from pathlib import PurePath from tinydb import TinyDB, where from dataclasses import dataclass MIN_SKILL = 1 MAX_SKILL = 10 class PlaySession: def __init__(self, database_location: PurePath): self.data = PlayerDatabase(database_location) def start_round(self): ... def end_round(self): ... def end(self): self.data.close() def __str__(self): display_string = "" for player in self.data.get_players(): display_string = display_string + player.__str__() + "\n" return display_string.rstrip() def __del__(self): self.end() @dataclass class Player: first_name: str last_name: str skill: int = 1 status: bool = False wait_time: int = 0 class PlayerDatabase: def __init__(self, database_location: PurePath = PurePath("storage.json")): print(f"Using database location: {database_location.name}") self._database = TinyDB(database_location.name) def get_players(self) -> list[Player]: player_list = [] for row in self._database: player_list.append( Player( first_name=row["first_name"], last_name=row["last_name"], skill=row["skill"], status=row["status"], wait_time=row["wait_time"], ) ) return player_list def activate_player(self, player: Player): self._database.update( {"status": True}, where("first_name") == player.first_name and where("last_name") == player.last_name, ) def deactivate_player(self, player: Player): self._database.update( {"wait_time": False}, where("first_name") == player.first_name and where("last_name") == player.last_name, ) def increment_player_wait(self, player: Player): self._database.update( {"wait_time": 1}, where("first_name") == player.first_name and where("last_name") == player.last_name, ) def reset_player_wait(self, player: Player): self._database.update( {"wait_time": 0}, where("first_name") == player.first_name and where("last_name") == player.last_name, ) def deactivate_all_players(self) -> bool: for row in self._database: row["status"] = False def add_player(self, player: Player) -> bool: self._database.insert( { "first_name": player.first_name, "last_name": player.last_name, "skill": player.skill, "status": player.status, "wait_time": player.wait_time, } ) def remove_player(self, player: Player) -> bool: self._database.remove( where("first_name") == player.first_name and where("last_name") == player.last_name ) def update_player_skill(self, player: Player): self._database.update( {"skill": player.skill}, where("first_name") == player.first_name and where("last_name") == player.last_name, ) def close(self) -> None: self._database.close() def __del__(self): self.close()