1
1
"""MIT License
2
2
3
- Copyright (c) 2021 - Present PythonistaGuild
3
+ Copyright (c) 2021- Present PythonistaGuild
4
4
5
5
Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
of this software and associated documentation files (the "Software"), to deal
20
20
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
SOFTWARE.
22
22
"""
23
+ from __future__ import annotations
24
+
23
25
import asyncio
26
+ from abc import abstractmethod
24
27
from typing import TYPE_CHECKING , Any
25
28
26
29
import discord
27
30
from discord import ui # shortcut because I'm lazy
28
- from discord .ext .commands import CommandError , Paginator as _Paginator
31
+ from discord .ext .commands import CommandError , Paginator as _Paginator # type: ignore # why does this need a stub file?
29
32
from discord .utils import MISSING
33
+
34
+
35
+ if TYPE_CHECKING :
36
+ from typing_extensions import Self
37
+
30
38
from core import Context
31
- from typing_extensions import Self
39
+
32
40
33
41
__all__ = ("CannotPaginate" , "Pager" , "KVPager" , "TextPager" )
34
42
@@ -86,9 +94,10 @@ def __init__(
86
94
if stop :
87
95
self .reaction_emojis .append (("\N{BLACK SQUARE FOR STOP} " , self .stop_pages )) # type: ignore
88
96
89
- if ctx .guild is not None :
97
+ if ctx .guild :
90
98
self .permissions = self .channel .permissions_for (ctx .guild .me )
91
99
else :
100
+ assert isinstance (self .channel , discord .abc .PrivateChannel )
92
101
self .permissions = self .channel .permissions_for (ctx .me )
93
102
94
103
if not self .permissions .embed_links :
@@ -97,7 +106,7 @@ def __init__(
97
106
if not self .permissions .send_messages :
98
107
raise CannotPaginate ("Bot cannot send messages." )
99
108
100
- def setup_buttons (self ):
109
+ def setup_buttons (self ) -> None :
101
110
self .clear_items ()
102
111
for emoji , button in self .reaction_emojis :
103
112
btn = ui .Button [Self ](emoji = emoji )
@@ -108,14 +117,15 @@ def get_page(self, page: int) -> list[Any]:
108
117
base = (page - 1 ) * self .per_page
109
118
return self .entries [base : base + self .per_page ]
110
119
120
+ @abstractmethod
111
121
def get_content (self , entry : Any , page : int , * , first : bool = False ) -> str :
112
- return None
122
+ raise NotImplementedError
113
123
114
- def get_embed (self , entries : list [Any ], page : int , * , first : bool = False ):
124
+ def get_embed (self , entries : list [Any ], page : int , * , first : bool = False ) -> discord . Embed :
115
125
self .prepare_embed (entries , page , first = first )
116
126
return self .embed
117
127
118
- def prepare_embed (self , entries : list [Any ], page : int , * , first : bool = False ):
128
+ def prepare_embed (self , entries : list [Any ], page : int , * , first : bool = False ) -> None :
119
129
p : list [Any ] = []
120
130
for index , entry in enumerate (entries , 1 + ((page - 1 ) * self .per_page )):
121
131
if self .nocount :
@@ -162,28 +172,28 @@ async def checked_show_page(self, page: int):
162
172
if page != 0 and page <= self .maximum_pages :
163
173
await self .show_page (page )
164
174
165
- async def first_page (self , inter : discord .Interaction ):
175
+ async def first_page (self , inter : discord .Interaction ) -> None :
166
176
await inter .response .defer ()
167
177
await self .show_page (1 )
168
178
169
- async def last_page (self , inter : discord .Interaction ):
179
+ async def last_page (self , inter : discord .Interaction ) -> None :
170
180
await inter .response .defer ()
171
181
await self .show_page (self .maximum_pages )
172
182
173
- async def next_page (self , inter : discord .Interaction ):
183
+ async def next_page (self , inter : discord .Interaction ) -> None :
174
184
await inter .response .defer ()
175
185
await self .checked_show_page (self .current_page + 1 )
176
186
177
- async def previous_page (self , inter : discord .Interaction ):
187
+ async def previous_page (self , inter : discord .Interaction ) -> None :
178
188
await inter .response .defer ()
179
189
await self .checked_show_page (self .current_page - 1 )
180
190
181
- async def show_current_page (self , inter : discord .Interaction ):
191
+ async def show_current_page (self , inter : discord .Interaction ) -> None :
182
192
await inter .response .defer ()
183
193
if self .paginating :
184
194
await self .show_page (self .current_page )
185
195
186
- async def numbered_page (self , inter : discord .Interaction ):
196
+ async def numbered_page (self , inter : discord .Interaction ) -> None :
187
197
await inter .response .defer ()
188
198
to_delete = [await self .channel .send ("What page do you want to go to?" )]
189
199
@@ -205,8 +215,8 @@ def message_check(m: discord.Message) -> bool:
205
215
await asyncio .sleep (5 )
206
216
207
217
try :
208
- await self .channel .delete_messages (to_delete )
209
- except Exception :
218
+ await self .channel .delete_messages (to_delete ) # type: ignore # we handle the attribute error or http since exception handling is free
219
+ except ( AttributeError , discord . HTTPException ) :
210
220
pass
211
221
212
222
async def stop_pages (self , interaction : discord .Interaction | None = None ):
@@ -302,7 +312,7 @@ def get_page(self, page: int) -> Any:
302
312
return self .entries [page - 1 ]
303
313
304
314
def get_embed (self , entries : list [str ], page : int , * , first : bool = False ) -> discord .Embed :
305
- return None # type: ignore
315
+ return None # type: ignore
306
316
307
317
def get_content (self , entry : str , page : int , * , first : bool = False ) -> str :
308
318
if self .maximum_pages > 1 :
0 commit comments