Mi2dRPGamEng/engine/network/client.py

44 lines
1.5 KiB
Python

from __future__ import annotations
import asyncio
import json
from engine.network.protocol import DEFAULT_PORT, encode_message
class GameClient:
"""Minimal TCP client for GameServer: sends hello/move, receives broadcasts from other players."""
def __init__(self, entity_id: str, name: str, host: str = "127.0.0.1", port: int = DEFAULT_PORT):
self.entity_id = entity_id
self.name = name
self.host = host
self.port = port
self._reader: asyncio.StreamReader | None = None
self._writer: asyncio.StreamWriter | None = None
async def connect(self) -> None:
self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
await self.send({"type": "hello", "entity_id": self.entity_id, "name": self.name})
async def send(self, message: dict) -> None:
assert self._writer is not None
self._writer.write(encode_message(message))
await self._writer.drain()
async def send_move(self, map_id: str, x: int, y: int, z: int) -> None:
await self.send({"type": "move", "entity_id": self.entity_id, "map_id": map_id, "x": x, "y": y, "z": z})
async def receive(self) -> dict | None:
assert self._reader is not None
line = await self._reader.readline()
if not line:
return None
return json.loads(line)
async def close(self) -> None:
if self._writer is not None:
self._writer.close()
await self._writer.wait_closed()
self._writer = None