async def on_raw_reaction_add(self, payload): if payload.user_id == self.bot.id: return if payload.member and payload.member.bot: return if payload.emoji.name not in ["⏮️", "◀️", "⏹️", "▶️", "⏭️"]: return menu, channel, message = await tools.get_reaction_menu( self.bot, payload, "paginator") if menu is None: return if payload.emoji.name == "⏹️": try: await message.clear_reactions() except discord.Forbidden: for emoji in ["⏮️", "◀️", "⏹️", "▶️", "⏭️"]: try: await message.remove_reaction(emoji, self.bot.user) except discord.NotFound: pass await self.bot.state.delete( f"reaction_menu:{channel.id}:{message.id}") await self.bot.state.srem( "reaction_menu_keys", f"reaction_menu:{channel.id}:{message.id}", ) return page = menu["data"]["page"] all_pages = menu["data"]["all_pages"] if payload.emoji.name == "⏮️": page = 0 elif payload.emoji.name == "◀️" and page > 0: page -= 1 elif payload.emoji.name == "▶️" and page < len(all_pages) - 1: page += 1 elif payload.emoji.name == "⏭️": page = len(all_pages) - 1 await message.edit(Embed.from_dict(all_pages[page])) try: member = tools.create_fake_user(payload.user_id) await message.remove_reaction(payload.emoji, member) except (discord.Forbidden, discord.NotFound): pass menu["data"]["page"] = page menu["end"] = int(time.time()) + 180 await self.bot.state.set(f"reaction_menu:{channel.id}:{message.id}", menu)
def __init__(self, *, state, channel, data): self._state = state self._data = data self.id = int(data["id"]) self.webhook_id = utils._get_as_snowflake(data, "webhook_id") self.attachments = [ Attachment(data=x, state=self._state) for x in data["attachments"] ] self.embeds = [Embed.from_dict(x) for x in data["embeds"]] self.application = data.get("application") self.activity = data.get("activity") self.channel = channel self._edited_timestamp = utils.parse_time(data["edited_timestamp"]) self.type = try_enum(MessageType, data["type"]) self.pinned = data["pinned"] self.flags = MessageFlags._from_value(data.get("flags", 0)) self.mention_everyone = data["mention_everyone"] self.tts = data["tts"] self.content = data["content"] self.nonce = data.get("nonce") ref = data.get("message_reference") self.reference = MessageReference.with_state( state, ref) if ref is not None else None try: self._author = self._state.store_user(self._data["author"]) except KeyError: self._author = None try: author = self._author try: author._update_from_message(self._data["member"]) except AttributeError: author = Member._from_message(message=self, data=self._data["member"]) self._member = author except KeyError: self._member = None for handler in ("call", "flags"): try: getattr(self, f"_handle_{handler}")(data[handler]) except KeyError: continue
async def on_raw_reaction_add(self, payload): if payload.user_id == self.bot.id: return if payload.member: return if payload.emoji.name in ["✅", "🔁", "❌"]: menu, channel, msg = await tools.get_reaction_menu( self.bot, payload, "confirmation") if menu is None: return guild = await self.bot.get_guild(menu["data"]["guild"]) message = Message(state=self.bot.state, channel=channel, data=menu["data"]["msg"]) if payload.emoji.name == "✅": await self.send_mail(message, guild) await msg.delete() else: if payload.emoji.name == "🔁": await msg.edit(Embed("Loading servers...")) self.bot.loop.create_task( tools.select_guild(self.bot, message, msg)) elif payload.emoji.name == "❌": await msg.edit( ErrorEmbed("Request cancelled successfully.")) for reaction in ["✅", "🔁", "❌"]: await msg.remove_reaction(reaction, self.bot.user) await self.bot.state.delete(f"reaction_menu:{channel.id}:{msg.id}") await self.bot.state.srem( "reaction_menu_keys", f"reaction_menu:{channel.id}:{msg.id}", ) return numbers = ["1⃣", "2⃣", "3⃣", "4⃣", "5⃣", "6⃣", "7⃣", "8⃣", "9⃣", "🔟"] arrows = ["◀️", "▶️"] if payload.emoji.name in numbers + arrows: menu, channel, msg = await tools.get_reaction_menu( self.bot, payload, "selection") if menu is None: return page = menu["data"]["page"] all_pages = menu["data"]["all_pages"] if payload.emoji.name not in arrows: chosen = numbers.index(payload.emoji.name) await msg.delete() fields = all_pages[page]["fields"] if chosen > len(fields): return guild = await self.bot.get_guild( fields[chosen]["value"].split()[-1]) message = Message(state=self.bot.state, channel=channel, data=menu["data"]["msg"]) await self.send_mail(message, guild) await self.bot.state.delete( f"reaction_menu:{channel.id}:{msg.id}") await self.bot.state.srem( "reaction_menu_keys", f"reaction_menu:{channel.id}:{msg.id}", ) return if payload.emoji.name == "◀️" and page > 0: page -= 1 new_page = Embed.from_dict(all_pages[page]) await msg.edit(new_page) menu["data"]["page"] = page menu["end"] = int(time.time()) + 180 await self.bot.state.set( f"reaction_menu:{channel.id}:{msg.id}", menu) for reaction in numbers[:len(new_page.fields)]: await msg.add_reaction(reaction) if payload.emoji.name == "▶️" and page < len(all_pages) - 1: page += 1 new_page = Embed.from_dict(all_pages[page]) await msg.edit(new_page) menu["data"]["page"] = page menu["end"] = int(time.time()) + 180 await self.bot.state.set( f"reaction_menu:{channel.id}:{msg.id}", menu) for reaction in numbers[len(new_page.fields):]: try: await msg.remove_reaction(reaction, self.bot.user) except discord.NotFound: pass