This repository has been archived on 2020-03-29. You can view files and clone it, but cannot push or open issues or pull requests.
sampy_archive/sampy/client.py

80 lines
1.9 KiB
Python
Raw Normal View History

2018-09-24 11:37:21 +02:00
import socket
2019-12-14 20:08:34 +01:00
import logging
import struct
2020-03-29 18:45:38 +02:00
from .network.compression import uncompress
from .handlers import serverQueryHandler, mainHandler
from .helpers.byteFormater import readable_bytes
from .server import Server
2019-12-14 20:08:34 +01:00
2020-03-29 18:45:38 +02:00
from . import glob
if glob.config["debug"]:
from importlib import reload
2019-12-14 20:08:34 +01:00
logger = logging.getLogger(__name__)
2018-09-24 11:37:21 +02:00
class Client:
BUFF_SIZE = 65535
HANDLERS = {
2019-12-14 20:08:34 +01:00
b"SAMP": serverQueryHandler.handle
2018-09-24 11:37:21 +02:00
}
2020-03-29 18:45:38 +02:00
def __init__(self, server, addr: "Address"):
2018-09-24 11:37:21 +02:00
self.server = server
2019-12-14 20:08:34 +01:00
self.ip_uint = struct.unpack(b"<I", bytes(int(x) for x in addr[0].split(".")))[0]
2018-09-24 11:37:21 +02:00
self.addr = addr
self.state = 0
2020-03-29 18:45:38 +02:00
2019-12-14 20:08:34 +01:00
self.__writebuffer = bytearray()
2018-09-24 11:37:21 +02:00
2019-12-14 20:08:34 +01:00
def handle_data(self, data: bytes):
2018-09-24 11:37:21 +02:00
found = False
2019-12-14 20:08:34 +01:00
for pattern, handle in self.HANDLERS.items(): # SAMP query
if data.startswith(pattern):
2019-12-14 20:08:34 +01:00
queue = handle(self, data)
2018-09-24 11:37:21 +02:00
if queue:
2020-03-29 18:45:38 +02:00
self.write(queue)
2018-09-24 11:37:21 +02:00
found = True
if not found:
2019-12-14 20:08:34 +01:00
# deobfuscate
try:
data: bytearray = uncompress(data)
logger.debug("[%s] -> %s" % (self.addr, readable_bytes(data)))
queue = mainHandler.handle(self, data)
except Exception as err:
logger.error(err)
finally:
if queue:
2020-03-29 18:45:38 +02:00
self.write(queue)
2018-09-24 11:37:21 +02:00
2020-03-29 18:45:38 +02:00
def write(self, data: bytes):
2019-12-14 20:08:34 +01:00
if type(data) == int:
2018-09-24 11:37:21 +02:00
self.__writebuffer.append(data)
2019-12-14 20:08:34 +01:00
elif type(data) == list:
for item in data:
2020-03-29 18:45:38 +02:00
self.write(item)
2018-09-24 11:37:21 +02:00
else:
self.__writebuffer += data
2019-12-14 20:08:34 +01:00
def get_buffer_size(self) -> int:
2018-09-24 11:37:21 +02:00
return len(self.__writebuffer)
2020-03-29 18:45:38 +02:00
def flush(self):
if not self.get_buffer_size():
return
2019-12-14 20:08:34 +01:00
2020-03-29 18:45:38 +02:00
logger.debug("[%s] <- %s" % (self.addr, readable_bytes(self.__writebuffer)))
self.server.socket.sendto(self.__writebuffer, self.addr)
self.__writebuffer.clear()
2019-12-14 20:08:34 +01:00
def send_immediate(self, data: bytes):
logger.debug("[%s] <- %s" % (self.addr, readable_bytes(data)))
self.server.socket.sendto(data, self.addr)
2018-09-24 11:37:21 +02:00
def restart():
2019-12-14 20:08:34 +01:00
reload(serverQueryHandler)
reload(mainHandler)
mainHandler.restart()