From 6e46af4c1305f101397d85f4d65bb1457cf9fbf9 Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Thu, 13 Jul 2023 02:35:38 +0300 Subject: [PATCH] Prepare for Upload mods --- src/core/core.py | 32 +++++++++++++++++++++++--------- src/core/core.pyi | 3 ++- src/core/tcp_server.py | 21 ++++++++++++++------- src/core/tcp_server.pyi | 2 +- 4 files changed, 40 insertions(+), 18 deletions(-) diff --git a/src/core/core.py b/src/core/core.py index 791be06..3975a8b 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -23,6 +23,7 @@ class Client: def __init__(self, reader, writer, core): self.reader = reader self.writer = writer + self.down_rw = (None, None) self.log = utils.get_logger("client(None:0)") self.addr = writer.get_extra_info("sockname") self.loop = asyncio.get_event_loop() @@ -108,18 +109,31 @@ class Client: return data async def sync_resources(self): - await self.tcp_send(b"P" + bytes(f"{self.cid}", "utf-8")) - data = await self.recv() - if data.startswith(b"SR"): - await self.tcp_send(b"-") # Cannot handle mods for now. - data = await self.recv() - if data == b"Done": - await self.tcp_send(b"M/levels/" + bytes(config.Game['map'], 'utf-8') + b"/info.json") - await self.last_handle() + while True: + data = await self.recv() + if data.startswith(b"f"): + # TODO: SendFile + pass + elif data.startswith(b"SR"): + # TODO: Create mods list + self.log.debug("Sending Mod Info") + mods = [] + mod_list = b'' + # * code * + if len(mods) == 0: + await self.tcp_send(b"-") + else: + await self.tcp_send(mod_list) + data = await self.recv() + if data == b"Done": + await self.tcp_send(b"M/levels/" + bytes(config.Game['map'], 'utf-8') + b"/info.json") + break - async def last_handle(self): + async def looper(self): # self.is_disconnected() self.log.debug(f"Alive: {self.alive}") + await self.tcp_send(b"P" + bytes(f"{self.cid}", "utf-8")) + await self.sync_resources() while self.alive: data = await self.recv() if data == b"": diff --git a/src/core/core.pyi b/src/core/core.pyi index b57e3f1..cfc5d81 100644 --- a/src/core/core.pyi +++ b/src/core/core.pyi @@ -19,6 +19,7 @@ class Client: def __init__(self, reader: StreamReader, writer: StreamWriter, core: Core) -> "Client": self.reader = reader self.writer = writer + self.down_rw: Tuple[StreamReader, StreamWriter] | Tuple[None, None] = (None, None) self.log = utils.get_logger("client(id: )") self.addr = writer.get_extra_info("sockname") self.loop = asyncio.get_event_loop() @@ -34,7 +35,7 @@ class Client: async def tcp_send(self, data: bytes) -> None: ... async def sync_resources(self) -> None: ... async def recv(self) -> bytes: ... - async def last_handle(self) -> bytes: ... + async def looper(self) -> None: ... def _update_logger(self) -> None: ... diff --git a/src/core/tcp_server.py b/src/core/tcp_server.py index b275fe9..e97ae77 100644 --- a/src/core/tcp_server.py +++ b/src/core/tcp_server.py @@ -68,22 +68,29 @@ class TCPServer: return True, client - async def handle_download(self, writer): - # TODO: HandleDownload - self.log.debug(f"Client: \"IP: {0!r}; ID: {0}\" - HandleDownload!") - return False + async def set_down_rw(self, reader, writer): + try: + cid = (await reader.read(1)).decode() # FIXME: wtf? 1 byte? + self.log.debug(f"Client: \"ID: {cid}\" - HandleDownload!") + if not cid.isdigit(): + return False + for _client in self.Core.clients: + if _client.cid == cid: + _client.down_rw = (reader, writer) + return True + finally: + return False async def handle_code(self, code, reader, writer): match code: case "C": result, client = await self.auth_client(reader, writer) if result: - await client.sync_resources() - # await client.kick("Authentication success! Server not ready.") + await client.looper() return True return False case "D": - return await self.handle_download(writer) + return await self.set_down_rw(reader, writer) case "P": writer.write(b"P") await writer.drain() diff --git a/src/core/tcp_server.pyi b/src/core/tcp_server.pyi index 0db1130..df73094 100644 --- a/src/core/tcp_server.pyi +++ b/src/core/tcp_server.pyi @@ -20,7 +20,7 @@ class TCPServer: self.port = port self.loop = asyncio.get_event_loop() async def auth_client(self, reader: StreamReader, writer: StreamWriter) -> Tuple[bool, Client]: ... - async def handle_download(self, writer: StreamWriter) -> bool: ... + async def set_down_rw(self, reader: StreamReader, writer: StreamWriter) -> bool: ... async def handle_code(self, code: str, reader: StreamReader, writer: StreamWriter) -> bool: ... async def handle_client(self, reader: StreamReader, writer: StreamWriter) -> None: ... async def start(self) -> None: ...