aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts
diff options
context:
space:
mode:
authorGravatar Shom770 <[email protected]>2021-10-27 19:08:34 -0400
committerGravatar Shom770 <[email protected]>2022-02-09 18:13:37 -0500
commit805cb8025433c87454027aad4e70bbe72b86dbdb (patch)
tree8065bbe3182262ed7ea99460a12e8c5587f4cfec /bot/exts
parentUse partial ellipsis in revealing answer (diff)
Bluenix's reviews' changes
Diffstat (limited to 'bot/exts')
-rw-r--r--bot/exts/events/trivianight/_questions.py32
-rw-r--r--bot/exts/events/trivianight/_scoreboard.py66
-rw-r--r--bot/exts/events/trivianight/trivianight.py3
3 files changed, 51 insertions, 50 deletions
diff --git a/bot/exts/events/trivianight/_questions.py b/bot/exts/events/trivianight/_questions.py
index f94b340f..741e8422 100644
--- a/bot/exts/events/trivianight/_questions.py
+++ b/bot/exts/events/trivianight/_questions.py
@@ -7,9 +7,19 @@ from discord import Embed, Interaction
from discord.ui import Button, View
from bot.constants import Colours, NEGATIVE_REPLIES
+
from ._scoreboard import Scoreboard
+class UserScore:
+ """Marker class for passing into the scoreboard to add points/record speed."""
+
+ __slots__ = ("user_id",)
+
+ def __init__(self, user_id: int):
+ self.user_id = user_id
+
+
class CurrentQuestion(TypedDict):
"""Representing the different 'keys' of the question taken from the JSON."""
@@ -26,30 +36,26 @@ class QuestionButton(Button):
self.users_picked = users_picked
super().__init__(label=label, style=discord.ButtonStyle.green)
- def set_time(self) -> None:
- """Sets an instance attribute to a perf counter simulating the question beginning."""
- self._time = perf_counter()
-
async def callback(self, interaction: Interaction) -> None:
"""When a user interacts with the button, this will be called."""
if interaction.user.id not in self.users_picked.keys():
- self.users_picked[interaction.user.id] = [self.label, 1, perf_counter() - self._time]
+ self.users_picked[interaction.user.id] = [self.label, True, perf_counter() - self._time]
await interaction.response.send_message(
embed=Embed(
- title="Success!",
+ title="Confirming that..",
description=f"You chose answer {self.label}.",
color=Colours.soft_green
),
ephemeral=True
)
- elif self.users_picked[interaction.user.id][1] < 2:
+ elif self.users_picked[interaction.user.id][1] is True:
self.users_picked[interaction.user.id] = [
- self.label, self.users_picked[interaction.user.id][1] + 1, perf_counter() - self._time
+ self.label, False, perf_counter() - self._time
]
await interaction.response.send_message(
embed=Embed(
- title="Success!",
- description=f"You changed your answer to answer choice {self.label}.",
+ title="Confirming that..",
+ description=f"You changed your answer to answer {self.label}.",
color=Colours.soft_green
),
ephemeral=True
@@ -86,8 +92,9 @@ class QuestionView(View):
for label, answer in zip("ABCD", self.current_question["answers"]):
question_embed.add_field(name=f"Answer {label}", value=answer, inline=False)
+ current_time = perf_counter()
for button in self.buttons:
- button.set_time()
+ button._time = current_time
return question_embed
@@ -170,7 +177,6 @@ class Questions:
"""Terminates answering of the question and displays the correct answer."""
scores, answer_embed = self.view.end_question()
for user, score in scores.items():
- self.scoreboard[f"points: {user}"] = 1
- self.scoreboard[f"speed: {user}"] = score[2]
+ self.scoreboard[UserScore(user)] = {"points": 1, "speed": score[2]}
return answer_embed
diff --git a/bot/exts/events/trivianight/_scoreboard.py b/bot/exts/events/trivianight/_scoreboard.py
index c39fc666..dbec966d 100644
--- a/bot/exts/events/trivianight/_scoreboard.py
+++ b/bot/exts/events/trivianight/_scoreboard.py
@@ -20,36 +20,38 @@ class ScoreboardView(View):
async def create_main_leaderboard(self) -> Embed:
"""Helper function that iterates through `self.points` to generate the main leaderboard embed."""
- main_embed = Embed(
- title="Winners of the Trivia Night",
- description="See the leaderboard for who got the most points during the Trivia Night!",
- color=Colours.python_blue,
- )
-
formatted_string = ""
- participant_points = list(self.points.items())[:30] if len(self.points.items()) > 30 else self.points.items()
- for current_placement, (user, points) in participant_points:
+ for current_placement, (user, points) in enumerate(self.points.items()):
+ if current_placement + 1 > 30:
+ break
+
user = await self.bot.fetch_user(int(user))
formatted_string += f"`{current_placement + 1}`. {user.mention} "
formatted_string += f"({points} pts)\n"
if (current_placement + 1) % 10 == 0:
formatted_string += "⎯⎯⎯⎯⎯⎯⎯⎯\n"
- current_placement += 1
+
+ main_embed = Embed(
+ title="Winners of the Trivia Night",
+ description=formatted_string,
+ color=Colours.python_blue,
+ )
return main_embed
async def _create_speed_embed(self) -> Embed:
"""Helper function that iterates through `self.speed` to generate a leaderboard embed."""
formatted_string = ""
- participant_speed = list(self.speed.items())[:30] if len(self.speed.items()) > 30 else self.speed.items()
- for current_placement, (user, time_taken) in enumerate(participant_speed):
+ for current_placement, (user, time_taken) in enumerate(self.speed.items()):
+ if current_placement + 1 > 30:
+ break
+
user = await self.bot.fetch_user(int(user))
formatted_string += f"`{current_placement + 1}`. {user.mention} "
- formatted_string += f"({time_taken:.1f}s)\n"
+ formatted_string += f"({(time_taken[-1] / time_taken[0]):.1f}s)\n"
if (current_placement + 1) % 10 == 0:
formatted_string += "⎯⎯⎯⎯⎯⎯⎯⎯\n"
- current_placement += 1
speed_embed = Embed(
title="Average time taken to answer a question",
@@ -61,9 +63,10 @@ class ScoreboardView(View):
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)
+ # These are stored as strings so that the last digit can be determined to choose the suffix
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)
+ points_rank = str(list(self.points.keys()).index(member.id) + 1)
+ speed_rank = str(list(self.speed.keys()).index(member.id) + 1)
except ValueError:
return Embed(
title=choice(NEGATIVE_REPLIES),
@@ -76,7 +79,7 @@ class ScoreboardView(View):
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."
+ f" with {self.points[member.id]} points."
),
inline=False
)
@@ -84,7 +87,7 @@ class ScoreboardView(View):
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."
+ f" with a time of {(self.speed[member.id][1] / self.speed[member.id][0]):.1f} seconds."
),
inline=False
)
@@ -105,24 +108,17 @@ class Scoreboard:
"""Class for the scoreboard for the Trivia Night event."""
def __setitem__(self, key: str, value: int):
- if key.startswith("points: "):
- key = key.removeprefix("points: ")
- if key not in self.view.points.keys():
- self.view.points[key] = value
- else:
- self.view.points[key] += self.view.points[key]
- elif key.startswith("speed: "):
- key = key.removeprefix("speed: ")
- if key not in self.view.speed.keys():
- self.view.speed[key] = [1, value]
- else:
- self.view.speed[key] = [self.view.speed[key][0] + 1, self.view.speed[key][1] + value]
-
- def __getitem__(self, item: str):
- if item.startswith("points: "):
- return self.view.points[item.removeprefix("points: ")]
- elif item.startswith("speed: "):
- return self.view.speed[item.removeprefix("speed: ")]
+ if key.user_id not in self.view.points.keys():
+ self.view.points[key.user_id] = value["points"]
+ else:
+ self.view.points[key.user_id] += self.view.points[key.user_id]
+
+ if key.user_id not in self.view.speed.keys():
+ self.view.speed[key.user_id] = [1, value["speed"]]
+ else:
+ self.view.speed[key.user_id] = [
+ self.view.speed[key.user_id][0] + 1, self.view.speed[key.user_id][1] + value["speed"]
+ ]
async def display(self) -> Union[Embed, View]:
"""Returns the embed of the main leaderboard along with the ScoreboardView."""
diff --git a/bot/exts/events/trivianight/trivianight.py b/bot/exts/events/trivianight/trivianight.py
index 2ec869ab..bb7c205b 100644
--- a/bot/exts/events/trivianight/trivianight.py
+++ b/bot/exts/events/trivianight/trivianight.py
@@ -1,4 +1,3 @@
-import logging
from json import loads
from random import choice
@@ -7,6 +6,7 @@ from discord.ext import commands
from bot.bot import Bot
from bot.constants import Colours, POSITIVE_REPLIES
+
from ._questions import QuestionView, Questions
from ._scoreboard import Scoreboard, ScoreboardView
@@ -30,7 +30,6 @@ class TriviaNight(commands.Cog):
json_text = (await ctx.message.attachments[0].read()).decode("utf8")
serialized_json = loads(json_text)
self.questions.view = QuestionView()
- logging.getLogger(__name__).debug(self.questions.view)
self.scoreboard.view = ScoreboardView(self.bot)
self.questions.set_questions(serialized_json)
success_embed = Embed(