asodbaosdboausbd
Version:
An effective and easy-to-use package for making, "pages" in discord.js for Discord bots.
213 lines (174 loc) • 5.48 kB
JavaScript
const Discord = require("discord.js");
/**
* DiscordEasyPages constructor.
* @param {Object} message - Discord message.
* @param {Object} pages - Discord.js Embeds in a table.
* @param {Object} emojis - Emojis.
* @param {String} footer - Footer next that goes aside the page number.
* @param {Number} authoronly - If only the author should be able to change the page. Default true.
* @param {Number} timeout - Timeout until emojis will be removed. Default: 250 seconds.
* @returns {Object} CurrentPage
*/
module.exports = async (message, pages, emojis, footer, authoronly, timeout) => {
if (!message) {
throw new Error("[DiscordEasyPages]: Please provide a valid discord message.");
}
if (!pages) {
return new Error("[DiscordEasyPages]: Please include pages.");
}
if (!emojis) {
emojis = ["⬅", "➡"];
}
if (!authoronly) {
authoronly = true;
}
if (!footer) {
footer = "⚡";
}
if (!timeout) {
timeout = 250 * 1000;
}
if (!emojis.length === 2) {
return new Error(`[DiscordEasyPages]: Invalid custom number of emojis. Expected 2, got ${emojis.length}.`);
}
let PageNumber = 0;
const CurrentPage = await message.channel
.send({
embeds: [pages[PageNumber]],
})
.catch(err => {});
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Please wait until reactions load!`)],
});
for (const emoji of emojis) {
try {
await CurrentPage.react(emoji).catch(err => {});
} catch (err) {
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter("Error occured!")],
});
return new Error(`[DiscordEasyPages]: Error reacting with ${emoji}! Are you sure this is a valid emoji?`);
}
}
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Page ${PageNumber + 1}/${pages.length}`)],
});
const Filter = (reaction, user) =>
authoronly
? emojis.includes(reaction.emoji.name) && user.id === message.author.id
: emojis.includes(reaction.emoji.name);
const ReactionCollector = CurrentPage.createReactionCollector(Filter, {
time: timeout,
});
ReactionCollector.on("collect", async reaction => {
reaction.users.remove(message.author).catch(err => {});
if (reaction.emoji.name) {
if (reaction.emoji.name === emojis[0]) {
if (PageNumber > 0) {
--PageNumber;
} else {
PageNumber = pages.length - 1;
}
} else if (reaction.emoji.name === emojis[1]) {
if (PageNumber + 1 < pages.length) {
++PageNumber;
} else {
PageNumber = 0;
}
} else {
return;
}
}
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Page ${PageNumber + 1}/${pages.length}`)],
});
});
ReactionCollector.on("end", () => {
if (CurrentPage.deleted) {
return;
}
CurrentPage.reactions.removeAll().catch(err => {});
});
return CurrentPage;
};
module.exports = async (interaction, pages, emojis, footer, authoronly, timeout) => {
if (!interaction) {
throw new Error("[DiscordEasyPages]: Please provide a valid discord message.");
}
if (!pages) {
return new Error("[DiscordEasyPages]: Please include pages.");
}
if (!emojis) {
emojis = ["⬅", "➡"];
}
if (!authoronly) {
authoronly = true;
}
if (!footer) {
footer = "⚡";
}
if (!timeout) {
timeout = 250 * 1000;
}
if (!emojis.length === 2) {
return new Error(`[DiscordEasyPages]: Invalid custom number of emojis. Expected 2, got ${emojis.length}.`);
}
let PageNumber = 0;
const CurrentPage = await interaction.reply({
embeds: [pages[PageNumber]],
})
.catch(err => {});
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Please wait until reactions load!`)],
});
for (const emoji of emojis) {
try {
await CurrentPage.react(emoji).catch(err => {});
} catch (err) {
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter("Error occured!")],
});
return new Error(`[DiscordEasyPages]: Error reacting with ${emoji}! Are you sure this is a valid emoji?`);
}
}
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Page ${PageNumber + 1}/${pages.length}`)],
});
const Filter = (reaction, user) =>
authoronly
? emojis.includes(reaction.emoji.name) && user.id === interaction.user.id
: emojis.includes(reaction.emoji.name);
const ReactionCollector = CurrentPage.createReactionCollector(Filter, {
time: timeout,
});
ReactionCollector.on("collect", async reaction => {
reaction.users.remove(interaction.user).catch(err => {});
if (reaction.emoji.name) {
if (reaction.emoji.name === emojis[0]) {
if (PageNumber > 0) {
--PageNumber;
} else {
PageNumber = pages.length - 1;
}
} else if (reaction.emoji.name === emojis[1]) {
if (PageNumber + 1 < pages.length) {
++PageNumber;
} else {
PageNumber = 0;
}
} else {
return;
}
}
CurrentPage.edit({
embeds: [pages[PageNumber].setFooter(`${footer} • Page ${PageNumber + 1}/${pages.length}`)],
});
});
ReactionCollector.on("end", () => {
if (CurrentPage.deleted) {
return;
}
CurrentPage.reactions.removeAll().catch(err => {});
});
return CurrentPage;
};