From 776ff7258189f8c549db1a10a2e43135aa405093 Mon Sep 17 00:00:00 2001 From: Abigail Gold Date: Mon, 13 Jan 2020 14:06:26 -0500 Subject: [PATCH 1/5] add ability to use any pool for hamstudy command Fixes #28 --- exts/study.py | 147 ++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 118 insertions(+), 29 deletions(-) diff --git a/exts/study.py b/exts/study.py index 2f28ae6..6443e07 100644 --- a/exts/study.py +++ b/exts/study.py @@ -9,6 +9,7 @@ General Public License, version 2. import random import json +from datetime import datetime import aiohttp @@ -25,41 +26,115 @@ class StudyCog(commands.Cog): self.session = aiohttp.ClientSession(connector=bot.qrm.connector) @commands.command(name="hamstudy", aliases=['rq', 'randomquestion', 'randomq'], category=cmn.cat.study) - async def _random_question(self, ctx: commands.Context, level: str = None): - '''Gets a random question from the Technician, General, and/or Extra question pools.''' - tech_pool = 'E2_2018' - gen_pool = 'E3_2019' - extra_pool = 'E4_2016' - - embed = cmn.embed_factory(ctx) + async def _random_question(self, ctx: commands.Context, country: str = '', level: str = ''): + '''Gets a random question from [HamStudy's](https://hamstudy.org) question pools.''' with ctx.typing(): - selected_pool = None - try: - level = level.lower() - except AttributeError: # no level given (it's None) - pass + embed = cmn.embed_factory(ctx) - if level in ['t', 'technician', 'tech']: - selected_pool = tech_pool + country = country.lower() + level = level.lower() - if level in ['g', 'gen', 'general']: - selected_pool = gen_pool + pool_names = {'us': {'technician': 'E2', + 'tech': 'E2', + 't': 'E2', + 'general': 'E3', + 'gen': 'E3', + 'g': 'E3', + 'extra': 'E4', + 'e': 'E4'}, + 'ca': {'basic': 'CA_B', + 'b': 'CA_B', + 'advanced': 'CA_A', + 'adv': 'CA_A', + 'a': 'CA_A', + 'basic_fr': 'CA_FB', + 'b_fr': 'CA_FB', + 'base': 'CA_FB', + 'advanced_fr': 'CA_FS', + 'adv_fr': 'CA_FS', + 'a_fr': 'CA_FS', + 'supérieure': 'CA_FS', + 'superieure': 'CA_FS', + 's': 'CA_FS'}, + 'us_c': {'c1': 'C1', + 'comm1': 'C1', + 'c3': 'C3', + 'comm3': 'C3', + 'c6': 'C6', + 'comm6': 'C6', + 'c7': 'C7', + 'comm7': 'C7', + 'c7r': 'C7R', + 'comm7r': 'C7R', + 'c8': 'C8', + 'comm8': 'C8', + 'c9': 'C9', + 'comm9': 'C9'}} - if level in ['e', 'ae', 'extra']: - selected_pool = extra_pool + if country in pool_names.keys(): + if level in pool_names[country].keys(): + pool_name = pool_names[country][level] - if (level is None) or (level == 'all'): # no pool given or user wants all, so pick a random pool - selected_pool = random.choice([tech_pool, gen_pool, extra_pool]) - if (level is not None) and (selected_pool is None): # unrecognized pool given by user - embed.title = 'Error in HamStudy command' - embed.description = ('The question pool you gave was unrecognized. ' - 'There are many ways to call up certain question pools - try ?rq t, g, or e. ' - '\n\nNote that currently only the US question pools are available.') + elif level in ("random", "r"): + # select a random level in that country + pool_name = random.choice(list(pool_names[country].values())) + + else: + # show list of possible pools + embed.title = "Pool Not Found!" + embed.description = "Possible arguments are:" + embed.colour = cmn.colours.bad + for cty in pool_names: + levels = '`, `'.join(pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) + await ctx.send(embed=embed) + return + + elif country in ("random", "r"): + # select a random country and level + country = random.choice(list(pool_names.keys())) + pool_name = random.choice(list(pool_names[country].values())) + + else: + # show list of possible pools + embed.title = "Pool Not Found!" + embed.description = "Possible arguments are:" embed.colour = cmn.colours.bad + for cty in pool_names: + levels = '`, `'.join(pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) await ctx.send(embed=embed) return - async with self.session.get(f'https://hamstudy.org/pools/{selected_pool}') as resp: + pools = await self.hamstudy_get_pools() + + pool_matches = [p for p in pools.keys() if p.startswith(pool_name)] + + if len(pool_matches) > 0: + if len(pool_matches) == 1: + pool = pool_matches[0] + else: + # look at valid_from and expires dates to find the correct one + for p in pool_matches: + valid_from = datetime.fromisoformat(pools[p]["valid_from"][:-1] + "+00:00") + expires = datetime.fromisoformat(pools[p]["expires"][:-1] + "+00:00") + + if valid_from < datetime.utcnow() < expires: + pool = p + break + else: + # show list of possible pools + embed.title = "Pool Not Found!" + embed.description = "Possible arguments are:" + embed.colour = cmn.colours.bad + for cty in pool_names: + levels = '`, `'.join(pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) + await ctx.send(embed=embed) + return + + + async with self.session.get(f'https://hamstudy.org/pools/{pool}') as resp: if resp.status != 200: embed.title = 'Error in HamStudy command' embed.description = 'Could not load questions' @@ -83,13 +158,12 @@ class StudyCog(commands.Cog): + '\n**D:** ' + question['answers']['D'], inline=False) embed.add_field(name='Answer:', value='Type _?rqa_ for answer', inline=False) if 'image' in question: - image_url = f'https://hamstudy.org/_1330011/images/{selected_pool.split("_",1)[1]}/{question["image"]}' + image_url = f'https://hamstudy.org/_1330011/images/{pool.split("_",1)[1]}/{question["image"]}' embed.set_image(url=image_url) self.lastq[ctx.message.channel.id] = (question['id'], question['answer']) await ctx.send(embed=embed) - @commands.command(name="hamstudyanswer", aliases=['rqa', 'randomquestionanswer', 'randomqa', 'hamstudya'], - category=cmn.cat.study) + @commands.command(name="hamstudyanswer", aliases=['rqa', 'randomquestionanswer', 'randomqa', 'hamstudya'], category=cmn.cat.study) async def _q_answer(self, ctx: commands.Context, answer: str = None): '''Returns the answer to question last asked (Optional argument: your answer).''' with ctx.typing(): @@ -115,6 +189,21 @@ class StudyCog(commands.Cog): embed.colour = cmn.colours.neutral await ctx.send(embed=embed) + async def hamstudy_get_pools(self): + async with self.session.get('https://hamstudy.org/pools/') as resp: + if resp.status != 200: + raise ConnectionError + else: + pools_dict = json.loads(await resp.read()) + + pools_list = [] + for l in pools_dict.values(): + pools_list += l + + pools = {p["id"]: p for p in pools_list} + + return pools + def setup(bot: commands.Bot): bot.add_cog(StudyCog(bot)) From b6f6d0408cebd5843c508782f249e614126b4858 Mon Sep 17 00:00:00 2001 From: Abigail Gold Date: Mon, 20 Jan 2020 20:50:55 -0500 Subject: [PATCH 2/5] WIP: answer hamstudy by reaction --- common.py | 6 +++++- exts/study.py | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/common.py b/common.py index 20a7d77..1795850 100644 --- a/common.py +++ b/common.py @@ -44,7 +44,11 @@ emojis = SimpleNamespace(check_mark='✅', warning='⚠️', question='❓', no_entry='⛔', - bangbang='‼️') + bangbang='‼️', + a='🇦', + b='🇧', + c='🇨', + d='🇩') paths = SimpleNamespace(data=Path("./data/"), resources=Path("./resources/"), diff --git a/exts/study.py b/exts/study.py index 6443e07..81168f5 100644 --- a/exts/study.py +++ b/exts/study.py @@ -152,16 +152,24 @@ class StudyCog(commands.Cog): embed.description = self.source embed.colour = cmn.colours.good embed.add_field(name='Question:', value=question['text'], inline=False) - embed.add_field(name='Answers:', value='**A:** ' + question['answers']['A'] - + '\n**B:** ' + question['answers']['B'] - + '\n**C:** ' + question['answers']['C'] - + '\n**D:** ' + question['answers']['D'], inline=False) + embed.add_field(name='Answers:', + value=(f"**{cmn.emojis.a}** {question['answers']['A']}" + f"\n**{cmn.emojis.b}** {question['answers']['B']}" + f"\n**{cmn.emojis.c}** {question['answers']['C']}" + f"\n**{cmn.emojis.d}** {question['answers']['D']}"), + inline=False) embed.add_field(name='Answer:', value='Type _?rqa_ for answer', inline=False) if 'image' in question: image_url = f'https://hamstudy.org/_1330011/images/{pool.split("_",1)[1]}/{question["image"]}' embed.set_image(url=image_url) self.lastq[ctx.message.channel.id] = (question['id'], question['answer']) - await ctx.send(embed=embed) + q_msg = await ctx.send(embed=embed) + + await cmn.add_react(q_msg, cmn.emojis.a) + await cmn.add_react(q_msg, cmn.emojis.b) + await cmn.add_react(q_msg, cmn.emojis.c) + await cmn.add_react(q_msg, cmn.emojis.d) + @commands.command(name="hamstudyanswer", aliases=['rqa', 'randomquestionanswer', 'randomqa', 'hamstudya'], category=cmn.cat.study) async def _q_answer(self, ctx: commands.Context, answer: str = None): From 09c58f9ba2734fdad34ca947e328e497f94f2be2 Mon Sep 17 00:00:00 2001 From: Abigail Date: Tue, 21 Jan 2020 19:48:19 -0500 Subject: [PATCH 3/5] removed hamstudyanswer command and replaced it with using reactions to answer questions. Fixes #169 --- exts/study.py | 137 +++++++++++++++++---------------------------- resources/study.py | 49 ++++++++++++++++ 2 files changed, 100 insertions(+), 86 deletions(-) create mode 100644 resources/study.py diff --git a/exts/study.py b/exts/study.py index 81168f5..1d68e66 100644 --- a/exts/study.py +++ b/exts/study.py @@ -10,15 +10,19 @@ General Public License, version 2. import random import json from datetime import datetime +import asyncio import aiohttp import discord.ext.commands as commands import common as cmn +from resources import study class StudyCog(commands.Cog): + choices = {cmn.emojis.a: 'A', cmn.emojis.b: 'B', cmn.emojis.c: 'C', cmn.emojis.d: 'D'} + def __init__(self, bot: commands.Bot): self.bot = bot self.lastq = dict() @@ -34,81 +38,46 @@ class StudyCog(commands.Cog): country = country.lower() level = level.lower() - pool_names = {'us': {'technician': 'E2', - 'tech': 'E2', - 't': 'E2', - 'general': 'E3', - 'gen': 'E3', - 'g': 'E3', - 'extra': 'E4', - 'e': 'E4'}, - 'ca': {'basic': 'CA_B', - 'b': 'CA_B', - 'advanced': 'CA_A', - 'adv': 'CA_A', - 'a': 'CA_A', - 'basic_fr': 'CA_FB', - 'b_fr': 'CA_FB', - 'base': 'CA_FB', - 'advanced_fr': 'CA_FS', - 'adv_fr': 'CA_FS', - 'a_fr': 'CA_FS', - 'supérieure': 'CA_FS', - 'superieure': 'CA_FS', - 's': 'CA_FS'}, - 'us_c': {'c1': 'C1', - 'comm1': 'C1', - 'c3': 'C3', - 'comm3': 'C3', - 'c6': 'C6', - 'comm6': 'C6', - 'c7': 'C7', - 'comm7': 'C7', - 'c7r': 'C7R', - 'comm7r': 'C7R', - 'c8': 'C8', - 'comm8': 'C8', - 'c9': 'C9', - 'comm9': 'C9'}} - - if country in pool_names.keys(): - if level in pool_names[country].keys(): - pool_name = pool_names[country][level] + if country in study.pool_names.keys(): + if level in study.pool_names[country].keys(): + pool_name = study.pool_names[country][level] elif level in ("random", "r"): # select a random level in that country - pool_name = random.choice(list(pool_names[country].values())) + pool_name = random.choice(list(study.pool_names[country].values())) else: # show list of possible pools embed.title = "Pool Not Found!" embed.description = "Possible arguments are:" embed.colour = cmn.colours.bad - for cty in pool_names: - levels = '`, `'.join(pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) + for cty in study.pool_names: + levels = '`, `'.join(study.pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return elif country in ("random", "r"): # select a random country and level - country = random.choice(list(pool_names.keys())) - pool_name = random.choice(list(pool_names[country].values())) + country = random.choice(list(study.pool_names.keys())) + pool_name = random.choice(list(study.pool_names[country].values())) else: # show list of possible pools embed.title = "Pool Not Found!" embed.description = "Possible arguments are:" embed.colour = cmn.colours.bad - for cty in pool_names: - levels = '`, `'.join(pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) + for cty in study.pool_names: + levels = '`, `'.join(study.pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return pools = await self.hamstudy_get_pools() - pool_matches = [p for p in pools.keys() if p.startswith(pool_name)] + pool_matches = [p for p in pools.keys() if "_".join(p.split("_")[:-1]) == pool_name] if len(pool_matches) > 0: if len(pool_matches) == 1: @@ -127,12 +96,14 @@ class StudyCog(commands.Cog): embed.title = "Pool Not Found!" embed.description = "Possible arguments are:" embed.colour = cmn.colours.bad - for cty in pool_names: - levels = '`, `'.join(pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}`**", value=f"Levels: `{levels}`", inline=False) + for cty in study.pool_names: + levels = '`, `'.join(study.pool_names[cty].keys()) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return + pool_meta = pools[pool] async with self.session.get(f'https://hamstudy.org/pools/{pool}') as resp: if resp.status != 200: @@ -148,9 +119,8 @@ class StudyCog(commands.Cog): pool_questions = random.choice(pool_section)['questions'] question = random.choice(pool_questions) - embed.title = question['id'] + embed.title = f"{study.pool_emojis[country]} {pool_meta['class']} {question['id']}" embed.description = self.source - embed.colour = cmn.colours.good embed.add_field(name='Question:', value=question['text'], inline=False) embed.add_field(name='Answers:', value=(f"**{cmn.emojis.a}** {question['answers']['A']}" @@ -158,11 +128,13 @@ class StudyCog(commands.Cog): f"\n**{cmn.emojis.c}** {question['answers']['C']}" f"\n**{cmn.emojis.d}** {question['answers']['D']}"), inline=False) - embed.add_field(name='Answer:', value='Type _?rqa_ for answer', inline=False) + embed.add_field(name='To Answer:', + value='Answer with reactions below. If not answered within 10 minutes, the answer will be revealed.', + inline=False) if 'image' in question: image_url = f'https://hamstudy.org/_1330011/images/{pool.split("_",1)[1]}/{question["image"]}' embed.set_image(url=image_url) - self.lastq[ctx.message.channel.id] = (question['id'], question['answer']) + q_msg = await ctx.send(embed=embed) await cmn.add_react(q_msg, cmn.emojis.a) @@ -170,32 +142,26 @@ class StudyCog(commands.Cog): await cmn.add_react(q_msg, cmn.emojis.c) await cmn.add_react(q_msg, cmn.emojis.d) + def check(reaction, user): + return user.id != self.bot.user.id and reaction.message.id == q_msg.id and str(reaction.emoji) in self.choices.keys() - @commands.command(name="hamstudyanswer", aliases=['rqa', 'randomquestionanswer', 'randomqa', 'hamstudya'], category=cmn.cat.study) - async def _q_answer(self, ctx: commands.Context, answer: str = None): - '''Returns the answer to question last asked (Optional argument: your answer).''' - with ctx.typing(): - correct_ans = self.lastq[ctx.message.channel.id][1] - q_num = self.lastq[ctx.message.channel.id][0] - embed = cmn.embed_factory(ctx) - if answer is not None: - answer = answer.upper() - if answer == correct_ans: - result = f'Correct! The answer to {q_num} was **{correct_ans}**.' - embed.title = f'{q_num} Answer' - embed.description = f'{self.source}\n\n{result}' - embed.colour = cmn.colours.good - else: - result = f'Incorrect. The answer to {q_num} was **{correct_ans}**, not **{answer}**.' - embed.title = f'{q_num} Answer' - embed.description = f'{self.source}\n\n{result}' - embed.colour = cmn.colours.bad + try: + reaction, user = await self.bot.wait_for('reaction_add', timeout=600.0, check=check) + except asyncio.TimeoutError: + embed.remove_field(2) + embed.add_field(name="Answer:", value=f"Timed out! The correct answer was **{question['answer']}**.") + await q_msg.edit(embed=embed) + else: + if self.choices[str(reaction.emoji)] == question['answer']: + embed.remove_field(2) + embed.add_field(name="Answer:", value=f"Correct! The answer was **{question['answer']}**.") + embed.colour = cmn.colours.good + await q_msg.edit(embed=embed) else: - result = f'The correct answer to {q_num} was **{correct_ans}**.' - embed.title = f'{q_num} Answer' - embed.description = f'{self.source}\n\n{result}' - embed.colour = cmn.colours.neutral - await ctx.send(embed=embed) + embed.remove_field(2) + embed.add_field(name="Answer:", value=f"Incorrect! The correct answer was **{question['answer']}**.") + embed.colour = cmn.colours.bad + await q_msg.edit(embed=embed) async def hamstudy_get_pools(self): async with self.session.get('https://hamstudy.org/pools/') as resp: @@ -204,11 +170,10 @@ class StudyCog(commands.Cog): else: pools_dict = json.loads(await resp.read()) - pools_list = [] - for l in pools_dict.values(): - pools_list += l - - pools = {p["id"]: p for p in pools_list} + pools = dict() + for ls in pools_dict.values(): + for pool in ls: + pools[pool["id"]] = pool return pools diff --git a/resources/study.py b/resources/study.py new file mode 100644 index 0000000..b68f99f --- /dev/null +++ b/resources/study.py @@ -0,0 +1,49 @@ +""" +A listing of hamstudy command resources +--- +Copyright (C) 2019-2020 Abigail Gold, 0x5c + +This file is part of discord-qrmbot and is released under the terms of the GNU +General Public License, version 2. +""" + +pool_names = {'us': {'technician': 'E2', + 'tech': 'E2', + 't': 'E2', + 'general': 'E3', + 'gen': 'E3', + 'g': 'E3', + 'extra': 'E4', + 'e': 'E4'}, + 'ca': {'basic': 'CA_B', + 'b': 'CA_B', + 'advanced': 'CA_A', + 'adv': 'CA_A', + 'a': 'CA_A', + 'basic_fr': 'CA_FB', + 'b_fr': 'CA_FB', + 'base': 'CA_FB', + 'advanced_fr': 'CA_FS', + 'adv_fr': 'CA_FS', + 'a_fr': 'CA_FS', + 'supérieure': 'CA_FS', + 'superieure': 'CA_FS', + 's': 'CA_FS'}, + 'us_c': {'c1': 'C1', + 'comm1': 'C1', + 'c3': 'C3', + 'comm3': 'C3', + 'c6': 'C6', + 'comm6': 'C6', + 'c7': 'C7', + 'comm7': 'C7', + 'c7r': 'C7R', + 'comm7r': 'C7R', + 'c8': 'C8', + 'comm8': 'C8', + 'c9': 'C9', + 'comm9': 'C9'}} + +pool_emojis = {'us': '🇺🇸', + 'ca': '🇨🇦', + 'us_c': '🇺🇸 🏢'} From 528307f22f4d2176d9b0a07ff36c93252d852ed3 Mon Sep 17 00:00:00 2001 From: Abigail Date: Tue, 21 Jan 2020 20:25:37 -0500 Subject: [PATCH 4/5] updated changelog for hamstudy refactor --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e8648c6..cb9a35f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed - Changelog command to accept a version as argument. - The qrz command can now link to a QRZ page instead of embedding the data with the `--link` flag. +- All currently-available pools can now be accessed by the `hamstudy` command. +- The `hamstudy` command now uses the syntax `?hamstudy `. +- Replaced `hamstudyanswer` command with answering by reaction. ### Fixed - Fixed ditto marks (") appearing in the ae7q call command. - Fixed issue where incorrect table was parsed in ae7q call command. From b64c7ee39a5c904755e307a89b4c86730f33ceb2 Mon Sep 17 00:00:00 2001 From: Abigail Date: Tue, 21 Jan 2020 20:31:13 -0500 Subject: [PATCH 5/5] damn you flake8 --- exts/study.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/exts/study.py b/exts/study.py index 1d68e66..b6e11c8 100644 --- a/exts/study.py +++ b/exts/study.py @@ -53,7 +53,8 @@ class StudyCog(commands.Cog): embed.colour = cmn.colours.bad for cty in study.pool_names: levels = '`, `'.join(study.pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", + value=f"Levels: `{levels}`", inline=False) embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return @@ -70,7 +71,8 @@ class StudyCog(commands.Cog): embed.colour = cmn.colours.bad for cty in study.pool_names: levels = '`, `'.join(study.pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", + value=f"Levels: `{levels}`", inline=False) embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return @@ -98,7 +100,8 @@ class StudyCog(commands.Cog): embed.colour = cmn.colours.bad for cty in study.pool_names: levels = '`, `'.join(study.pool_names[cty].keys()) - embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", value=f"Levels: `{levels}`", inline=False) + embed.add_field(name=f"**Country: `{cty}` {study.pool_emojis[cty]}**", + value=f"Levels: `{levels}`", inline=False) embed.add_field(name="**Random**", value="To select a random pool or country, use `random` or `r`") await ctx.send(embed=embed) return @@ -129,7 +132,8 @@ class StudyCog(commands.Cog): f"\n**{cmn.emojis.d}** {question['answers']['D']}"), inline=False) embed.add_field(name='To Answer:', - value='Answer with reactions below. If not answered within 10 minutes, the answer will be revealed.', + value=('Answer with reactions below. If not answered within 10 minutes,' + ' the answer will be revealed.'), inline=False) if 'image' in question: image_url = f'https://hamstudy.org/_1330011/images/{pool.split("_",1)[1]}/{question["image"]}' @@ -143,7 +147,9 @@ class StudyCog(commands.Cog): await cmn.add_react(q_msg, cmn.emojis.d) def check(reaction, user): - return user.id != self.bot.user.id and reaction.message.id == q_msg.id and str(reaction.emoji) in self.choices.keys() + return (user.id != self.bot.user.id + and reaction.message.id == q_msg.id + and str(reaction.emoji) in self.choices.keys()) try: reaction, user = await self.bot.wait_for('reaction_add', timeout=600.0, check=check)