36 lines
1.0 KiB
Python
36 lines
1.0 KiB
Python
import struct
|
|
import socket
|
|
|
|
from . import base
|
|
from . import query
|
|
from . import player
|
|
|
|
from ..struct.server import ServerConfig
|
|
|
|
STATE_UNKNOWN = (0, base.BaseClient)
|
|
STATE_QUERY = (1, query.QueryClient)
|
|
STATE_PLAYER = (2, player.PlayerClient)
|
|
|
|
class Client:
|
|
def __init__(self, config: ServerConfig, socket: socket.socket, ip: str, port: int):
|
|
self.config = config
|
|
self.socket = socket
|
|
self.ip = ip
|
|
self.port = port
|
|
|
|
self.set_state(STATE_UNKNOWN)
|
|
|
|
def set_state(self, state: tuple):
|
|
self.state = state
|
|
self.client = self.state[1](self.config, self.socket, self.ip, self.port)
|
|
|
|
async def on_packet(self, packet: bytes):
|
|
if self.state == STATE_UNKNOWN:
|
|
# We are currently unaware if this is a player client or query client, but we got a packet that will be our check to know
|
|
if packet.startswith(b"SAMP"):
|
|
self.set_state(STATE_QUERY)
|
|
else:
|
|
self.set_state(STATE_PLAYER)
|
|
|
|
await self.client.on_packet(packet)
|