From 8a2432a575f72c1fa0c083e552217136ffb87102 Mon Sep 17 00:00:00 2001 From: Krittick Date: Tue, 12 Apr 2022 17:54:31 -0700 Subject: [PATCH 1/7] initial pass at adding `Paginator.edit()` method --- discord/ext/pages/pagination.py | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index 4b196bfb36..fd132084e6 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -839,6 +839,61 @@ async def send( return self.message + async def edit( + self, + message: discord.Message, + suppress: Optional[bool] = None, + allowed_mentions: Optional[discord.AllowedMentions] = None, + delete_after: Optional[float] = None, + ) -> discord.Message: + """Edits an existing message to replace it with the paginator contents. + + Parameters + ----------- + message: :class:`discord.Message` + The message to edit with the paginator. + suppress: :class:`bool` + Whether to suppress embeds for the message. This removes + all the embeds if set to ``True``. If set to ``False`` + this brings the embeds back if they were suppressed. + Using this parameter requires :attr:`~.Permissions.manage_messages`. + allowed_mentions: Optional[:class:`~discord.AllowedMentions`] + Controls the mentions being processed in this message. If this is + passed, then the object is merged with :attr:`~discord.Client.allowed_mentions`. + The merging behaviour only overrides attributes that have been explicitly passed + to the object, otherwise it uses the attributes set in :attr:`~discord.Client.allowed_mentions`. + If no object is passed at all then the defaults given by :attr:`~discord.Client.allowed_mentions` + are used instead. + delete_after: Optional[:class:`float`] + If set, deletes the paginator after the specified time. + Returns + -------- + :class:`discord.Message` + The message that was edited. + """ + if not isinstance(message, discord.Message): + raise TypeError(f"expected Message not {message.__class__!r}") + + self.update_buttons() + self.update_buttons() + + page: Union[Page, str, discord.Embed, List[discord.Embed]] = self.pages[self.current_page] + page_content: Page = self.get_page_content(page) + + if page_content.custom_view: + self.update_custom_view(page_content.custom_view) + + self.user = message.author + + return await message.edit( + content=page_content.content, + embeds=page_content.embeds, + view=self, + suppress=suppress, + allowed_mentions=allowed_mentions, + delete_after=delete_after, + ) + async def respond( self, interaction: discord.Interaction, From 9ad4bc186c165ced2f7d5d49776a71f8ad3c0772 Mon Sep 17 00:00:00 2001 From: Krittick Date: Tue, 12 Apr 2022 18:01:55 -0700 Subject: [PATCH 2/7] update docstrings, add try/except to skip messages that aren't found --- discord/ext/pages/pagination.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index fd132084e6..d5b23bac2e 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -848,6 +848,11 @@ async def edit( ) -> discord.Message: """Edits an existing message to replace it with the paginator contents. + .. note:: + + If invoked from an interaction, you will still need to respond to the interaction. + + Parameters ----------- message: :class:`discord.Message` @@ -866,6 +871,7 @@ async def edit( are used instead. delete_after: Optional[:class:`float`] If set, deletes the paginator after the specified time. + Returns -------- :class:`discord.Message` @@ -884,15 +890,20 @@ async def edit( self.update_custom_view(page_content.custom_view) self.user = message.author + self.message = message + try: + await message.edit( + content=page_content.content, + embeds=page_content.embeds, + view=self, + suppress=suppress, + allowed_mentions=allowed_mentions, + delete_after=delete_after, + ) + except discord.NotFound: + pass - return await message.edit( - content=page_content.content, - embeds=page_content.embeds, - view=self, - suppress=suppress, - allowed_mentions=allowed_mentions, - delete_after=delete_after, - ) + return message async def respond( self, From 9c0fd5731ffbc5c1ce0e455082c9b97313d01eb9 Mon Sep 17 00:00:00 2001 From: Krittick Date: Tue, 12 Apr 2022 18:07:23 -0700 Subject: [PATCH 3/7] remove accidental duplicate line --- discord/ext/pages/pagination.py | 1 - 1 file changed, 1 deletion(-) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index d5b23bac2e..bfd2311aa7 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -881,7 +881,6 @@ async def edit( raise TypeError(f"expected Message not {message.__class__!r}") self.update_buttons() - self.update_buttons() page: Union[Page, str, discord.Embed, List[discord.Embed]] = self.pages[self.current_page] page_content: Page = self.get_page_content(page) From 3e7c51ec255e554549807f2d430ab908d9d598e1 Mon Sep 17 00:00:00 2001 From: Krittick Date: Tue, 12 Apr 2022 18:12:07 -0700 Subject: [PATCH 4/7] add except clause when trying to edit a message that doesn't belong to the bot --- discord/ext/pages/pagination.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index bfd2311aa7..94a927a506 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -901,6 +901,8 @@ async def edit( ) except discord.NotFound: pass + except discord.Forbidden: + pass return message From cb58f631cbe3e79cc90d16bd3f4bc650cf48002a Mon Sep 17 00:00:00 2001 From: krittick Date: Thu, 14 Apr 2022 08:15:01 -0700 Subject: [PATCH 5/7] Update discord/ext/pages/pagination.py Co-authored-by: Middledot <78228142+Middledot@users.noreply.github.com> --- discord/ext/pages/pagination.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index 94a927a506..72aeca66a0 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -899,9 +899,7 @@ async def edit( allowed_mentions=allowed_mentions, delete_after=delete_after, ) - except discord.NotFound: - pass - except discord.Forbidden: + except (discord.NotFound, discord.Forbidden): pass return message From 4a05db22cf4e6f7826a98d00be36f0960d590023 Mon Sep 17 00:00:00 2001 From: Krittick Date: Thu, 14 Apr 2022 12:03:04 -0700 Subject: [PATCH 6/7] apply suggestions from code review --- discord/ext/pages/pagination.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index 72aeca66a0..31e7952a0d 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -845,7 +845,7 @@ async def edit( suppress: Optional[bool] = None, allowed_mentions: Optional[discord.AllowedMentions] = None, delete_after: Optional[float] = None, - ) -> discord.Message: + ) -> Optional[discord.Message]: """Edits an existing message to replace it with the paginator contents. .. note:: @@ -889,9 +889,8 @@ async def edit( self.update_custom_view(page_content.custom_view) self.user = message.author - self.message = message try: - await message.edit( + self.message = await message.edit( content=page_content.content, embeds=page_content.embeds, view=self, @@ -902,7 +901,7 @@ async def edit( except (discord.NotFound, discord.Forbidden): pass - return message + return self.message async def respond( self, From bf2ff8d9fd9b8e57b44c205398979884d3e9ea60 Mon Sep 17 00:00:00 2001 From: krittick Date: Thu, 14 Apr 2022 12:30:53 -0700 Subject: [PATCH 7/7] Update discord/ext/pages/pagination.py Co-authored-by: Middledot <78228142+Middledot@users.noreply.github.com> --- discord/ext/pages/pagination.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/ext/pages/pagination.py b/discord/ext/pages/pagination.py index 31e7952a0d..41aa8a76e9 100644 --- a/discord/ext/pages/pagination.py +++ b/discord/ext/pages/pagination.py @@ -874,8 +874,8 @@ async def edit( Returns -------- - :class:`discord.Message` - The message that was edited. + Optional[:class:`discord.Message`] + The message that was edited. Returns ``None`` if the operation failed. """ if not isinstance(message, discord.Message): raise TypeError(f"expected Message not {message.__class__!r}")