diff --git a/src/controller/client.py b/src/controller/client.py index be0d487..b89bf1b 100644 --- a/src/controller/client.py +++ b/src/controller/client.py @@ -6,7 +6,7 @@ from controller import GameControllerInterface, ClientControllerInterface from netcode.models import Message, LoginMessage -from model import Player +from model import Player, Team def vibe_check(t): @@ -69,9 +69,9 @@ class ClientController(ClientControllerInterface): self, notification_type: str, data: dict, - client_filter: Callable[["ClientController"], Any] = lambda x: True, + player_filter: Callable[[Player], Any] = lambda x: True, ): - if client_filter(self): + if hasattr(self, "player") is False or player_filter(self.player): await self.send( Message(type=notification_type, data_type="object", data=data) ) diff --git a/src/controller/game.py b/src/controller/game.py index 0a4be6b..41ec8db 100644 --- a/src/controller/game.py +++ b/src/controller/game.py @@ -36,12 +36,11 @@ class GameController(GameControllerInterface): self, notification_type: str, data: dict, - client_filter: Callable[["ClientController"], Any], + player_filter: Callable[[Player], Any], ): messages = [] for c in self.clients: - - if client_filter(c): + if hasattr(c, "player") is False or player_filter(c.player): messages.append( c.send( Message( diff --git a/src/controller/interfaces.py b/src/controller/interfaces.py index 5b13630..9eb4685 100644 --- a/src/controller/interfaces.py +++ b/src/controller/interfaces.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from typing import Callable, Any, List -from model import Game +from model import Game, Player from netcode import WSServer from netcode.models import Message, LoginMessage from netcode.ws_server import WebSocketServerProtocol @@ -25,7 +25,7 @@ class ClientControllerInterface(ABC): self, notification_type: str, data: dict, - client_filter: Callable = lambda x: True, + player_filter: Callable[[Player], bool] = lambda x: True, ): pass @@ -69,7 +69,7 @@ class GameControllerInterface(ABC): self, notification_type: str, data: dict, - client_filter: Callable[[ClientControllerInterface], Any], + player_filter: Callable[[Player], Any], ): pass diff --git a/src/model/game.py b/src/model/game.py index 6fa3456..bfc6b94 100644 --- a/src/model/game.py +++ b/src/model/game.py @@ -3,9 +3,7 @@ from typing import List import random from model import ( Card, - CardType, CardRole, - CardFaction, CardParser, Player, Team, @@ -87,7 +85,6 @@ class Game(Serializable): async def create_card(self, card: Card) -> Card: self.cards.append(card) await self.notify_controller("create", card.serialize_guest()) - return card async def create_base_deck(self, base_deck_name: str = "base") -> List[Card]: @@ -120,7 +117,7 @@ class Game(Serializable): if team is None: team = await self.create_team() - player = Player(username, team) + player = Player(self, username, team) self.players.append(player) player.stack_pile = await self.create_base_deck("base") @@ -152,8 +149,7 @@ class Game(Serializable): await self.notify_controller("update", self.serialize_guest()) def serialize_guest(self) -> dict: - return super().serialize_guest() | { - "loaded_cards": None, + data = super().serialize_guest() | { "cards": [card.uuid for card in self.cards], "market_stack": [None for card in self.market_stack], "market": [None if card is None else card.uuid for card in self.market], @@ -165,6 +161,8 @@ class Game(Serializable): "turn": None if self.turn is None else self.turn.uuid, } + return {k: data[k] for k in data.keys() - ["loaded_cards"]} + async def start_game(self): self.started = True self.turn = random.choice(self.teams) @@ -183,26 +181,6 @@ class Game(Serializable): notifications = [] - # Send cards in hand to teams - - # TODO : Migrate this to player (when player draw) - for p in self.players: - notifications.append(p.team.notify_controller("update", p.serialize_team())) - # for t in self.teams: - # current_team = [p for p in self.players if p.team == t] - # for p in current_team: - # for o in current_team: - # notifications.append( - # p.notify_controller("update", o.serialize_team()) - # ) - - # Send cards in hand to all others - for p in self.players: - for o in self.players: - if p.team == o.team: - continue - notifications.append(p.notify_controller("update", o.serialize_guest())) - await asyncio.gather(*notifications) print( diff --git a/src/model/serializable.py b/src/model/serializable.py index 6f7c658..acaf6a6 100644 --- a/src/model/serializable.py +++ b/src/model/serializable.py @@ -26,7 +26,8 @@ class Serializable: self, notification_type: str, game_object: dict, - client_filter: Callable = lambda _: True, + # TODO : Player interface to typing + player_filter: Callable[[Any], bool] = lambda _: True, ): for l in self.listeners: - await l(notification_type, game_object, client_filter) + await l(notification_type, game_object, player_filter) diff --git a/src/netcode/ws_server.py b/src/netcode/ws_server.py index 7f322ae..ee8806a 100644 --- a/src/netcode/ws_server.py +++ b/src/netcode/ws_server.py @@ -8,7 +8,9 @@ class WSServer: """Handles Client-Server communication""" connections: Set[WebSocketServerProtocol] - on_new_connection_callback: Callable[[WebSocketServerProtocol], None] + on_new_connection_callback: Callable[ + [WebSocketServerProtocol, Callable[[Any], Awaitable[None]]], Awaitable[None] + ] port: int