From 959f7b68be2688d3389a4a9dc135c255dcd147aa Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 17 Jan 2021 21:45:58 +1030 Subject: [PATCH 01/39] Replace unary operators --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 008408b..45e9a4b 100644 --- a/index.js +++ b/index.js @@ -13,10 +13,10 @@ const paginationEmbed = async (msg, pages, emojiList = ['⏪', '⏩'], timeout = reaction.users.remove(msg.author); switch (reaction.emoji.name) { case emojiList[0]: - page = page > 0 ? --page : pages.length - 1; + page = page > 0 ? page -= 1 : pages.length - 1; break; case emojiList[1]: - page = page + 1 < pages.length ? ++page : 0; + page = page + 1 < pages.length ? page += 1 : 0; break; default: break; From cc739654df7ce9b40d8b22ed1c7020c1afc19099 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 19:13:05 +1030 Subject: [PATCH 02/39] Add custom footer and page resolvers, shift all optional and default arguments into an options object. --- index.d.ts | 14 ++++++++++ index.js | 78 ++++++++++++++++++++++++++++++++++++++++------------ package.json | 1 + 3 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 index.d.ts diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..15f54e3 --- /dev/null +++ b/index.d.ts @@ -0,0 +1,14 @@ +import { Message, MessageEmbed, MessageReaction, ReactionCollectorOptions, User } from "discord.js"; + +interface PaginationOptions extends ReactionCollectorOptions { + deleteOnEnd?: boolean, + useUtil?: boolean, + emojiList?: string[], + collectorFilter(reaction: MessageReaction, user: User): boolean | Promise + footerResolver(pageIndex: number, pagesLength: number): string, + pageResolver(pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise +} + +declare function paginationEmbed (msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise + +export = paginationEmbed; diff --git a/index.js b/index.js index 45e9a4b..59db4df 100644 --- a/index.js +++ b/index.js @@ -1,33 +1,75 @@ -const paginationEmbed = async (msg, pages, emojiList = ['⏪', '⏩'], timeout = 120000) => { +/** + * + * @param {MessageEmbed[]} pages + * @param {string[]} emojiList + * @param {number} currentPageIndex + * @param {MessageReaction} reaction + * @returns {number} - the new page index. + */ +const defaultPageResolver = async (pages, emojiList, currentPageIndex, reaction) => { + let newPage = currentPageIndex; + switch (reaction.emoji.name) { + case emojiList[0]: + newPage = currentPageIndex > 0 ? currentPageIndex - 1 : pages.length - 1; + break; + case emojiList[1]: + newPage = currentPageIndex + 1 < pages.length ? currentPageIndex + 1 : 0; + break; + default: + return currentPageIndex; + } + return newPage; +}; + +const defaultFooterResolver = (currentPageIndex, pagesLength) =>`Page ${currentPageIndex + 1} / ${pagesLength}`; + +const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; + +/** + * + * @param {Message} msg - the message + * @param {MessageEmbed[]} pages - array of message embeds to use as each page. + * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. + * @param {Function} footerResolver - Takes the current page index and number of pages, returns a string to be used for the footer. + */ +const paginationEmbed = async ( + msg, pages, + { + deleteOnEnd = false, useUtil = false, + emojiList = ['⏪', '⏩'], + collectorFilter = defaultCollectorFilter, + footerResolver = defaultFooterResolver, + pageResolver = defaultPageResolver, + timeout = 120000, + ...rest + } = {}) => { if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); if (!pages) throw new Error('Pages are not given.'); if (emojiList.length !== 2) throw new Error('Need two emojis.'); let page = 0; - const curPage = await msg.channel.send(pages[page].setFooter(`Page ${page + 1} / ${pages.length}`)); + pages[page].setFooter(footerResolver(page, pages.length)); + const curPage = useUtil ? await msg.util.reply(pages[page]) : await msg.channel.send(pages[page]); for (const emoji of emojiList) await curPage.react(emoji); const reactionCollector = curPage.createReactionCollector( - (reaction, user) => emojiList.includes(reaction.emoji.name) && !user.bot, - { time: timeout } + (reaction, user) => collectorFilter(reaction, user, emojiList), + { time: timeout, ...rest } ); - reactionCollector.on('collect', reaction => { + reactionCollector.on('collect', async reaction => { reaction.users.remove(msg.author); - switch (reaction.emoji.name) { - case emojiList[0]: - page = page > 0 ? page -= 1 : pages.length - 1; - break; - case emojiList[1]: - page = page + 1 < pages.length ? page += 1 : 0; - break; - default: - break; - } - curPage.edit(pages[page].setFooter(`Page ${page + 1} / ${pages.length}`)); + page = await pageResolver(pages, emojiList, page, reaction); + + if (page >= 0 && page < pages.length && !curPage.deleted) + curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); }); - reactionCollector.on('end', () => { + reactionCollector.on('end', async () => { if (!curPage.deleted) { - curPage.reactions.removeAll() + if (deleteOnEnd) + await curPage.delete(); + else + curPage.reactions.removeAll(); } }); return curPage; }; + module.exports = paginationEmbed; diff --git a/package.json b/package.json index bddf60e..a4617ba 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "1.0.3", "description": "A simple utility to paginate discord embeds. ", "main": "index.js", + "types": "index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, From 0e71be1c32aee0bfdb17790022de05f07e2f6cd0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 19:13:16 +1030 Subject: [PATCH 03/39] Ignore vscode --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ad46b30..8161132 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,6 @@ typings/ # next.js build output .next + +# vscode +.vscode/ From 12a384538f31d52e562956ce7d3e612cbc495fd7 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 19:33:26 +1030 Subject: [PATCH 04/39] Remove the now redundant emojiList length check --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 59db4df..3e4fd1e 100644 --- a/index.js +++ b/index.js @@ -45,7 +45,6 @@ const paginationEmbed = async ( } = {}) => { if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); if (!pages) throw new Error('Pages are not given.'); - if (emojiList.length !== 2) throw new Error('Need two emojis.'); let page = 0; pages[page].setFooter(footerResolver(page, pages.length)); const curPage = useUtil ? await msg.util.reply(pages[page]) : await msg.channel.send(pages[page]); From 1c6ce1ac6bfbb1996ba8c51c9cf6476cdb5b88d3 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 19:51:10 +1030 Subject: [PATCH 05/39] Expose user on the collect event, await the reaction removal. --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 3e4fd1e..16acc48 100644 --- a/index.js +++ b/index.js @@ -53,8 +53,8 @@ const paginationEmbed = async ( (reaction, user) => collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } ); - reactionCollector.on('collect', async reaction => { - reaction.users.remove(msg.author); + reactionCollector.on('collect', async (reaction, user) => { + await reaction.users.remove(user.id); page = await pageResolver(pages, emojiList, page, reaction); if (page >= 0 && page < pages.length && !curPage.deleted) From 914781d4b0fd198393a8dfbf44bb0ce029b0f351 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 20:03:00 +1030 Subject: [PATCH 06/39] Remove unnecessary footerResolver param comment line --- index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/index.js b/index.js index 16acc48..fcc5ab4 100644 --- a/index.js +++ b/index.js @@ -30,7 +30,6 @@ const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes * @param {Message} msg - the message * @param {MessageEmbed[]} pages - array of message embeds to use as each page. * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. - * @param {Function} footerResolver - Takes the current page index and number of pages, returns a string to be used for the footer. */ const paginationEmbed = async ( msg, pages, From 57d06057d230965a81f974d6b05f6f39a691fb96 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 20:20:09 +1030 Subject: [PATCH 07/39] Prevent crash if message is deleted before reactions are applied. --- index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index fcc5ab4..f9ac3e2 100644 --- a/index.js +++ b/index.js @@ -47,7 +47,12 @@ const paginationEmbed = async ( let page = 0; pages[page].setFooter(footerResolver(page, pages.length)); const curPage = useUtil ? await msg.util.reply(pages[page]) : await msg.channel.send(pages[page]); - for (const emoji of emojiList) await curPage.react(emoji); + // This will fail if the message is deleted before the reactions are all added, bail before reactor creation + try { + for (const emoji of emojiList) await curPage.react(emoji); + } catch (error) { + return curPage; + } const reactionCollector = curPage.createReactionCollector( (reaction, user) => collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } From 92b9cc89f0bbfdf68e79a9e8f406339658f7d2bc Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 20:31:04 +1030 Subject: [PATCH 08/39] Always filter against bots, always ensure emoji is in list, apply custom filter only if it exists. --- index.d.ts | 2 +- index.js | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/index.d.ts b/index.d.ts index 15f54e3..2f56672 100644 --- a/index.d.ts +++ b/index.d.ts @@ -4,7 +4,7 @@ interface PaginationOptions extends ReactionCollectorOptions { deleteOnEnd?: boolean, useUtil?: boolean, emojiList?: string[], - collectorFilter(reaction: MessageReaction, user: User): boolean | Promise + collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise footerResolver(pageIndex: number, pagesLength: number): string, pageResolver(pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise } diff --git a/index.js b/index.js index f9ac3e2..4160fcd 100644 --- a/index.js +++ b/index.js @@ -23,8 +23,6 @@ const defaultPageResolver = async (pages, emojiList, currentPageIndex, reaction) const defaultFooterResolver = (currentPageIndex, pagesLength) =>`Page ${currentPageIndex + 1} / ${pagesLength}`; -const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; - /** * * @param {Message} msg - the message @@ -36,7 +34,7 @@ const paginationEmbed = async ( { deleteOnEnd = false, useUtil = false, emojiList = ['⏪', '⏩'], - collectorFilter = defaultCollectorFilter, + collectorFilter = null, footerResolver = defaultFooterResolver, pageResolver = defaultPageResolver, timeout = 120000, @@ -47,16 +45,18 @@ const paginationEmbed = async ( let page = 0; pages[page].setFooter(footerResolver(page, pages.length)); const curPage = useUtil ? await msg.util.reply(pages[page]) : await msg.channel.send(pages[page]); + const reactionCollector = curPage.createReactionCollector( + (reaction, user) => emojiList.includes(reaction.emoji.name) && !user.bot + && (collectorFilter ? collectorFilter(reaction, user, emojiList) : true), + { time: timeout, ...rest } + ); // This will fail if the message is deleted before the reactions are all added, bail before reactor creation try { for (const emoji of emojiList) await curPage.react(emoji); } catch (error) { + reactionCollector.stop(); return curPage; } - const reactionCollector = curPage.createReactionCollector( - (reaction, user) => collectorFilter(reaction, user, emojiList), - { time: timeout, ...rest } - ); reactionCollector.on('collect', async (reaction, user) => { await reaction.users.remove(user.id); page = await pageResolver(pages, emojiList, page, reaction); From e9308fd24a66863bf10829bd6c3c20828242eed3 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 20:33:12 +1030 Subject: [PATCH 09/39] Shift collection reactor setup prior to the bot adding reactions. --- index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index 4160fcd..8c9be70 100644 --- a/index.js +++ b/index.js @@ -50,13 +50,6 @@ const paginationEmbed = async ( && (collectorFilter ? collectorFilter(reaction, user, emojiList) : true), { time: timeout, ...rest } ); - // This will fail if the message is deleted before the reactions are all added, bail before reactor creation - try { - for (const emoji of emojiList) await curPage.react(emoji); - } catch (error) { - reactionCollector.stop(); - return curPage; - } reactionCollector.on('collect', async (reaction, user) => { await reaction.users.remove(user.id); page = await pageResolver(pages, emojiList, page, reaction); @@ -72,6 +65,13 @@ const paginationEmbed = async ( curPage.reactions.removeAll(); } }); + // This will fail if the message is deleted before the reactions are all added, bail before reactor creation + try { + for (const emoji of emojiList) await curPage.react(emoji); + } catch (error) { + reactionCollector.stop(); + return curPage; + } return curPage; }; From 94018c48e0b3d2c4084db72013cbe168e5d7ee85 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 20:40:07 +1030 Subject: [PATCH 10/39] Expose the message to the pageResolver --- index.d.ts | 2 +- index.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.d.ts b/index.d.ts index 2f56672..4e5f699 100644 --- a/index.d.ts +++ b/index.d.ts @@ -6,7 +6,7 @@ interface PaginationOptions extends ReactionCollectorOptions { emojiList?: string[], collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise footerResolver(pageIndex: number, pagesLength: number): string, - pageResolver(pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise + pageResolver(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise } declare function paginationEmbed (msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise diff --git a/index.js b/index.js index 8c9be70..5f6dab6 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ * @param {MessageReaction} reaction * @returns {number} - the new page index. */ -const defaultPageResolver = async (pages, emojiList, currentPageIndex, reaction) => { +const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reaction) => { let newPage = currentPageIndex; switch (reaction.emoji.name) { case emojiList[0]: @@ -52,7 +52,7 @@ const paginationEmbed = async ( ); reactionCollector.on('collect', async (reaction, user) => { await reaction.users.remove(user.id); - page = await pageResolver(pages, emojiList, page, reaction); + page = await pageResolver(msg, pages, emojiList, page, reaction); if (page >= 0 && page < pages.length && !curPage.deleted) curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); From 9f65ab351b3311a06cafeb2f77fdca4e1bdd8a4b Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 21:19:00 +1030 Subject: [PATCH 11/39] Mark resolvers optional in typings --- index.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.d.ts b/index.d.ts index 4e5f699..571e366 100644 --- a/index.d.ts +++ b/index.d.ts @@ -5,8 +5,8 @@ interface PaginationOptions extends ReactionCollectorOptions { useUtil?: boolean, emojiList?: string[], collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise - footerResolver(pageIndex: number, pagesLength: number): string, - pageResolver(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise + footerResolver?(pageIndex: number, pagesLength: number): string, + pageResolver?(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise } declare function paginationEmbed (msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise From 1008e1db263b3f7447af8f328fac80a5c2719dae Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 22:03:59 +1030 Subject: [PATCH 12/39] Pass in the correct message to the pageResolver --- index.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 5f6dab6..597c09b 100644 --- a/index.js +++ b/index.js @@ -52,9 +52,10 @@ const paginationEmbed = async ( ); reactionCollector.on('collect', async (reaction, user) => { await reaction.users.remove(user.id); - page = await pageResolver(msg, pages, emojiList, page, reaction); + const currentPage = page; + page = await pageResolver(curPage, pages, emojiList, page, reaction); - if (page >= 0 && page < pages.length && !curPage.deleted) + if ( !curPage.deleted && currentPage != page && page >= 0 && page < pages.length) curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); }); reactionCollector.on('end', async () => { @@ -69,8 +70,8 @@ const paginationEmbed = async ( try { for (const emoji of emojiList) await curPage.react(emoji); } catch (error) { - reactionCollector.stop(); - return curPage; + reactionCollector.stop(); + throw error; } return curPage; }; From 25ccae7c3078736eada462b2b0116c3dfff09004 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 22:04:44 +1030 Subject: [PATCH 13/39] Fix emoji list typing --- index.d.ts | 4 ++-- index.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/index.d.ts b/index.d.ts index 571e366..17d0a20 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,9 +1,9 @@ -import { Message, MessageEmbed, MessageReaction, ReactionCollectorOptions, User } from "discord.js"; +import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollectorOptions, User } from "discord.js"; interface PaginationOptions extends ReactionCollectorOptions { deleteOnEnd?: boolean, useUtil?: boolean, - emojiList?: string[], + emojiList?: EmojiIdentifierResolvable[], collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise footerResolver?(pageIndex: number, pagesLength: number): string, pageResolver?(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise diff --git a/index.js b/index.js index 597c09b..62714ec 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,7 @@ /** * * @param {MessageEmbed[]} pages - * @param {string[]} emojiList + * @param {EmojiIdentifierResolvable[]} emojiList * @param {number} currentPageIndex * @param {MessageReaction} reaction * @returns {number} - the new page index. From a076510a4913124146bec1efed2c4d66ff641fa2 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 18 Jan 2021 22:15:11 +1030 Subject: [PATCH 14/39] Additional page message delete guard --- index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.js b/index.js index 62714ec..8096184 100644 --- a/index.js +++ b/index.js @@ -51,6 +51,8 @@ const paginationEmbed = async ( { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { + // In case a react deletes the curPage msg in the pageResolver and another react is quickly made. + if (curPage.deleted) return; await reaction.users.remove(user.id); const currentPage = page; page = await pageResolver(curPage, pages, emojiList, page, reaction); From 9350fcaa01f55e332884d7f5814edafd2369d958 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Jan 2021 18:17:44 +1030 Subject: [PATCH 15/39] Typing syntax ',' to ';', add sendMessage property of PaginationOptions. --- index.d.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/index.d.ts b/index.d.ts index 17d0a20..0026dcf 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,14 +1,15 @@ import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollectorOptions, User } from "discord.js"; interface PaginationOptions extends ReactionCollectorOptions { - deleteOnEnd?: boolean, - useUtil?: boolean, - emojiList?: EmojiIdentifierResolvable[], - collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise - footerResolver?(pageIndex: number, pagesLength: number): string, - pageResolver?(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise + deleteOnEnd?: boolean; + useUtil?: boolean; + emojiList?: EmojiIdentifierResolvable[]; + collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; + footerResolver?(pageIndex: number, pagesLength: number): string; + pageResolver?(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; + sendMessage?(message: Message, pageEmbed: MessageEmbed): Promise; } -declare function paginationEmbed (msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise +declare function paginationEmbed(msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; export = paginationEmbed; From d03d1480a63b596b7513e05dc5a4515ffa069903 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Jan 2021 18:22:45 +1030 Subject: [PATCH 16/39] Remove uinnecessary deleted check and try/catch, add defaultCollectorFilter and sendMessage option. --- index.js | 58 +++++++++++++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/index.js b/index.js index 8096184..2bb6ffe 100644 --- a/index.js +++ b/index.js @@ -21,7 +21,11 @@ const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reacti return newPage; }; -const defaultFooterResolver = (currentPageIndex, pagesLength) =>`Page ${currentPageIndex + 1} / ${pagesLength}`; +const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; + +const defaultSendMessage = async (message, pageEmbed) => await message.channel.send(pageEmbed); + +const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; /** * @@ -29,52 +33,42 @@ const defaultFooterResolver = (currentPageIndex, pagesLength) =>`Page ${currentP * @param {MessageEmbed[]} pages - array of message embeds to use as each page. * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. */ -const paginationEmbed = async ( - msg, pages, - { - deleteOnEnd = false, useUtil = false, - emojiList = ['⏪', '⏩'], - collectorFilter = null, - footerResolver = defaultFooterResolver, - pageResolver = defaultPageResolver, - timeout = 120000, - ...rest - } = {}) => { +const paginationEmbed = async (msg, pages, + { + deleteOnEnd = false, useUtil = false, + emojiList = ['⏪', '⏩'], + footerResolver = defaultFooterResolver, + sendMessage = defaultSendMessage, + collectorFilter = defaultCollectorFilter, + pageResolver = defaultPageResolver, + timeout = 120000, + ...rest + } = {} +) => { if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); if (!pages) throw new Error('Pages are not given.'); let page = 0; pages[page].setFooter(footerResolver(page, pages.length)); - const curPage = useUtil ? await msg.util.reply(pages[page]) : await msg.channel.send(pages[page]); + const curPage = await sendMessage(msg, pages[paghe]); const reactionCollector = curPage.createReactionCollector( - (reaction, user) => emojiList.includes(reaction.emoji.name) && !user.bot - && (collectorFilter ? collectorFilter(reaction, user, emojiList) : true), + (reaction, user) => await collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { - // In case a react deletes the curPage msg in the pageResolver and another react is quickly made. - if (curPage.deleted) return; await reaction.users.remove(user.id); const currentPage = page; - page = await pageResolver(curPage, pages, emojiList, page, reaction); + page = await pageResolver(curPage, pages, emojiList, page, reaction); if ( !curPage.deleted && currentPage != page && page >= 0 && page < pages.length) - curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); + await curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); }); reactionCollector.on('end', async () => { - if (!curPage.deleted) { - if (deleteOnEnd) - await curPage.delete(); - else - curPage.reactions.removeAll(); - } + if (curPage.deletable && deleteOnEnd) + await curPage.delete(); + else + curPage.reactions.removeAll(); }); - // This will fail if the message is deleted before the reactions are all added, bail before reactor creation - try { - for (const emoji of emojiList) await curPage.react(emoji); - } catch (error) { - reactionCollector.stop(); - throw error; - } + for (const emoji of emojiList) await curPage.react(emoji); return curPage; }; From c9947e3bd3041cb62d8773b6a6841d41d1e4d6bc Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Jan 2021 19:19:07 +1030 Subject: [PATCH 17/39] Add missing async, fix paghe > page typo --- index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.js b/index.js index 2bb6ffe..c0457cd 100644 --- a/index.js +++ b/index.js @@ -49,9 +49,9 @@ const paginationEmbed = async (msg, pages, if (!pages) throw new Error('Pages are not given.'); let page = 0; pages[page].setFooter(footerResolver(page, pages.length)); - const curPage = await sendMessage(msg, pages[paghe]); + const curPage = await sendMessage(msg, pages[page]); const reactionCollector = curPage.createReactionCollector( - (reaction, user) => await collectorFilter(reaction, user, emojiList), + async (reaction, user) => await collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { From aa984dc05d8bc34c935ef032072fec90cf706717 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 17:43:04 +1030 Subject: [PATCH 18/39] Rename page > currentPageIndex --- index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/index.js b/index.js index c0457cd..1b23464 100644 --- a/index.js +++ b/index.js @@ -47,20 +47,20 @@ const paginationEmbed = async (msg, pages, ) => { if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); if (!pages) throw new Error('Pages are not given.'); - let page = 0; - pages[page].setFooter(footerResolver(page, pages.length)); - const curPage = await sendMessage(msg, pages[page]); + let currentPageIndex = 0; + pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); + const curPage = await sendMessage(msg, pages[currentPageIndex]); const reactionCollector = curPage.createReactionCollector( async (reaction, user) => await collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { await reaction.users.remove(user.id); - const currentPage = page; + const currentPage = currentPageIndex; - page = await pageResolver(curPage, pages, emojiList, page, reaction); - if ( !curPage.deleted && currentPage != page && page >= 0 && page < pages.length) - await curPage.edit(pages[page].setFooter(footerResolver(page, pages.length))); + currentPageIndex = await pageResolver(curPage, pages, emojiList, currentPageIndex, reaction); + if ( !curPage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) + await curPage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); }); reactionCollector.on('end', async () => { if (curPage.deletable && deleteOnEnd) From 770615ccdbe19ce3942d598ae00c5e7930a2f38f Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 17:56:54 +1030 Subject: [PATCH 19/39] Rename curPage > paginatedEmbedMessage --- index.js | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index 1b23464..d4ecd5a 100644 --- a/index.js +++ b/index.js @@ -49,8 +49,8 @@ const paginationEmbed = async (msg, pages, if (!pages) throw new Error('Pages are not given.'); let currentPageIndex = 0; pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); - const curPage = await sendMessage(msg, pages[currentPageIndex]); - const reactionCollector = curPage.createReactionCollector( + const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); + const reactionCollector = paginatedEmbedMessage.createReactionCollector( async (reaction, user) => await collectorFilter(reaction, user, emojiList), { time: timeout, ...rest } ); @@ -58,18 +58,18 @@ const paginationEmbed = async (msg, pages, await reaction.users.remove(user.id); const currentPage = currentPageIndex; - currentPageIndex = await pageResolver(curPage, pages, emojiList, currentPageIndex, reaction); - if ( !curPage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) - await curPage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); + if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) + await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); }); reactionCollector.on('end', async () => { - if (curPage.deletable && deleteOnEnd) - await curPage.delete(); + if (paginatedEmbedMessage.deletable && deleteOnEnd) + await paginatedEmbedMessage.delete(); else - curPage.reactions.removeAll(); + paginatedEmbedMessage.reactions.removeAll(); }); - for (const emoji of emojiList) await curPage.react(emoji); - return curPage; + for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); + return paginatedEmbedMessage; }; module.exports = paginationEmbed; From 05153790655e755c799e3bb876e467bb80b85580 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 17:58:50 +1030 Subject: [PATCH 20/39] Remove useUtils from PaginationOptions, type parameter name clarifications. --- index.d.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/index.d.ts b/index.d.ts index 0026dcf..8443eaa 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,14 +2,13 @@ import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, Reac interface PaginationOptions extends ReactionCollectorOptions { deleteOnEnd?: boolean; - useUtil?: boolean; emojiList?: EmojiIdentifierResolvable[]; collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; footerResolver?(pageIndex: number, pagesLength: number): string; - pageResolver?(msg: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; - sendMessage?(message: Message, pageEmbed: MessageEmbed): Promise; + pageResolver?(paginatedEmbedMessage: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; + sendMessage?(receivedMessage: Message, pageEmbed: MessageEmbed): Promise; } -declare function paginationEmbed(msg: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; +declare function paginationEmbed(receivedMessage: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; export = paginationEmbed; From 06bfba1bd9710de77eee67f1b18c038c41c20a30 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 18:57:14 +1030 Subject: [PATCH 21/39] Add collectErrorHandler --- index.d.ts | 5 +++-- index.js | 17 ++++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/index.d.ts b/index.d.ts index 8443eaa..d9b3fb0 100644 --- a/index.d.ts +++ b/index.d.ts @@ -3,10 +3,11 @@ import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, Reac interface PaginationOptions extends ReactionCollectorOptions { deleteOnEnd?: boolean; emojiList?: EmojiIdentifierResolvable[]; - collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; footerResolver?(pageIndex: number, pagesLength: number): string; - pageResolver?(paginatedEmbedMessage: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; sendMessage?(receivedMessage: Message, pageEmbed: MessageEmbed): Promise; + collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; + pageResolver?(paginatedEmbedMessage: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; + collectErrorHandler?(error: Error): void | Promise; } declare function paginationEmbed(receivedMessage: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; diff --git a/index.js b/index.js index d4ecd5a..5afa609 100644 --- a/index.js +++ b/index.js @@ -41,6 +41,7 @@ const paginationEmbed = async (msg, pages, sendMessage = defaultSendMessage, collectorFilter = defaultCollectorFilter, pageResolver = defaultPageResolver, + collectErrorHandler = () => {}, timeout = 120000, ...rest } = {} @@ -55,12 +56,18 @@ const paginationEmbed = async (msg, pages, { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { - await reaction.users.remove(user.id); - const currentPage = currentPageIndex; + // this try / catch is to handle the edge case where a collect event is fired after a message delete call + // but before the delete is complete, handling is offloaded to the user via collectErrorHandler + try { + await reaction.users.remove(user.id); + const currentPage = currentPageIndex; - currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); - if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) - await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); + if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) + await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + } catch(error) { + await collectErrorHandler(error); + } }); reactionCollector.on('end', async () => { if (paginatedEmbedMessage.deletable && deleteOnEnd) From db3458716fcb0c999eaf41989bc047f63cd48990 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 19:43:33 +1030 Subject: [PATCH 22/39] Update example usage --- README.md | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index db367e4..9661f20 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ A simple utility to paginate discord embeds. Built on discord.js@^12.0.0 (master * `npm install discord.js-pagination` # Usage + __Basic Bot Example__ ```js // Import the discord.js-pagination package @@ -20,21 +21,25 @@ const paginationEmbed = require('discord.js-pagination'); // Use either MessageEmbed or RichEmbed to make pages // Keep in mind that Embeds should't have their footers set since the pagination method sets page info there -const { MessageEmbed } = require('discord.js'); -const embed1 = new MessageEmbed(); +const myPages = []; + +for (let i = 0; i < 10; i++) { + const pageEmbed = new MessageEmbed(); + pageEmbed + .setTitle(`This embed is index ${i}!`) + .setDescription(`That means it is page #${i+1}`); + myPages.push(pageEmbed); +} + +const footerResolver = (currentPageIndex, pagesLength) => + `Page ${currentPageIndex + 1} / ${pagesLength}: ${(currentPageIndex % 2 === 0 ? 'This page is even!' : 'This page is odd!')}`; -// Create an array of embeds -pages = [ - embed1, - embed2, - //.... - embedn -]; +const collectErrorHandler = (error) => console.log(error); // Call the paginationEmbed method, first two arguments are required -// emojiList is the pageturners defaults to ['⏪', '⏩'] -// timeout is the time till the reaction collectors are active, after this you can't change pages (in ms), defaults to 120000 -paginationEmbed(msg, pages, emojiList, timeout); +// The third argument is the PaginationOptions - all optional +// Any additional arguments in PaginationOptions are passed down as ReactionCollectorOptions +paginationEmbed(msg, myPages, { emojiList, footerResolver, collectErrorHandler, timeout: 120000, idle: 60000 }); // There you go, now you have paged embeds ``` # Preview From 637147b9c409844b5d7a282c62fd9bd77988e156 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 19:46:57 +1030 Subject: [PATCH 23/39] Remove redundant useUtil --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 5afa609..737cb97 100644 --- a/index.js +++ b/index.js @@ -35,7 +35,7 @@ const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes */ const paginationEmbed = async (msg, pages, { - deleteOnEnd = false, useUtil = false, + deleteOnEnd = false, emojiList = ['⏪', '⏩'], footerResolver = defaultFooterResolver, sendMessage = defaultSendMessage, From c5fcf45660926d4b4e69f23ce0366e1cf899fbb5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 19:48:36 +1030 Subject: [PATCH 24/39] Remove unnecessary explicit async/await. --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 737cb97..7b792b2 100644 --- a/index.js +++ b/index.js @@ -23,7 +23,7 @@ const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reacti const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; -const defaultSendMessage = async (message, pageEmbed) => await message.channel.send(pageEmbed); +const defaultSendMessage = (message, pageEmbed) => message.channel.send(pageEmbed); const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; From d347174974ac50150d1f91183fe8b2ad235fc428 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 20:00:02 +1030 Subject: [PATCH 25/39] Re-add MessageEmbed require to example --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9661f20..a9e1867 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ const paginationEmbed = require('discord.js-pagination'); // Use either MessageEmbed or RichEmbed to make pages // Keep in mind that Embeds should't have their footers set since the pagination method sets page info there +const { MessageEmbed } = require('discord.js'); + const myPages = []; for (let i = 0; i < 10; i++) { From 62a7c1b6b4ddfd5a4719b4e1a91cfb9a30b045dd Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 21:24:17 +1030 Subject: [PATCH 26/39] Fix indentation --- index.js | 106 +++++++++++++++++++++++++++---------------------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/index.js b/index.js index 7b792b2..bf24703 100644 --- a/index.js +++ b/index.js @@ -7,18 +7,18 @@ * @returns {number} - the new page index. */ const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reaction) => { - let newPage = currentPageIndex; - switch (reaction.emoji.name) { - case emojiList[0]: - newPage = currentPageIndex > 0 ? currentPageIndex - 1 : pages.length - 1; - break; - case emojiList[1]: - newPage = currentPageIndex + 1 < pages.length ? currentPageIndex + 1 : 0; - break; - default: - return currentPageIndex; - } - return newPage; + let newPage = currentPageIndex; + switch (reaction.emoji.name) { + case emojiList[0]: + newPage = currentPageIndex > 0 ? currentPageIndex - 1 : pages.length - 1; + break; + case emojiList[1]: + newPage = currentPageIndex + 1 < pages.length ? currentPageIndex + 1 : 0; + break; + default: + return currentPageIndex; + } + return newPage; }; const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; @@ -34,49 +34,49 @@ const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. */ const paginationEmbed = async (msg, pages, - { - deleteOnEnd = false, - emojiList = ['⏪', '⏩'], - footerResolver = defaultFooterResolver, - sendMessage = defaultSendMessage, - collectorFilter = defaultCollectorFilter, - pageResolver = defaultPageResolver, - collectErrorHandler = () => {}, - timeout = 120000, - ...rest - } = {} + { + deleteOnEnd = false, + emojiList = ['⏪', '⏩'], + footerResolver = defaultFooterResolver, + sendMessage = defaultSendMessage, + collectorFilter = defaultCollectorFilter, + pageResolver = defaultPageResolver, + collectErrorHandler = () => {}, + timeout = 120000, + ...rest + } = {} ) => { - if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); - if (!pages) throw new Error('Pages are not given.'); - let currentPageIndex = 0; - pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); - const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); - const reactionCollector = paginatedEmbedMessage.createReactionCollector( - async (reaction, user) => await collectorFilter(reaction, user, emojiList), - { time: timeout, ...rest } - ); - reactionCollector.on('collect', async (reaction, user) => { - // this try / catch is to handle the edge case where a collect event is fired after a message delete call - // but before the delete is complete, handling is offloaded to the user via collectErrorHandler - try { - await reaction.users.remove(user.id); - const currentPage = currentPageIndex; + if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); + if (!pages) throw new Error('Pages are not given.'); + let currentPageIndex = 0; + pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); + const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); + const reactionCollector = paginatedEmbedMessage.createReactionCollector( + async (reaction, user) => await collectorFilter(reaction, user, emojiList), + { time: timeout, ...rest } + ); + reactionCollector.on('collect', async (reaction, user) => { + // this try / catch is to handle the edge case where a collect event is fired after a message delete call + // but before the delete is complete, handling is offloaded to the user via collectErrorHandler + try { + await reaction.users.remove(user.id); + const currentPage = currentPageIndex; - currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); - if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) - await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); - } catch(error) { - await collectErrorHandler(error); - } - }); - reactionCollector.on('end', async () => { - if (paginatedEmbedMessage.deletable && deleteOnEnd) - await paginatedEmbedMessage.delete(); - else - paginatedEmbedMessage.reactions.removeAll(); - }); - for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); - return paginatedEmbedMessage; + currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); + if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) + await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + } catch(error) { + await collectErrorHandler(error); + } + }); + reactionCollector.on('end', async () => { + if (paginatedEmbedMessage.deletable && deleteOnEnd) + await paginatedEmbedMessage.delete(); + else + paginatedEmbedMessage.reactions.removeAll(); + }); + for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); + return paginatedEmbedMessage; }; module.exports = paginationEmbed; From 4a221d9f492fb7dfd0ad7d1fa5caed695e67984a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 21:24:17 +1030 Subject: [PATCH 27/39] Fix indentation --- index.js | 100 +++++++++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/index.js b/index.js index 7b792b2..84a0682 100644 --- a/index.js +++ b/index.js @@ -7,18 +7,18 @@ * @returns {number} - the new page index. */ const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reaction) => { - let newPage = currentPageIndex; - switch (reaction.emoji.name) { - case emojiList[0]: - newPage = currentPageIndex > 0 ? currentPageIndex - 1 : pages.length - 1; - break; - case emojiList[1]: - newPage = currentPageIndex + 1 < pages.length ? currentPageIndex + 1 : 0; - break; - default: - return currentPageIndex; - } - return newPage; + let newPage = currentPageIndex; + switch (reaction.emoji.name) { + case emojiList[0]: + newPage = currentPageIndex > 0 ? currentPageIndex - 1 : pages.length - 1; + break; + case emojiList[1]: + newPage = currentPageIndex + 1 < pages.length ? currentPageIndex + 1 : 0; + break; + default: + return currentPageIndex; + } + return newPage; }; const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; @@ -34,49 +34,49 @@ const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. */ const paginationEmbed = async (msg, pages, - { - deleteOnEnd = false, - emojiList = ['⏪', '⏩'], - footerResolver = defaultFooterResolver, - sendMessage = defaultSendMessage, - collectorFilter = defaultCollectorFilter, - pageResolver = defaultPageResolver, - collectErrorHandler = () => {}, - timeout = 120000, - ...rest - } = {} + { + deleteOnEnd = false, + emojiList = ['⏪', '⏩'], + footerResolver = defaultFooterResolver, + sendMessage = defaultSendMessage, + collectorFilter = defaultCollectorFilter, + pageResolver = defaultPageResolver, + collectErrorHandler = () => {}, + timeout = 120000, + ...rest + } = {} ) => { - if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); - if (!pages) throw new Error('Pages are not given.'); - let currentPageIndex = 0; - pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); - const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); - const reactionCollector = paginatedEmbedMessage.createReactionCollector( - async (reaction, user) => await collectorFilter(reaction, user, emojiList), - { time: timeout, ...rest } - ); - reactionCollector.on('collect', async (reaction, user) => { - // this try / catch is to handle the edge case where a collect event is fired after a message delete call - // but before the delete is complete, handling is offloaded to the user via collectErrorHandler - try { - await reaction.users.remove(user.id); - const currentPage = currentPageIndex; + if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); + if (!pages) throw new Error('Pages are not given.'); + let currentPageIndex = 0; + pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); + const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); + const reactionCollector = paginatedEmbedMessage.createReactionCollector( + async (reaction, user) => await collectorFilter(reaction, user, emojiList), + { time: timeout, ...rest } + ); + reactionCollector.on('collect', async (reaction, user) => { + // this try / catch is to handle the edge case where a collect event is fired after a message delete call + // but before the delete is complete, handling is offloaded to the user via collectErrorHandler + try { + await reaction.users.remove(user.id); + const currentPage = currentPageIndex; - currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); - if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) - await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); + if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) + await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); } catch(error) { await collectErrorHandler(error); } - }); - reactionCollector.on('end', async () => { - if (paginatedEmbedMessage.deletable && deleteOnEnd) - await paginatedEmbedMessage.delete(); - else - paginatedEmbedMessage.reactions.removeAll(); - }); - for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); - return paginatedEmbedMessage; + }); + reactionCollector.on('end', async () => { + if (paginatedEmbedMessage.deletable && deleteOnEnd) + await paginatedEmbedMessage.delete(); + else + paginatedEmbedMessage.reactions.removeAll(); + }); + for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); + return paginatedEmbedMessage; }; module.exports = paginationEmbed; From 1646e3aeddc2041f563392e0f403b5bc3d719f6b Mon Sep 17 00:00:00 2001 From: Psi Date: Wed, 20 Jan 2021 21:27:48 +1030 Subject: [PATCH 28/39] Update index.js --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 84a0682..acdb162 100644 --- a/index.js +++ b/index.js @@ -65,9 +65,9 @@ const paginationEmbed = async (msg, pages, currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); - } catch(error) { - await collectErrorHandler(error); - } + } catch(error) { + await collectErrorHandler(error); + } }); reactionCollector.on('end', async () => { if (paginatedEmbedMessage.deletable && deleteOnEnd) From 5b56e3a3acbc0c4a200f12658456b4b05f82230c Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 20 Jan 2021 22:15:45 +1030 Subject: [PATCH 29/39] Fix example usage syntax error --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a9e1867..e04f8e4 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ for (let i = 0; i < 10; i++) { } const footerResolver = (currentPageIndex, pagesLength) => - `Page ${currentPageIndex + 1} / ${pagesLength}: ${(currentPageIndex % 2 === 0 ? 'This page is even!' : 'This page is odd!')}`; + `Page ${currentPageIndex + 1} / ${pagesLength}: ${(currentPageIndex % 2 === 0) ? 'This page is even!' : 'This page is odd!'}`; const collectErrorHandler = (error) => console.log(error); From 8091a755ade0b9adaf039a12d2c491c1c0f6360a Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 22 Jan 2021 22:53:51 +1030 Subject: [PATCH 30/39] Add deleted guard on end (in case ended by other means) --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index acdb162..420fb32 100644 --- a/index.js +++ b/index.js @@ -70,7 +70,8 @@ const paginationEmbed = async (msg, pages, } }); reactionCollector.on('end', async () => { - if (paginatedEmbedMessage.deletable && deleteOnEnd) + if (paginatedEmbedMessage.deleted) return; + if (deleteOnEnd) await paginatedEmbedMessage.delete(); else paginatedEmbedMessage.reactions.removeAll(); From 9ee632a61ae68a56d3d11f37954529bfb3adb0dc Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Feb 2021 17:30:49 +1030 Subject: [PATCH 31/39] Destructure params - optional, delegate end handler, expose messages to error handler. --- index.d.ts | 31 +++++++++++++++++++++++++++---- index.js | 35 +++++++++++++++++++---------------- 2 files changed, 46 insertions(+), 20 deletions(-) diff --git a/index.d.ts b/index.d.ts index d9b3fb0..10ecaac 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,13 +1,36 @@ -import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollectorOptions, User } from "discord.js"; +import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollector, ReactionCollectorOptions, User } from "discord.js"; + +interface BaseHandlerParameters { + receivedMessage?: Message; + paginatedEmbedMessage?: MessageEmbed; +} + +interface PageResolverParameters { + paginatedEmbedMessage?: MessageEmbed; + pages?: MessageEmbed[]; + emojiList?: string[]; + currentPageIndex?: number; + reaction?: MessageReaction; +} + +interface CollectErrorHandlerParameters extends BaseHandlerParameters { + error?: Error; + reactionCollector?: ReactionCollector; +} + +interface CollectEndHandlerParameters extends BaseHandlerParameters { + collected?: Collection; + reason?: string; +} interface PaginationOptions extends ReactionCollectorOptions { - deleteOnEnd?: boolean; emojiList?: EmojiIdentifierResolvable[]; footerResolver?(pageIndex: number, pagesLength: number): string; sendMessage?(receivedMessage: Message, pageEmbed: MessageEmbed): Promise; collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; - pageResolver?(paginatedEmbedMessage: Message, pages: MessageEmbed[], emojiList: string[], currentPageIndex: number, reaction: MessageReaction): number | Promise; - collectErrorHandler?(error: Error): void | Promise; + pageResolver?(pageResolverParameters?: PageResolverParameters): number | Promise; + collectErrorHandler?(collectErrorHandlerParameters?: CollectErrorHandlerParameters): void | Promise; + collectorEndHandler?(collectorEndHandlerParameters?: CollectEndHandlerParameters): void | Promise; } declare function paginationEmbed(receivedMessage: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; diff --git a/index.js b/index.js index 420fb32..aba3572 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ * @param {MessageReaction} reaction * @returns {number} - the new page index. */ -const defaultPageResolver = async (_, pages, emojiList, currentPageIndex, reaction) => { +const defaultPageResolver = async ({pages, emojiList, currentPageIndex, reaction}) => { let newPage = currentPageIndex; switch (reaction.emoji.name) { case emojiList[0]: @@ -27,33 +27,40 @@ const defaultSendMessage = (message, pageEmbed) => message.channel.send(pageEmbe const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; +const defaultCollectorEndHandler = ({paginatedEmbedMessage}) => { + if (!paginatedEmbedMessage.deleted) + await paginatedEmbedMessage.reactions.removeAll(); +} + /** * - * @param {Message} msg - the message + * @param {Message} receivedMessage - the received message * @param {MessageEmbed[]} pages - array of message embeds to use as each page. * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. */ -const paginationEmbed = async (msg, pages, +const paginationEmbed = async (receivedMessage, pages, { - deleteOnEnd = false, emojiList = ['⏪', '⏩'], footerResolver = defaultFooterResolver, sendMessage = defaultSendMessage, collectorFilter = defaultCollectorFilter, pageResolver = defaultPageResolver, collectErrorHandler = () => {}, + collectorEndHandler = defaultCollectorEndHandler, timeout = 120000, ...rest } = {} ) => { - if (!msg && !msg.channel) throw new Error('Channel is inaccessible.'); + if (!receivedMessage && !receivedMessage.channel) throw new Error('Channel is inaccessible.'); if (!pages) throw new Error('Pages are not given.'); let currentPageIndex = 0; pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); - const paginatedEmbedMessage = await sendMessage(msg, pages[currentPageIndex]); + const paginatedEmbedMessage = await sendMessage(receivedMessage, pages[currentPageIndex]); const reactionCollector = paginatedEmbedMessage.createReactionCollector( - async (reaction, user) => await collectorFilter(reaction, user, emojiList), - { time: timeout, ...rest } + async (reaction, user) => { + await collectorFilter(reaction, user, emojiList) + }, + { time: timeout, ...rest } ); reactionCollector.on('collect', async (reaction, user) => { // this try / catch is to handle the edge case where a collect event is fired after a message delete call @@ -62,19 +69,15 @@ const paginationEmbed = async (msg, pages, await reaction.users.remove(user.id); const currentPage = currentPageIndex; - currentPageIndex = await pageResolver(paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction); + currentPageIndex = await pageResolver({ paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction }); if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); } catch(error) { - await collectErrorHandler(error); + await collectErrorHandler({ error, receivedMessage, paginatedEmbedMessage }); } }); - reactionCollector.on('end', async () => { - if (paginatedEmbedMessage.deleted) return; - if (deleteOnEnd) - await paginatedEmbedMessage.delete(); - else - paginatedEmbedMessage.reactions.removeAll(); + reactionCollector.on('end', async (collected, reason) => { + await collectorEndHandler({ collected, reason, paginatedEmbedMessage, receivedMessage }); }); for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); return paginatedEmbedMessage; From 9d17bd373ee5a5dcadb6fc07a7723160904e97ea Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Feb 2021 17:32:22 +1030 Subject: [PATCH 32/39] Update error handler example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e04f8e4..45c9bc1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ for (let i = 0; i < 10; i++) { const footerResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}: ${(currentPageIndex % 2 === 0) ? 'This page is even!' : 'This page is odd!'}`; -const collectErrorHandler = (error) => console.log(error); +const collectErrorHandler = ({ error }) => console.log(error); // Call the paginationEmbed method, first two arguments are required // The third argument is the PaginationOptions - all optional From 44a4b0c4ae751c0785075f95ac8093cc20bdc650 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 25 Feb 2021 18:05:17 +1030 Subject: [PATCH 33/39] Fix collector filter typing, adjust consistent syntax --- index.d.ts | 18 ++++++++++++------ index.js | 9 +++++---- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/index.d.ts b/index.d.ts index 10ecaac..d2f79ed 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,10 +1,5 @@ import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollector, ReactionCollectorOptions, User } from "discord.js"; -interface BaseHandlerParameters { - receivedMessage?: Message; - paginatedEmbedMessage?: MessageEmbed; -} - interface PageResolverParameters { paginatedEmbedMessage?: MessageEmbed; pages?: MessageEmbed[]; @@ -13,6 +8,17 @@ interface PageResolverParameters { reaction?: MessageReaction; } +interface CollectorFilterParameters { + reaction?: MessageReaction; + user?: User; + emojiList: string[]; +} + +interface BaseHandlerParameters { + receivedMessage?: Message; + paginatedEmbedMessage?: MessageEmbed; +} + interface CollectErrorHandlerParameters extends BaseHandlerParameters { error?: Error; reactionCollector?: ReactionCollector; @@ -27,7 +33,7 @@ interface PaginationOptions extends ReactionCollectorOptions { emojiList?: EmojiIdentifierResolvable[]; footerResolver?(pageIndex: number, pagesLength: number): string; sendMessage?(receivedMessage: Message, pageEmbed: MessageEmbed): Promise; - collectorFilter?(reaction: MessageReaction, user: User): boolean | Promise; + collectorFilter?(collectorFilterParameters?: CollectorFilterParameters): boolean | Promise; pageResolver?(pageResolverParameters?: PageResolverParameters): number | Promise; collectErrorHandler?(collectErrorHandlerParameters?: CollectErrorHandlerParameters): void | Promise; collectorEndHandler?(collectorEndHandlerParameters?: CollectEndHandlerParameters): void | Promise; diff --git a/index.js b/index.js index aba3572..e728fb2 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ * @param {MessageReaction} reaction * @returns {number} - the new page index. */ -const defaultPageResolver = async ({pages, emojiList, currentPageIndex, reaction}) => { +const defaultPageResolver = async ({ pages, emojiList, currentPageIndex, reaction }) => { let newPage = currentPageIndex; switch (reaction.emoji.name) { case emojiList[0]: @@ -25,9 +25,9 @@ const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${current const defaultSendMessage = (message, pageEmbed) => message.channel.send(pageEmbed); -const defaultCollectorFilter = (reaction, user, emojiList) => emojiList.includes(reaction.emoji.name) && !user.bot; +const defaultCollectorFilter = ({ reaction, user, emojiList }) => emojiList.includes(reaction.emoji.name) && !user.bot; -const defaultCollectorEndHandler = ({paginatedEmbedMessage}) => { +const defaultCollectorEndHandler = ({ paginatedEmbedMessage }) => { if (!paginatedEmbedMessage.deleted) await paginatedEmbedMessage.reactions.removeAll(); } @@ -79,7 +79,8 @@ const paginationEmbed = async (receivedMessage, pages, reactionCollector.on('end', async (collected, reason) => { await collectorEndHandler({ collected, reason, paginatedEmbedMessage, receivedMessage }); }); - for (const emoji of emojiList) await paginatedEmbedMessage.react(emoji); + for (const emoji of emojiList) + await paginatedEmbedMessage.react(emoji); return paginatedEmbedMessage; }; From 1641156be7bf88d99bdc684a081cceeaa4966fad Mon Sep 17 00:00:00 2001 From: psibean Date: Sat, 7 Aug 2021 12:36:19 +0930 Subject: [PATCH 34/39] Update with initial discordjs v13 support --- index.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index e728fb2..0942bab 100644 --- a/index.js +++ b/index.js @@ -6,7 +6,7 @@ * @param {MessageReaction} reaction * @returns {number} - the new page index. */ -const defaultPageResolver = async ({ pages, emojiList, currentPageIndex, reaction }) => { + const defaultPageResolver = async ({ pages, emojiList, currentPageIndex, reaction }) => { let newPage = currentPageIndex; switch (reaction.emoji.name) { case emojiList[0]: @@ -23,7 +23,7 @@ const defaultPageResolver = async ({ pages, emojiList, currentPageIndex, reactio const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; -const defaultSendMessage = (message, pageEmbed) => message.channel.send(pageEmbed); +const defaultSendMessage = (message, pageEmbed) => message.channel.send({ embeds: [pageEmbed] }); const defaultCollectorFilter = ({ reaction, user, emojiList }) => emojiList.includes(reaction.emoji.name) && !user.bot; @@ -56,12 +56,13 @@ const paginationEmbed = async (receivedMessage, pages, let currentPageIndex = 0; pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length)); const paginatedEmbedMessage = await sendMessage(receivedMessage, pages[currentPageIndex]); - const reactionCollector = paginatedEmbedMessage.createReactionCollector( - async (reaction, user) => { + const reactionCollector = paginatedEmbedMessage.createReactionCollector({ + filter: async (reaction, user) => { await collectorFilter(reaction, user, emojiList) - }, - { time: timeout, ...rest } - ); + }, + time: timeout, + ...rest + }); reactionCollector.on('collect', async (reaction, user) => { // this try / catch is to handle the edge case where a collect event is fired after a message delete call // but before the delete is complete, handling is offloaded to the user via collectErrorHandler @@ -71,7 +72,7 @@ const paginationEmbed = async (receivedMessage, pages, currentPageIndex = await pageResolver({ paginatedEmbedMessage, pages, emojiList, currentPageIndex, reaction }); if ( !paginatedEmbedMessage.deleted && currentPage != currentPageIndex && currentPageIndex >= 0 && currentPageIndex < pages.length) - await paginatedEmbedMessage.edit(pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))); + await paginatedEmbedMessage.edit({ embeds: [pages[currentPageIndex].setFooter(footerResolver(currentPageIndex, pages.length))] }); } catch(error) { await collectErrorHandler({ error, receivedMessage, paginatedEmbedMessage }); } From ab9278017a306e5c8b7d378e92b4ef942a23c9da Mon Sep 17 00:00:00 2001 From: psibean Date: Sat, 7 Aug 2021 14:30:43 +0930 Subject: [PATCH 35/39] Update index typings --- index.d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index d2f79ed..de2ccb2 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1,6 @@ -import { EmojiIdentifierResolvable, Message, MessageEmbed, MessageReaction, ReactionCollector, ReactionCollectorOptions, User } from "discord.js"; +import { Collection, EmojiIdentifierResolvable, Message, MessageEmbed, + MessageReaction, ReactionCollector, ReactionCollectorOptions, + Snowflake, User } from "discord.js"; interface PageResolverParameters { paginatedEmbedMessage?: MessageEmbed; From 1f9349a20b26a5720548ab9e1991ae21ba41edad Mon Sep 17 00:00:00 2001 From: psibean Date: Sat, 7 Aug 2021 14:33:36 +0930 Subject: [PATCH 36/39] Update readme installation and version support information --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c9bc1..eead8c6 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,19 @@ # discord.js-pagination -A simple utility to paginate discord embeds. Built on discord.js@^12.0.0 (master) but should work on older versions. Compatible with MessageEmbeds, RichEmbeds (not tested). Pages are embeds. +A simple utility to paginate discord embeds. Built on discord.js@^13.0.0, v12 support is available (see below) but is not supported. Compatible with MessageEmbeds, RichEmbeds (not tested). Pages are embeds. # Installation +For discord.js@^13.0.0 + * `npm install discord.js-pagination` +For the older version of the package with discord.js@^12.0.0 support: + +* `npm install discord.js-pagination@1.0.3` + +**Note: the usage for 1.0.3 is completely different (not supported)** + # Usage __Basic Bot Example__ From cbaf4047d090cd507278e07a9735a499ac29f6d9 Mon Sep 17 00:00:00 2001 From: psibean Date: Sat, 7 Aug 2021 14:36:31 +0930 Subject: [PATCH 37/39] Bump major --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a4617ba..6c98e54 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "discord.js-pagination", - "version": "1.0.3", + "version": "2.0.0", "description": "A simple utility to paginate discord embeds. ", "main": "index.js", "types": "index.d.ts", From 97fcb6df2678f495ac1d2e181589792b5b4e0e68 Mon Sep 17 00:00:00 2001 From: psibean Date: Sun, 8 Aug 2021 01:40:55 +0930 Subject: [PATCH 38/39] Fix async/await defaults, fix collectorFilter destruct params --- index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 0942bab..e5927f1 100644 --- a/index.js +++ b/index.js @@ -23,11 +23,11 @@ const defaultFooterResolver = (currentPageIndex, pagesLength) => `Page ${currentPageIndex + 1} / ${pagesLength}`; -const defaultSendMessage = (message, pageEmbed) => message.channel.send({ embeds: [pageEmbed] }); +const defaultSendMessage = async (message, pageEmbed) => await message.channel.send({ embeds: [pageEmbed] }); const defaultCollectorFilter = ({ reaction, user, emojiList }) => emojiList.includes(reaction.emoji.name) && !user.bot; -const defaultCollectorEndHandler = ({ paginatedEmbedMessage }) => { +const defaultCollectorEndHandler = async ({ paginatedEmbedMessage }) => { if (!paginatedEmbedMessage.deleted) await paginatedEmbedMessage.reactions.removeAll(); } @@ -58,7 +58,7 @@ const paginationEmbed = async (receivedMessage, pages, const paginatedEmbedMessage = await sendMessage(receivedMessage, pages[currentPageIndex]); const reactionCollector = paginatedEmbedMessage.createReactionCollector({ filter: async (reaction, user) => { - await collectorFilter(reaction, user, emojiList) + await collectorFilter({reaction, user, emojiList}) }, time: timeout, ...rest From 4f774fed6acb8dd127642bcf6e0390882ee227d0 Mon Sep 17 00:00:00 2001 From: psibean Date: Sun, 8 Aug 2021 11:12:00 +0930 Subject: [PATCH 39/39] Add missing filter return, add interaction typing --- index.d.ts | 10 +++++----- index.js | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/index.d.ts b/index.d.ts index de2ccb2..c0ff757 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,5 +1,5 @@ -import { Collection, EmojiIdentifierResolvable, Message, MessageEmbed, - MessageReaction, ReactionCollector, ReactionCollectorOptions, +import { Collection, EmojiIdentifierResolvable, Interaction, Message, + MessageEmbed,MessageReaction, ReactionCollector, ReactionCollectorOptions, Snowflake, User } from "discord.js"; interface PageResolverParameters { @@ -17,7 +17,7 @@ interface CollectorFilterParameters { } interface BaseHandlerParameters { - receivedMessage?: Message; + receivedMessage?: Interaction | Message; paginatedEmbedMessage?: MessageEmbed; } @@ -34,13 +34,13 @@ interface CollectEndHandlerParameters extends BaseHandlerParameters { interface PaginationOptions extends ReactionCollectorOptions { emojiList?: EmojiIdentifierResolvable[]; footerResolver?(pageIndex: number, pagesLength: number): string; - sendMessage?(receivedMessage: Message, pageEmbed: MessageEmbed): Promise; + sendMessage?(receivedMessage: Interaction | Message, pageEmbed: MessageEmbed): Promise; collectorFilter?(collectorFilterParameters?: CollectorFilterParameters): boolean | Promise; pageResolver?(pageResolverParameters?: PageResolverParameters): number | Promise; collectErrorHandler?(collectErrorHandlerParameters?: CollectErrorHandlerParameters): void | Promise; collectorEndHandler?(collectorEndHandlerParameters?: CollectEndHandlerParameters): void | Promise; } -declare function paginationEmbed(receivedMessage: Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; +declare function paginationEmbed(receivedMessage: Interaction | Message, pages: MessageEmbed[], paginationOptions?: PaginationOptions): Promise; export = paginationEmbed; diff --git a/index.js b/index.js index e5927f1..c45dcbd 100644 --- a/index.js +++ b/index.js @@ -34,7 +34,7 @@ const defaultCollectorEndHandler = async ({ paginatedEmbedMessage }) => { /** * - * @param {Message} receivedMessage - the received message + * @param {(Interaction|Message)} receivedMessage - the received message or interaction * @param {MessageEmbed[]} pages - array of message embeds to use as each page. * @param {PaginationOptions} paginationOptions - exposes collector options, provides customization. */ @@ -58,7 +58,7 @@ const paginationEmbed = async (receivedMessage, pages, const paginatedEmbedMessage = await sendMessage(receivedMessage, pages[currentPageIndex]); const reactionCollector = paginatedEmbedMessage.createReactionCollector({ filter: async (reaction, user) => { - await collectorFilter({reaction, user, emojiList}) + return await collectorFilter({reaction, user, emojiList}) }, time: timeout, ...rest