Example #1
0
    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)
Example #2
0
    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