From ac40cc53c9ae0e287d6ae0223ed7455300e59f14 Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Fri, 8 May 2026 16:15:33 +0300 Subject: [PATCH] =?UTF-8?q?MAX=20&&=20TT:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/oneme/processors/contacts.py | 55 +++++++++++++++++++++++++++++++ src/tamtam/processors/contacts.py | 52 +++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/src/oneme/processors/contacts.py b/src/oneme/processors/contacts.py index abb22fd..49c23be 100644 --- a/src/oneme/processors/contacts.py +++ b/src/oneme/processors/contacts.py @@ -222,6 +222,61 @@ class ContactsProcessors(BaseProcessor): await self._send(writer, packet) + elif action == "UPDATE": + async with self.db_pool.acquire() as conn: + async with conn.cursor() as cursor: + # Проверяем, существует ли контакт + await cursor.execute( + "SELECT * FROM contacts WHERE owner_id = %s AND contact_id = %s", + (userId, contactId) + ) + row = await cursor.fetchone() + + # Если контакта нет, отдаем ошибку + if not row: + await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.CONTACT_NOT_FOUND, writer) + return + + # Обновляем контакт + await cursor.execute( + "UPDATE contacts SET custom_firstname = %s, custom_lastname = %s WHERE owner_id = %s AND contact_id = %s", + (firstName, lastName, userId, contactId) + ) + + # Получаем данные пользователя + await cursor.execute("SELECT * FROM users WHERE id = %s", (contactId,)) + user = await cursor.fetchone() + + # Генерируем профиль + 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) + + contact = 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")), + accountStatus=int(user.get("accountstatus")), + description=user.get("description"), + includeProfileOptions=False, + custom_firstname=firstName, + custom_lastname=lastName, + ) + + response_payload = { + "contact": contact + } + + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.CONTACT_UPDATE, payload=response_payload + ) + + await self._send(writer, packet) + async def contact_presence(self, payload, seq, writer): """Обработчик получения статуса контактов""" # Валидируем данные пакета diff --git a/src/tamtam/processors/contacts.py b/src/tamtam/processors/contacts.py index af3f623..2087917 100644 --- a/src/tamtam/processors/contacts.py +++ b/src/tamtam/processors/contacts.py @@ -222,6 +222,58 @@ class ContactsProcessors(BaseProcessor): await self._send(writer, packet) + elif action == "UPDATE": + async with self.db_pool.acquire() as conn: + async with conn.cursor() as cursor: + # Проверяем, существует ли контакт + await cursor.execute( + "SELECT * FROM contacts WHERE owner_id = %s AND contact_id = %s", + (userId, contactId) + ) + row = await cursor.fetchone() + + # Если контакта нет, отдаем ошибку + if not row: + await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.CONTACT_NOT_FOUND, writer) + return + + # Обновляем контакт + await cursor.execute( + "UPDATE contacts SET custom_firstname = %s, custom_lastname = %s WHERE owner_id = %s AND contact_id = %s", + (firstName, lastName, userId, contactId) + ) + + # Получаем данные пользователя + await cursor.execute("SELECT * FROM users WHERE id = %s", (contactId,)) + user = await cursor.fetchone() + + # Генерируем профиль + 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) + + contact = self.tools.generate_profile_tt( + id=user.get("id"), + phone=int(user.get("phone")), + avatarUrl=avatar_url, + photoId=photo_id, + updateTime=int(user.get("updatetime")), + firstName=user.get("firstname"), + lastName=user.get("lastname"), + options=json.loads(user.get("options")), + description=user.get("description"), + username=user.get("username") + ), + + response_payload = { + "contact": contact + } + + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.CONTACT_UPDATE, payload=response_payload + ) + + await self._send(writer, packet) + async def contact_presence(self, payload, seq, writer): """Обработчик получения статуса контактов""" # Валидируем данные пакета