예제 #1
0
async def get_schedule_infotext():
    utcnow = pytz.utc.localize(datetime.datetime.utcnow())
    matches = await get_upcoming_and_current()

    max_r1_len = 0
    max_r2_len = 0
    for match in matches:
        max_r1_len = max(max_r1_len,
                         len(strutil.tickless(match.racer_1.display_name)))
        max_r2_len = max(max_r2_len,
                         len(strutil.tickless(match.racer_2.display_name)))

    schedule_text = '``` \nUpcoming matches: \n'
    for match in matches:
        if len(schedule_text) > 1800:
            break
        schedule_text += '{r1:>{w1}} v {r2:<{w2}} : '.format(
            r1=strutil.tickless(match.racer_1.display_name),
            w1=max_r1_len,
            r2=strutil.tickless(match.racer_2.display_name),
            w2=max_r2_len)
        if match.suggested_time - utcnow < datetime.timedelta(minutes=0):
            schedule_text += 'Right now!'
        else:
            schedule_text += timestr.str_full_24h(match.suggested_time)
        schedule_text += '\n'
    schedule_text += '```'

    return schedule_text
예제 #2
0
    async def cawmentator_alert(self, match: Match):
        """PM an alert to the match cawmentator, if any, that the match is soon to begin

        Parameters
        ----------
        match: Match
        """
        # PM a cawmentator alert
        cawmentator = await match.get_cawmentator()
        if cawmentator is None or match.time_until_match is None:
            return

        alert_format_str = 'Reminder: You\'re scheduled to commentate **{racer_1}** - **{racer_2}**, ' \
                           'which is scheduled to begin in {minutes} minutes.\n\n'
        alert_text = alert_format_str.format(
            racer_1=match.racer_1.display_name,
            racer_2=match.racer_2.display_name,
            minutes=int((match.time_until_match.total_seconds() + 30) // 60))

        racer_1_stats = await leaguestats.get_league_stats(
            match.racer_1.user_id)
        racer_2_stats = await leaguestats.get_league_stats(
            match.racer_2.user_id)

        racer_1_infotext = await leaguestats.get_big_infotext(
            user=match.racer_1, stats=racer_1_stats)
        racer_2_infotext = await leaguestats.get_big_infotext(
            user=match.racer_2, stats=racer_2_stats)
        alert_text += '```' + strutil.tickless(racer_1_infotext) + '\n```'
        alert_text += '```' + strutil.tickless(racer_2_infotext) + '\n```'

        await self._client.send_message(cawmentator.member, alert_text)
예제 #3
0
 def leaderboard(self):
     new_leaderboard = '``` \n' + strutil.tickless(self._leaderboard_header(self.current_race)) \
                       + self.current_race.status_str + '\n'
     new_leaderboard += 'Entrants:\n'
     new_leaderboard += strutil.tickless(self.current_race.leaderboard_text)
     new_leaderboard += '```'
     return new_leaderboard
예제 #4
0
 async def post_result(self, race: Race):
     await self.client.send_message(
         self.results_channel,
         'Race begun at {0}:\n```\n{1}{2}\n```'.format(
             race.start_datetime.strftime("%d %B %Y, UTC %H:%M"),
             strutil.tickless(self._leaderboard_header(race)),
             strutil.tickless(race.leaderboard_text)))
예제 #5
0
    async def _cawmentator_alert(match: Match):
        """PM an alert to the match cawmentator, if any, that the match is soon to begin
        
        Parameters
        ----------
        match: Match
        """
        # PM a cawmentator alert
        cawmentator = await match.get_cawmentator()
        if cawmentator is None or match.time_until_match is None:
            return

        alert_format_str = 'Reminder: You\'re scheduled to cawmentate **{racer_1}** - **{racer_2}**, ' \
                           'which is scheduled to begin {timestamp}.\n\n'
        alert_text = alert_format_str.format(
            racer_1=match.racer_1.display_name,
            racer_2=match.racer_2.display_name,
            timestamp=match.discord_rel_timestamp
        )

        league_tag = match.league_tag
        try:
            await LeagueMgr().get_league(league_tag=league_tag)
            racer_1_stats = await leaguestats.get_league_stats(league_tag=league_tag, user_id=match.racer_1.user_id)
            racer_2_stats = await leaguestats.get_league_stats(league_tag=league_tag, user_id=match.racer_2.user_id)

            racer_1_infotext = await leaguestats.get_big_infotext(user=match.racer_1, stats=racer_1_stats)
            racer_2_infotext = await leaguestats.get_big_infotext(user=match.racer_2, stats=racer_2_stats)
            alert_text += '```' + strutil.tickless(racer_1_infotext) + '\n```'
            alert_text += '```' + strutil.tickless(racer_2_infotext) + '\n```'
        except necrobot.exception.LeagueDoesNotExist:
            pass

        await cawmentator.member.send(alert_text)
예제 #6
0
 def infobox(self) -> str:
     return '```\n' \
            '{0}\n' \
            '{1}```'\
             .format(
                 strutil.tickless(self.infoname),
                 strutil.tickless(self.infotext)
             )
예제 #7
0
    async def _do_execute(self, cmd):
        infotext = await leaguestats.get_fastest_times_league_infotext(20)
        infobox = '```\nFastest wins:\n{0}```'.format(
            strutil.tickless(infotext)
        )

        await self.client.send_message(cmd.channel, infobox)
예제 #8
0
    async def _do_execute(self, cmd):
        async with cmd.channel.typing():
            amplified = True

            # Parse arguments
            args = cmd.args
            try:
                base_arg_pos = args.index('nodlc')
                amplified = False
                args.pop(base_arg_pos)
            except ValueError:
                pass

            if len(cmd.args) != 1:
                await cmd.channel.send(
                    '{0}: Wrong number of arguments for `.fastest`.'.format(
                        cmd.author.mention))
                return

            ndchar = NDChar.fromstr(args[0])
            if ndchar is None:
                await cmd.channel.send(
                    '{0}: Couldn\'t parse {1} as a character.'.format(
                        cmd.author.mention, args[0]))
                return

            infotext = await racestats.get_fastest_times_infotext(
                ndchar, amplified, 20)
            infobox = 'Fastest public all-zones {2} {0} times:\n```\n{1}```'.format(
                ndchar.name, strutil.tickless(infotext),
                'Amplified' if amplified else 'base-game')
            await cmd.channel.send(infobox)
예제 #9
0
    async def _do_execute(self, cmd):
        await server.client.send_typing(cmd.channel)

        # Parse arguments
        args = cmd.args

        if len(args) > 1:
            await self.client.send_message(
                cmd.channel,
                '{0}: Error: wrong number of arguments for `.stats`.'.format(
                    cmd.author.mention))
            return

        if len(args) == 0:
            user = await userlib.get_user(discord_id=int(cmd.author.id),
                                          register=True)
        else:  # len(args) == 1
            racer_name = args[0]
            user = await userlib.get_user(any_name=racer_name)
            if user is None:
                await self.client.send_message(
                    cmd.channel,
                    'Could not find user "{0}".'.format(racer_name))
                return

        # Show stats
        general_stats = await racestats.get_general_stats(user.user_id)
        await self.client.send_message(
            cmd.channel, '```\n{0}\'s stats (public races):\n{1}\n```'.format(
                strutil.tickless(user.display_name), general_stats.infotext))
예제 #10
0
파일: daily.py 프로젝트: Khold6458/necrobot
    async def leaderboard_text(self, daily_number: int, display_seed=False):
        """The text (results) for the leaderboard"""
        text = "``` \n"
        text += self.leaderboard_header(daily_number) + '\n'

        if display_seed:
            for row in await dailydb.get_daily_seed(
                    daily_id=daily_number, daily_type=self.daily_type.value):
                text += "Seed: {}\n".format(row[0])
                break

        no_entries = True
        rank = int(0)

        prior_result = ''  # detect and handle ties
        rank_to_display = int(1)
        reverse_levelsort = dailytype.character(
            daily_type=self.daily_type, daily_number=daily_number) == 'Aria'
        daily_times = sorted(
            await dailydb.get_daily_times(daily_id=daily_number,
                                          daily_type=self.daily_type.value),
            key=lambda x: level.level_sortval(int(x[1]),
                                              reverse=reverse_levelsort),
            reverse=True)

        for row in daily_times:
            name = strutil.tickless(row[0])
            lv = row[1]
            time = row[2]
            if lv == level.LEVEL_FINISHED:
                result_string = racetime.to_str(time)
            elif lv == level.LEVEL_NOS:
                continue
            else:
                result_string = level.to_str(lv)
                if result_string == '':
                    result_string = "death"
                else:
                    result_string = "death ({0})".format(result_string)

            rank += 1
            no_entries = False

            # update the rank only if we've gotten a different result than the last entrant
            if result_string != prior_result:  # kinda hacky to use a string comparison here, but works
                rank_to_display = rank

            prior_result = result_string

            text += '{0: >3}. {1: <24} {2}\n'.format(rank_to_display, name,
                                                     result_string)

        if no_entries:
            text += 'No entries yet.\n'

        text += '```'
        return text
예제 #11
0
    async def _do_execute(self, cmd):
        if len(cmd.args) == 0:
            user = await userlib.get_user(discord_id=int(cmd.author.id), register=True)
        else:
            username = cmd.arg_string
            user = await userlib.get_user(any_name=username)
            if user is None:
                await cmd.channel.send(
                    "Couldn't find the user `{0}`.".format(username)
                )
                return

        stats = await leaguestats.get_league_stats(user.user_id)
        infobox = '```\nStats: {username}\n{stats}\n```'\
                  .format(
                      username=strutil.tickless(user.display_name),
                      stats=strutil.tickless(stats.infotext)
                  )
        await cmd.channel.send(infobox)
예제 #12
0
    async def _do_execute(self, cmd):
        await server.client.send_typing(cmd.channel)

        try:
            category = Category.fromstr(cmd.arg_string)
        except necrobot.exception.ParseException as e:
            await self.client.send_message(cmd.channel, e)
            return

        infotext = await racestats.get_most_races_infotext(category, 20)
        infobox = 'Most public {0} races:\n```\n{1}```'.format(
            category.name, strutil.tickless(infotext))
        await self.client.send_message(cmd.channel, infobox)
예제 #13
0
    async def _do_execute(self, cmd):
        if len(cmd.args) == 0:
            await cmd.channel.send('Please specify a league for `{}`.'.format(
                self.mention))
            return

        if len(cmd.args) > 2:
            await cmd.channel.send(
                'Too many arguments for `{}`. (Please enclose user names with spaces in quotes.)'
                .format(self.mention))
            return

        league_tag = cmd.args[0].lower()
        try:
            await LeagueMgr().get_league(league_tag=league_tag)
        except necrobot.exception.LeagueDoesNotExist:
            await cmd.channel.send(
                'Error: Can\'t find the league `{}`.'.format(league_tag))
            return

        if len(cmd.args) == 1:
            user = await userlib.get_user(discord_id=int(cmd.author.id),
                                          register=True)
        else:
            username = cmd.args[1]
            user = await userlib.get_user(any_name=username)
            if user is None:
                await cmd.channel.send(
                    "Couldn't find the user `{0}`.".format(username))
                return

        stats = await leaguestats.get_league_stats(league_tag, user.user_id)
        infobox = '```\nStats: {username}\n{stats}\n```'\
                  .format(
                      username=strutil.tickless(user.display_name),
                      stats=strutil.tickless(stats.infotext)
                  )
        await cmd.channel.send(infobox)
예제 #14
0
    async def _do_execute(self, cmd):
        if len(cmd.args) != 1:
            await cmd.channel.send(
                '{0}: Wrong number of arguments for `.mostraces`.'.format(
                    cmd.author.mention))
            return

        ndchar = NDChar.fromstr(cmd.args[0])
        if ndchar is None:
            await cmd.channel.send(
                '{0}: Couldn\'t parse {1} as a character.'.format(
                    cmd.author.mention, cmd.args[0]))
            return

        infotext = await racestats.get_most_races_infotext(ndchar, 20)
        infobox = 'Most public all-zones {0} races:\n```\n{1}```'.format(
            ndchar.name, strutil.tickless(infotext))
        await cmd.channel.send(infobox)
예제 #15
0
    async def _do_execute(self, cmd):
        if len(cmd.args) != 1:
            await cmd.channel.send(
                'Wrong number of arguments for `{}`. (Remember to specify the league.)'
                .format(self.mention))
            return

        league_tag = cmd.args[0].lower()
        try:
            await LeagueMgr().get_league(league_tag=league_tag)
        except necrobot.exception.LeagueDoesNotExist:
            await cmd.channel.send(
                'Error: Can\'t find the league `{}`.'.format(league_tag))
            return

        infotext = await leaguestats.get_fastest_times_league_infotext(
            league_tag=league_tag, limit=20)
        infobox = '```\nFastest wins:\n{0}```'.format(
            strutil.tickless(infotext))

        await cmd.channel.send(infobox)
예제 #16
0
    async def _do_execute(self, cmd):
        amplified = True

        # Parse arguments
        args = cmd.args
        try:
            base_arg_pos = args.index('nodlc')
            amplified = False
            args.pop(base_arg_pos)
        except ValueError:
            pass

        if len(args) > 1:
            await cmd.channel.send(
                '{0}: Error: wrong number of arguments for `.stats`.'.format(
                    cmd.author.mention))
            return

        if len(args) == 0:
            user = await userlib.get_user(discord_id=int(cmd.author.id),
                                          register=True)
        else:  # len(args) == 1
            racer_name = args[0]
            user = await userlib.get_user(any_name=racer_name)
            if user is None:
                await cmd.channel.send(
                    'Could not find user "{0}".'.format(racer_name))
                return

        # Show stats
        general_stats = await racestats.get_general_stats(user.user_id,
                                                          amplified=amplified)
        await cmd.channel.send(
            '```\n{0}\'s stats ({1}, public all-zones races):\n{2}\n```'.
            format(strutil.tickless(user.display_name),
                   'Amplified' if amplified else 'Base game',
                   general_stats.infotext))