Closes #6; Multiples games in parallel
release-tag / release-image (push) Successful in 22s

This commit is contained in:
2024-05-11 18:16:37 +02:00
parent dc02d9b22f
commit 93949062d6
10 changed files with 307 additions and 103 deletions
+31 -66
View File
@@ -14,6 +14,7 @@ from .auth import discord_process_code
if TYPE_CHECKING:
from controller import GameController
from model import Game
def vibe_check(t):
@@ -50,24 +51,13 @@ class ClientController:
websocket: WebSocketServerProtocol,
):
self.websocket = websocket
self.on_message = self.login_context
self.game_controller = game_controller
self.game_controller.clients.append(self)
self.on_message = lambda _: None
async def listen(self) -> None:
"""Hooks the client to the correct listen callbacks"""
await self.send(
Message(
type=MessageType.CONTEXT,
data_type="game_context_id",
data="login",
)
)
await self.game_controller.announce_game(self.websocket)
async for message in self.websocket:
await self.on_message(message)
async def close(self):
"""Remove self from Game broadcasting list"""
self.game_controller.clients.remove(self)
async def send(self, message: Message) -> None:
"""Send a Message object to the connected client"""
@@ -95,65 +85,33 @@ class ClientController:
Message(type=notification_type, data_type="object", data=data)
)
@vibe_check(LoginMessage)
async def login_context(self, message: LoginMessage) -> None:
"""Handles all messages related to when the current client isn't yet logged in"""
username = message.data
if message.type == MessageType.REGISTER:
async def join_game(
self, game: "Game", username: str, discord_id: str, discord_avatar: str
) -> None:
player = next(
(p for p in game.players if p.discord_id == discord_id),
None,
)
if player is None:
if self.game_controller.game.started:
return await self.send_error(
"you cannot interact with a game that has already started"
)
if len(username) < 3:
return await self.send_error(
"username must be longer than 3 characters"
)
if self.game_controller.game.get_player(username) is not None:
return await self.send_error("username already exists")
player = await self.game_controller.game.create_player(username)
elif message.type == MessageType.LOGIN:
player2 = self.game_controller.game.get_player(username)
if player2 is None:
return await self.send_error("player doesn't exists")
player = player2
elif message.type == MessageType.DISCORD_LOGIN:
user = discord_process_code(message.data)
if user is None:
await self.send_error("discord login not successful")
return
username = user["global_name"]
player = next(
(
p
for p in self.game_controller.game.players
if p.discord_id == user["id"]
),
None,
)
if player is None:
if self.game_controller.game.started:
return await self.send_error(
"you cannot interact with a game that has already started"
)
player = await self.game_controller.game.create_player(username)
player.discord_id = user["id"]
player.image = (
"https://cdn.discordapp.com/avatars/"
+ user["id"]
+ "/"
+ user["avatar"]
+ ".webp"
)
else:
return await self.send_error("invalid message type for context")
player.discord_id = discord_id
player.image = (
"https://cdn.discordapp.com/avatars/"
+ discord_id
+ "/"
+ discord_avatar
+ ".webp"
)
self.player = player
self.player.team.listeners.append(self.send_announce_dict)
if self.game_controller.game.started:
self.on_message = self.game_context
await self.send(
@@ -188,6 +146,13 @@ class ClientController:
data=self.player.uuid,
)
)
await self.send(
Message(
type=MessageType.SET,
data_type="current_game",
data=self.player.game.uuid,
)
)
@vibe_check(Message)
async def pregame_context(self, message: Message) -> None: