from pathlib import PurePath from tinydb import TinyDB, where from dataclasses import dataclass from random import randint MIN_SKILL = 1 MAX_SKILL = 10 class PlaySession: def __init__(self, database_location: PurePath): self.data = PlayerDatabase(database_location) def get_matches(self, number_of_courts: int = 4): player_list = self.data.get_players() game_list = [] for i in range(number_of_courts): game_list.append( Game( court_number=i + 1, team_1=Team( player_1=player_list[randint(0, len(player_list) - 1)], player_2=player_list[randint(0, len(player_list) - 1)], ), team_2=Team( player_1=player_list[randint(0, len(player_list) - 1)], player_2=player_list[randint(0, len(player_list) - 1)], ), ) ) return game_list 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 def get_name(self): return self.first_name + " " + self.last_name @dataclass class Team: player_1: Player player_2: Player def __str__(self): return self.player_1.get_name() + " & " + self.player_2.get_name() @dataclass class Game: court_number: int team_1: Team team_2: Team 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()