@@ -8,11 +8,126 @@ def __init__(self, color = None, **kwargs):
88 super ().__init__ (** kwargs )
99 self .timestamp = datetime .utcnow ()
1010 self .color = color or discord .Color .from_rgb (0 ,191 ,255 ) #Deepskyblue
11-
11+
1212
1313class Error (commands .CommandError ):
1414 def __init__ (self , title : str = 'Error' , description : str = '-' , fields : dict = {}, ** kwargs ):
1515 self .title = title
1616 self .description = description
1717 self .fields = fields
1818 super ().__init__ (** kwargs )
19+
20+
21+ class ViewPageScroller (discord .ui .View ):
22+ def __init__ (self , * , ownerid : int , load_page , pages : list = [], timeout = None ):
23+ self .ownerid = ownerid
24+ self .pages = pages
25+ self .current_page = 1
26+ self .load_page = load_page
27+
28+ super ().__init__ (
29+ timeout = timeout
30+ )
31+
32+ async def send_message (self , ctx , * args , ** kwargs ):
33+ self .message = await ctx .send (view = self , * args , ** kwargs )
34+ await self .update_message ()
35+
36+ async def update_message (self ):
37+ self .update_buttons ()
38+ await self .message .edit (embed = self .create_embed (), view = self )
39+
40+ def update_buttons (self ):
41+ if (self .current_page == 1 ) and (self .current_page != len (self .pages )):
42+ self .first_page_button .disabled = True
43+ self .next_button .disabled = False
44+ self .prev_button .disabled = True
45+ self .last_page_button .disabled = False
46+
47+ self .first_page_button .style = discord .ButtonStyle .gray
48+ self .next_button .style = discord .ButtonStyle .primary
49+ self .prev_button .style = discord .ButtonStyle .gray
50+ self .last_page_button .style = discord .ButtonStyle .green
51+
52+ elif (self .current_page > 1 ) and (self .current_page == len (self .pages )):
53+ self .first_page_button .disabled = False
54+ self .next_button .disabled = True
55+ self .prev_button .disabled = False
56+ self .last_page_button .disabled = True
57+
58+ self .first_page_button .style = discord .ButtonStyle .green
59+ self .next_button .style = discord .ButtonStyle .gray
60+ self .prev_button .style = discord .ButtonStyle .primary
61+ self .last_page_button .style = discord .ButtonStyle .gray
62+
63+ elif (self .current_page == 1 ) and (self .current_page == len (self .pages )):
64+ self .first_page_button .disabled = True
65+ self .next_button .disabled = True
66+ self .prev_button .disabled = True
67+ self .last_page_button .disabled = True
68+
69+ self .first_page_button .style = discord .ButtonStyle .gray
70+ self .next_button .style = discord .ButtonStyle .gray
71+ self .prev_button .style = discord .ButtonStyle .gray
72+ self .last_page_button .style = discord .ButtonStyle .gray
73+
74+ else :
75+ self .first_page_button .disabled = False
76+ self .next_button .disabled = False
77+ self .prev_button .disabled = False
78+ self .last_page_button .disabled = False
79+
80+ self .first_page_button .style = discord .ButtonStyle .green
81+ self .next_button .style = discord .ButtonStyle .primary
82+ self .prev_button .style = discord .ButtonStyle .primary
83+ self .last_page_button .style = discord .ButtonStyle .green
84+
85+ def create_embed (self ) -> discord .Embed :
86+ data = self .load_page (self .pages [self .current_page - 1 ])
87+ data .set_footer (text = f'Page [{ self .current_page } /{ len (self .pages )} ]\n ' )
88+ return data
89+
90+
91+ @discord .ui .button (label = "|<" , style = discord .ButtonStyle .green )
92+ async def first_page_button (self , interaction : discord .Interaction , button : discord .ui .Button ):
93+ if interaction .user .id != self .ownerid : return
94+ await interaction .response .defer ()
95+ self .current_page = 1
96+
97+ await self .update_message ()
98+
99+ @discord .ui .button (label = "<" , style = discord .ButtonStyle .primary )
100+ async def prev_button (self , interaction :discord .Interaction , button : discord .ui .Button ):
101+ if interaction .user .id != self .ownerid : return
102+ await interaction .response .defer ()
103+ self .current_page -= 1
104+
105+ await self .update_message ()
106+
107+ @discord .ui .button (label = ">" , style = discord .ButtonStyle .primary )
108+ async def next_button (self , interaction :discord .Interaction , button : discord .ui .Button ):
109+ if interaction .user .id != self .ownerid : return
110+ await interaction .response .defer ()
111+ self .current_page += 1
112+
113+ await self .update_message ()
114+
115+ @discord .ui .button (label = ">|" , style = discord .ButtonStyle .green )
116+ async def last_page_button (self , interaction :discord .Interaction , button : discord .ui .Button ):
117+ if interaction .user .id != self .ownerid : return
118+ await interaction .response .defer ()
119+ self .current_page = len (self .pages )
120+
121+ await self .update_message ()
122+
123+ @discord .ui .button (label = "Done" , style = discord .ButtonStyle .blurple )
124+ async def done (self , interaction :discord .Interaction , button : discord .ui .Button ):
125+ last = self .create_embed ()
126+ last .set_footer (text = f'Page [{ self .current_page } /{ len (self .pages )} ]\n Disabled due to user\n ' )
127+ await self .message .edit (embed = last , view = None )
128+ self .stop ()
129+
130+ async def on_timeout (self ) -> None :
131+ last = self .create_embed ()
132+ last .set_footer (text = f'Page [{ self .current_page } /{ len (self .pages )} ]\n Disabled due to timeout\n ' )
133+ await self .message .edit (embed = last , view = None )
0 commit comments