Prepare for Upload mods

This commit is contained in:
Maxim Khomutov 2023-07-13 02:35:38 +03:00
parent d21798aaf1
commit 6e46af4c13
4 changed files with 40 additions and 18 deletions

View File

@ -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"":

View File

@ -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: ...

View File

@ -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()

View File

@ -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: ...