UNPKG

discord.js-embed-pages

Version:

A package for handling all types of embed pages

320 lines (306 loc) 11.7 kB
const Discord = require("discord.js") //const disbut = require("discord-buttons") var client = null; //var instances = [] exports.initialise = async function(cl){ client = cl } exports.buttonFlick = async function (message, pages, settings){ if(!settings){ settings = { timeout: 60*1000, buttons: { delete: { style: "red", emoji: "❌", text: "Delete" }, forward: { style: "green", emoji: "⏩", text: "Forward" }, backward: { style: "green", emoji: "⏪", text: "Backward" } }, extraRows: [], extraPos: "below", message: "", ephemeral: "You do not own this embed!" } } var timeout = settings.timeout; const pageMovingButtons1 = new Discord.MessageButton() .setCustomId(`forward_button_embed`) .setLabel((settings.buttons.forward.text) ? settings.buttons.forward.text : "") .setEmoji(settings.buttons.forward.emoji) .setStyle(settings.buttons.forward.style) const pageMovingButtons2 = new Discord.MessageButton() .setCustomId(`back_button_embed`) .setLabel((settings.buttons.backward.text) ? settings.buttons.backward.text: "") .setEmoji(settings.buttons.backward.emoji) .setStyle(settings.buttons.backward.style) var pageMovingButtons = new Discord.MessageActionRow() pageMovingButtons.addComponents([pageMovingButtons2]) if(settings.buttons.delete){ const deleteEmbedButton = new Discord.MessageButton() .setCustomId("delete_button_embed") .setLabel((settings.buttons.delete.text) ? settings.buttons.delete.text: "") .setEmoji(settings.buttons.delete.emoji) .setStyle(settings.buttons.delete.style) pageMovingButtons.addComponents([deleteEmbedButton]) } pageMovingButtons.addComponents([pageMovingButtons1]) var currentPage = 0; var ar = settings.extraRows; if(settings.extraPos == "above"){ ar.push(pageMovingButtons) } else{ ar.splice(0,0,pageMovingButtons) } var m; if(settings.message){ m = await message.channel.send(settings.message, {components: ar, embeds: [await pages[0]]}); } else{ m = await message.channel.send({components: ar, embeds: [await pages[0]]}) } const filter = (interaction) => interaction.message.id == m.id let js = { filter } if(timeout){ js.time = timeout } const collector = message.channel.createMessageComponentCollector(js); collector.on('collect', async i => { if(!i.isButton)return; if(i.message.id == m.id && i.user.id == message.author.id){ if(i.customId == "back_button_embed"){ if(currentPage - 1 < 0){ currentPage = pages.length - 1 } else{ currentPage -= 1; } } else if(i.customId == "forward_button_embed"){ if(currentPage + 1 == pages.length){ currentPage = 0; } else{ currentPage += 1; } } else if(i.customId == "delete_button_embed"){ try{ m.delete(); } catch (err){ console.log(err) } } if(i.customId == "back_button_embed" || i.customId == "forward_button_embed"){ if(settings.message){ m.edit(settings.message, {components: ar, embeds: [await pages[currentPage]]}); } else{ m.edit({components: ar, embeds: [await pages[currentPage]]}) } try{ i.deferUpdate(); } catch{ try{ i.defer(true); } catch (err){ console.log("Cannot defer button!\nFull error:\n" + err) } } } } else{ if(settings.ephemeral){ await i.reply(settings.ephemeral, {ephemeral: true}) } } }); } exports.menuPages = async function (message, selectData, pages, settings){ } async function buttonPages(message, settings){ } exports.buttonFlickAndMenuPages = async function(message, selectData, buttonData, pages, settings){ if(!settings){ settings = { "timeout": 60*1000, "placeholder": "Click To Select Page!", "ephemeral": "You do not own this embed!", "message": false, "extraRows": [], "extraPos": "below" } } if(!buttonData){ buttonData = { delete: { style: "red", emoji: "❌", text: "Delete" }, forward: { style: "green", emoji: "⏩", text: "Forward" }, backward: { style: "green", emoji: "⏪", text: "Backward" }, pos: "above" } } (settings.timeout) ? null : settings.timeout = 60*1000 (settings.placeholder) ? null : settings.placeholder = "Click To Select Page!" var options = []; const timeout = settings.timeout const client = message.client; for(var i = 0;i<selectData.length;i++){ if(!selectData[i].linkedPage){ selectData[i].linkedPage = i; } let option = new disbut.MessageMenuOption() .setLabel(selectData[i].name) .setValue(`${message.id}.${selectData[i].linkedPage}`) .setDescription(selectData[i].description) .setEmoji(selectData[i].emoji.name, selectData[i].emoji.animated) options.push(option); } const Menu = new disbut.MessageMenu() .addOptions(options) .setPlaceholder(settings.placeholder) .setID("WEEE") var timeForStart = Date.now(); var row = new disbut.MessageActionRow() .addComponent(Menu) if(!settings.extraRows){ settings.extraRows = [] } const pageMovingButtons1 = new disbut.MessageButton() .setID(`forward_button_embed`) .setLabel((buttonData.forward.text) ? buttonData.forward.text : "") .setEmoji(buttonData.forward.emoji) .setStyle(buttonData.forward.style) const pageMovingButtons2 = new disbut.MessageButton() .setID(`back_button_embed`) .setLabel((buttonData.backward.text) ? buttonData.backward.text: "") .setEmoji(buttonData.backward.emoji) .setStyle(buttonData.backward.style) var pageMovingButtons = new disbut.MessageActionRow() .addComponent(pageMovingButtons2) if(buttonData.delete){ const deleteEmbedButton = new disbut.MessageButton() .setID("delete_button_embed") .setLabel((buttonData.delete.text) ? buttonData.delete.text: "") .setEmoji(buttonData.delete.emoji) .setStyle(buttonData.delete.style) pageMovingButtons.addComponent(deleteEmbedButton) } pageMovingButtons.addComponent(pageMovingButtons1) if(settings.extraPos == "above"){ if(buttonData.pos == "above"){ settings.extraRows.push(pageMovingButtons) settings.extraRows.push(row) } else{ settings.extraRows.splice(row) settings.extraRows.push(pageMovingButtons) } } else{ if(buttonData.pos == "above"){ settings.extraRows.splice(0,0,row) settings.extraRows.splice(0,0,pageMovingButtons) } else{ settings.extraRows.splice(0,0,pageMovingButtons) settings.extraRows.splice(0,0,row) } } var m; if(settings.message){ m = await message.channel.send(settings.message, {embed: await pages[0], components: settings.extraRows}) } else{ m = await message.channel.send({embed: await pages[0], components: settings.extraRows}) } var currentPage = 0; client.on("clickMenu", async menu=>{ if(Date.now() - timeForStart >= settings.timeout)return; if(menu.message.id == m.id && menu.clicker.user.id == message.author.id){ var row = new disbut.MessageActionRow() .addComponent(Menu) currentPage = parseInt(menu.values[0].split(".")[menu.values[0].split(".").length - 1]) if(settings.message){ m.edit(settings.message, {embed: await pages[parseInt(menu.values[0].split(".")[menu.values[0].split(".").length - 1])], components: settings.extraRows}) } else{ m.edit({embed: await pages[parseInt(menu.values[0].split(".")[menu.values[0].split(".").length - 1])], components: settings.extraRows}); } try{ menu.reply.defer(true); } catch{ try{ menu.defer(true); } catch (err){ console.log("Cannot defer selection!\nFull error:\n" + err) } } } else if(menu.clicker.user.id != message.author.id){ if(settings.ephemeral){ try{ menu.reply.send(settings.ephemeral, {ephemeral : true}) } catch (err){ } } } }) client.on("clickButton", async b=>{ if(Date.now() - timeForStart >= timeout)return; if(b.message.id == m.id && b.clicker.user.id == message.author.id){ if(b.id == "back_button_embed"){ if(currentPage - 1 < 0){ currentPage = pages.length - 1 } else{ currentPage -= 1; } } else if(b.id == "forward_button_embed"){ if(currentPage + 1 == pages.length){ currentPage = 0; } else{ currentPage += 1; } } else if(b.id == "delete_button_embed"){ try{ m.delete(); } catch (err){ console.log(err) } } if(b.id == "back_button_embed" || b.id == "forward_button_embed"){ if(settings.message){ m.edit(settings.message, {components: settings.extraRows, embed: await pages[currentPage]}); } else{ m.edit({components: settings.extraRows, embed: await pages[currentPage]}) } try{ b.reply.defer(true); } catch{ try{ b.defer(true); } catch (err){ console.log("Cannot defer button!\nFull error:\n" + err) } } } } else{ if(settings.ephemeral){ await b.reply.send(settings.ephemeral, {ephemeral: true}) } } }) } async function buttonPagesAndMenuPages(message, settings){ } async function buttonFlickAndMenuPagesAndButtonPages(message, settings){ }