-
Notifications
You must be signed in to change notification settings - Fork 4
/
pagination.py
144 lines (138 loc) · 5.05 KB
/
pagination.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#Importing libraries, these are all we need
import discord, asyncio
from discord.ext import commands
from discord_components import DiscordComponents, Button, ButtonStyle, InteractionType
#Using commands.Bot, you can use discord.Client also
bot = commands.Bot(
command_prefix = "sc." #Put your prefix in place of "sc."
)
#Components init
DiscordComponents(bot)
#On ready event
@bot.event
async def on_ready():
print("Paginator Online")
#Pagination Embeds...
##Like usual, just type out embeds in the discord.Embed() format and be sure to keep the names different
embedOne = discord.Embed(
title = "Page #1", #Any title will do
description = "This is page one!" #Any description will be fine
)
embedTwo = discord.Embed(
title = "Page #2",
description = "This is page two!"
)
embedThree = discord.Embed(
title = "Page #3",
description = "This is page three!"
)
#I have not added fields / authors, you're free to do so and works fine anyways
#Get all embeds into a list
paginationList = [embedOne, embedTwo, embedThree] #Just append all embed names in here, in the right order ofcourse
#Main command
@bot.command(
name = "pagination",
aliases = ["pages"]
)
async def pagination(ctx):
#Sets a default embed
current = 0
#Sending first message
#I used ctx.reply, you can use simply send as well
mainMessage = await ctx.reply(
"**Pagination!**",
embed = paginationList[current],
components = [ #Use any button style you wish to :)
[
Button(
label = "Prev",
id = "back",
style = ButtonStyle.red
),
Button(
label = f"Page {int(paginationList.index(paginationList[current])) + 1}/{len(paginationList)}",
id = "cur",
style = ButtonStyle.grey,
disabled = True
),
Button(
label = "Next",
id = "front",
style = ButtonStyle.red
)
]
]
)
#Infinite loop
while True:
#Try and except blocks to catch timeout and break
try:
interaction = await bot.wait_for(
"button_click",
check = lambda i: i.component.id in ["back", "front"], #You can add more
timeout = 10.0 #10 seconds of inactivity
)
#Getting the right list index
if interaction.component.id == "back":
current -= 1
elif interaction.component.id == "front":
current += 1
#If its out of index, go back to start / end
if current == len(paginationList):
current = 0
elif current < 0:
current = len(paginationList) - 1
#Edit to new page + the center counter changes
await interaction.respond(
type = InteractionType.UpdateMessage,
embed = paginationList[current],
components = [ #Use any button style you wish to :)
[
Button(
label = "Prev",
id = "back",
style = ButtonStyle.red
),
Button(
label = f"Page {int(paginationList.index(paginationList[current])) + 1}/{len(paginationList)}",
id = "cur",
style = ButtonStyle.grey,
disabled = True
),
Button(
label = "Next",
id = "front",
style = ButtonStyle.red
)
]
]
)
except asyncio.TimeoutError:
#Disable and get outta here
await mainMessage.edit(
components = [
[
Button(
label = "Prev",
id = "back",
style = ButtonStyle.red,
disabled = True
),
Button(
label = f"Page {int(paginationList.index(paginationList[current])) + 1}/{len(paginationList)}",
id = "cur",
style = ButtonStyle.grey,
disabled = True
),
Button(
label = "Next",
id = "front",
style = ButtonStyle.red,
disabled = True
)
]
]
)
break
#Run bot
bot.run("<TOKEN>")