discord.js-embed-pages
Version:
A package for handling all types of embed pages
320 lines (306 loc) • 11.7 kB
JavaScript
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){
}