From 35a4101608504bde07f83c3f5cd520ebc17de781 Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Fri, 24 Apr 2026 17:17:33 +0300 Subject: [PATCH] =?UTF-8?q?MAX:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BA=20=D0=BF=D1=80=D0=B8=D0=B2=D0=B0=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/tools.py | 14 ++++++++++ src/oneme/processors/auth.py | 8 +++++- src/oneme/processors/main.py | 52 +++++++++++++++++++++++++++++++++++ src/oneme/socket.py | 9 ++++++ src/oneme/websocket.py | 9 ++++++ src/tamtam/processors/auth.py | 8 +++++- 6 files changed, 98 insertions(+), 2 deletions(-) diff --git a/src/common/tools.py b/src/common/tools.py index 5df66f9..2163dae 100644 --- a/src/common/tools.py +++ b/src/common/tools.py @@ -503,3 +503,17 @@ class Tools: # Возвращаем return unique_id + + async def update_user_config(self, cursor, phone, user_settings, default_settings): + """Функция для обновления юзер конфига из бд в случае его изменения""" + + user_config = json.loads(user_settings) + updated_config = {**default_settings, **user_config} + + if updated_config != user_config: + await cursor.execute( + "UPDATE user_data SET user_config = %s WHERE phone = %s", + (json.dumps(updated_config), phone), + ) + + return updated_config diff --git a/src/oneme/processors/auth.py b/src/oneme/processors/auth.py index 46595a9..9bad7bd 100644 --- a/src/oneme/processors/auth.py +++ b/src/oneme/processors/auth.py @@ -530,6 +530,12 @@ class AuthProcessors(BaseProcessor): for chat in user_chats: chats.append(chat.get("chat_id")) + # Обновляем юзер конфиг + updated_user_config = await self.tools.update_user_config( + cursor, token_data.get("phone"), + user_data.get("user_config"), self.static.USER_SETTINGS + ) + # Аватарка с биографией 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 + photoId @@ -572,7 +578,7 @@ class AuthProcessors(BaseProcessor): "presence": {}, "config": { "server": self.server_config, - "user": json.loads(user_data.get("user_config")), + "user": updated_user_config, }, "token": token, "videoChatHistory": False, diff --git a/src/oneme/processors/main.py b/src/oneme/processors/main.py index d050e3e..0ac7ba6 100644 --- a/src/oneme/processors/main.py +++ b/src/oneme/processors/main.py @@ -127,5 +127,57 @@ class MainProcessors(BaseProcessor): cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.PROFILE, payload=payload ) + # Отправляем + await self._send(writer, response) + + async def update_config(self, payload, seq, writer, userPhone): + """ + Обработчик 22 опкода (config) + Он отвечает за обновление настроек приватности + и пуш токена для пушей + """ + # Пейлоад, который отдадим клиенту + # а отдавать его нужно только при изменении настроек приватности + result_payload = None + + if payload.get("pushToken") and payload.get("pushOptions"): + # TODO: Когда сядем за пуши, сделать тут обновление пуш токена + pass + elif payload.get("settings") and payload.get("settings").get("user"): + """Обновление настроек приватности""" + new_settings = payload.get("settings").get("user") + + async with self.db_pool.acquire() as conn: + async with conn.cursor() as cursor: + # Получаем текущий конфиг + await cursor.execute( + "SELECT user_config FROM user_data WHERE phone = %s", (userPhone,) + ) + row = await cursor.fetchone() + + if row: + current_config = json.loads(row.get("user_config")) + + # Обновляем настройки + for key, value in new_settings.items(): + if key in current_config: + current_config[key] = value + + # Сохраняем обновлённый конфиг + await cursor.execute( + "UPDATE user_data SET user_config = %s WHERE phone = %s", + (json.dumps(current_config), userPhone) + ) + + result_payload = { + "user": current_config, + "hash": "0" + } + + # Собираем пакет + response = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.CONFIG, payload=result_payload + ) + # Отправляем await self._send(writer, response) \ No newline at end of file diff --git a/src/oneme/socket.py b/src/oneme/socket.py index 7079056..6afff17 100644 --- a/src/oneme/socket.py +++ b/src/oneme/socket.py @@ -272,6 +272,15 @@ class OnemeMobile: seq, writer, ) + case self.opcodes.CONFIG: + await self.auth_required( + userPhone, + self.processors.update_config, + payload, + seq, + writer, + userPhone, + ) case _: self.logger.warning(f"Неизвестный опкод {opcode}") except Exception as e: diff --git a/src/oneme/websocket.py b/src/oneme/websocket.py index 0da3c7d..db7da50 100644 --- a/src/oneme/websocket.py +++ b/src/oneme/websocket.py @@ -246,6 +246,15 @@ class OnemeWS: seq, websocket, ) + case self.opcodes.CONFIG: + await self.auth_required( + userPhone, + self.processors.update_config, + payload, + seq, + websocket, + userPhone, + ) case _: self.logger.warning(f"Неизвестный опкод {opcode}") except websockets.exceptions.ConnectionClosed: diff --git a/src/tamtam/processors/auth.py b/src/tamtam/processors/auth.py index f838000..4d48384 100644 --- a/src/tamtam/processors/auth.py +++ b/src/tamtam/processors/auth.py @@ -300,6 +300,12 @@ class AuthProcessors(BaseProcessor): chat.get("chat_id") ) + # Обновляем юзер конфиг + updated_user_config = await self.tools.update_user_config( + cursor, token_data.get("phone"), + user_data.get("user_config"), self.static.USER_SETTINGS + ) + # Аватарка с биографией photo_id = None if not user.get("avatar_id") else int(user.get("avatar_id")) avatar_url = None if not photo_id else self.config.avatar_base_url + str(photo_id) @@ -335,7 +341,7 @@ class AuthProcessors(BaseProcessor): "config": { "hash": "e5903aa8-0000000000000000-80000106-0000000000000001-00000001-0000000000000000-00000000-2-00000001-0000019c9559d057", "server": self.server_config, - "user": json.loads(user_data.get("user_config")), + "user": updated_user_config, "chatFolders": { "FOLDERS": [], "ALL_FILTER_EXCLUDE": []