working on clientController : register POC

This commit is contained in:
2024-03-27 18:43:58 +01:00
parent 85308a8007
commit 34c519345e
8 changed files with 136 additions and 26 deletions
+77 -3
View File
@@ -1,15 +1,89 @@
from pydantic import ValidationError
from controller import GameController
from websockets.server import WebSocketServerProtocol
from netcode.models import Message, LoginMessage, MessageData
from game import Player
class Client:
def vibe_check(t):
"""Enforces the selected type for the message"""
def decorator(func):
async def new_f(self, message):
try:
message = t.model_validate_json(message)
return await func(self, message)
except ValidationError as e:
await self.send_error(e.errors())
return new_f
return decorator
class ClientController:
websocket: WebSocketServerProtocol
def __init__(self, websocket: WebSocketServerProtocol):
game_controller: GameController
player: Player
def __init__(
self, game_controller: GameController, websocket: WebSocketServerProtocol
):
self.websocket = websocket
self.on_message = self.login_context
self.game_controller = game_controller
async def listen(self):
"""Initializes the client controller"""
await self.send(Message(type="context", data=MessageData(message="login")))
async for message in self.websocket:
await self.on_message(message)
async def on_message(self, message):
async def send(self, message: Message):
await self.websocket.send(message.model_dump_json())
async def send_error(self, error: str):
await self.send(Message(type="error", data=MessageData(message=error)))
@vibe_check(Message)
async def game_context(self, message: Message):
"""Handles messages when the client is logged in"""
print(message)
@vibe_check(LoginMessage)
async def login_context(self, message: LoginMessage):
"""Handles messages when the client isn't logged in"""
if message.type == "register":
username = message.data.username
if len(username) < 3:
await self.send_error("username must be longer than 3 characters")
return
if self.game_controller.get_player(username) is not None:
await self.send_error("username already exists")
return
player = self.game_controller.create_player(username)
elif message.type == "login":
username = message.data.username
player = self.game_controller.get_player(username)
if player is None:
await self.send_error("player doesn't exists")
return
else:
await self.send_error("invalid message type for context")
return
self.player = player
self.on_message = self.game_context
print("user logged in : " + username)
await self.send(Message(type="context", data=MessageData(message="game")))