diff options
Diffstat (limited to 'swiftstory/client.py')
-rw-r--r-- | swiftstory/client.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/swiftstory/client.py b/swiftstory/client.py new file mode 100644 index 0000000..a84783d --- /dev/null +++ b/swiftstory/client.py @@ -0,0 +1,76 @@ +import asyncio +import logging + +from swiftstory.exception import WrongAction, UnsupportedLanguage, JoinError + + +class Client: + def __init__(self, socket, game_manager): + self.game = None + self.game_manager = game_manager + + self.socket = socket + self.player = None + + def join_game(self, game_name, lang): + if self.game is not None: + raise WrongAction('You are already in a game') + + if lang is None: + lang = 'en' + + try: + game = self.game_manager.join_game(game_name, lang) + except UnsupportedLanguage as e: + raise JoinError(f"unsupported language: {str(e)}") from e + # XXX self.game will be assigned by game.try_join() + + return game.try_join(self) + + def play_white_card(self, card_id): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_play_card(self.player, card_id) + + def pick_black_card(self): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_become_judge(self.player) + + def collect_cards(self): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_collect_cards(self.player) + + def designate_card(self, card_id): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_designate_card(self.player, card_id) + + def view_player_cards(self): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_view_player_cards(self.player) + + def view_played_cards(self): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_view_played_cards(self.player) + + def view_black_card(self): + if self.game is None: + raise WrongAction('You have to join a game first') + return self.game.try_view_black_card(self.player) + + def register_notification(self, message): + async def f(): + try: + await self.socket.send(message) + except websockets.exceptions.ConnectionClosed: + logging.warning("Recipient has disconnected.") + + asyncio.create_task(f()) + + def disconnect(self): + if self.player is not None: + self.game.disconnect(self.player) |