aboutsummaryrefslogtreecommitdiffstats
path: root/bot/exts/easter/easter_riddle.py
blob: a93b374545c16194fa265555869338d672963532 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import asyncio
import logging
import random
from json import load
from pathlib import Path

import discord
from discord.ext import commands

from bot.constants import Colours, NEGATIVE_REPLIES

log = logging.getLogger(__name__)

with Path("bot/resources/easter/easter_riddle.json").open("r", encoding="utf8") as f:
    RIDDLE_QUESTIONS = load(f)

TIMELIMIT = 10


class EasterRiddle(commands.Cog):
    """This cog contains the command for the Easter quiz!"""

    def __init__(self, bot: commands.Bot):
        self.bot = bot
        self.winners = set()
        self.correct = ""
        self.current_channel = None

    @commands.command(aliases=["riddlemethis", "riddleme"])
    async def riddle(self, ctx: commands.Context) -> None:
        """
        Gives a random riddle, then provides 2 hints at certain intervals before revealing the answer.

        The duration of the hint interval can be configured by changing the TIMELIMIT constant in this file.
        """
        if self.current_channel:
            return await ctx.send(f"A riddle is already being solved in {self.current_channel.mention}!")

        # Don't let users start in a DM
        if not ctx.guild:
            await ctx.send(
                embed=discord.Embed(
                    title=random.choice(NEGATIVE_REPLIES),
                    description="You can't start riddles in DMs",
                    colour=discord.Colour.red()
                )
            )
            return

        self.current_channel = ctx.message.channel

        random_question = random.choice(RIDDLE_QUESTIONS)
        question = random_question["question"]
        hints = random_question["riddles"]
        self.correct = random_question["correct_answer"]

        description = f"You have {TIMELIMIT} seconds before the first hint."

        riddle_embed = discord.Embed(title=question, description=description, colour=Colours.pink)

        await ctx.send(embed=riddle_embed)
        await asyncio.sleep(TIMELIMIT)

        hint_embed = discord.Embed(
            title=f"Here's a hint: {hints[0]}!",
            colour=Colours.pink
        )

        await ctx.send(embed=hint_embed)
        await asyncio.sleep(TIMELIMIT)

        hint_embed = discord.Embed(
            title=f"Here's a hint: {hints[1]}!",
            colour=Colours.pink
        )

        await ctx.send(embed=hint_embed)
        await asyncio.sleep(TIMELIMIT)

        if self.winners:
            win_list = " ".join(self.winners)
            content = f"Well done {win_list} for getting it right!"
        else:
            content = "Nobody got it right..."

        answer_embed = discord.Embed(
            title=f"The answer is: {self.correct}!",
            colour=Colours.pink
        )

        await ctx.send(content, embed=answer_embed)

        self.winners.clear()
        self.current_channel = None

    @commands.Cog.listener()
    async def on_message(self, message: discord.Message) -> None:
        """If a non-bot user enters a correct answer, their username gets added to self.winners."""
        if self.current_channel != message.channel:
            return

        if self.bot.user == message.author:
            return

        if message.content.lower() == self.correct.lower():
            self.winners.add(message.author.mention)


def setup(bot: commands.Bot) -> None:
    """Easter Riddle Cog load."""
    bot.add_cog(EasterRiddle(bot))