예제 #1
0
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))
예제 #2
0
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'])
    )
예제 #3
0
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)
예제 #4
0
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.")
예제 #5
0
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."
        )
예제 #6
0
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."
        )