Exemplo n.º 1
0
async def get_fastest_times_league_infotext(league_tag: str,
                                            limit: int) -> str:
    fastest_times = await leaguedb.get_fastest_wins_raw(league_tag, limit)
    max_namelen = 0
    namelen_cap = 20
    for row in fastest_times:
        if row[1] is None:
            continue
        max_namelen = max(max_namelen, len(row[1]), namelen_cap)

    dated_format_str = '  {winner:>' + str(max_namelen) + '.' + str(max_namelen) + \
                       '} -- {time:<9} (vs {loser}, {date:%b %d})\n'
    undated_format_str = '  {winner:>' + str(max_namelen) + '.' + str(max_namelen) + \
                         '} -- {time:<9} (vs {loser})\n'

    infotext = ''
    for row in fastest_times:
        if row[1] is None or row[2] is None:
            continue
        if row[3] is not None:
            infotext += dated_format_str.format(winner=row[1],
                                                time=racetime.to_str(row[0]),
                                                loser=row[2],
                                                date=row[3])
        else:
            infotext += undated_format_str.format(winner=row[1],
                                                  time=racetime.to_str(row[0]),
                                                  loser=row[2])
    return infotext[:-1] if infotext else ''
Exemplo n.º 2
0
    async def parse_submission(self, daily_number: int, user_id: int,
                               args: list) -> str:
        """Attempt to parse args as a valid daily submission, and submits for the daily if sucessful.

        Returns
        -------
            A string whose content confirms parse, or the empty string if parse fails.
        """
        lv = level.LEVEL_NOS
        time = -1
        ret_str = ''
        if len(args) > 0:
            if args[0] == 'death':
                if len(args) == 2:
                    lv = level.from_str(args[1])
                    if not lv == level.LEVEL_NOS:
                        ret_str = 'died on {}'.format(args[1])
                else:
                    lv = level.LEVEL_UNKNOWN_DEATH
                    ret_str = 'died'
            else:
                time = racetime.from_str(args[0])
                if not time == -1:
                    lv = level.LEVEL_FINISHED
                    ret_str = 'finished in {}'.format(racetime.to_str(time))

        if not lv == level.LEVEL_NOS:  # parse succeeded
            await self.submit_to_daily(daily_number, user_id, lv, time)
            return ret_str
        else:
            return ''
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
async def get_fastest_times_infotext(category: Category, limit: int) -> str:
    fastest_times = await racedb.get_fastest_times_leaderboard(category.name.lower(), limit)
    infotext = '{0:>20} {1:<9} {2:<9} {3:<13}\n'.format('', 'Time (rta)', 'Seed', 'Date')
    for row in fastest_times:
        infotext += '{0:>20.20} {1:>9} {2:>9} {3:>13}\n'.format(
            row[0],
            racetime.to_str(int(row[1])),
            row[2],
            row[3].strftime("%b %d, %Y"))
    return infotext
Exemplo n.º 5
0
async def get_fastest_times_infotext(ndchar: NDChar, amplified: bool,
                                     limit: int) -> str:
    fastest_times = await racedb.get_fastest_times_leaderboard(
        str(ndchar), amplified, limit)
    infotext = '{0:>20} {1:<9} {2:<9} {3:<13}\n'.format(
        '', 'Time (rta)', 'Seed', 'Date')
    for row in fastest_times:
        infotext += '{0:>20.20} {1:>9} {2:>9} {3:>13}\n'.format(
            row[0], racetime.to_str(int(row[1])), row[2],
            row[3].strftime("%b %d, %Y"))
    return infotext
Exemplo n.º 6
0
    def _status_str(self, short: bool) -> str:
        status = ''
        if self._state == RacerStatus.finished:
            status += racetime.to_str(self.time)
            if not self.igt == FIELD_UNKNOWN and not short:
                status += ' (igt {})'.format(racetime.to_str(self.igt))
        else:
            status += str(self._state)
            if self._state == RacerStatus.forfeit and not short:
                status += ' (rta {}'.format(racetime.to_str(self.time))
                if 0 < self.level < 22:
                    status += ', ' + level.to_str(self.level)
                if not self.igt == FIELD_UNKNOWN:
                    status += ', igt {}'.format(racetime.to_str(self.igt))
                status += ')'

        if not self.comment == '' and not short:
            status += ': ' + self.comment

        return status
Exemplo n.º 7
0
def convert_score_to_text(category_race_info_descriptor: str,
                          score: int) -> Optional[str]:
    time_categories = [
        'CoH: Story (any%)', 'CoH: Story (all instruments)', 'CoH: Permadeath',
        'CoH: Double Tempo'
    ]
    if category_race_info_descriptor in time_categories:
        return racetime.to_str(score)
    elif category_race_info_descriptor == 'CoH: Fixed Beat':
        return str(score)
    else:
        return None
Exemplo n.º 8
0
 def stdev_str(self) -> str:
     if self.has_wins:
         return racetime.to_str(int(self.stdev))
     else:
         return '--'
Exemplo n.º 9
0
 def mean_str(self) -> str:
     if self.has_wins:
         return racetime.to_str(int(self.mean))
     else:
         return '--'
Exemplo n.º 10
0
 def time_str(self) -> str:
     return racetime.to_str(self.time)
Exemplo n.º 11
0
 def current_time_str(self) -> str:
     current_time_ = self.current_time
     if current_time_ is not None:
         return racetime.to_str(current_time_)
     else:
         return ''
Exemplo n.º 12
0
 def avg_win_str(self):
     return racetime.to_str(
         self.average) if self.average is not None else '--'
Exemplo n.º 13
0
 def best_win_str(self):
     return racetime.to_str(self.best) if self.best is not None else '--'