From d4d5dd5530d83761326c3bc9a000099aa93d8044 Mon Sep 17 00:00:00 2001 From: zavolo Date: Sun, 15 Mar 2026 11:39:32 +0300 Subject: [PATCH] =?UTF-8?q?feat:=2016=20=D0=BE=D0=BF=D0=BA=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/oneme_tcp/models.py | 7 +++- src/oneme_tcp/processors.py | 73 ++++++++++++++++++++++++++++++++++++- src/oneme_tcp/server.py | 4 ++ 3 files changed, 82 insertions(+), 2 deletions(-) diff --git a/src/oneme_tcp/models.py b/src/oneme_tcp/models.py index 03f0cc4..34ff0bd 100644 --- a/src/oneme_tcp/models.py +++ b/src/oneme_tcp/models.py @@ -93,4 +93,9 @@ class SearchUsersPayloadModel(pydantic.BaseModel): contactIds: list class ComplainReasonsGetPayloadModel(pydantic.BaseModel): - complainSync: int \ No newline at end of file + complainSync: int + +class UpdateProfilePayloadModel(pydantic.BaseModel): + description: str = None + firstName: str = None + lastName: str = None \ No newline at end of file diff --git a/src/oneme_tcp/processors.py b/src/oneme_tcp/processors.py index 5d499b8..85974b5 100644 --- a/src/oneme_tcp/processors.py +++ b/src/oneme_tcp/processors.py @@ -892,4 +892,75 @@ class Processors: ) # Отправляем пакет - await self._send(writer, packet) \ No newline at end of file + await self._send(writer, packet) + + + async def process_update_profile(self, payload, seq, writer, userId, userPhone): + # Валидируем входные данные + try: + UpdateProfilePayloadModel.model_validate(payload) + except Exception as e: + await self._send_error(seq, self.proto.PROFILE, self.error_types.INVALID_PAYLOAD, writer) + return + + # Извлекаем поля из пакета (каждое может быть None) + description = payload.get("description") + firstName = payload.get("firstName") + lastName = payload.get("lastName") + + # Обновляем только те поля, которые пришли в запросе + async with self.db_pool.acquire() as conn: + async with conn.cursor() as cursor: + if description is not None: + # При изменении описания также обновляем время последнего изменения профиля + await cursor.execute( + "UPDATE users SET description = %s, updatetime = %s WHERE id = %s", + (description, int(time.time() * 1000), userId) + ) + if firstName is not None: + await cursor.execute( + "UPDATE users SET firstname = %s WHERE id = %s", + (firstName, userId) + ) + if lastName is not None: + await cursor.execute( + "UPDATE users SET lastname = %s WHERE id = %s", + (lastName, userId) + ) + + # Получаем актуальные данные пользователя после обновления + await cursor.execute("SELECT * FROM users WHERE id = %s", (userId,)) + user = await cursor.fetchone() + + # Формируем URL аватарки если она есть + photoId = None if not user.get("avatar_id") else int(user.get("avatar_id")) + avatar_url = None if not photoId else self.config.avatar_base_url + str(photoId) + + # Генерируем профиль для отправки клиенту + profile = self.tools.generate_profile( + id=user.get("id"), + phone=int(user.get("phone")), + avatarUrl=avatar_url, + photoId=photoId, + updateTime=int(user.get("updatetime")), + firstName=user.get("firstname"), + lastName=user.get("lastname"), + options=json.loads(user.get("options")), + description=user.get("description"), + accountStatus=int(user.get("accountstatus")), + profileOptions=json.loads(user.get("profileoptions")), + includeProfileOptions=True, + username=user.get("username") + ) + + # Отправляем ответ на запрос (CMD_OK) + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.proto.PROFILE, payload=profile + ) + await self._send(writer, packet) + + # Отправляем уведомление об изменении профиля (CMD_NOF) + notif_packet = self.proto.pack_packet( + cmd=self.proto.CMD_NOF, seq=0, opcode=self.proto.NOTIF_PROFILE, payload=profile + ) + await self._send(writer, notif_packet) \ No newline at end of file diff --git a/src/oneme_tcp/server.py b/src/oneme_tcp/server.py index d05bcb6..7ab720e 100644 --- a/src/oneme_tcp/server.py +++ b/src/oneme_tcp/server.py @@ -142,6 +142,10 @@ class OnemeMobileServer: await self.auth_required( userPhone, self.processors.process_complain_reasons_get, payload, seq, writer ) + case self.proto.PROFILE: + await self.processors.process_update_profile( + payload, seq, writer, userId=userId, userPhone=userPhone + ) case _: self.logger.warning(f"Неизвестный опкод {opcode}") except Exception as e: