diff options
Diffstat (limited to 'bot/exts/events/trivianight/_questions.py')
-rw-r--r-- | bot/exts/events/trivianight/_questions.py | 74 |
1 files changed, 42 insertions, 32 deletions
diff --git a/bot/exts/events/trivianight/_questions.py b/bot/exts/events/trivianight/_questions.py index ef56ee81..f558c50e 100644 --- a/bot/exts/events/trivianight/_questions.py +++ b/bot/exts/events/trivianight/_questions.py @@ -1,7 +1,9 @@ -from random import choice +from random import choice, randrange from time import perf_counter +from typing import Union -from discord import ButtonStyle, Embed, Interaction +import discord +from discord import Embed, Interaction from discord.ui import Button, View from bot.constants import Colours, NEGATIVE_REPLIES @@ -11,22 +13,21 @@ from ._scoreboard import Scoreboard class QuestionButton(Button): """Button subclass for the options of the questions.""" - def __init__(self, label: str): - self._time = perf_counter() - self.users_picked = {} - super().__init__(label=label, style=ButtonStyle.green) + def __init__(self, label: str, users_picked: dict): + self.users_picked = users_picked + super().__init__(label=label, style=discord.ButtonStyle.green) - def answer(self, label: str) -> dict: - """Returns the dictionary of the users who picked the answer only if it was correct.""" - return self.users_picked if label == self.label else {} + 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] - elif self.users_picked[interaction.user.id][1] < 3: + elif self.users_picked[interaction.user.id][1] < 2: self.users_picked[interaction.user.id] = [ - self.label, self.users_picked[interaction.user.id][0] + 1, perf_counter() - self._time + self.label, self.users_picked[interaction.user.id][1] + 1, perf_counter() - self._time ] else: await interaction.response.send_message( @@ -43,7 +44,12 @@ class QuestionView(View): """View for the questions.""" def __init__(self): + super().__init__() self.current_question = {} + self.users_picked = {} + self.buttons = [QuestionButton(label, self.users_picked) for label in ("A", "B", "C", "D")] + for button in self.buttons: + self.add_item(button) def create_current_question(self) -> Embed: """Helper function to create the embed for the current question.""" @@ -53,30 +59,27 @@ class QuestionView(View): color=Colours.python_yellow ) for label, answer in zip(("A", "B", "C", "D"), self.current_question["answers"]): - question_embed.add_field(name=label, value=answer, inline=False) + question_embed.add_field(name=f"Choice {label}", value=answer, inline=False) - self.buttons = [QuestionButton(label) for label in ("A", "B", "C", "D")] for button in self.buttons: - self.add_item(button) + button.set_time() + return question_embed def end_question(self) -> tuple[dict, Embed]: """Returns the dictionaries from the corresponding buttons for those who got it correct.""" labels = ("A", "B", "C", "D") - label = labels[self.current_question["correct"].index(self.current_question["answers"])] - return_dict = {} + label = labels[self.current_question["answers"].index(self.current_question["correct"])] + return_dict = {name: info for name, info in self.users_picked.items() if info[0] == label} + self.users_picked = {} + for button in self.buttons: - return_dict.update(button.answer(label)) - self.remove_item(button) + button.users_picked = self.users_picked answer_embed = Embed( title=f"The correct answer for Question {self.current_question['number']} was", - color=Colours.grass_green - ) - answer_embed.add_field( - name=label, - value=self.current_question["correct"].index(self.current_question["answers"]), - inline=False + description=self.current_question["correct"], + color=Colours.soft_green ) return return_dict, answer_embed @@ -87,7 +90,6 @@ class Questions: def __init__(self, scoreboard: Scoreboard): self.scoreboard = scoreboard - self.view = QuestionView() self.questions = [] self._ptr = -1 @@ -95,18 +97,26 @@ class Questions: """Setting `self.questions` dynamically via a function to set it.""" self.questions = questions - def next_question(self) -> None: - """Advances to the next question.""" - self._ptr += 1 - if self._ptr < len(self.questions): - self.questions[self._ptr]["visited"] = True - self.view.current_question = self.questions[self._ptr] + def next_question(self) -> Union[Embed, None]: + """Uses another, new question.""" + if all("visited" in question.keys() for question in self.questions.values()): + return Embed( + title=choice(NEGATIVE_REPLIES), + description="All of the questions in the question bank have been used.", + color=Colours.soft_red + ) + + while "visited" in self.questions[self._ptr].keys(): + self._ptr = randrange(0, len(self.questions)) + + self.questions[self._ptr]["visited"] = True + self.view.current_question = self.questions[self._ptr] def current_question(self) -> tuple[Embed, QuestionView]: """Returns an embed entailing the current question as an embed with a view.""" return self.view.create_current_question(), self.view - def end_question(self) -> None: + def end_question(self) -> Embed: """Terminates answering of the question and displays the correct answer.""" scores, answer_embed = self.view.end_question() for user, score in scores.items(): |