from math import floor from csv import reader from typing import Tuple from time import time, strftime from dataclasses import dataclass MIN_LEVEL = 1 MAX_LEVEL = 10 PLAYER_PER_COURT = 4 @dataclass class Player: name: str skill: int = 1 status: bool = False @dataclass class Team: player1: str player2: str @dataclass class Game: court: int team1: Team team2: Team @dataclass class CourtList: total: int def __post_init__(self) -> None: self.courts = {i + 1: True for i in range(self.total)} def get_court_status(self, court_number: int) -> bool: return self.courts[court_number] def toggle_court_status(self, court_number: int) -> None: new_status = not self.courts[court_number] self.courts[court_number] = new_status return new_status def get_courts(self) -> dict: return self.courts def separate_courts(self) -> Tuple[dict, dict]: active_courts = {k: v for k, v in self.courts.items() if v} inactive_courts = {k: v for k, v in self.courts.items() if not v} return active_courts, inactive_courts @dataclass class PlayerList: location: str guests: int = 0 def __post_init__(self) -> None: with open("data/" + self.location, newline="") as file: pointer = reader(file) next(pointer, None) players = { id: Player(row[0], int(row[1])) for id, row in enumerate(pointer) } self.guest_id_start = len(players) + 1 self.players = players def increment_guests(self): self.guests = self.guests + 1 return self.guests def decrement_guests(self): if self.guests == 0: return 0 self.guests = self.guests - 1 return self.guests def get_player_status(self, player_number: int) -> bool: return self.players[player_number].status def toggle_player_status(self, player_number: int) -> Tuple[bool, str]: new_status = not self.players[player_number].status self.players[player_number].status = new_status return new_status, self.players[player_number].name def get_players(self) -> dict: return self.players def get_possible_game_count(self) -> int: total_players = len(self.get_potential_players()) possible_games = floor(total_players / PLAYER_PER_COURT) return possible_games def get_potential_players(self) -> dict: players = {k: v for k, v in self.players.items() if v.status} guests = { self.guest_id_start + k: Player(name=f"Guest {k}") for k in range(1, self.guests + 1) } players.update(guests) return players @dataclass class Timer: ref: float = None running: bool = False max_mins: int = 1 default: str = ("00", "00") def __post_init__(self): self.max_seconds = self.max_mins * 60 def start(self): self.ref = time() + self.max_seconds self.running = True def stop(self): self.ref = None self.running = False def get(self): if not self.running: return self.default total_seconds = self.ref - time() if total_seconds < 0: self.stop() return self.default mins = f"{int(total_seconds // 60):02d}" secs = f"{int(total_seconds % 60):02d}" print(mins) print(secs) return mins, secs