diff options
| author | Karan Jayachandra <mail@karanjayachandra.com> | 2024-11-09 18:19:48 +0000 |
|---|---|---|
| committer | Karan Jayachandra <mail@karanjayachandra.com> | 2024-11-09 18:19:48 +0000 |
| commit | 1a7ae4bc2b759de7a03e6ad83632e6ad678754c8 (patch) | |
| tree | 5b771e755f3a55c6794c649431de35798242a2e0 /src/match_up/model.py | |
| parent | 2b18e0929a0b3e083cbe9e5e8ffd421ed8d17e52 (diff) | |
| parent | 75a3ef7d14fcaedab29da46ba3dc5cf9c1bab699 (diff) | |
Merge branch 'feature/package' into 'develop'
Implemented packaging and command line arguments
See merge request KaranJayachandra/match_up!10
Diffstat (limited to 'src/match_up/model.py')
| -rw-r--r-- | src/match_up/model.py | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/src/match_up/model.py b/src/match_up/model.py new file mode 100644 index 0000000..5d6c0f5 --- /dev/null +++ b/src/match_up/model.py @@ -0,0 +1,123 @@ +from math import floor +from csv import reader +from typing import Tuple +from names import get_full_name +from dataclasses import dataclass +from random import randint, getrandbits + +MIN_LEVEL = 1 +MAX_LEVEL = 10 +DEFAULT_COURTS = 12 +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 = DEFAULT_COURTS + + 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 + + +def _load_csv_players(file_name: str) -> dict: + with open(file_name, newline="") as file: + pointer = reader(file) + next(pointer, None) + players = {id: Player(row[0], int(row[1])) for id, row in enumerate(pointer)} + return players + + +def _generate_random_players(player_count: int = 80) -> list[Player]: + players = { + i: Player( + name=get_full_name(), + skill=randint(MIN_LEVEL, MAX_LEVEL), + status=bool(getrandbits(1)), + ) + for i in range(player_count) + } + return players + + +@dataclass +class PlayerList: + location: str = None + guests: int = 0 + + def __post_init__(self) -> None: + if self.location is not None: + self.players = _load_csv_players(self.location) + else: + self.players = _generate_random_players() + self.guest_id_start = len(self.players) + 1 + + 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 |
