From 3defc99389815c0467ccb8decf5df0894f0cce49 Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Fri, 7 Jul 2023 17:56:01 +0300 Subject: [PATCH] I hate this "header" --- src/core/core.py | 27 ++++++++++++++++++++------- src/core/core.pyi | 16 ++++++++-------- 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/core/core.py b/src/core/core.py index fd98872..1737bdc 100644 --- a/src/core/core.py +++ b/src/core/core.py @@ -39,17 +39,24 @@ class Client: def kick(self, reason): self.log.info(f"Client: \"IP: {self.addr!r}; ID: {self.cid}\" - kicked with reason: \"{reason}\"") - self.socket.send(b"K" + bytes(reason, "utf-8")) + self.tcp_send(b"K" + bytes(reason, "utf-8")) self.socket.close() self.alive = False def tcp_send(self, data): - header = b"C\x00\x00\x00\x00" - # size = len(data) - # to_send = bytearray(size + len(data)) - # to_send[0:len(data)] = size.to_bytes(len(data), byteorder='big') - # to_send[len(data):] = data - self.socket.send(header + b"\x00" + data + b"\x00") + + # TNetwork.cpp; Line: 383 + # BEAMP TCP protocol sends a header of 4 bytes, followed by the data. + # [][][][][][]...[] + # ^------^^---...-^ + # size data + + data = data.replace(b" ", b"_") + if len(data) == 10: + data += b"." + header = len(data).to_bytes(4, "little") + self.log.debug(f'len(data) {len(data)}; header: {header}; send {header + data}') + self.socket.send(header + data) class Core: @@ -64,6 +71,12 @@ class Core: self.tcp = TCPServer self.udp = UDPServer + def get_client(self, sock=None, cid=None): + if cid: + return self.clients.get(cid) + if sock: + return self.clients.get(sock.getsockname()) + def create_client(self, *args, **kwargs): cl = Client(*args, **kwargs) self.clients_counter += 1 diff --git a/src/core/core.pyi b/src/core/core.pyi index a1f6bdf..566a186 100644 --- a/src/core/core.pyi +++ b/src/core/core.pyi @@ -5,6 +5,7 @@ # Licence: FPA # (c) kuitoi.su 2023 import asyncio +import socket from asyncio import StreamWriter, AbstractEventLoop, StreamReader from asyncio.trsock import TransportSocket @@ -12,15 +13,14 @@ from core import utils from .tcp_server import TCPServer from .udp_server import UDPServer class Client: - def __init__(self, reader: StreamReader, writer: StreamWriter): - self.cid: int = 0 - self.nick: str = None + + def __init__(self, sock: socket.socket): + self.cid = 0 + self.nick = None self.log = utils.get_logger("client") - self.writer: StreamWriter = writer - self.reader: StreamReader = reader - self.addr: tuple = writer.get_extra_info('peername') - self.socket: TransportSocket = writer.get_extra_info('socket') - self.loop: AbstractEventLoop = asyncio.get_event_loop() + self.addr = sock.getsockname() + self.socket = sock + self.loop = asyncio.get_event_loop() self.alive = True def is_disconnected(self) -> bool: ... def kick(self, reason: str) -> None: ...