From a04545712866bad06c2172c8059ceb62e9008038 Mon Sep 17 00:00:00 2001 From: Alexey Polyakov Date: Fri, 8 May 2026 15:57:24 +0300 Subject: [PATCH] =?UTF-8?q?MAX:=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8=20=D1=80=D0=B0=D0=B7=D0=B1?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=82=D0=B0=D0=BA=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/static.py | 16 +++++++- src/oneme/processors/contacts.py | 63 +++++++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 2 deletions(-) diff --git a/src/common/static.py b/src/common/static.py index 5b9fef1..5af8a81 100644 --- a/src/common/static.py +++ b/src/common/static.py @@ -13,6 +13,8 @@ class Static: CHAT_NOT_FOUND = "chat_not_found" CHAT_NOT_ACCESS = "chat_not_access" RATE_LIMITED = "rate_limited" + CONTACT_NOT_FOUND = "contact_not_found" + CONTACT_ALREADY_ADDED = "contact_already_added" class ChatTypes: DIALOG = "DIALOG" @@ -80,7 +82,19 @@ class Static: "error": "error.rate_limited", "message": "Too many attempts. Please try again later", "title": "Слишком много попыток" - } + }, + "contact_not_found": { + "localizedMessage": "Контакт не найден", + "error": "contact.not.found", + "message": "Contact not found", + "title": "Контакт не найден" + }, + "contact_already_added": { + "localizedMessage": "Контакт уже добавлен", + "error": "contact.already.added", + "message": "Contact already added", + "title": "Контакт уже добавлен" + }, } ### Сообщения бота diff --git a/src/oneme/processors/contacts.py b/src/oneme/processors/contacts.py index eb6e4ef..51a43dd 100644 --- a/src/oneme/processors/contacts.py +++ b/src/oneme/processors/contacts.py @@ -95,7 +95,7 @@ class ContactsProcessors(BaseProcessor): user = await cursor.fetchone() if not user: - await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.USER_NOT_FOUND, writer) + await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.CONTACT_NOT_FOUND, writer) return # Проверяем, не добавлен ли уже контакт @@ -161,6 +161,67 @@ class ContactsProcessors(BaseProcessor): await self._send(writer, packet) + elif action == "BLOCK": + 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 row: + await cursor.execute( + "UPDATE contacts SET is_blocked = TRUE WHERE owner_id = %s AND contact_id = %s", + (userId, contactId) + ) + else: # В ином случае добавляем новую запись в бд + await cursor.execute("SELECT * FROM users WHERE id = %s", (contactId,)) + user = await cursor.fetchone() + if not user: + await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.USER_NOT_FOUND, writer) + return + + await cursor.execute( + "INSERT INTO contacts (owner_id, contact_id, custom_firstname, custom_lastname, is_blocked) VALUES (%s, %s, %s, %s, TRUE)", + (userId, contactId, firstName, lastName) + ) + + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.CONTACT_UPDATE, payload=None + ) + + await self._send(writer, packet) + + elif action == "UNBLOCK": + # Разблокируем контакт + 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 row: + await cursor.execute( + "UPDATE contacts SET is_blocked = FALSE WHERE owner_id = %s AND contact_id = %s", + (userId, contactId) + ) + else: # В ином случае отправляем ошибку + await self._send_error(seq, self.opcodes.CONTACT_UPDATE, self.error_types.CONTACT_NOT_FOUND, writer) + return + + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.CONTACT_UPDATE, payload=None + ) + + await self._send(writer, packet) + async def contact_presence(self, payload, seq, writer): """Обработчик получения статуса контактов""" # Валидируем данные пакета