-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathviews.py
123 lines (100 loc) · 3.6 KB
/
views.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import discord
import math
class RoleSelect(discord.ui.Select):
def __init__(self, roles, action):
self.selected = None
options = []
for role in roles:
options.append(discord.SelectOption(
label=role.name,
value=role.id
))
super().__init__(placeholder=f'Select role to {action}', min_values=1, max_values=1, options=options)
async def callback(self, interaction: discord.Interaction):
selected = [f for f in self.options if str(f.value) in self.values][0]
self.selected = {"name": selected.label, "id": selected.value}
await interaction.response.defer()
self.view.value = True
self.view.stop()
class EditButton(discord.ui.Button):
def __init__(self):
super().__init__(
label='Edit Post',
style=discord.ButtonStyle.green
)
async def callback(self, interaction: discord.Interaction):
self.view.value = True
await interaction.response.defer()
self.view.stop()
class CancelButton(discord.ui.Button):
def __init__(self):
super().__init__(
label='Cancel',
style=discord.ButtonStyle.red
)
async def callback(self, interaction: discord.Interaction):
self.view.value = False
await interaction.response.defer()
self.view.stop()
class LeftButton(discord.ui.Button):
def __init__(self):
super().__init__(
label='◀',
style=discord.ButtonStyle.primary
)
async def callback(self, interaction: discord.Interaction):
await interaction.response.defer()
await self.view.page_down()
class RightButton(discord.ui.Button):
def __init__(self):
super().__init__(
label='▶',
style=discord.ButtonStyle.primary
)
async def callback(self, interaction: discord.Interaction):
await interaction.response.defer()
await self.view.page_up()
class RoleView(discord.ui.View):
def __init__(self, interaction, roles, action, timeout):
super().__init__(timeout=timeout)
self.interaction = interaction
self.action = action
self.value = None
self.page = 0
self.total_pages = 1
self.roles = roles
if len(roles) > 25:
self.page = 1
self.total_pages = math.ceil(len(roles) / 25)
roles = self.roles[0:25]
action = f'{action} (Page 1)'
self.select = RoleSelect(roles, action)
self.add_item(self.select)
if self.page > 0:
self.add_item(LeftButton())
self.add_item(RightButton())
# disable left button, we're first page at the start
self.children[1].disabled = True
async def page_down(self):
if self.page <= 1:
return
self.page -= 1
await self.change_page()
async def page_up(self):
if self.page >= self.total_pages:
return
self.page += 1
await self.change_page()
async def change_page(self):
start = (self.page - 1) * 25
end = start + 25
roles = self.roles[start:end]
# remove old select, add new select
self.remove_item(self.select)
action = f'{self.action} (Page {self.page})'
self.select = RoleSelect(roles, action)
self.add_item(self.select)
# disable buttons if needed
self.children[0].disabled = self.page == 1
self.children[1].disabled = self.page == self.total_pages
await self.interaction.edit_original_response(view=self)