async def handler(target, source, message, client): if not (source == 'RaceBot' or source == 'synack'): return srl_id = srl_race_id(target) if target == '#speedrunslive': asyncio.create_task(join_srl_room(client, message)) if target.startswith('#srl-'): if starting.match(message) or message == 'test starting': asyncio.create_task(set_goal(srl_id, client, target)) if go.match(message) or message == 'test go': asyncio.create_task( spoilers.send_spoiler_log(srl_id, client, target)) asyncio.create_task(discord_integration.discord_race_start(srl_id)) asyncio.create_task(alt_hunter.check_race(srl_id)) if message == 'test complete': await topic_change_handler(target, source, message, client) result = runnerdone.search(message) if result: asyncio.create_task( discord_integration.discord_race_finish(result.group(1), srl_id))
async def process_league_race_finish(target, client): srl_id = srl.srl_race_id(target) srl_race = await srl.get_race(srl_id) await tournament_results.record_tournament_results( srl_id=srl_id, results_json=json.dumps(srl_race['entrants']) )
async def handler(target, source, message, client): if not (source == 'RaceBot' or source == 'synack'): return srl_id = srl_race_id(target) if target == '#speedrunslive': result = newroom.search(message) if result and result.group(1) in srl_game_whitelist: if not c.DEBUG: await asyncio.sleep(1) await client.join(result.group(2)) await asyncio.sleep(60) await client.message( result.group(2), "Hi! I'm SahasrahBot, your friendly robotic elder and ALTTPR/SMZ3 seed roller. To see what I can do, visit https://sahasrahbot.synack.live" ) else: print(f'would have joined {result.group(2)}') if target.startswith('#srl-'): if starting.match(message) or message == 'test starting': race = await srl_races.get_srl_race_by_id(srl_id) if race: if not client.in_channel(target): await client.join(target) await client.message(target, f".setgoal {race['goal']}") await srl_races.delete_srl_race(srl_id) if go.match(message) or message == 'test go': # spoilers race = await spoiler_races.get_spoiler_race_by_id(srl_id) if race: await client.message(target, 'Sending spoiler log...') await client.message(target, '---------------') await client.message( target, f"This race\'s spoiler log: {race['spoiler_url']}") await client.message(target, '---------------') await client.message(target, 'GLHF! :mudora:') await countdown_timer( ircbot=client, duration_in_seconds=race['studytime'], srl_channel=target, beginmessage=True, ) await spoiler_races.delete_spoiler_race(srl_id) await discord_integration.discord_race_start(srl_id) await alt_hunter.check_race(srl_id) result = runnerdone.search(message) if result: await discord_integration.discord_race_finish( result.group(1), srl_id)
async def process_league_race(target, args, client): srl_id = srl.srl_race_id(target) srl_race = await srl.get_race(srl_id) if not srl_race['game']['abbrev'] == 'alttphacks': await client.message(target, "This must be an alttphacks race.") return await client.message(target, "Generating game, please wait. If nothing happens after a minute, contact Synack.") race = await srl_races.get_srl_race_by_id(srl_id) if race: await client.message(target, "There is already a game generated for this room. To cancel it, use the $cancel command.") return generated_league_race = await league_race(episodeid=args.episodeid, week=args.week) player_names = generated_league_race.get_player_names() player_discords = generated_league_race.get_player_discords() goal = f"ALTTPR League - {', '.join(player_names)} - {generated_league_race.friendly_name}" await client.message(target, f".setgoal {goal}") embed = await generated_league_race.seed.embed( name=goal, emojis=discordbot.emojis ) tournament_embed = await generated_league_race.seed.tournament_embed( name=goal, notes="The permalink for this seed was sent via direct message to each runner.", emojis=discordbot.emojis ) broadcast_channels = [a['name'] for a in generated_league_race.episode['channels'] if not a['name'] == 'No Stream'] for channel in broadcast_channels: await twitch_command_text.insert_command_text(channel.lower(), "mode", generated_league_race.twitch_mode_command) if len(broadcast_channels) > 0: tournament_embed.insert_field_at( 0, name="Broadcast Channels", value=', '.join([f"[{a}](https://twitch.tv/{a})" for a in broadcast_channels]), inline=False) embed.insert_field_at( 0, name="Broadcast Channels", value=', '.join([f"[{a}](https://twitch.tv/{a})" for a in broadcast_channels]), inline=False) audit_channel_id = await config.get(generated_league_race.guild.id, 'AlttprLeagueAuditChannel') if audit_channel_id is not None: audit_channel = discordbot.get_channel(int(audit_channel_id)) await audit_channel.send(embed=embed) commentary_channel_id = await config.get(generated_league_race.guild.id, 'AlttprLeagueCommentaryChannel') if commentary_channel_id is not None and len(broadcast_channels) > 0: commentary_channel = discordbot.get_channel(int(commentary_channel_id)) await commentary_channel.send(embed=tournament_embed) for player in player_discords: try: await player.send(embed=embed) except discord.HTTPException: if audit_channel is not None: await audit_channel.send(f"@here could not send DM to {player.name}#{player.discriminator}") if generated_league_race.type == 'spoiler': await spoiler_races.insert_spoiler_race(srl_id, generated_league_race.spoiler_log_url, generated_league_race.studyperiod) await srl_races.insert_srl_race(srl_id, generated_league_race.goal_after_start) await tournament_results.insert_tournament_race( srl_id=srl_id, episode_id=generated_league_race.episodeid, permalink=generated_league_race.seed.url, event='alttprleague', week=generated_league_race.week, spoiler=generated_league_race.spoiler_log_url if generated_league_race.spoiler_log_url else None ) await client.message(target, "Seed has been generated, you should have received a DM in Discord. Please contact a League Moderator if you haven't received the DM.")
async def handler(target, source, message, client): if not message[0] == '$': return try: args = await parse_args(message) except argparse.ArgumentError as err: if not target == '#speedrunslive': await client.message(target, err.message) return festivemode = await config.get(0, 'FestiveMode') == "true" post_start_message = None if args.command in ['$preset', '$race', '$quickswaprace' ] and target.startswith('#srl-'): srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': randomizer = 'alttpr' elif srl['game']['abbrev'] == 'alttpsm': randomizer = 'smz3' elif srl['game']['abbrev'] == 'smhacks': randomizer = 'sm' else: raise SahasrahBotException("This game is not yet supported.") seed, preset_dict = await preset.get_preset( args.preset, randomizer=randomizer, hints=args.hints, spoilers="off", allow_quickswap=True if args.command == "$quickswaprace" else False) goal = preset_dict['goal_name'] if srl['game']['abbrev'] == 'alttphacks': if args.accessible and seed.data['spoiler']['meta'][ 'logic'] == 'NoGlitches': goal = f"{goal} - accessible ruleset" await client.message(target, ACCESSIBLE_RACE_WARNING) post_start_message = ACCESSIBLE_RACE_WARNING pre_race_goal = goal if srl['game']['abbrev'] == 'alttphacks': pre_race_goal = f'vt8 randomizer - {pre_race_goal}' goal = f'vt8 randomizer - {goal}' pre_race_goal += f" - {seed.url}" if seed.code is not None: pre_race_goal += f" - ({'/'.join(seed.code)})" if isinstance( seed.code, list) else f" - ({seed.code})" if args.command == "$quickswaprace": pre_race_goal += " - Quickswap Enabled" if args.silent: await client.message(target, pre_race_goal) else: await client.message(target, f".setgoal {pre_race_goal}") await srl_races.insert_srl_race(srl_id, goal, post_start_message) if args.command in ['$mystery', '$festivemystery' ] and target.startswith('#srl-'): mode = "mystery" festive = True if args.command in ['$festivemystery' ] and festivemode else False srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': seed = await mystery.generate_random_game( weightset=args.weightset, tournament=True, spoilers="off" if mode == "random" else "mystery", festive=festive) if festive: goal = f"vt8 randomizer - festive {mode} {args.weightset} - DO NOT RECORD" else: goal = f"vt8 randomizer - {mode} {args.weightset}" if args.accessible and seed.data['spoiler']['meta'][ 'logic'] == 'NoGlitches': goal = f"{goal} - accessible ruleset" await client.message(target, ACCESSIBLE_RACE_WARNING) post_start_message = ACCESSIBLE_RACE_WARNING if args.silent: await client.message( target, f"{goal} - {seed.url} - ({'/'.join(seed.code)})") else: await client.message( target, f".setgoal {goal} - {seed.url} - ({'/'.join(seed.code)})") else: raise SahasrahBotException("This game is not yet supported.") await srl_races.insert_srl_race(srl_id, goal, post_start_message) if args.command == '$custom' and target.startswith('#srl-'): await client.message(target, "Not yet implemented. Sorry!") if args.command == '$spoiler' and target.startswith('#srl-'): srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': seed, preset_dict, spoiler_log_url = await spoilers.generate_spoiler_game( args.preset) goal_name = preset_dict['goal_name'] if not seed: return goal = f"vt8 randomizer - spoiler {goal_name}" if args.accessible and seed.data['spoiler']['meta'][ 'logic'] == 'NoGlitches': goal = f"{goal} - accessible ruleset" await client.message(target, ACCESSIBLE_RACE_WARNING) post_start_message = ACCESSIBLE_RACE_WARNING studytime = 900 if args.studytime is None else args.studytime if args.silent: await client.message( target, f"{goal} - {seed.url} - ({'/'.join(seed.code)})") else: await client.message( target, f".setgoal {goal} - {seed.url} - ({'/'.join(seed.code)})") await client.message( target, f"The spoiler log for this race will be sent after the race begins in SRL. A {studytime}s countdown timer at that time will begin." ) else: await client.message(target, "This game is not yet supported.") return await srl_races.insert_srl_race(srl_id, goal, post_start_message) await spoiler_races.insert_spoiler_race(srl_id, spoiler_log_url, studytime) if args.command == '$leaguerace' and target.startswith('#srl-'): await league.process_league_race(target, args, client) if args.command == '$cancel' and target.startswith('#srl-'): srl_id = srl_race_id(target) await srl_races.delete_srl_race(srl_id) await spoiler_races.delete_spoiler_race(srl_id) await tournament_results.delete_active_touranment_race(srl_id) await client.message(target, "Current race cancelled.") await client.message(target, f".setgoal new race") if args.command == '$rules' and target.startswith('#srl-'): await client.message( target, "For the ALTTPR rules for this race, visit https://link.alttpr.com/racerules" ) if args.command == '$accessible' and target.startswith('#srl-'): await client.message( target, "For the ALTTPR accessible racing rules, visit https://link.alttpr.com/accessible" ) if args.command == '$help': await client.message( target, "For documentation on using this bot, visit https://sahasrahbot.synack.live" ) if args.command == '$joinroom': await client.join(args.channel) if args.command == '$leave' and target.startswith('#srl-'): await client.part(target) if args.command == '$vt' and target.startswith('#srl-'): await client.message( target, "You summon VT, he looks around confused and curses your next game with bad RNG." )
async def handler(target, source, message, client): if not message[0] == '$': return try: args = await parse_args(message) except argparse.ArgumentError as err: if not target == '#speedrunslive': await client.message(target, err.message) return festivemode = await config.get(0, 'FestiveMode') == "true" if args.command == '$preset' and target.startswith('#srl-'): srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': seed, preset_dict = await preset.get_preset(args.preset, hints=args.hints, spoilers="off") goal = f"vt8 randomizer - {preset_dict['goal_name']}" code = await seed.code() if args.silent: await client.message( target, f"{goal} - {seed.url} - ({'/'.join(code)})") else: await client.message( target, f".setgoal {goal} - {seed.url} - ({'/'.join(code)})") elif srl['game']['abbrev'] == 'alttpsm': seed, preset_dict = await preset.get_preset(args.preset, randomizer='smz3') goal = preset_dict['goal_name'] if args.silent: await client.message(target, f"{goal} - {args.preset} - {seed.url}") else: await client.message( target, f".setgoal {goal} - {args.preset} - {seed.url}") else: raise SahasrahBotException("This game is not yet supported.") await srl_races.insert_srl_race(srl_id, goal) if args.command in [ '$random', '$festiverandom', '$mystery', '$festivemystery' ] and target.startswith('#srl-'): mode = "random" if args.command in ['$random', '$festiverandom' ] else "mystery" festive = True if args.command in [ '$festiverandom', '$festivemystery' ] and festivemode else False srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': seed = await mystery.generate_random_game( weightset=args.weightset, tournament=True, spoilers="off" if mode == "random" else "mystery", festive=festive) code = await seed.code() if festive: goal = f"vt8 randomizer - festive {mode} {args.weightset} - DO NOT RECORD" else: goal = f"vt8 randomizer - {mode} {args.weightset}" if args.silent: await client.message( target, f"{goal} - {seed.url} - ({'/'.join(code)})") else: await client.message( target, f".setgoal {goal} - {seed.url} - ({'/'.join(code)})") else: raise SahasrahBotException("This game is not yet supported.") await srl_races.insert_srl_race(srl_id, goal) if args.command == '$custom' and target.startswith('#srl-'): await client.message(target, "Not yet implemented. Sorry!") if args.command == '$spoiler' and target.startswith('#srl-'): srl_id = srl_race_id(target) srl = await get_race(srl_id) await client.message( target, "Generating game, please wait. If nothing happens after a minute, contact Synack." ) race = await srl_races.get_srl_race_by_id(srl_id) if race: raise SahasrahBotException( "There is already a game generated for this room. To cancel it, use the $cancel command." ) if srl['game']['abbrev'] == 'alttphacks': seed, preset_dict, spoiler_log_url = await spoilers.generate_spoiler_game( args.preset) goal_name = preset_dict['goal_name'] if not seed: return goal = f"vt8 randomizer - spoiler {goal_name}" studytime = 900 if not args.studytime else args.studytime code = await seed.code() if args.silent: await client.message( target, f"{goal} - {seed.url} - ({'/'.join(code)})") else: await client.message( target, f".setgoal {goal} - {seed.url} - ({'/'.join(code)})") await client.message( target, f"The spoiler log for this race will be sent after the race begins in SRL. A {studytime}s countdown timer at that time will begin." ) elif srl['game']['abbrev'] == 'alttpsm': seed, spoiler_log_url = await smz3_spoilers.generate_spoiler_game( args.preset) if seed is None: raise SahasrahBotException( "That preset does not exist. For documentation on using this bot, visit https://sahasrahbot.synack.live" ) goal = f"spoiler beat the games" studytime = 1500 if not args.studytime else args.studytime if args.silent: await client.message(target, f"{goal} - {seed.url}") else: await client.message(target, f".setgoal {goal} - {seed.url}") await client.message( target, f"The spoiler log for this race will be sent after the race begins in SRL. A {studytime}s countdown timer at that time will begin." ) else: await client.message(target, "This game is not yet supported.") return await srl_races.insert_srl_race(srl_id, goal) await spoiler_races.insert_spoiler_race(srl_id, spoiler_log_url, studytime) if args.command == '$leaguerace' and target.startswith('#srl-'): await league.process_league_race(target, args, client) if args.command == '$cancel' and target.startswith('#srl-'): srl_id = srl_race_id(target) await srl_races.delete_srl_race(srl_id) await spoiler_races.delete_spoiler_race(srl_id) await client.message(target, "Current race cancelled.") await client.message(target, f".setgoal new race") if args.command == '$help': await client.message( target, "For documentation on using this bot, visit https://sahasrahbot.synack.live" ) if args.command == '$joinroom': await client.join(args.channel) if args.command == '$leave' and target.startswith('#srl-'): await client.part(target) if args.command == '$vt' and target.startswith('#srl-'): await client.message( target, "You summon VT, he looks around confused and curses your next game with bad RNG." )