From c1c18f4f3b7a5960d92360487c01856f817b8339 Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Sat, 8 Jul 2023 12:21:52 +0300 Subject: [PATCH] CONNECTING TO WORLD!!! --- README.md | 6 ++++- src/core/core.py | 8 +++---- src/core/core.pyi | 2 ++ src/core/tcp_server.py | 50 +++++++++-------------------------------- src/core/tcp_server.pyi | 1 - 5 files changed, 21 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index d536047..4e8295e 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,11 @@ BeamingDrive Multiplayer (BeamMP) server compatible with BeamMP clients. - [x] Understanding beamp header - [X] Authorization - [ ] Upload mods - - [ ] Connecting to the world + - [x] Connecting to the world + - [x] Chat + - [ ] ABG: (compressed data) + - [ ] Decompress data + - [ ] Vehicle data - [ ] UDP Server part: - [ ] Players synchronizations - [x] Additional: diff --git a/src/core/core.py b/src/core/core.py index 0b1c8a6..bb0ceaf 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -5,7 +5,6 @@ # Licence: FPA # (c) kuitoi.su 2023 import asyncio -import socket from core import utils from .tcp_server import TCPServer @@ -17,7 +16,7 @@ class Client: def __init__(self, reader, writer): self.reader = reader self.writer = writer - self.log = utils.get_logger("client(id: )") + self.log = utils.get_logger("client(None:0)") self.addr = writer.get_extra_info("sockname") self.loop = asyncio.get_event_loop() self.cid = 0 @@ -28,7 +27,8 @@ class Client: self.alive = True def _update_logger(self): - self.log = utils.get_logger(f"client(id:{self.cid})") + self.log.debug(f"Update logger") + self.log = utils.get_logger(f"client({self.nick}:{self.cid})") def is_disconnected(self): if not self.alive: @@ -157,7 +157,7 @@ class Core: def create_client(self, *args, **kwargs): cl = Client(*args, **kwargs) - self.clients_counter += 1 + self.clients_counter = self.clients_counter + 1 cl.id = self.clients_counter cl._update_logger() return cl diff --git a/src/core/core.pyi b/src/core/core.pyi index a7a1e43..3ee28cc 100644 --- a/src/core/core.pyi +++ b/src/core/core.pyi @@ -29,7 +29,9 @@ class Client: def is_disconnected(self) -> bool: ... async def kick(self, reason: str) -> None: ... 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: ... class Core: diff --git a/src/core/tcp_server.py b/src/core/tcp_server.py index 9dc725e..7e44d01 100644 --- a/src/core/tcp_server.py +++ b/src/core/tcp_server.py @@ -20,44 +20,10 @@ class TCPServer: self.port = port self.loop = asyncio.get_event_loop() - async def recv(self, client): - # if not client.is_disconnected(): - # self.log.debug(f"Client with {client.nick}({client.cid}) disconnected") - # return - - header = await client.reader.read(4) # header: 4 bytes - data = await client.reader.read(101 * MB) - - int_header = 0 - for i in range(len(header)): - int_header += header[i] - self.log.debug(f"header: `{header}`; int_header: `{int_header}`; data: `{data}`;") - - if int_header <= 0: - await client.kick("Invalid packet - header negative") - return - - if not int_header < 100 * MB: - await client.kick("Header size limit exceeded") - self.log.warn(f"Client {client.nick}({client.cid}) sent header of >100MB - " - f"assuming malicious intent and disconnecting the client.") - return - - if len(data) != int_header: - self.log.debug(f"WARN Expected to read {int_header} bytes, instead got {len(data)}") - - # TODO: ABG: DeComp(Data) - abg = b"ABG:" - if len(data) > len(abg) and data.startswith(abg): - data = data[len(abg):] - # return DeComp(Data); - return data - async def auth_client(self, reader, writer): - # TODO: Authentication client = self.Core.create_client(reader, writer) self.log.info(f"Identifying new ClientConnection...") - data = await self.recv(client) + data = await client.recv() self.log.debug(f"recv1 data: {data}") if len(data) > 50: await client.kick("Too long data") @@ -67,9 +33,8 @@ class TCPServer: return else: await client.tcp_send(b"A") # Accepted client version - # await client.tcp_send(b"S") # Ask client key - data = await self.recv(client) + data = await client.recv() self.log.debug(f"recv2 data: {data}") if len(data) > 50: await client.kick("Invalid Key (too long)!") @@ -87,11 +52,13 @@ class TCPServer: client.nick = res["username"] client.roles = res["roles"] client.guest = res["guest"] + client._update_logger() except Exception as e: self.log.error(f"Auth error: {e}") - await client.kick('Invalid authentication data! Try to econnect in 5 minutes.') + await client.kick('Invalid authentication data! Try to connect in 5 minutes.') # TODO: Password party + # await client.tcp_send(b"S") # Ask client key ev.call_event("on_auth", client) @@ -113,8 +80,10 @@ class TCPServer: case "C": result, client = await self.auth_client(reader, writer) if result: - await client.kick("Authentication success! Server not ready.") + await client.sync_resources() + # await client.kick("Authentication success! Server not ready.") return True + return False case "D": return await self.handle_download(writer) case "P": @@ -144,7 +113,8 @@ class TCPServer: async def start(self): self.log.debug("Starting TCP server.") - server = await asyncio.start_server(self.handle_client, self.host, self.port, backlog=config.Game["players"]+1) + server = await asyncio.start_server(self.handle_client, self.host, self.port, + backlog=config.Game["players"] + 1) try: self.log.debug(f"TCP server started on {server.sockets[0].getsockname()!r}") while True: diff --git a/src/core/tcp_server.pyi b/src/core/tcp_server.pyi index 967e5a9..335df3e 100644 --- a/src/core/tcp_server.pyi +++ b/src/core/tcp_server.pyi @@ -20,7 +20,6 @@ class TCPServer: self.host = host self.port = port self.loop = asyncio.get_event_loop() - async def recv(self, client: Client) -> bytes: ... async def auth_client(self, reader: StreamReader, writer: StreamWriter) -> Tuple[bool, Client]: ... async def handle_download(self, writer: StreamWriter) -> bool: ... async def handle_code(self, code: str, reader: StreamReader, writer: StreamWriter) -> bool: ...