From d8a1e17a2f9ca2162fb98b892b56057c89153982 Mon Sep 17 00:00:00 2001 From: qwewqa <198e559dbd446d973355f415bdfa34@gmail.com> Date: Mon, 21 Dec 2020 21:00:47 -0500 Subject: [PATCH] create generic reaction message implementation --- miyu_bot/commands/cogs/music.py | 19 ++---------- miyu_bot/commands/common/reaction_message.py | 32 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 miyu_bot/commands/common/reaction_message.py diff --git a/miyu_bot/commands/cogs/music.py b/miyu_bot/commands/cogs/music.py index f9411b0..06d8524 100644 --- a/miyu_bot/commands/cogs/music.py +++ b/miyu_bot/commands/cogs/music.py @@ -9,6 +9,7 @@ from discord.ext import commands from main import asset_manager from miyu_bot.commands.common.fuzzy_matching import romanize, FuzzyMap +from miyu_bot.commands.common.reaction_message import make_tabbed_message class Music(commands.Cog): @@ -18,7 +19,7 @@ class Music(commands.Cog): self.music = self.get_music() def get_music(self): - music = FuzzyMap(lambda m: m.is_released) + music = FuzzyMap(lambda m: m.is_released and not m.is_tutorial) for m in asset_manager.music_master.values(): music[f'{m.name} {m.special_unit_name}'] = m return music @@ -123,21 +124,7 @@ class Music(commands.Cog): 790050636225052694, ] - for emote_id in reaction_emote_ids: - await message.add_reaction(self.bot.get_emoji(emote_id)) - - def check(rxn, usr): - return usr == ctx.author and rxn.emoji.id in reaction_emote_ids - - while True: - try: - reaction, user = await self.bot.wait_for('reaction_add', timeout=60, check=check) - self.logger.debug(f'Reaction {reaction} from user {user}.') - emote_index = reaction_emote_ids.index(reaction.emoji.id) - await message.edit(embed=embeds[emote_index]) - await message.remove_reaction(reaction, user) - except asyncio.TimeoutError: - break + asyncio.ensure_future(make_tabbed_message(ctx, message, reaction_emote_ids, embeds)) def get_chart_embed_info(self, song): embeds = [] diff --git a/miyu_bot/commands/common/reaction_message.py b/miyu_bot/commands/common/reaction_message.py new file mode 100644 index 0000000..947aece --- /dev/null +++ b/miyu_bot/commands/common/reaction_message.py @@ -0,0 +1,32 @@ +import asyncio +from typing import List, Callable, Awaitable + +from discord import Message, Embed +from discord.ext.commands import Context + + +async def make_tabbed_message(ctx: Context, message: Message, emote_ids: List[int], embeds: List[Embed], timeout=300): + async def callback(index, _ctx, _message): + await message.edit(embed=embeds[index]) + + await make_reaction_message(ctx, message, emote_ids, callback, timeout) + + +async def make_reaction_message(ctx: Context, message: Message, emote_ids: List[int], + callback: Callable[[int, Context, Message], Awaitable[None]], timeout = 300): + for emote_id in emote_ids: + await message.add_reaction(ctx.bot.get_emoji(emote_id)) + + def check(rxn, usr): + return usr == ctx.author and rxn.emoji.id in emote_ids and rxn.message.id == message.id + + while True: + try: + reaction, user = await ctx.bot.wait_for('reaction_add', timeout=timeout, check=check) + emote_index = emote_ids.index(reaction.emoji.id) + await callback(emote_index, ctx, message) + await message.remove_reaction(reaction, user) + except asyncio.TimeoutError: + for emote_id in emote_ids: + await message.remove_reaction(ctx.bot.get_emoji(emote_id), ctx.bot.user) + break