UNPKG

xfinity

Version:

Easy to use discord.js multipurpose package for your bot

72 lines (69 loc) 2.15 kB
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;