adjusted tournaments to work on the same schedule system as leagues

This commit is contained in:
Sakimori 2021-01-15 03:18:41 -05:00
parent 8d6f6ab33a
commit e77e406470
2 changed files with 131 additions and 22 deletions

View File

@ -52,30 +52,30 @@ class league_structure(object):
standings[team_name] = {"wins" : wins, "losses" : losses, "run_diff" : run_diff} standings[team_name] = {"wins" : wins, "losses" : losses, "run_diff" : run_diff}
for subleague in iter(self.league.keys()): for subleague in iter(self.league.keys()):
team_dic = {} team_dic = {}
division_leaders = []
subleague_array = [] subleague_array = []
wildcard_leaders = [] wildcard_leaders = []
for division in iter(self.league[subleague].keys()): for division in iter(self.league[subleague].keys()):
division_standings = []
division_standings += self.division_standings(self.league[subleague][division], standings) division_standings += self.division_standings(self.league[subleague][division], standings)
for division_team in division_standings: division_leaders = division_standings[:self.constraints["division_leaders"]]
if division_team.name != division_standings[self.constraints["division_leaders"]-1].name and standings[division_team.name]["wins"] == standings[division_standings[self.constraints["division_leaders"]-1].name]["wins"]: for division_team, wins, losses, diff, gb in division_standings[self.constraints["division_leaders"]:]:
matchups.append((division_team, division_standings[self.constraints["division_leaders"]-1]), f"{division} Tiebreaker") if division_team.name != division_leaders[-1][0].name and standings[division_team.name]["wins"] == standings[division_leaders[-1][0].name]["wins"]:
matchups.append((division_team, division_standings[self.constraints["division_leaders"]-1][0], f"{division} Tiebreaker"))
this_div_wildcard = [this_team for this_team, wins, losses, diff, gb in self.division_standings(self.league[subleague][division], standings)[self.constraints["division_leaders"]:]] this_div_wildcard = [this_team for this_team, wins, losses, diff, gb in self.division_standings(self.league[subleague][division], standings)[self.constraints["division_leaders"]:]]
subleague_array += this_div_wildcard subleague_array += this_div_wildcard
if self.constraints["wild_cards"] > 0: if self.constraints["wild_cards"] > 0:
wildcard_standings = self.division_standings(subleague_array, standings) wildcard_standings = self.division_standings(subleague_array, standings)
for wildcard_team in wildcard_standings: wildcard_leaders = wildcard_standings[:self.constraints["wild_cards"]]
if wildcard_team.name != wildcard_standings[self.constraints["wild_cards"]-1].name and standings[wildcard_team.name]["wins"] == standings[wildcard_standings[self.constraints["wild_cards"]-1].name]["wins"]: for wildcard_team, wins, losses, diff, gb in wildcard_standings[self.constraints["wild_cards"]:]:
matchups.append((wildcard_team, wildcard_standings[self.constraints["wild_cards"]-1]), f"{subleague} Wildcard Tiebreaker") if wildcard_team.name != wildcard_leaders[-1][0].name and standings[wildcard_team.name]["wins"] == standings[wildcard_leaders[-1][0].name]["wins"]:
matchups.append((wildcard_team, wildcard_standings[self.constraints["wild_cards"]-1][0], f"{subleague} Wildcard Tiebreaker"))
for this_team, wins, losses, diff, gb in divison_leaders + wildcard_leaders:
team_dic[this_team] = {"wins" : wins}
for team_a, team_b, type in matchups: for team_a, team_b, type in matchups:
tourney = tournament(f"{league.name} {type}",{team_a : {"wins" : 1}, team_b : {"wins" : 0}}, secs_between_games=int(3600/self.games_per_hour), secs_between_rounds=int(7200/self.games_per_hour)) tourney = tournament(f"{self.name} {type}",{team_a : {"wins" : 1}, team_b : {"wins" : 0}}, finals_series_length=1, secs_between_games=int(3600/self.games_per_hour), secs_between_rounds=int(7200/self.games_per_hour))
tourney.build_bracket(by_wins = True) tourney.build_bracket(by_wins = True)
tourney.league = self
tournaments.append(tourney) tournaments.append(tourney)
return tournaments return tournaments
@ -310,11 +310,12 @@ class league_structure(object):
if self.constraints["wild_cards"] > 0: if self.constraints["wild_cards"] > 0:
wildcard_leaders = self.division_standings(subleague_array, standings)[:self.constraints["wild_cards"]] wildcard_leaders = self.division_standings(subleague_array, standings)[:self.constraints["wild_cards"]]
for this_team, wins, losses, diff, gb in divison_leaders + wildcard_leaders: for this_team, wins, losses, diff, gb in division_leaders + wildcard_leaders:
team_dic[this_team] = {"wins" : wins} team_dic[this_team] = {"wins" : wins}
subleague_tournament = tournament(f"{self.name} {subleague} Championship Series", team_dic, secs_between_games=int(3600/self.games_per_hour), secs_between_rounds=int(7200/self.games_per_hour)) subleague_tournament = tournament(f"{self.name} {subleague} Championship Series", team_dic, secs_between_games=int(3600/self.games_per_hour), secs_between_rounds=int(7200/self.games_per_hour))
subleague_tournament.build_bracket(by_wins = True) subleague_tournament.build_bracket(by_wins = True)
subleague_tournament.league = self
tournaments.append(subleague_tournament) tournaments.append(subleague_tournament)
return tournaments return tournaments
@ -334,6 +335,7 @@ class tournament(object):
self.round_delay = secs_between_rounds self.round_delay = secs_between_rounds
self.finals = False self.finals = False
self.id = id self.id = id
self.league = None
self.winner = None self.winner = None
if id is None: if id is None:

View File

@ -809,7 +809,7 @@ Plays a league with a given name, provided that league has been saved on the web
elif league.day % league.series_length == 1: elif league.day % league.series_length == 1:
await start_league_day(msg.channel, league) await start_league_day(msg.channel, league)
else: else:
await start_league_day(msg.channel, league, partial = True)
else: else:
await msg.channel.send("Couldn't find that league, boss. Did you save it on the website?") await msg.channel.send("Couldn't find that league, boss. Did you save it on the website?")
@ -1156,7 +1156,15 @@ async def start_tournament_round(channel, tourney, seeding = None):
for pair in games_to_start: for pair in games_to_start:
if pair[0] is not None and pair[1] is not None: if pair[0] is not None and pair[1] is not None:
this_game = games.game(pair[0].prepare_for_save().finalize(), pair[1].prepare_for_save().finalize(), length = tourney.game_length) team_a = get_team_fuzzy_search(pair[0].name)
team_b = get_team_fuzzy_search(pair[1].name)
if tourney.league is not None:
team_a.set_pitcher(rotation_slot = tourney.league.day)
team_b.set_pitcher(rotation_slot = tourney.league.day)
league.day += 1
this_game = games.game(team_a.finalize(), team_b.finalize(), length = tourney.game_length)
this_game, state_init = prepare_game(this_game) this_game, state_init = prepare_game(this_game)
state_init["is_league"] = True state_init["is_league"] = True
@ -1187,6 +1195,12 @@ async def continue_tournament_series(tourney, queue, games_list, wins_in_series)
for oldgame in queue: for oldgame in queue:
away_team = games.get_team(oldgame.teams["away"].name) away_team = games.get_team(oldgame.teams["away"].name)
home_team = games.get_team(oldgame.teams["home"].name) home_team = games.get_team(oldgame.teams["home"].name)
if tourney.league is not None:
away_team.set_pitcher(rotation_slot = tourney.league.day)
home_team.set_pitcher(rotation_slot = tourney.league.day)
league.day += 1
this_game = games.game(away_team.finalize(), home_team.finalize(), length = tourney.game_length) this_game = games.game(away_team.finalize(), home_team.finalize(), length = tourney.game_length)
this_game, state_init = prepare_game(this_game) this_game, state_init = prepare_game(this_game)
@ -1250,8 +1264,32 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
if len(queued_games) > 0: if len(queued_games) > 0:
await channel.send(f"The next batch of games for {tourney.name} will start in {int(tourney.delay/60)} minutes.")
await asyncio.sleep(tourney.delay) if tourney.league is not None:
now = datetime.datetime.now()
validminutes = [int((60 * div)/tourney.league.games_per_hour) for div in range(0,tourney.league.games_per_hour)]
for i in range(0, len(validminutes)):
if now.minute > validminutes[i]:
if i <= len(validminutes)-3:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (validminutes[i+2] - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
elif i <= len(validminutes)-2:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (60 - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
else:
delta = datetime.timedelta(minutes= (60 - now.minute))
next_start = (now + delta).replace(microsecond=0)
wait_seconds = (next_start - now).seconds
await channel.send(f"The next batch of games for {tourney.name} will start in {math.ceil(wait_seconds/60)} minutes.")
await asyncio.sleep(wait_seconds)
else:
await channel.send(f"The next batch of games for {tourney.name} will start in {int(tourney.delay/60)} minutes.")
await asyncio.sleep(tourney.delay)
await channel.send(f"{len(queued_games)} games for {tourney.name}, starting at {filter_url}") await channel.send(f"{len(queued_games)} games for {tourney.name}, starting at {filter_url}")
games_list = await continue_tournament_series(tourney, queued_games, games_list, wins_in_series) games_list = await continue_tournament_series(tourney, queued_games, games_list, wins_in_series)
else: else:
@ -1269,11 +1307,37 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
winners_string = "" winners_string = ""
for game in tourney.bracket.get_bottom_row(): for game in tourney.bracket.get_bottom_row():
winners_string += f"{game[0].name}\n{game[1].name}\n" winners_string += f"{game[0].name}\n{game[1].name}\n"
await channel.send(f"""
if tourney.league is not None:
now = datetime.datetime.now()
validminutes = [int((60 * div)/tourney.league.games_per_hour) for div in range(0,tourney.league.games_per_hour)]
for i in range(0, len(validminutes)):
if now.minute > validminutes[i]:
if i <= len(validminutes)-3:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (validminutes[i+2] - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
elif i <= len(validminutes)-2:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (60 - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
else:
delta = datetime.timedelta(minutes= (60 - now.minute))
next_start = (now + delta).replace(microsecond=0)
wait_seconds = (next_start - now).seconds
await channel.send(f"""This round of games for {tourney.name} is now complete! The next round will start in {math.ceil(wait_seconds/60)} minutes.
Advancing teams:
{winners_string}""")
await asyncio.sleep(wait_seconds)
else:
await channel.send(f"""
This round of games for {tourney.name} is now complete! The next round will be starting in {int(tourney.round_delay/60)} minutes. This round of games for {tourney.name} is now complete! The next round will be starting in {int(tourney.round_delay/60)} minutes.
Advancing teams: Advancing teams:
{winners_string}""") {winners_string}""")
await asyncio.sleep(tourney.round_delay) await asyncio.sleep(tourney.round_delay)
await start_tournament_round(channel, tourney) await start_tournament_round(channel, tourney)
@ -1658,6 +1722,27 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
if last: #if last game of the season if last: #if last game of the season
now = datetime.datetime.now()
validminutes = [int((60 * div)/league.games_per_hour) for div in range(0,league.games_per_hour)]
for i in range(0, len(validminutes)):
if now.minute > validminutes[i]:
if i <= len(validminutes)-3:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (validminutes[i+2] - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
elif i <= len(validminutes)-2:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (60 - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
else:
delta = datetime.timedelta(minutes= (60 - now.minute))
next_start = (now + delta).replace(microsecond=0)
wait_seconds = (next_start - now).seconds
await channel.send(f"This {league.name} season is now over! The postseason (with any necessary tiebreakers) will be starting in {math.ceil(wait_seconds/60)} minutes.")
await asyncio.sleep(wait_seconds)
await league_postseason(channel, league) await league_postseason(channel, league)
#need to reset league to new season here #need to reset league to new season here
@ -1732,14 +1817,36 @@ async def league_postseason(channel, league):
tiebreakers = league.tiebreaker_required() tiebreakers = league.tiebreaker_required()
if tiebreakers != []: if tiebreakers != []:
await channel.send("Tiebreakers required!") await channel.send("Tiebreakers required!")
await asyncio.gather(*[start_tournament_round(tourney) for tourney in tiebreakers]) await asyncio.gather(*[start_tournament_round(channel, tourney) for tourney in tiebreakers])
for tourney in tiebreakers: for tourney in tiebreakers:
league.update_standings({tourney.winner.name : {"wins" : 1}}) league.update_standings({tourney.winner.name : {"wins" : 1}})
leagues.save_league(league) leagues.save_league(league)
now = datetime.datetime.now()
validminutes = [int((60 * div)/league.games_per_hour) for div in range(0,league.games_per_hour)]
for i in range(0, len(validminutes)):
if now.minute > validminutes[i]:
if i <= len(validminutes)-3:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (validminutes[i+2] - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
elif i <= len(validminutes)-2:
if validminutes[i+1] == now.minute:
delta = datetime.timedelta(minutes= (60 - now.minute))
else:
delta = datetime.timedelta(minutes= (validminutes[i+1] - now.minute))
else:
delta = datetime.timedelta(minutes= (60 - now.minute))
next_start = (now + delta).replace(microsecond=0)
wait_seconds = (next_start - now).seconds
await channel.send(f"Tiebreakers complete! Postseason starting in {math.ceil(wait_seconds/60)} minutes.")
await asyncio.sleep(wait_seconds)
await channel.send("Setting up postseason...")
tourneys = league.champ_series() tourneys = league.champ_series()
await asyncio.gather(*[start_tournament_round(tourney) for tourney in tourneys]) await asyncio.gather(*[start_tournament_round(channel, tourney) for tourney in tourneys])
champs = {} champs = {}
for tourney in tourneys: for tourney in tourneys:
for team in tourney.teams.keys(): for team in tourney.teams.keys():