Skip to content

Commit 6de5aee

Browse files
+ Added view pagination
1 parent 905f039 commit 6de5aee

File tree

1 file changed

+116
-1
lines changed

1 file changed

+116
-1
lines changed

src/utils.py

Lines changed: 116 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

1313
class 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)}]\nDisabled 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)}]\nDisabled due to timeout\n‍')
133+
await self.message.edit(embed = last, view = None)

0 commit comments

Comments
 (0)