From fc7cb02784d33710d42260d798fa5378e5a776ad Mon Sep 17 00:00:00 2001 From: Emily Wood Date: Mon, 30 Aug 2021 19:39:34 +1000 Subject: [PATCH] oops deleted something important --- LICENSE | 19 ++++++++ README.md | 41 +++++++++++++++++ index.js | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 55 +++++++++++++++++++++++ 4 files changed, 239 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 index.js create mode 100644 package.json diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..03cfc17 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2020 XzFirzal + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..64a6588 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# discord-paginator.js +A lightweight package to paginate discord message for discord bots with ease! + +# How to use? easy! +# Install using NPM +```properties +npm install discord-paginator.js +``` + +# Example +```js +const BasePaginator = require('discord-paginator.js') + +const pages = ['foo', 'bar'] //return foo at the first page, and bar at the second page + +const Paginator = new BasePaginator({ + pages: pages, //the pages + timeout: 120000, //the timeout for the reaction collector ended (in ms) + page: 'Page {current}/{total}', //Show the page counter to the message + filter: (reaction, user) => user.id == message.author.id //to filter the reaction collector +}) + +Paginator.spawn(message.channel) //to spawn the paginator to specific text channel +``` + +# Explanation +```js +const Paginator = new BasePaginator({ + pages: Array, //The pages, can contain string or message embed + remove: String, //The emoji to despawn the paginator + reset: String, //The emoji to reset the paginator to first page + reaction: [String, String], //The emoji to move previous or next page + removeReaction: Boolean, //Remove the user reaction when used + removeAtEnd: Boolean, //Remove the reactions when the reaction collector is ended + pageCount: String, //Show the page counter to the message + timeout: Number, //The timeout for the reaction collector ended (in ms) + filter: Function //An additional filter for the paginator +}) + +await Paginator.spawn(Discord.TextChannel) //Spawn the paginator to specific text channel +``` \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..d630f5c --- /dev/null +++ b/index.js @@ -0,0 +1,124 @@ +let djs + +try { + djs = require('discord.js') +} catch { + throw new Error('Paginator: ' + 'Please install discord.js package manually') +} + +const defaultOpts = { + pages: [], + remove: '🗑️', + reset: '🔁', + reaction: ['⬅️', '➡️'], + removeReaction: true, + removeAtEnd: true, + timeout: 60000, + filter: (reaction, user) => true +} + +function none() {} + +class Paginator { + constructor(opts = defaultOpts) { + Object.assign(this, defaultOpts) + Object.assign(this, opts) + } + + async spawn(channel) { + const opts = { + remove: this.remove, + reset: this.reset, + reaction: this.reaction, + removeReaction: this.removeReaction, + removeAtEnd: this.removeAtEnd, + timeout: this.timeout, + filter: this.filter + } + const pages = [...this.pages] + let page = 0 + + if (!pages.length) throw new Error('Paginator: ' + 'Empty pages') + + let message = await channel.send(pages[page]) + + if (!Array.isArray(opts.reaction) || opts.reaction.length < 2) throw new Error('Paginator: ' + 'Must be two reactions given in \'reaction\' options') + + if (typeof opts.filter != 'function') throw new Error('Paginator: ' + 'Expecting a function in \'filter\' options') + + if (opts.timeout < 1000 || opts.timeout > 259200000) throw new Error('Paginator: ' + 'Spawner timeout must be between 1 second and 3 days') + + const reactions = {} + + if (typeof opts.reset == 'string' && pages.length > 1) { + reactions.reset = await message.react(opts.reset).catch(none) + if (!reactions.reset) return + } + + if (pages.length > 1) { + reactions.left = await message.react(opts.reaction[0]).catch(none) + + if (!reactions.left) return + + reactions.right = await message.react(opts.reaction[1]).catch(none) + } + + + if (typeof opts.remove == 'string') { + reactions.remove = await message.react(opts.remove).catch(none) + if (!reactions.remove) return + } + + async function filter(reaction, user) { + const bool = [false, await opts.filter(reaction, user)] + + if (reactions.reset) bool[0] = reaction.emoji.toString() == reactions.reset.emoji.toString() + + if (!bool[0] && reactions.remove) bool[0] = reaction.emoji.toString() == reactions.remove.emoji.toString() + + if (!bool[0]) bool[0] = reaction.emoji.toString() == reactions.left.emoji.toString() || reaction.emoji.toString() == reactions.right.emoji.toString() + + return bool.every(condition => condition) + } + + const collector = message.createReactionCollector(filter, { time: opts.timeout }) + + collector.on('collect', async (reaction, user) => { + if (reactions.reset && reaction.emoji.toString() == reactions.reset.emoji.toString()) { + page = 0 + + await message.edit(pages[page]) + } else if (reactions.remove && reaction.emoji.toString() == reactions.remove.emoji.toString()) { + collector.stop('123M0V3') + + return + } else if (reaction.emoji.toString() == reactions.left.emoji.toString()) { + if (pages[page - 1]) { + page-- + + await message.edit(pages[page]) + } + } else if (reaction.emoji.toString() == reactions.right.emoji.toString()) { + if (pages[page + 1]) { + page++ + + await message.edit(pages[page]) + } + } + + reaction.users.remove(user.id).catch(none) + }) + + collector.on('end', async (collected, reason) => { + if (opts.removeAtEnd && reason != '123M0V3') { + for (const reaction of Object.values(reactions)) { + await reaction.remove().catch(none) + } + } + + if (reason == '123M0V3') await message.delete() + }) + } +} + +module.exports = Paginator diff --git a/package.json b/package.json new file mode 100644 index 0000000..d2f723e --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "_from": "github:mudkipscience/discord-paginator.js", + "_id": "discord-paginator.js@1.0.2", + "_inBundle": false, + "_integrity": "", + "_location": "/discord-paginator.js", + "_phantomChildren": {}, + "_requested": { + "type": "git", + "raw": "discord-paginator.js@github:mudkipscience/discord-paginator.js", + "name": "discord-paginator.js", + "escapedName": "discord-paginator.js", + "rawSpec": "github:mudkipscience/discord-paginator.js", + "saveSpec": "github:mudkipscience/discord-paginator.js", + "fetchSpec": null, + "gitCommittish": null + }, + "_requiredBy": [ + "/" + ], + "_resolved": "github:mudkipscience/discord-paginator.js#c0969fb34119fd0f5a9af9c75bc6fa39f680993c", + "_spec": "discord-paginator.js@github:mudkipscience/discord-paginator.js", + "_where": "/home/container", + "author": { + "name": "Azusfin#9887" + }, + "bugs": { + "url": "https://github.com/XzFirzal/discord-paginator.js/issues" + }, + "bundleDependencies": false, + "deprecated": false, + "description": "A lightweight package to paginate discord message for discord bots", + "homepage": "https://github.com/XzFirzal/discord-paginator.js", + "keywords": [ + "paginate", + "discord", + "discord.js", + "menus", + "discord-menu", + "discord-pagination", + "menus", + "pagination" + ], + "license": "MIT", + "main": "index.js", + "name": "discord-paginator.js", + "repository": { + "type": "git", + "url": "git+https://github.com/XzFirzal/discord-paginator.js.git" + }, + "scripts": { + "test": "node ." + }, + "version": "1.0.2" +}