tournament_handler.py
TournamentHandler
¶
Handles a tournament's generation and progression.
Attributes:
| Name | Type | Description |
|---|---|---|
tournament |
Tournament |
Corresponding tournament object. |
generator |
TournamentGenerator |
Object to generate matchmaking. |
current_round_num |
int |
Number of the round currently played. |
current_round_id |
int |
Unique id of the round currently played. |
current_match_num |
int |
Number of the match currently played. |
current_match_id |
int |
Unique id of the match currently played. |
__init__(self, tournament_id)
special
¶
Constructor for TournamentHandler.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
tournament_id |
int |
Unique id of the tournament to be resumed. |
required |
Source code in controller/tournament_handler.py
def __init__(self, tournament_id: int):
"""Constructor for TournamentHandler.
Args:
tournament_id (int): Unique id of the tournament to be resumed.
"""
self.tournament = DatabaseHandler().database.tournaments[tournament_id]
self.generator = TournamentGenerator(players=self.tournament.players)
self.current_round_num = 0
self.current_round_id = 0
self.current_match_num = 0
self.current_match_id = 0
self.resume_tournament()
create_round(self)
¶
Creates a new round and its matches based on current tournament progression.
Source code in controller/tournament_handler.py
def create_round(self):
"""Creates a new round and its matches based on current tournament progression."""
if len(self.tournament.rounds) == 0:
matches = self.generator.generate_first_round()
else:
all_matches_list = DatabaseHandler().helper.get_all_matches(tournament=self.tournament)
matches = self.generator.generate_other_round(
matches=all_matches_list, leaderboard=self.tournament.leaderboard
)
round_id = DatabaseHandler().create_round(
round_number=len(self.tournament.rounds) + 1, tournament_id=self.tournament.id_num
)
self.current_round_id = round_id
for players in matches:
DatabaseHandler().create_match(
players=players, tournament_id=self.tournament.id_num, round_id=round_id, winner=None
)
is_round_finished(self, round_)
¶
Verifies if a round is finished by iterating through its matches' winners.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
round_ |
Round |
Round object to be verified. |
required |
Returns:
| Type | Description |
|---|---|
bool |
Match is finished. |
Source code in controller/tournament_handler.py
def is_round_finished(self, round_: Round):
"""Verifies if a round is finished by iterating through its matches' winners.
Args:
round_ (Round): Round object to be verified.
Returns:
bool: Match is finished.
"""
matches = round_.matches
for match_id in matches:
match_object = self.tournament.rounds[round_.id_num].matches[match_id]
if match_object.winner is None:
return False
return True
is_tournament_finished(self)
¶
Verifies if a tournament is finished by iterating through its rounds.
Returns:
| Type | Description |
|---|---|
bool |
Tournament is finished. |
Source code in controller/tournament_handler.py
def is_tournament_finished(self):
"""Verifies if a tournament is finished by iterating through its rounds.
Returns:
bool: Tournament is finished.
"""
if len(self.tournament.rounds) < self.tournament.number_of_rounds:
return False
for round_id in self.tournament.rounds:
round_object = self.tournament.rounds[round_id]
if not self.is_round_finished(round_=round_object):
return False
DatabaseHandler().database.tournaments[self.tournament.id_num].is_finished = True
DatabaseHandler().save_tournament(tournament=DatabaseHandler().database.tournaments[self.tournament.id_num])
return True
load_rounds_and_matches(self)
¶
Uses database handler to load tournament's rounds and matches objects into memory.
Source code in controller/tournament_handler.py
def load_rounds_and_matches(self):
"""Uses database handler to load tournament's rounds and matches objects into memory."""
DatabaseHandler().load_rounds(tournament_id=self.tournament.id_num)
DatabaseHandler().load_matches(tournament_id=self.tournament.id_num)
match_generator(self)
¶
Returns a new match until tournament completion.
Returns:
| Type | Description |
|---|---|
Match |
Next match to be played. |
Source code in controller/tournament_handler.py
def match_generator(self):
"""Returns a new match until tournament completion.
Returns:
Match: Next match to be played.
"""
self.update_tournament_progression()
current_round = self.tournament.rounds[self.current_round_id]
if self.is_round_finished(round_=current_round):
if self.is_tournament_finished():
return None
self.create_round()
self.update_tournament_progression()
current_round = self.tournament.rounds[self.current_round_id]
return current_round.matches[self.current_match_id]
resume_tournament(self)
¶
Creates the first round if needed and requests a first progression update.
Source code in controller/tournament_handler.py
def resume_tournament(self):
"""Creates the first round if needed and requests a first progression update."""
self.load_rounds_and_matches()
if len(self.tournament.rounds) == 0:
self.create_round()
self.update_tournament_progression()
save_winner(self, match, winner)
¶
Takes the winner input by the user and saves it to the database.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
match |
Match |
Match to be considered. |
required |
winner |
str |
Input of the user. |
required |
Source code in controller/tournament_handler.py
def save_winner(self, match: Match, winner: str):
"""Takes the winner input by the user and saves it to the database.
Args:
match (Match): Match to be considered.
winner (str): Input of the user.
"""
if winner == "1":
winner = 1
DatabaseHandler().update_leaderboard(
tournament_id=match.tournament_id, player_id=match.player_1.id_num, points_earned=1
)
elif winner == "2":
winner = 2
DatabaseHandler().update_leaderboard(
tournament_id=match.tournament_id, player_id=match.player_2.id_num, points_earned=1
)
elif winner == "nul":
winner = 0
DatabaseHandler().update_leaderboard(
tournament_id=match.tournament_id, player_id=match.player_1.id_num, points_earned=0.5
)
DatabaseHandler().update_leaderboard(
tournament_id=match.tournament_id, player_id=match.player_2.id_num, points_earned=0.5
)
self.tournament.rounds[self.current_round_id].matches[match.id_num].winner = winner
DatabaseHandler().save_match(self.tournament.rounds[self.current_round_id].matches[match.id_num])
update_current_match(self)
¶
Updates current match number and unique id based on round's matches completion.
Source code in controller/tournament_handler.py
def update_current_match(self):
"""Updates current match number and unique id based on round's matches completion."""
self.current_match_num = 0
current_round = self.tournament.rounds[self.current_round_id]
# Search if a match is not yet finished
for match in current_round.matches:
self.current_match_num += 1
if current_round.matches[match].winner is None:
self.current_match_id = current_round.matches[match].id_num
return
# If all round's matches are finished, arbitrarily take the first match
# as none of them will be played.
first_match_id = list(current_round.matches.keys())[0]
self.current_match_id = first_match_id
update_current_round(self)
¶
Updates current round number and unique id based on tournament's rounds completion.
Source code in controller/tournament_handler.py
def update_current_round(self):
"""Updates current round number and unique id based on tournament's rounds completion."""
for round_id in self.tournament.rounds:
round_object = self.tournament.rounds[round_id]
if not self.is_round_finished(round_=round_object):
self.current_round_id = round_object.id_num
self.current_round_num = round_object.round_number
else:
if round_object.round_number > self.current_round_num:
self.current_round_num = round_object.round_number
self.current_round_id = round_object.id_num
update_tournament_progression(self)
¶
Requests an update on tournament's rounds and matches progession.
Source code in controller/tournament_handler.py
def update_tournament_progression(self):
"""Requests an update on tournament's rounds and matches progession."""
self.update_current_round()
self.update_current_match()