from dataclasses import dataclass import logging import os from typing import Dict, List from swiftstory.exception import UnsupportedLanguage from swiftstory.game import Game from swiftstory.cards import Cards @dataclass class LangContainer: """ Container for game ojects in a given language. """ black_cards: List[str] white_cards: List[str] games: Dict[str, Game] class GameManager: def __init__(self) -> None: self.lang_containers: Dict[str, LangContainer] = {} for language in self.list_languages(): self.lang_containers[language] = LangContainer( black_cards=Cards.get_black_cards(language), white_cards=Cards.get_white_cards(language), games={} ) def list_languages(self) -> List[str]: """ List available languages based on FS. """ return next(os.walk("usr/share/swiftstory/lang"))[1] def join_game(self, game_name: str, lang: str) -> Game: container = self.lang_containers.get(lang) if container is None: raise UnsupportedLanguage(lang) games = container.games black_cards = container.black_cards white_cards = container.white_cards game = games.get(game_name) if game is None: logging.info("Starting new game: %s (lang: %s)", game_name, lang) game = games[game_name] = Game(white_cards, black_cards) return game