
Research
/Security News
npm Author Qix Compromised via Phishing Email in Major Supply Chain Attack
npm author Qix’s account was compromised, with malicious versions of popular packages like chalk-template, color-convert, and strip-ansi published.
@discordx/pagination
Advanced tools
Add pagination to discord bot using buttons or menu.
Version 16.6.0 or newer of Node.js is required
npm install @discordx/pagination
yarn add @discordx/pagination
embeds: (string | MessageEmbed | MessageOptions)[] | Pagination
)import { Pagination, PaginationResolver } from "@discordx/pagination";
import type {
CommandInteraction,
MessageActionRowComponentBuilder,
} from "discord.js";
import {
ActionRowBuilder,
ButtonBuilder,
ButtonStyle,
EmbedBuilder,
} from "discord.js";
import type { ArgsOf } from "discordx";
import { Discord, On, Slash } from "discordx";
function GeneratePages(limit?: number): MessageOptions[] {
const pages = Array.from(Array(limit ?? 20).keys()).map((i) => {
return { content: `I am ${i + 1}`, embed: `Demo ${i + 1}` };
});
return pages.map((page) => {
return {
content: page.content,
embeds: [new MessageEmbed().setTitle(page.embed)],
};
});
}
@Discord()
export class Example {
// example: message
@On({ event: "messageCreate" })
async messageCreate([message]: ArgsOf<"messageCreate">): Promise<void> {
if (message.content === "paginated demo") {
const pagination = new Pagination(message, GeneratePages());
await pagination.send();
}
}
// example: any text channel
@On({ event: "messageCreate" })
async messageCreateChannel([
message,
]: ArgsOf<"messageCreate">): Promise<void> {
if (message.content === "paginated channel demo") {
const pagination = new Pagination(message.channel, GeneratePages());
await pagination.send();
}
}
// Example: simple slash with button pagination
@Slash({ description: "Simple slash with button pagination", name: "demo-a" })
async demoA(interaction: CommandInteraction): Promise<void> {
const resolver = new PaginationResolver((page, paginator) => {
// Let's update our pagination dynamically
if (page === 3) {
// Set pages, this can can be resolver as well
paginator.setPages([
{ content: "1" },
{ content: "2" },
{ content: "3" },
{ content: "4" },
{ content: "5" },
]);
return { content: "Pagination updated" };
}
return { content: `page v2 ${page + 1}` };
}, 25);
const pagination = new Pagination(interaction, resolver, {
onTimeout: async () => {
try {
await interaction.deleteReply();
} catch (err) {
// ignore
}
},
buttons: {
backward: {
emoji: { name: "🙂" },
},
},
time: 60_000,
});
await pagination.send();
}
// example: simple slash with menu pagination
@Slash({ description: "Simple slash with menu pagination", name: "demo-b" })
async demoB(interaction: CommandInteraction): Promise<void> {
const pagination = new Pagination(interaction, GeneratePages(), {
time: 60_000,
});
await pagination.send();
}
// example: simple string array
@Slash({ description: "Simple string array", name: "demo-c" })
async demoC(interaction: CommandInteraction): Promise<void> {
const pagination = new Pagination(
interaction,
Array.from(Array(200).keys()).map((i) => ({
content: (i + 1).toString(),
})),
);
await pagination.send();
}
// example: array of custom message options
@Slash({ description: "Array of custom message options", name: "demo-d" })
async demoD(interaction: CommandInteraction): Promise<void> {
const pagination = new Pagination(interaction, [
{
content: "Page 1",
},
{
content: "Page 2",
embeds: [new EmbedBuilder({ title: "It's me embed 2" })],
},
{
components: [
new ActionRowBuilder<MessageActionRowComponentBuilder>().addComponents(
[
new ButtonBuilder({
customId: "myCustomId",
label: "My Custom Button",
style: ButtonStyle.Primary,
}),
],
),
],
content: "Page 3",
embeds: [new EmbedBuilder({ title: "It's me embed 3" })],
},
]);
await pagination.send();
}
}
Name | Type | Default | Description |
---|---|---|---|
debug | boolean | false | Enable debug logging |
ephemeral | boolean | undefined | Set ephemeral response |
initialPage | number | 0 | Initial page number |
itemsPerPage | number | undefined | Number of items shown per page in select menu |
onTimeout | Function | undefined | Callback function when pagination times out |
The following options are available under the buttons
configuration:
Name | Type | Description |
---|---|---|
previous | ButtonOptions | Previous button configuration |
backward | ButtonOptions | Backward button configuration (-10 pages) |
forward | ButtonOptions | Forward button configuration (+10 pages) |
next | ButtonOptions | Next button configuration |
exit | ButtonOptions | Exit button configuration |
skipAmount | number | Number of pages to skip with skip buttons (default: 10) |
Name | Type | Description |
---|---|---|
enabled | Boolean | Show button in row |
emoji | ComponentEmojiResolvable | null | Button emoji |
id | string | Custom button ID |
label | string | Button label text |
style | ButtonStyle | Button style (PRIMARY|SECONDARY|SUCCESS|DANGER) |
The following options are available under the selectMenu
configuration:
Name | Type | Default | Description |
---|---|---|---|
labels.start | string | "Start" | Start label text |
labels.end | string | "End" | End label text |
menuId | string | "discordx@pagination@menu" | Custom select menu ID |
pageText | string | string[] | "Page {page} " | Page text format (use {page} for page number) |
rangePlaceholderFormat | string | undefined | Custom range placeholder format (use {start} , {end} , {total} ) |
FAQs
Library for creating pagination messages in Discord bots
The npm package @discordx/pagination receives a total of 231 weekly downloads. As such, @discordx/pagination popularity was classified as not popular.
We found that @discordx/pagination demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
/Security News
npm author Qix’s account was compromised, with malicious versions of popular packages like chalk-template, color-convert, and strip-ansi published.
Research
Four npm packages disguised as cryptographic tools steal developer credentials and send them to attacker-controlled Telegram infrastructure.
Security News
Ruby maintainers from Bundler and rbenv teams are building rv to bring Python uv's speed and unified tooling approach to Ruby development.