27
27
from typing import List
28
28
29
29
import discord
30
+ from discord .errors import DiscordException
30
31
from discord .ext .bridge import BridgeContext
31
32
from discord .ext .commands import Context
33
+ from discord .file import File
32
34
from discord .member import Member
33
35
from discord .user import User
34
36
@@ -103,26 +105,25 @@ async def callback(self, interaction: discord.Interaction):
103
105
interaction: :class:`discord.Interaction`
104
106
The interaction created by clicking the navigation button.
105
107
"""
108
+ new_page = self .paginator .current_page
106
109
if self .button_type == "first" :
107
- self . paginator . current_page = 0
110
+ new_page = 0
108
111
elif self .button_type == "prev" :
109
112
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
111
114
else :
112
- self . paginator . current_page -= 1
115
+ new_page -= 1
113
116
elif self .button_type == "next" :
114
117
if (
115
118
self .paginator .loop_pages
116
119
and self .paginator .current_page == self .paginator .page_count
117
120
):
118
- self . paginator . current_page = 0
121
+ new_page = 0
119
122
else :
120
- self . paginator . current_page += 1
123
+ new_page += 1
121
124
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 )
126
127
127
128
128
129
class Page :
@@ -656,6 +657,20 @@ async def cancel(
656
657
else :
657
658
await self .message .edit (view = self )
658
659
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
+
659
674
async def goto_page (
660
675
self , page_number : int = 0 , * , interaction : discord .Interaction | None = None
661
676
) -> None :
@@ -680,42 +695,34 @@ async def goto_page(
680
695
:class:`~discord.Message`
681
696
The message associated with the paginator.
682
697
"""
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 )
695
700
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
700
725
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
- )
719
726
if self .trigger_on_display :
720
727
await self .page_action (interaction = interaction )
721
728
0 commit comments