From 34b912bc7c6a1bad815308fb9453e8c7343cbcc4 Mon Sep 17 00:00:00 2001 From: Draper <27962761+Drapersniper@users.noreply.github.com> Date: Wed, 23 Jun 2021 19:48:06 +0100 Subject: [PATCH] Allow `menu()` to listen to both adding and removing reactions (#4517) --- redbot/core/utils/menus.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/redbot/core/utils/menus.py b/redbot/core/utils/menus.py index a0c612828..b0cdf604c 100644 --- a/redbot/core/utils/menus.py +++ b/redbot/core/utils/menus.py @@ -88,11 +88,20 @@ async def menu( return try: - react, user = await ctx.bot.wait_for( - "reaction_add", - check=ReactionPredicate.with_emojis(tuple(controls.keys()), message, ctx.author), - timeout=timeout, + predicates = ReactionPredicate.with_emojis(tuple(controls.keys()), message, ctx.author) + tasks = [ + asyncio.ensure_future(ctx.bot.wait_for("reaction_add", check=predicates)), + asyncio.ensure_future(ctx.bot.wait_for("reaction_remove", check=predicates)), + ] + done, pending = await asyncio.wait( + tasks, timeout=timeout, return_when=asyncio.FIRST_COMPLETED ) + for task in pending: + task.cancel() + + if len(done) == 0: + raise asyncio.TimeoutError() + react, user = done.pop().result() except asyncio.TimeoutError: if not ctx.me: return @@ -126,10 +135,6 @@ async def next_page( timeout: float, emoji: str, ): - perms = message.channel.permissions_for(ctx.me) - if perms.manage_messages: # Can manage messages, so remove react - with contextlib.suppress(discord.NotFound): - await message.remove_reaction(emoji, ctx.author) if page == len(pages) - 1: page = 0 # Loop around to the first item else: @@ -146,10 +151,6 @@ async def prev_page( timeout: float, emoji: str, ): - perms = message.channel.permissions_for(ctx.me) - if perms.manage_messages: # Can manage messages, so remove react - with contextlib.suppress(discord.NotFound): - await message.remove_reaction(emoji, ctx.author) if page == 0: page = len(pages) - 1 # Loop around to the last item else: