diff --git a/src/oneme/models.py b/src/oneme/models.py index 4ea34f8..edd999d 100644 --- a/src/oneme/models.py +++ b/src/oneme/models.py @@ -130,4 +130,8 @@ class ChatHistoryPayloadModel(pydantic.BaseModel): class ChatSubscribePayloadModel(pydantic.BaseModel): chatId: int - subscribe: bool \ No newline at end of file + subscribe: bool + +class ContactListPayloadModel(pydantic.BaseModel): + status: str + count: int = None \ No newline at end of file diff --git a/src/oneme/processors/__init__.py b/src/oneme/processors/__init__.py index 87d877a..1261263 100644 --- a/src/oneme/processors/__init__.py +++ b/src/oneme/processors/__init__.py @@ -3,6 +3,7 @@ from .auth import AuthProcessors from .calls import CallsProcessors from .chats import ChatsProcessors from .complains import ComplainsProcessors +from .contacts import ContactsProcessors from .folders import FoldersProcessors from .history import HistoryProcessors from .main import MainProcessors @@ -16,6 +17,7 @@ class Processors( CallsProcessors, ChatsProcessors, ComplainsProcessors, + ContactsProcessors, FoldersProcessors, HistoryProcessors, MainProcessors, diff --git a/src/oneme/processors/contacts.py b/src/oneme/processors/contacts.py new file mode 100644 index 0000000..b94abf5 --- /dev/null +++ b/src/oneme/processors/contacts.py @@ -0,0 +1,66 @@ +import pydantic +from classes.baseprocessor import BaseProcessor +from oneme.models import ContactListPayloadModel + +class ContactsProcessors(BaseProcessor): + async def contact_list(self, payload, seq, writer, userId): + """Обработчик получения контактов""" + # Валидируем данные пакета + try: + ContactListPayloadModel.model_validate(payload) + except pydantic.ValidationError as error: + self.logger.error(f"Возникли ошибки при валидации пакета: {error}") + await self._send_error(seq, self.opcodes.CONTACT_LIST, self.error_types.INVALID_PAYLOAD, writer) + return + + status = payload.get("status") + count = payload.get("count") + + # Итоговый контакт-лист + contact_list = [] + + if status == "BLOCKED": + # Собираем контакты, которые в черном списке + blocked = [] + + async with self.db_pool.acquire() as conn: + async with conn.cursor() as cursor: + if count: + await cursor.execute( + "SELECT * FROM contacts WHERE owner_id = %s AND is_blocked = TRUE LIMIT %s", + (userId, count), + ) + else: + await cursor.execute( + "SELECT * FROM contacts WHERE owner_id = %s AND is_blocked = TRUE", + (userId,), + ) + rows = await cursor.fetchall() + + for row in rows: + blocked.append( + { + "id": int(row.get("contact_id")), + "firstname": row.get("custom_firstname"), + "lastname": row.get("custom_lastname"), + "blocked": True, + } + ) + + # Генерируем контакт-лист + contact_list = await self.tools.generate_contacts( + blocked, self.db_pool, avatar_base_url=self.config.avatar_base_url + ) + + # Собираем данные пакета + response_payload = { + "contacts": contact_list + } + + # Создаем пакет + packet = self.proto.pack_packet( + seq=seq, opcode=self.opcodes.CONTACT_LIST, payload=response_payload + ) + + # Отправляем пакет + await self._send(writer, packet) diff --git a/src/oneme/socket.py b/src/oneme/socket.py index 151fb00..b6fba36 100644 --- a/src/oneme/socket.py +++ b/src/oneme/socket.py @@ -253,6 +253,15 @@ class OnemeMobile: writer, userId, ) + case self.opcodes.CONTACT_LIST: + await self.auth_required( + userPhone, + self.processors.contact_list, + payload, + seq, + writer, + userId, + ) case self.opcodes.COMPLAIN_REASONS_GET: await self.auth_required( userPhone, diff --git a/src/oneme/websocket.py b/src/oneme/websocket.py index bdd4519..35a6320 100644 --- a/src/oneme/websocket.py +++ b/src/oneme/websocket.py @@ -227,6 +227,15 @@ class OnemeWS: websocket, userId, ) + case self.opcodes.CONTACT_LIST: + await self.auth_required( + userPhone, + self.processors.contact_list, + payload, + seq, + websocket, + userId, + ) case self.opcodes.COMPLAIN_REASONS_GET: await self.auth_required( userPhone,