UNPKG

djs-systems

Version:

The simplest way to build complex Discord bots.

331 lines (330 loc) 15.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.buttonPages = void 0; const discord_js_1 = require("discord.js"); const error_1 = require("./error"); const misc_1 = require("./misc"); // ------------------------------ // ------ F U N C T I O N ------- // ------------------------------ /** * An *powerful yet customizable* **Embed Paginator** * * @param msgOrInt * @param options * @link `Documentation:` https://simplyd.js.org/docs/general/buttonPages * @example simplydjs.buttonPages(interaction, [embed1, embed2] ) */ async function buttonPages(msgOrInt, options = { strict: false }) { return new Promise(async () => { try { options.skips ??= true; options.delete ??= true; options.dynamic ??= false; options.count ??= false; options.disable ||= 'Label'; if (!options.embeds) if (options.strict) throw new error_1.SimplyError({ function: 'buttonPages', title: 'Provide an array for the pages option', tip: `Expected an array of MessageEmbed. Received ${options.embeds || 'undefined'}` }); else console.log(`SimplyError - buttonPages | Error: Provide an array for the pages option. Expected an array of MessageEmbed. Received ${options.embeds || 'undefined'}`); let comps; if (options?.rows) { if (!Array.isArray(options.rows)) { if (options?.strict) throw new error_1.SimplyError({ function: 'buttonPages', title: `Provide an array for the rows`, tip: `Expected an array of MessageActionRows. Received ${options?.rows || 'undefined'}` }); else console.log(`SimplyError - buttonPages | Provide an array for the rows\n\n` + `Expected an array of MessageActionRows. Received ${options?.rows || 'undefined'}`); } comps = options?.rows; } else { comps = []; } const buttonStyles = { first: { style: options?.buttons?.first?.style || discord_js_1.ButtonStyle.Primary, emoji: options?.buttons?.first?.emoji || '⏪', label: options?.buttons?.first?.label || 'First' }, next: { style: options?.buttons?.next?.style || discord_js_1.ButtonStyle.Success, emoji: options?.buttons?.next?.emoji || '▶️', label: options?.buttons?.next?.label || 'Next' }, back: { style: options?.buttons?.back?.style || discord_js_1.ButtonStyle.Success, emoji: options?.buttons?.back?.emoji || '◀️', label: options?.buttons?.back?.label || 'Back' }, last: { style: options?.buttons?.last?.style || discord_js_1.ButtonStyle.Primary, emoji: options?.buttons?.last?.emoji || '⏩', label: options?.buttons?.last?.label || 'Last' }, delete: { style: options?.buttons?.delete?.style || discord_js_1.ButtonStyle.Danger, emoji: options?.buttons?.delete?.emoji || '🗑', label: options?.buttons?.delete?.label || 'Delete' } }; if (buttonStyles.first?.style) buttonStyles.first.style = (0, misc_1.toButtonStyle)(buttonStyles.first?.style); if (buttonStyles.next?.style) buttonStyles.next.style = (0, misc_1.toButtonStyle)(buttonStyles?.next?.style); if (buttonStyles.back?.style) buttonStyles.back.style = (0, misc_1.toButtonStyle)(buttonStyles.back?.style); if (buttonStyles.last?.style) buttonStyles.last.style = (0, misc_1.toButtonStyle)(buttonStyles.last?.style); if (buttonStyles.delete?.style) buttonStyles.delete.style = (0, misc_1.toButtonStyle)(buttonStyles.delete?.style); //Defining all buttons const first = new discord_js_1.ButtonBuilder() .setCustomId('first_embed') .setStyle(buttonStyles.first?.style || discord_js_1.ButtonStyle.Primary); if (options?.disable === 'Label' || options?.disable === 'None') first.setEmoji(buttonStyles.first?.emoji || '⏪'); else if (options?.disable === 'Emoji' || options?.disable === 'None') first.setLabel(buttonStyles.first?.label || 'First'); const forward = new discord_js_1.ButtonBuilder() .setCustomId('forward_button_embed') .setStyle(buttonStyles.next?.style || discord_js_1.ButtonStyle.Success); if (options?.disable === 'Label' || options?.disable === 'None') forward.setEmoji(buttonStyles?.next?.emoji || '▶️'); else if (options?.disable === 'Emoji' || options?.disable === 'None') forward.setLabel(buttonStyles?.next?.label || 'Next'); const back = new discord_js_1.ButtonBuilder() .setCustomId('back_button_embed') .setStyle(buttonStyles?.back?.style || discord_js_1.ButtonStyle.Success); if (options?.disable === 'Label' || options?.disable === 'None') back.setEmoji(buttonStyles?.back?.emoji || '◀️'); else if (options?.disable === 'Emoji' || options?.disable === 'None') back.setLabel(buttonStyles?.back?.label || 'Back'); const last = new discord_js_1.ButtonBuilder() .setCustomId('last_embed') .setStyle(buttonStyles.last?.style || discord_js_1.ButtonStyle.Primary); if (options?.disable === 'Label' || options?.disable === 'None') last.setEmoji(buttonStyles.last?.emoji || '⏩'); else if (options?.disable === 'Emoji' || options?.disable === 'None') last.setLabel(buttonStyles.last?.label || 'Last'); if (options?.dynamic) { first.setDisabled(true); back.setDisabled(true); } const deleteButton = new discord_js_1.ButtonBuilder() .setCustomId('delete_embed') .setStyle(buttonStyles?.delete?.style || discord_js_1.ButtonStyle.Danger); if (options?.disable === 'Label' || options?.disable === 'None') deleteButton.setEmoji(buttonStyles?.delete?.emoji || '🗑'); else if (options?.disable === 'Emoji' || options?.disable === 'None') deleteButton.setLabel(buttonStyles?.delete?.label || 'Delete'); let btnCollection = []; //Creating the MessageActionRow let pageMovingButtons = new discord_js_1.ActionRowBuilder(); if (options?.skips == true) { if (options?.delete) { btnCollection = [first, back, deleteButton, forward, last]; } else { btnCollection = [first, back, forward, last]; } } else { if (options?.delete) { btnCollection = [back, deleteButton, forward]; } else { btnCollection = [back, forward]; } } pageMovingButtons.addComponents(btnCollection); let currentPage = 0; comps.push(pageMovingButtons); let interaction; if (msgOrInt.commandId) { interaction = msgOrInt; if (!interaction.deferred) await interaction.deferReply({ fetchReply: true }); } let m; const pages = options?.embeds; const extInteraction = msgOrInt; const extMessage = msgOrInt; if (interaction) { if (options?.count) { await extInteraction.followUp({ embeds: [pages[0].setFooter({ text: `Page 1/${pages.length}` })], components: comps, allowedMentions: { repliedUser: false }, fetchReply: true }); } else { await extInteraction.followUp({ embeds: [pages[0]], components: comps, allowedMentions: { repliedUser: false }, fetchReply: true }); } m = await extInteraction.fetchReply(); } else if (!interaction) { if (options?.count) { m = await extMessage.reply({ embeds: [pages[0].setFooter({ text: `Page 1/${pages.length}` })], components: comps, allowedMentions: { repliedUser: false } }); } else { m = await extMessage.reply({ embeds: [pages[0]], components: comps, allowedMentions: { repliedUser: false } }); } } const filter = (m) => m.user.id === (msgOrInt.user ? msgOrInt.user : msgOrInt.author).id; const collector = m.createMessageComponentCollector({ time: options?.timeout || (0, misc_1.ms)('2m'), filter: filter, componentType: discord_js_1.ComponentType.Button }); collector.on('collect', async (b) => { if (!b.isButton()) return; if (b.message.id !== m.id) return; await b.deferUpdate(); if (b.customId == 'back_button_embed') { if (currentPage - 1 < 0) currentPage = pages.length - 1; else currentPage -= 1; } else if (b.customId == 'forward_button_embed') { if (currentPage + 1 == pages.length) currentPage = 0; else currentPage += 1; } else if (b.customId == 'last_embed') { currentPage = pages.length - 1; } else if (b.customId == 'first_embed') { currentPage = 0; } if (options?.dynamic) { if (currentPage === 0) { const btn = comps[0].components[0]; btn.setDisabled(true); if (options?.skips) { const skip = comps[0].components[1]; skip.setDisabled(true); comps[0].components[1] = skip; } comps[0].components[0] = btn; } else { const btn = comps[0].components[0]; btn.setDisabled(false); if (options?.skips) { const skip = comps[0].components[1]; skip.setDisabled(false); comps[0].components[1] = skip; } comps[0].components[0] = btn; } if (currentPage === pages.length - 1) { if (options?.skips) { const bt = comps[0].components[3]; const inde = comps[0].components[4]; inde.setDisabled(true); bt.setDisabled(true); comps[0].components[3] = bt; comps[0].components[4] = inde; } else { const bt = comps[0].components[2]; bt.setDisabled(true); comps[0].components[2] = bt; } } else { if (options?.skips) { const bt = comps[0].components[3]; const inde = comps[0].components[4]; inde.setDisabled(false); bt.setDisabled(false); comps[0].components[3] = bt; comps[0].components[4] = inde; } else { const bt = comps[0].components[2]; bt.setDisabled(false); comps[0].components[2] = bt; } } } if (b.customId !== 'delete_embed') { if (options?.count) { m.edit({ embeds: [ pages[currentPage].setFooter({ text: `Page: ${currentPage + 1}/${pages.length}` }) ], components: comps, allowedMentions: { repliedUser: false } }); } else { m.edit({ embeds: [pages[currentPage]], components: comps, allowedMentions: { repliedUser: false } }); } } else if (b.customId === 'delete_embed') { collector.stop('del'); } }); collector.on('end', async (_collected, reason) => { if (reason === 'del') { await m.delete().catch(() => { }); } else { const disable = []; btnCollection.forEach((a) => { disable.push(a.setDisabled(true)); }); pageMovingButtons = new discord_js_1.ActionRowBuilder().addComponents(disable); m.edit({ components: [pageMovingButtons] }); } }); } catch (err) { if (options?.strict) throw new error_1.SimplyError({ function: 'buttonPages', title: 'An Error occured when running the function ', tip: err.stack }); else console.log(`SimplyError - buttonPages | Error: ${err.stack}`); } }); } exports.buttonPages = buttonPages;