fixes #223: can subscribe to league feeds in arbitrary channels
This commit is contained in:
parent
5198a0aa40
commit
e7f2a8585a
|
@ -146,6 +146,7 @@ def save_league(league):
|
||||||
state_dic = {
|
state_dic = {
|
||||||
"season" : league.season,
|
"season" : league.season,
|
||||||
"day" : league.day,
|
"day" : league.day,
|
||||||
|
"subs" : league.subbed_channels,
|
||||||
"last_weather_event" : league.last_weather_event_day,
|
"last_weather_event" : league.last_weather_event_day,
|
||||||
"constraints" : league.constraints,
|
"constraints" : league.constraints,
|
||||||
"game_length" : league.game_length,
|
"game_length" : league.game_length,
|
||||||
|
|
|
@ -23,6 +23,7 @@ class league_structure(object):
|
||||||
self.last_weather_event_day = 0
|
self.last_weather_event_day = 0
|
||||||
self.weather_event_duration = 0
|
self.weather_event_duration = 0
|
||||||
self.postseason = True
|
self.postseason = True
|
||||||
|
self.subbed_channels = []
|
||||||
|
|
||||||
def setup(self, league_dic, division_games = 1, inter_division_games = 1, inter_league_games = 1, games_per_hour = 2):
|
def setup(self, league_dic, division_games = 1, inter_division_games = 1, inter_league_games = 1, games_per_hour = 2):
|
||||||
self.league = league_dic # { subleague name : { division name : [team object] } }
|
self.league = league_dic # { subleague name : { division name : [team object] } }
|
||||||
|
@ -653,4 +654,8 @@ def load_league_file(league_name):
|
||||||
this_league.last_weather_event_day = state_dic["last_weather_event"]
|
this_league.last_weather_event_day = state_dic["last_weather_event"]
|
||||||
except:
|
except:
|
||||||
this_league.last_weather_event_day = 0
|
this_league.last_weather_event_day = 0
|
||||||
|
try:
|
||||||
|
this_league.subbed_channels = state_dic["subs"]
|
||||||
|
except:
|
||||||
|
this_league.subbed_channels = []
|
||||||
return this_league
|
return this_league
|
|
@ -831,6 +831,25 @@ Not every team will play every series, due to how the scheduling algorithm is co
|
||||||
else:
|
else:
|
||||||
raise CommandError("Couldn't find that league, boss. Did you save it on the website?")
|
raise CommandError("Couldn't find that league, boss. Did you save it on the website?")
|
||||||
|
|
||||||
|
class LeagueSubscribeCommand(Command):
|
||||||
|
name = "leaguesub"
|
||||||
|
template = "m;leaguesub [league name]"
|
||||||
|
description = "Posts all league feed events to this channel, in addition to the channel the league was started in. Run again to unsubscribe."
|
||||||
|
|
||||||
|
async def execute(self, msg, command, flags):
|
||||||
|
league_name = command.strip()
|
||||||
|
if league_exists(league_name):
|
||||||
|
league = leagues.load_league_file(league_name)
|
||||||
|
if msg.channel.id in league.subbed_channels:
|
||||||
|
league.subbed_channels.pop(league.subbed_channels.index(msg.channel.id))
|
||||||
|
await msg.channel.send("You're off the mailing list, boss. We promise.")
|
||||||
|
else:
|
||||||
|
league.subbed_channels.append(msg.channel.id)
|
||||||
|
await msg.channel.send(f"Thanks for signing up to the {league_name} newsletter.")
|
||||||
|
leagues.save_league(league)
|
||||||
|
else:
|
||||||
|
raise CommandError("That league doesn't exist, boss.")
|
||||||
|
|
||||||
class LeagueDisplayCommand(Command):
|
class LeagueDisplayCommand(Command):
|
||||||
name = "leaguestandings"
|
name = "leaguestandings"
|
||||||
template = "m;leaguestandings\n[league name]"
|
template = "m;leaguestandings\n[league name]"
|
||||||
|
@ -1375,6 +1394,7 @@ commands = [
|
||||||
LeagueClaimCommand(),
|
LeagueClaimCommand(),
|
||||||
LeagueAddOwnersCommand(),
|
LeagueAddOwnersCommand(),
|
||||||
StartLeagueCommand(),
|
StartLeagueCommand(),
|
||||||
|
LeagueSubscribeCommand(),
|
||||||
LeaguePauseCommand(),
|
LeaguePauseCommand(),
|
||||||
LeagueDisplayCommand(),
|
LeagueDisplayCommand(),
|
||||||
LeagueLeadersCommand(),
|
LeagueLeadersCommand(),
|
||||||
|
@ -1708,9 +1728,15 @@ async def start_tournament_round(channel, tourney, seeding = None):
|
||||||
ext = "?league=" + urllib.parse.quote_plus(tourney.name)
|
ext = "?league=" + urllib.parse.quote_plus(tourney.name)
|
||||||
|
|
||||||
if tourney.round_check(): #if finals
|
if tourney.round_check(): #if finals
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"The {tourney.name} finals are starting now, at {config()['simmadome_url']+ext}")
|
||||||
|
else:
|
||||||
await channel.send(f"The {tourney.name} finals are starting now, at {config()['simmadome_url']+ext}")
|
await channel.send(f"The {tourney.name} finals are starting now, at {config()['simmadome_url']+ext}")
|
||||||
finals = True
|
finals = True
|
||||||
|
|
||||||
|
else:
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"{len(current_games)} games started for the {tourney.name} tournament, at {config()['simmadome_url']+ext}")
|
||||||
else:
|
else:
|
||||||
await channel.send(f"{len(current_games)} games started for the {tourney.name} tournament, at {config()['simmadome_url']+ext}")
|
await channel.send(f"{len(current_games)} games started for the {tourney.name} tournament, at {config()['simmadome_url']+ext}")
|
||||||
finals = False
|
finals = False
|
||||||
|
@ -1738,7 +1764,7 @@ async def continue_tournament_series(tourney, queue, games_list, wins_in_series)
|
||||||
else:
|
else:
|
||||||
series_string = f"Best of {tourney.series_length}:"
|
series_string = f"Best of {tourney.series_length}:"
|
||||||
|
|
||||||
state_init["title"] = f"{series_string} {wins_in_series[oldgame.teams['away'].name]} - {wins_in_series[oldgame.teams['home'].name]}"
|
state_init["title"] = f"{series_string} {wins_in_series[away_team.name]} - {wins_in_series[home_team.name]}"
|
||||||
|
|
||||||
discrim_string = tourney.name
|
discrim_string = tourney.name
|
||||||
|
|
||||||
|
@ -1774,6 +1800,10 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
|
||||||
|
|
||||||
final_embed = game_over_embed(game)
|
final_embed = game_over_embed(game)
|
||||||
final_embed.add_field(name="Series score:", value=f"{wins_in_series[game.teams['away'].name]} - {wins_in_series[game.teams['home'].name]}")
|
final_embed.add_field(name="Series score:", value=f"{wins_in_series[game.teams['away'].name]} - {wins_in_series[game.teams['home'].name]}")
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"A {tourney.name} game just ended!")
|
||||||
|
await league_subscriber_update(tourney.league, channel, final_embed)
|
||||||
|
else:
|
||||||
await channel.send(f"A {tourney.name} game just ended!")
|
await channel.send(f"A {tourney.name} game just ended!")
|
||||||
await channel.send(embed=final_embed)
|
await channel.send(embed=final_embed)
|
||||||
if wins_in_series[winner_name] >= int((tourney.series_length+1)/2) and not finals:
|
if wins_in_series[winner_name] >= int((tourney.series_length+1)/2) and not finals:
|
||||||
|
@ -1813,11 +1843,20 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
|
||||||
|
|
||||||
next_start = (now + delta).replace(second=0, microsecond=0)
|
next_start = (now + delta).replace(second=0, microsecond=0)
|
||||||
wait_seconds = (next_start - now).seconds
|
wait_seconds = (next_start - now).seconds
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"The next batch of games for the {tourney.name} will start in {math.ceil(wait_seconds/60)} minutes.")
|
||||||
|
else:
|
||||||
await channel.send(f"The next batch of games for the {tourney.name} will start in {math.ceil(wait_seconds/60)} minutes.")
|
await channel.send(f"The next batch of games for the {tourney.name} will start in {math.ceil(wait_seconds/60)} minutes.")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
|
else:
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"The next batch of games for {tourney.name} will start in {int(tourney.delay/60)} minutes.")
|
||||||
else:
|
else:
|
||||||
await channel.send(f"The next batch of games for {tourney.name} will start in {int(tourney.delay/60)} minutes.")
|
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 asyncio.sleep(tourney.delay)
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, f"{len(queued_games)} games for {tourney.name}, starting at {filter_url}")
|
||||||
|
else:
|
||||||
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:
|
||||||
|
@ -1827,6 +1866,9 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
|
||||||
embed = discord.Embed(color = discord.Color.dark_purple(), title = f"{winner_list[0]} win the {tourney.name} finals!")
|
embed = discord.Embed(color = discord.Color.dark_purple(), title = f"{winner_list[0]} win the {tourney.name} finals!")
|
||||||
if tourney.league is not None and tourney.day > tourney.league.day:
|
if tourney.league is not None and tourney.day > tourney.league.day:
|
||||||
tourney.league.day = tourney.day
|
tourney.league.day = tourney.day
|
||||||
|
if tourney.league is not None:
|
||||||
|
await league_subscriber_update(tourney.league, channel, embed)
|
||||||
|
else:
|
||||||
await channel.send(embed=embed)
|
await channel.send(embed=embed)
|
||||||
tourney.winner = get_team_fuzzy_search(winner_list[0])
|
tourney.winner = get_team_fuzzy_search(winner_list[0])
|
||||||
active_tournaments.pop(active_tournaments.index(tourney))
|
active_tournaments.pop(active_tournaments.index(tourney))
|
||||||
|
@ -1858,7 +1900,7 @@ async def tourney_round_watcher(channel, tourney, games_list, filter_url, finals
|
||||||
|
|
||||||
next_start = (now + delta).replace(second=0, microsecond=0)
|
next_start = (now + delta).replace(second=0, microsecond=0)
|
||||||
wait_seconds = (next_start - now).seconds
|
wait_seconds = (next_start - now).seconds
|
||||||
await channel.send(f"""This round of games for the {tourney.name} is now complete! The next round will start in {math.ceil(wait_seconds/60)} minutes.
|
await league_subscriber_update(tourney.league, channel, f"""This round of games for the {tourney.name} is now complete! The next round will start in {math.ceil(wait_seconds/60)} minutes.
|
||||||
Advancing teams:
|
Advancing teams:
|
||||||
{winners_string}""")
|
{winners_string}""")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
|
@ -2153,16 +2195,16 @@ async def start_league_day(channel, league, partial = False):
|
||||||
ext = "?league=" + urllib.parse.quote_plus(league.name)
|
ext = "?league=" + urllib.parse.quote_plus(league.name)
|
||||||
|
|
||||||
if weather_check_result == 2:
|
if weather_check_result == 2:
|
||||||
await channel.send(f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
|
await league_subscriber_update(league, channel, f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
|
||||||
elif weather_check_result == 1:
|
elif weather_check_result == 1:
|
||||||
await channel.send(f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
|
await league_subscriber_update(league, channel, f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
|
||||||
|
|
||||||
if league.last_series_check(): #if finals
|
if league.last_series_check(): #if finals
|
||||||
await channel.send(f"The final series of the {league.name} regular season is starting now, at {config()['simmadome_url']+ext}")
|
await league_subscriber_update(league, channel, f"The final series of the {league.name} regular season is starting now, at {config()['simmadome_url']+ext}")
|
||||||
last = True
|
last = True
|
||||||
|
|
||||||
else:
|
else:
|
||||||
await channel.send(f"The day {league.day} series of the {league.name} is starting now, at {config()['simmadome_url']+ext}")
|
await league_subscriber_update(league, channel, f"The day {league.day} series of the {league.name} is starting now, at {config()['simmadome_url']+ext}")
|
||||||
last = False
|
last = False
|
||||||
|
|
||||||
if partial:
|
if partial:
|
||||||
|
@ -2219,8 +2261,8 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
|
||||||
final_embed = game_over_embed(game)
|
final_embed = game_over_embed(game)
|
||||||
final_embed.add_field(name="Day:", value=league.day)
|
final_embed.add_field(name="Day:", value=league.day)
|
||||||
final_embed.add_field(name="Series score:", value=f"{series_results[game.teams['away'].name]['wins']} - {series_results[game.teams['home'].name]['wins']}")
|
final_embed.add_field(name="Series score:", value=f"{series_results[game.teams['away'].name]['wins']} - {series_results[game.teams['home'].name]['wins']}")
|
||||||
await channel.send(f"A {league.name} game just ended!")
|
await league_subscriber_update(league, channel, f"A {league.name} game just ended!")
|
||||||
await channel.send(embed=final_embed)
|
await league_subscriber_update(league, channel, final_embed)
|
||||||
if series_results[winner_name]["wins"] + series_results[winner_name]["losses"] + missed < league.series_length:
|
if series_results[winner_name]["wins"] + series_results[winner_name]["losses"] + missed < league.series_length:
|
||||||
queued_games.append(game)
|
queued_games.append(game)
|
||||||
games_list.pop(i)
|
games_list.pop(i)
|
||||||
|
@ -2255,21 +2297,21 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
|
||||||
|
|
||||||
leagues.save_league(league)
|
leagues.save_league(league)
|
||||||
active_standings[league] = await channel.send(embed=league.standings_embed())
|
active_standings[league] = await channel.send(embed=league.standings_embed())
|
||||||
await channel.send(f"The day {league.day} games for the {league.name} will start in {math.ceil(wait_seconds/60)} minutes.")
|
await league_subscriber_update(league, channel, f"The day {league.day} games for the {league.name} will start in {math.ceil(wait_seconds/60)} minutes.")
|
||||||
weather_check_result = league.weather_event_check()
|
weather_check_result = league.weather_event_check()
|
||||||
if weather_check_result == 2:
|
if weather_check_result == 2:
|
||||||
await channel.send(f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
|
await league_subscriber_update(league, channel, f"The entire league is struck by a {league.weather_override.emoji} {league.weather_override.name}! The games must go on.")
|
||||||
elif weather_check_result == 1:
|
elif weather_check_result == 1:
|
||||||
await channel.send(f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
|
await league_subscriber_update(league, channel, f"The {league.weather_override.emoji} {league.weather_override.name} continues to afflict the league.")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
await channel.send(f"A {league.name} series is continuing now at {filter_url}")
|
await league_subscriber_update(league, channel, f"A {league.name} series is continuing now at {filter_url}")
|
||||||
games_list = await continue_league_series(league, queued_games, games_list, series_results, missed)
|
games_list = await continue_league_series(league, queued_games, games_list, series_results, missed)
|
||||||
else:
|
else:
|
||||||
league.active = False
|
league.active = False
|
||||||
|
|
||||||
if league.autoplay == 0 or config()["game_freeze"]: #if number of series to autoplay has been reached
|
if league.autoplay == 0 or config()["game_freeze"]: #if number of series to autoplay has been reached
|
||||||
active_standings[league] = await channel.send(embed=league.standings_embed())
|
active_standings[league] = await league_subscriber_update(league, channel, league.standings_embed())
|
||||||
await channel.send(f"The {league.name} is no longer autoplaying.")
|
await league_subscriber_update(league, channel, f"The {league.name} is no longer autoplaying.")
|
||||||
if config()["game_freeze"]:
|
if config()["game_freeze"]:
|
||||||
await channel.send("Patch incoming.")
|
await channel.send("Patch incoming.")
|
||||||
leagues.save_league(league)
|
leagues.save_league(league)
|
||||||
|
@ -2296,7 +2338,7 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
|
||||||
|
|
||||||
next_start = (now + delta).replace(second=0, microsecond=0)
|
next_start = (now + delta).replace(second=0, microsecond=0)
|
||||||
wait_seconds = (next_start - now).seconds
|
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 league_subscriber_update(league, channel, 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 asyncio.sleep(wait_seconds)
|
||||||
await league_postseason(channel, league)
|
await league_postseason(channel, league)
|
||||||
|
|
||||||
|
@ -2332,8 +2374,8 @@ async def league_day_watcher(channel, league, games_list, filter_url, last = Fal
|
||||||
wait_seconds = (next_start - now).seconds
|
wait_seconds = (next_start - now).seconds
|
||||||
|
|
||||||
leagues.save_league(league)
|
leagues.save_league(league)
|
||||||
active_standings[league] = await channel.send(embed=league.standings_embed())
|
active_standings[league] = await league_subscriber_update(league, channel, league.standings_embed())
|
||||||
await channel.send(f"""This {league.name} series is now complete! The next series will be starting in {int(wait_seconds/60)} minutes.""")
|
await league_subscriber_update(league, channel, f"""This {league.name} series is now complete! The next series will be starting in {int(wait_seconds/60)} minutes.""")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
|
|
||||||
await start_league_day(channel, league)
|
await start_league_day(channel, league)
|
||||||
|
@ -2398,7 +2440,7 @@ async def league_postseason(channel, league):
|
||||||
|
|
||||||
next_start = (now + delta).replace(second=0, microsecond=0)
|
next_start = (now + delta).replace(second=0, microsecond=0)
|
||||||
wait_seconds = (next_start - now).seconds
|
wait_seconds = (next_start - now).seconds
|
||||||
await channel.send(f"Tiebreakers complete! Postseason starting in {math.ceil(wait_seconds/60)} minutes.")
|
await league_subscriber_update(league, channel, f"Tiebreakers complete! Postseason starting in {math.ceil(wait_seconds/60)} minutes.")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2432,7 +2474,7 @@ async def league_postseason(channel, league):
|
||||||
|
|
||||||
next_start = (now + delta).replace(second=0, microsecond=0)
|
next_start = (now + delta).replace(second=0, microsecond=0)
|
||||||
wait_seconds = (next_start - now).seconds
|
wait_seconds = (next_start - now).seconds
|
||||||
await channel.send(f"The {league.name} Championship Series is starting in {math.ceil(wait_seconds/60)} minutes!")
|
await league_subscriber_update(league, channel, f"The {league.name} Championship Series is starting in {math.ceil(wait_seconds/60)} minutes!")
|
||||||
await asyncio.sleep(wait_seconds)
|
await asyncio.sleep(wait_seconds)
|
||||||
await start_tournament_round(channel, world_series)
|
await start_tournament_round(channel, world_series)
|
||||||
league.champion = world_series.winner.name
|
league.champion = world_series.winner.name
|
||||||
|
@ -2441,4 +2483,13 @@ async def league_postseason(channel, league):
|
||||||
season_save(league)
|
season_save(league)
|
||||||
league.season_reset()
|
league.season_reset()
|
||||||
|
|
||||||
|
async def league_subscriber_update(league, start_channel, message):
|
||||||
|
channel_list = filter(lambda chan : chan.id in league.subbed_channels, client.get_all_channels())
|
||||||
|
channel_list.append(start_channel)
|
||||||
|
for channel in channel_list:
|
||||||
|
if isinstance(message, discord.Embed):
|
||||||
|
await channel.send(embed=message)
|
||||||
|
else:
|
||||||
|
await channel.send(message)
|
||||||
|
|
||||||
client.run(config()["token"])
|
client.run(config()["token"])
|
Loading…
Reference in a new issue