diff options
| author | 2021-10-23 17:17:51 -0400 | |
|---|---|---|
| committer | 2022-02-09 18:13:36 -0500 | |
| commit | 2ae3deeccaafc8cabe5263decc8ce3c69db970d1 (patch) | |
| tree | 86d1095a298f1188dda87220544b2cf4df68e362 /bot/exts/events | |
| parent | added question and list command (diff) | |
added ranks as an ephemeral and redid scoreboard
Diffstat (limited to 'bot/exts/events')
| -rw-r--r-- | bot/exts/events/trivianight/_scoreboard.py | 79 | 
1 files changed, 61 insertions, 18 deletions
| diff --git a/bot/exts/events/trivianight/_scoreboard.py b/bot/exts/events/trivianight/_scoreboard.py index 7eb7a6a8..d3e1bfb3 100644 --- a/bot/exts/events/trivianight/_scoreboard.py +++ b/bot/exts/events/trivianight/_scoreboard.py @@ -1,11 +1,12 @@ +from random import choice  from typing import Union  import discord.ui -from discord import ButtonStyle, Embed, Interaction +from discord import ButtonStyle, Embed, Interaction, Member  from discord.ui import Button, View  from bot.bot import Bot -from bot.constants import Colours +from bot.constants import Colours, NEGATIVE_REPLIES  class ScoreboardView(View): @@ -25,43 +26,85 @@ class ScoreboardView(View):              color=Colours.python_blue,          ) +        formatted_string = "" +        participant_points = list(self.points.items())[:30] if len(self.points.items()) > 30 else self.points.items()          current_placement = 1 -        for user, points in self.points.items(): +        for user, points in participant_points:              user = await self.bot.fetch_user(int(user)) -            main_embed.add_field( -                name=f"{current_placement}. {user.name}#{user.discriminator}", -                value=f"`{points}` pts" -            ) +            formatted_string += f"`{current_placement}`. {user.mention} " +            formatted_string += f"({points} pts)\n" +            if current_placement % 10 == 0: +                formatted_string += "⎯⎯⎯⎯⎯⎯⎯⎯\n"              current_placement += 1          return main_embed      async def _create_speed_embed(self) -> Embed:          """Helper function that iterates through `self.speed` to generate a leaderboard embed.""" -        speed_embed = Embed( -            title="Average Time Taken to Answer a Question", -            description="See the leaderboard for how fast each user took to answer a question correctly!", -            color=Colours.python_blue, -        )          current_placement = 1 -        for user, time_taken in self.speed.items(): +        formatted_string = "" +        participant_speed = list(self.speed.items())[:30] if len(self.speed.items()) > 30 else self.speed.items() + +        for user, time_taken in participant_speed:              user = await self.bot.fetch_user(int(user)) -            speed_embed.add_field( -                name=f"{current_placement}. {user.name}#{user.discriminator}", -                value=f"`{(time_taken[1] / time_taken[0]):.3f}s` (on average)", -            ) +            formatted_string += f"`{current_placement}`. {user.mention} " +            formatted_string += f"({time_taken:.1f}s)\n" +            if current_placement % 10 == 0: +                formatted_string += "⎯⎯⎯⎯⎯⎯⎯⎯\n"              current_placement += 1 +        speed_embed = Embed( +            title="Average time taken to answer a question", +            description=formatted_string, +            color=Colours.python_blue +        )          return speed_embed +    def _get_rank(self, member: Member) -> Embed: +        """Gets the member's rank for the points leaderboard and speed leaderboard.""" +        rank_embed = Embed(title=f"Ranks for {member.display_name}", color=Colours.python_blue) +        try: +            points_rank = str(list(self.points.keys()).index(str(member.id)) + 1) +            speed_rank = str(list(self.speed.keys()).index(str(member.id)) + 1) +        except ValueError: +            return Embed( +                title=choice(NEGATIVE_REPLIES), +                description="It looks like you didn't participate in the Trivia Night event!", +                color=Colours.soft_red +            ) + +        suffixes = {"1": "st", "2": "nd", "3": "rd"} +        rank_embed.add_field( +            name="Total Points", +            value=( +                f"You got {points_rank}{'th' if not (suffix := suffixes.get(points_rank[-1])) else suffix} place" +                f" with {self.points[str(member.id)]} points." +            ), +            inline=False +        ) +        rank_embed.add_field( +            name="Average Speed", +            value=( +                f"You got {speed_rank}{'th' if not (suffix := suffixes.get(speed_rank[-1])) else suffix} place" +                f" with a time of {(self.speed[str(member.id)][1] / self.speed[str(member.id)][0]):.1f} seconds." +            ), +            inline=False +        ) +        return rank_embed +      @discord.ui.button(label="Scoreboard for Speed", style=ButtonStyle.green)      async def speed_leaderboard(self, button: Button, interaction: Interaction) -> None:          """Send an ephemeral message with the speed leaderboard embed."""          await interaction.response.send_message(embed=await self._create_speed_embed(), ephemeral=True) +    @discord.ui.button(label="What's my rank?", style=ButtonStyle.blurple) +    async def rank_button(self, button: Button, interaction: Interaction) -> None: +        """Send an ephemeral message with the user's rank for the overall points/average speed.""" +        await interaction.response.send_message(embed=self._get_rank(interaction.user), ephemeral=True) +  class Scoreboard: -    """Class for the scoreboard for the trivianight event.""" +    """Class for the scoreboard for the Trivia Night event."""      def __setitem__(self, key: str, value: int):          if key.startswith("points: "): | 
