diff --git a/src/oneme/controller.py b/src/oneme/controller.py index 44a236b..ec57fda 100644 --- a/src/oneme/controller.py +++ b/src/oneme/controller.py @@ -10,13 +10,18 @@ from common.opcodes import Opcodes class OnemeController(ControllerBase): def __init__(self): self.config = ServerConfig() - self.proto = MobileProto() + self.proto_tcp = MobileProto() + self.proto_web = WebProto() self.opcodes = Opcodes() async def event(self, target, client, eventData): # Извлекаем тип события и врайтер eventType = eventData.get("eventType") writer = client.get("writer") + is_web = client.get("type") == "web" + + # Выбираем протокол в зависимости от типа подключения + proto = self.proto_web if is_web else self.proto_tcp # Не отправляем событие самому себе if writer == eventData.get("writer"): @@ -41,7 +46,7 @@ class OnemeController(ControllerBase): } # Создаем пакет - packet = self.proto.pack_packet( + packet = proto.pack_packet( cmd=0, seq=1, opcode=self.opcodes.NOTIF_MESSAGE, payload=payload ) elif eventType == "typing": @@ -58,7 +63,7 @@ class OnemeController(ControllerBase): } # Создаем пакет - packet = self.proto.pack_packet( + packet = proto.pack_packet( cmd=0, seq=1, opcode=self.opcodes.NOTIF_TYPING, payload=payload ) elif eventType == "profile_updated": @@ -71,7 +76,7 @@ class OnemeController(ControllerBase): } # Создаем пакет - packet = self.proto.pack_packet( + packet = proto.pack_packet( cmd=0, seq=1, opcode=self.opcodes.NOTIF_PROFILE, payload=payload ) elif eventType == "presence": @@ -85,13 +90,16 @@ class OnemeController(ControllerBase): "time": event_time } - packet = self.proto.pack_packet( + packet = proto.pack_packet( cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload ) # Отправляем пакет - writer.write(packet) - await writer.drain() + if is_web: + await writer.send(packet) + else: + writer.write(packet) + await writer.drain() def launch(self, api): async def _start_all(): diff --git a/src/oneme/websocket.py b/src/oneme/websocket.py index 8113216..ecc0a0c 100644 --- a/src/oneme/websocket.py +++ b/src/oneme/websocket.py @@ -320,7 +320,8 @@ class OnemeWS: "writer": websocket, "ip": addr[0], "port": addr[1], - "protocol": "oneme" + "protocol": "oneme", + "type": "web" } ) else: @@ -334,7 +335,8 @@ class OnemeWS: "writer": websocket, "ip": addr[0], "port": addr[1], - "protocol": "oneme" + "protocol": "oneme", + "type": "web" } ] } diff --git a/src/tamtam/controller.py b/src/tamtam/controller.py index f4cedab..aa3e43c 100644 --- a/src/tamtam/controller.py +++ b/src/tamtam/controller.py @@ -3,10 +3,103 @@ from tamtam.socket import TamTamMobile from tamtam.websocket import TamTamWS from classes.controllerbase import ControllerBase from common.config import ServerConfig +from common.proto_tcp import MobileProto +from common.proto_web import WebProto +from common.opcodes import Opcodes class TTController(ControllerBase): def __init__(self): self.config = ServerConfig() + self.proto_tcp = MobileProto() + self.proto_web = WebProto() + self.opcodes = Opcodes() + + async def event(self, target, client, eventData): + # Извлекаем тип события и врайтер + eventType = eventData.get("eventType") + writer = client.get("writer") + is_web = client.get("type") == "web" + + # Выбираем протокол в зависимости от типа подключения + proto = self.proto_web if is_web else self.proto_tcp + + # Не отправляем событие самому себе + if writer == eventData.get("writer"): + return + + # Обрабатываем событие + if eventType == "new_msg": + # Данные сообщения + chatId = eventData.get("chatId") + message = eventData.get("message") + prevMessageId = eventData.get("prevMessageId") + time = eventData.get("time") + + # Данные пакета + payload = { + "chatId": chatId, + "message": message, + "prevMessageId": prevMessageId, + "ttl": False, + "unread": 0, + "mark": time + } + + # Создаем пакет + packet = proto.pack_packet( + cmd=0, seq=1, opcode=self.opcodes.NOTIF_MESSAGE, payload=payload + ) + elif eventType == "typing": + # Данные события + chatId = eventData.get("chatId") + userId = eventData.get("userId") + type = eventData.get("type") + + # Данные пакета + payload = { + "chatId": chatId, + "userId": userId, + "type": type + } + + # Создаем пакет + packet = proto.pack_packet( + cmd=0, seq=1, opcode=self.opcodes.NOTIF_TYPING, payload=payload + ) + elif eventType == "profile_updated": + # Данные события + profile = eventData.get("profile") + + # Данные пакета + payload = { + "profile": profile + } + + # Создаем пакет + packet = proto.pack_packet( + cmd=0, seq=1, opcode=self.opcodes.NOTIF_PROFILE, payload=payload + ) + elif eventType == "presence": + userId = eventData.get("userId") + presence = eventData.get("presence") + event_time = eventData.get("time") + + payload = { + "userId": userId, + "presence": presence, + "time": event_time + } + + packet = proto.pack_packet( + cmd=0, seq=1, opcode=self.opcodes.NOTIF_PRESENCE, payload=payload + ) + + # Отправляем пакет + if is_web: + await writer.send(packet) + else: + writer.write(packet) + await writer.drain() def launch(self, api): async def _start_all(): diff --git a/src/tamtam/socket.py b/src/tamtam/socket.py index fc37476..e0c8886 100644 --- a/src/tamtam/socket.py +++ b/src/tamtam/socket.py @@ -199,7 +199,8 @@ class TamTamMobile: "writer": writer, "ip": addr[0], "port": addr[1], - "protocol": "tamtam" + "protocol": "tamtam", + "type": "tcp" } ) else: @@ -211,7 +212,8 @@ class TamTamMobile: "writer": writer, "ip": addr[0], "port": addr[1], - "protocol": "tamtam" + "protocol": "tamtam", + "type": "tcp" } ] } diff --git a/src/tamtam/websocket.py b/src/tamtam/websocket.py index fd91888..b146188 100644 --- a/src/tamtam/websocket.py +++ b/src/tamtam/websocket.py @@ -187,7 +187,8 @@ class TamTamWS: "writer": websocket, "ip": addr[0], "port": addr[1], - "protocol": "tamtam" + "protocol": "tamtam", + "type": "web" } ) else: @@ -199,7 +200,8 @@ class TamTamWS: "writer": websocket, "ip": addr[0], "port": addr[1], - "protocol": "tamtam" + "protocol": "tamtam", + "type": "web" } ] }