Archived
This commit is contained in:
+31
-66
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user