Skip to content

Commit 6c990b9

Browse files
fix(ext-pages): revert paginator on callback fail (#2448)
* fix(ext-pages): revert paginator on callback fail * style(pre-commit): auto fixes from pre-commit.com hooks * docs(changelog): update changelog --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 08370b5 commit 6c990b9

File tree

2 files changed

+52
-43
lines changed

2 files changed

+52
-43
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ These changes are available on the `master` branch, but have not yet been releas
4646
([#2417](https://github.com/Pycord-Development/pycord/pull/2417))
4747
- Fixed parameter `embed=None` causing `AttributeError` on `PartialMessage.edit`.
4848
([#2446](https://github.com/Pycord-Development/pycord/pull/2446))
49+
- Fixed paginator to revert state if a page update callback fails.
50+
([#2448](https://github.com/Pycord-Development/pycord/pull/2448))
4951

5052
### Changed
5153

discord/ext/pages/pagination.py

Lines changed: 50 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
from typing import List
2828

2929
import discord
30+
from discord.errors import DiscordException
3031
from discord.ext.bridge import BridgeContext
3132
from discord.ext.commands import Context
33+
from discord.file import File
3234
from discord.member import Member
3335
from discord.user import User
3436

@@ -103,26 +105,25 @@ async def callback(self, interaction: discord.Interaction):
103105
interaction: :class:`discord.Interaction`
104106
The interaction created by clicking the navigation button.
105107
"""
108+
new_page = self.paginator.current_page
106109
if self.button_type == "first":
107-
self.paginator.current_page = 0
110+
new_page = 0
108111
elif self.button_type == "prev":
109112
if self.paginator.loop_pages and self.paginator.current_page == 0:
110-
self.paginator.current_page = self.paginator.page_count
113+
new_page = self.paginator.page_count
111114
else:
112-
self.paginator.current_page -= 1
115+
new_page -= 1
113116
elif self.button_type == "next":
114117
if (
115118
self.paginator.loop_pages
116119
and self.paginator.current_page == self.paginator.page_count
117120
):
118-
self.paginator.current_page = 0
121+
new_page = 0
119122
else:
120-
self.paginator.current_page += 1
123+
new_page += 1
121124
elif self.button_type == "last":
122-
self.paginator.current_page = self.paginator.page_count
123-
await self.paginator.goto_page(
124-
page_number=self.paginator.current_page, interaction=interaction
125-
)
125+
new_page = self.paginator.page_count
126+
await self.paginator.goto_page(page_number=new_page, interaction=interaction)
126127

127128

128129
class Page:
@@ -656,6 +657,20 @@ async def cancel(
656657
else:
657658
await self.message.edit(view=self)
658659

660+
def _goto_page(self, page_number: int = 0) -> tuple[Page, list[File] | None]:
661+
self.current_page = page_number
662+
self.update_buttons()
663+
664+
page = self.pages[page_number]
665+
page = self.get_page_content(page)
666+
667+
if page.custom_view:
668+
self.update_custom_view(page.custom_view)
669+
670+
files = page.update_files()
671+
672+
return page, files
673+
659674
async def goto_page(
660675
self, page_number: int = 0, *, interaction: discord.Interaction | None = None
661676
) -> None:
@@ -680,42 +695,34 @@ async def goto_page(
680695
:class:`~discord.Message`
681696
The message associated with the paginator.
682697
"""
683-
self.update_buttons()
684-
self.current_page = page_number
685-
if self.show_indicator:
686-
try:
687-
self.buttons["page_indicator"][
688-
"object"
689-
].label = f"{self.current_page + 1}/{self.page_count + 1}"
690-
except KeyError:
691-
pass
692-
693-
page = self.pages[page_number]
694-
page = self.get_page_content(page)
698+
old_page = self.current_page
699+
page, files = self._goto_page(page_number)
695700

696-
if page.custom_view:
697-
self.update_custom_view(page.custom_view)
698-
699-
files = page.update_files()
701+
try:
702+
if interaction:
703+
await interaction.response.defer() # needed to force webhook message edit route for files kwarg support
704+
await interaction.followup.edit_message(
705+
message_id=self.message.id,
706+
content=page.content,
707+
embeds=page.embeds,
708+
attachments=[],
709+
files=files or [],
710+
view=self,
711+
)
712+
else:
713+
await self.message.edit(
714+
content=page.content,
715+
embeds=page.embeds,
716+
attachments=[],
717+
files=files or [],
718+
view=self,
719+
)
720+
except DiscordException:
721+
# Something went wrong, and the paginator couldn't be updated.
722+
# Revert our changes and propagate the error.
723+
self._goto_page(old_page)
724+
raise
700725

701-
if interaction:
702-
await interaction.response.defer() # needed to force webhook message edit route for files kwarg support
703-
await interaction.followup.edit_message(
704-
message_id=self.message.id,
705-
content=page.content,
706-
embeds=page.embeds,
707-
attachments=[],
708-
files=files or [],
709-
view=self,
710-
)
711-
else:
712-
await self.message.edit(
713-
content=page.content,
714-
embeds=page.embeds,
715-
attachments=[],
716-
files=files or [],
717-
view=self,
718-
)
719726
if self.trigger_on_display:
720727
await self.page_action(interaction=interaction)
721728

0 commit comments

Comments
 (0)