xfinity
Version:
Easy to use discord.js multipurpose package for your bot
72 lines (69 loc) • 2.15 kB
JavaScript
const { Message, MessageActionRow, MessageSelectMenu } = require("discord.js");
const chalk = require("chalk");
/**
*
* @param {Message} message
* @param {Array} pages
*/
async function mPagination(message, pages, options = []) {
if (!pages || !message)
throw new TypeError(
chalk.redBright(`Please supply both message and a pages array!`)
);
let count = 0;
let pos = 0;
let dropdowns = [];
try {
pages.forEach(() => {
const newPos = pos++;
let description = `Click this to jump to the ${newPos} page!`;
let label = `#${newPos}`;
if (options.description)
description = options.description.replace(/{position}/, newPos);
if (options.label) label = options.label.replace(/{position}/, newPos);
dropdowns.push({
label,
description,
value: `${newPos}`,
});
});
const row = new MessageActionRow().addComponents([
new MessageSelectMenu()
.setPlaceholder("Choose a page!")
.addOptions(dropdowns)
.setCustomId("queue_pagination"),
]);
const baseMessage = await message.followUp({
embeds: [pages[count]],
components: [row],
});
const filter = async (interaction) => {
if (interaction.user.id !== message.user.id) {
interaction.reply({
content: ":x: Someone else is using the menu!",
ephemeral: true,
});
return false;
}
return true;
};
const collector = baseMessage.createMessageComponentCollector({
filter,
componentType: "SELECT_MENU",
});
collector.on("collect", async (interaciton) => {
if (interaciton.isSelectMenu()) {
if (interaciton.customId === "queue_pagination") {
const newPage = interaciton.values[0];
await interaciton.deferUpdate();
await interaciton.message.edit({ embeds: [pages[newPage]] });
}
}
});
} catch (e) {
console.log(
chalk.redBright(`Error occured | mPagination | Error: ${e.stack}`)
);
}
}
module.exports = mPagination;