Archived
working on clientController : register POC
This commit is contained in:
@@ -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")))
|
||||
|
||||
Reference in New Issue
Block a user