diff --git a/src/tamtam/models.py b/src/tamtam/models.py index ffab737..84df963 100644 --- a/src/tamtam/models.py +++ b/src/tamtam/models.py @@ -34,4 +34,7 @@ class LoginPayloadModel(pydantic.BaseModel): token: str class SearchUsersPayloadModel(pydantic.BaseModel): - contactIds: list \ No newline at end of file + contactIds: list + +class PingPayloadModel(pydantic.BaseModel): + interactive: bool \ No newline at end of file diff --git a/src/tamtam/processors/main.py b/src/tamtam/processors/main.py index 8f2f59e..ee8d69b 100644 --- a/src/tamtam/processors/main.py +++ b/src/tamtam/processors/main.py @@ -1,5 +1,6 @@ +import pydantic from classes.baseprocessor import BaseProcessor -from tamtam.models import HelloPayloadModel +from tamtam.models import HelloPayloadModel, PingPayloadModel class MainProcessors(BaseProcessor): async def session_init(self, payload, seq, writer): @@ -7,7 +8,7 @@ class MainProcessors(BaseProcessor): # Валидируем данные пакета try: HelloPayloadModel.model_validate(payload) - except Exception as e: + except pydantic.ValidationError as error: await self._send_error(seq, self.opcodes.SESSION_INIT, self.error_types.INVALID_PAYLOAD, writer) return None, None @@ -33,4 +34,32 @@ class MainProcessors(BaseProcessor): # Отправляем await self._send(writer, packet) - return device_type, device_name \ No newline at end of file + return device_type, device_name + + async def ping(self, payload, seq, writer): + """Обработчик пинга""" + # Валидируем данные пакета + try: + PingPayloadModel.model_validate(payload) + except pydantic.ValidationError as error: + self.logger.error(f"Возникли ошибки при валидации пакета: {error}") + await self._send_error(seq, self.opcodes.PING, self.error_types.INVALID_PAYLOAD, writer) + return + + # Собираем пакет + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.PING, payload=None + ) + + # Отправляем + await self._send(writer, packet) + + async def log(self, payload, seq, writer): + """Обработчик лога""" + # Собираем пакет + packet = self.proto.pack_packet( + cmd=self.proto.CMD_OK, seq=seq, opcode=self.opcodes.LOG, payload=None + ) + + # Отправляем + await self._send(writer, packet) \ No newline at end of file diff --git a/src/tamtam/socket.py b/src/tamtam/socket.py index 6da1028..6724195 100644 --- a/src/tamtam/socket.py +++ b/src/tamtam/socket.py @@ -76,6 +76,10 @@ class TTMobileServer: match opcode: case self.opcodes.SESSION_INIT: deviceType, deviceName = await self.processors.session_init(payload, seq, writer) + case self.opcodes.PING: + await self.processors.ping(payload, seq, writer) + case self.opcodes.LOG: + await self.processors.log(payload, seq, writer) case self.opcodes.AUTH_REQUEST: if not self.auth_rate_limiter.is_allowed(address[0]): await self.processors._send_error(seq, self.opcodes.AUTH_REQUEST, self.processors.error_types.RATE_LIMITED, writer)