commit 5a0271b7b0d2bc29bce7dfcd28726d3da601c933 Author: Josh S Date: Sat Jun 18 23:28:38 2022 -0400 Add files via upload diff --git a/Config.js b/Config.js new file mode 100644 index 0000000..5a25ca9 --- /dev/null +++ b/Config.js @@ -0,0 +1,6 @@ +module.exports = { + prefix: ["e"], // Prefixes of the bot + developers: ["764888169047916636", "756160653307412532"], //Owners of the bot + token: "OTgwNjc5NTQ3NjI2MzQ4NjE0.GBgoHE.cDDeLHcvsVDc3in53sMeS08GjsekiSPpKJWDxQ", //TOKEN + mongo: "mongodb://144.172.80.86:3465" // Mongo URI +} \ No newline at end of file diff --git a/Src/Commands/ButtonCommands/EvalButton.js b/Src/Commands/ButtonCommands/EvalButton.js new file mode 100644 index 0000000..68480f9 --- /dev/null +++ b/Src/Commands/ButtonCommands/EvalButton.js @@ -0,0 +1,8 @@ +module.exports = { + name : 'evalbtn', + returnNoErrors: true, + ownerOnly: true, + run : async(client, interaction, container) => { + interaction.message.delete() + } +} \ No newline at end of file diff --git a/Src/Commands/ContextMenus/LogMessage.js b/Src/Commands/ContextMenus/LogMessage.js new file mode 100644 index 0000000..74c4bb7 --- /dev/null +++ b/Src/Commands/ContextMenus/LogMessage.js @@ -0,0 +1,11 @@ +module.exports = { + name: "log", + type: "MESSAGE", + run: async(client, interaction, container) => { + console.log(interaction.channel.messages.cache.get(interaction.targetId) ?? await interaction.channel.messages.fetch(interaction.targetId)) + interaction.reply({ + content: "Logged message to console.", + ephemeral: true + }) + } +} \ No newline at end of file diff --git a/Src/Commands/SlashCommands/Basic/Ping.js b/Src/Commands/SlashCommands/Basic/Ping.js new file mode 100644 index 0000000..0f8ed09 --- /dev/null +++ b/Src/Commands/SlashCommands/Basic/Ping.js @@ -0,0 +1,12 @@ +module.exports = { + name: "ping", + description: "Run this to see my ping.", + run: async(client, interaction, container) => { + const ping = new container.Discord.MessageEmbed() + .setColor('RANDOM') + .setTimestamp() + .setTitle('🏓╎ Pong!') + .setDescription(`🏠╎Websocket Latency: ${client.ws.ping}ms\n🤖╎Bot Latency: ${Date.now() - interaction.createdTimestamp}ms`); + interaction.reply({ embeds: [ping] }) + } +} \ No newline at end of file diff --git a/Src/Commands/SlashCommands/Basic/reactions.js b/Src/Commands/SlashCommands/Basic/reactions.js new file mode 100644 index 0000000..a6a9f66 --- /dev/null +++ b/Src/Commands/SlashCommands/Basic/reactions.js @@ -0,0 +1,96 @@ +const react = require('../../../Functions/mongodb-reaction-role') + +module.exports = { + name: 'reaction', + description: 'Create/Delete/Edit reaction roles', + ownerOnly: true, + options: [{ + name: 'create', + description: 'Create a reaction role', + type: 'SUB_COMMAND', + options: [{ + name: 'message', + description: 'The message ID', + required: true, + type: 'STRING' + }, + { + name: 'role', + description: 'The role ID', + required: true, + type: 'ROLE' + }, + { + name: 'emoji', + description: 'The emoji', + required: true, + type: 'STRING' + }, + { + name: 'channel', + description: 'The channel', + required: true, + type: 'CHANNEL', + channel_type: 'GUILD_TEXT' + }, + ] + }, + { + name: 'delete', + description: 'Delete a reaction role', + type: 'SUB_COMMAND', + options: [{ + name: 'message', + description: 'The message ID', + required: true, + type: 'STRING' + }, + { + name: 'emoji', + description: 'The emoji', + required: true, + type: 'STRING' + }, + ] + } + ], + run: async (client, interaction, container) => { + + try { + + if (interaction.options.getSubcommand() === 'create') { + + const message = interaction.options.getString('message'); + const role = interaction.options.getRole('role').id; + const emoji = interaction.options.getString('emoji'); + const channel = interaction.options.getChannel('channel').id; + + await react.createrr(client, interaction.guild.id, message, role, emoji, false); //the last field is : if the person should be dm + + //find the given message + const msg = await interaction.guild.channels.cache.find(c => c.id === channel).messages.fetch(message); + await msg.react(emoji); + + interaction.reply("Successfully created the reaction role!") + + } else if (interaction.options.getSubcommand() === 'delete') { + + const message = interaction.options.getString('message'); + const emoji = interaction.options.getString('emoji'); + + /// await react.deleterr(client, message.guild.id ,"message.id" , "emoji"); + /// !deleterr + await react.deleterr(client, interaction.guild.id, message, emoji); + interaction.reply("Successfully deleted the reaction role!") + + } + + } catch (error) { + + console.log(error) + await interaction.reply("Something went wrong.\n", error); + + } + + } +} \ No newline at end of file diff --git a/Src/Commands/SlashCommands/Dev/Eval.js b/Src/Commands/SlashCommands/Dev/Eval.js new file mode 100644 index 0000000..bdf386e --- /dev/null +++ b/Src/Commands/SlashCommands/Dev/Eval.js @@ -0,0 +1,50 @@ +const { inspect } = require('util') +module.exports = { + name : 'eval', + ownerOnly: true, + options: [{ + name: 'code', + description: 'The code to run', + required: true, + type: 'STRING' + }], + run : async(client, interaction, container) => { + Object.assign(this, container) + const row = new container.Discord.MessageActionRow() + .addComponents( + new container.Discord.MessageButton() + .setCustomId('evalbtn') + .setLabel('Delete Output') + .setStyle('DANGER'), + ); + let code = interaction.options.getString('code').trim() + let depth = 0 + const originalCode = code + if(!code) return interaction.reply("Please specify something to Evaluate") + try{ + if (originalCode.includes("--str")) code = `${code.replace("--str", "").trim()}.toString()` + if (originalCode.includes("--send")) code = `interaction.channel.send(${code.replace("--send", "").trim()})` + if (originalCode.includes("--async")) code = `(async () => {${code.replace("--async", "").trim()}})()` + if (originalCode.includes("--depth=")) depth = originalCode.split("--depth=")[1]; code = code.split("--depth=")[0] + code = code.replace("--silent", "").trim() + code = await eval(code) + code = inspect(code, { depth: depth }) + if (String(code).length > 1990) code = "Output is too long" + if (String(code).includes(container.Config.token)) code = "This message contained client's token." + if (originalCode.includes("--silent")) return; + else interaction.reply({ + content:`\`\`\`js\n${code}\n\`\`\``, + components: [row], + allowedMentions: { + repliedUser: false + } + }) + } catch (error){ + console.log(error) + interaction.reply({ + content:`\`\`\`js\n${error}\n\`\`\``, + components: [row] + }) + } + } + } diff --git a/Src/Commands/SlashCommands/Dev/Exec.js b/Src/Commands/SlashCommands/Dev/Exec.js new file mode 100644 index 0000000..08274d1 --- /dev/null +++ b/Src/Commands/SlashCommands/Dev/Exec.js @@ -0,0 +1,36 @@ +const { exec } = require("child_process") +module.exports = { + name: 'exec', + ownerOnly: true, + options: [{ + name: 'command', + description: 'The command to execute', + required: true, + type: 'STRING' + }], + run: async (client, interaction, container) => { + const row = new container.Discord.MessageActionRow() + .addComponents( + new container.Discord.MessageButton() + .setCustomId('evalbtn') + .setLabel('Delete Output') + .setStyle('DANGER') + ) + let lola = interaction.options.getString('command') + if (!lola) return interaction.reply("Please provide what to execute in the terminal!") + exec(`${lola}`, (error, stdout) => { + let response = (error || stdout) + if (error) { + interaction.reply({ + content:`\`\`\`js\n${error.message}\n\`\`\``, + components: [row] + }) + } else { + interaction.reply({ + content:`\`\`\`js\n${response}\n\`\`\``, + components: [row] + }) + } + }) + } + } \ No newline at end of file diff --git a/Src/Events/Client/ErrorManager.js b/Src/Events/Client/ErrorManager.js new file mode 100644 index 0000000..401b9f1 --- /dev/null +++ b/Src/Events/Client/ErrorManager.js @@ -0,0 +1,12 @@ +module.exports = { + name: "errorManager", + customEvent: true, + run: async(client) => { + process.on('unhandledRejection', error => { + console.log(error) + }) + process.on('uncaughtException', error => { + console.log(error) + }) + } +} \ No newline at end of file diff --git a/Src/Events/Client/InteractionCreate.js b/Src/Events/Client/InteractionCreate.js new file mode 100644 index 0000000..ee3002a --- /dev/null +++ b/Src/Events/Client/InteractionCreate.js @@ -0,0 +1,10 @@ +module.exports = { + name: "interactionCreate", + run: async(interaction, client) => { + const loadCommandOptions = require("../../Structures/CommandOptions/loadCommandOptions") + if (interaction.isButton()) loadCommandOptions(client, interaction, client.commands.buttonCommands.get(interaction.customId), true, "Button") + else if (interaction.isSelectMenu()) loadCommandOptions(client, interaction, client.commands.selectMenus.get(interaction.values[0] ?? interaction.customId), true, "SelectMenus") + else if (interaction.isCommand()) loadCommandOptions(client, interaction, client.commands.slashCommands.get(interaction.commandName), true, "SlashCommand") + else if (interaction.isContextMenu()) loadCommandOptions(client, interaction, client.commands.contextMenus.get(interaction.commandName), true, "ContextMenus") + } +} \ No newline at end of file diff --git a/Src/Events/Client/MessageCreate.js b/Src/Events/Client/MessageCreate.js new file mode 100644 index 0000000..6a18596 --- /dev/null +++ b/Src/Events/Client/MessageCreate.js @@ -0,0 +1,17 @@ +module.exports = { + name: "messageCreate", + run: async(message, client, container) => { + const loadCommandOptions = require("../../Structures/CommandOptions/loadCommandOptions") + container.Config.prefix.forEach(prefix => { + if (!message.content.toLowerCase().startsWith(prefix)) return; + const cmdName = message.content.toString().toLowerCase().slice(prefix.length).trim().split(" ")[0] + const command = client.commands.messageCommands.get(cmdName) ?? client.commands.messageCommands.get(client.commands.messageCommands.aliases.get(cmdName)) + if (!command) return; + if (command.allowBots) loadCommandOptions(client, message, command, false) + else if (message.author.bot) return; + else if (command.guildOnly == false) loadCommandOptions(client, message, command, false) + else if (!message.guild) return; + else loadCommandOptions(client, message, command, false) + }) + } +} \ No newline at end of file diff --git a/Src/Events/Client/ReadyClient.js b/Src/Events/Client/ReadyClient.js new file mode 100644 index 0000000..12471d4 --- /dev/null +++ b/Src/Events/Client/ReadyClient.js @@ -0,0 +1,62 @@ +const chalk = require("chalk") +const Box = require("cli-box") +module.exports = { + name: "ready", + once: true, + run: async(client) => { + client.user.setActivity('E', { + type: `WATCHING`, + }) + const ClientBox = new Box({ + w: Math.floor(client.user.tag.length + 27 ), + h: 7, + stringify: false, + marks: { + nw: '╭', + n: '─', + ne: '╮', + e: '│', + se: '╯', + s: '─', + sw: '╰', + w: '│' + }, + hAlign: 'left', + }, `C L I E N T I N F O R M A T I O N + +Client Details :: ${client.user.tag} +Guilds Count :: ${client.guilds.cache.size} +User Count :: ${client.users.cache.size} +NodeJS Version :: ${process.version} +`).stringify() + + const CommandsBox = new Box({ + w: Math.floor(`Initiating ${client.commands.messageCommands.aliases.size} messageCommands Aliases.`.length + 37), + h: 8, + stringify: false, + marks: { + nw: '╭', + n: '─', + ne: '╮', + e: '│', + se: '╯', + s: '─', + sw: '╰', + w: '│' + }, + hAlign: "left", + }, `C O M M A N D S I N F O R M A T I O N + +MessageCommands :: Initiating ${client.commands.messageCommands.size} messageCommands. +MessageCommands Aliases :: Initiating ${client.commands.messageCommands.aliases.size} messageCommands Aliases. +SlashCommands :: Initiating ${client.commands.slashCommands.size} slashCommands. +SelectMenus :: Initiating ${client.commands.selectMenus.size} selectMenus. +ContextMenus :: Initiating ${client.commands.contextMenus.size} contextMenus. +ButtonCommands :: Initiating ${client.commands.buttonCommands.size} buttonCommands. +Client Events :: Initiating ${client.events.size} events. +`).stringify() + + console.log(chalk.bold.greenBright(ClientBox)) + console.log(chalk.bold.blueBright(CommandsBox)) + } +} \ No newline at end of file diff --git a/Src/Events/Reactions/reactionAdd.js b/Src/Events/Reactions/reactionAdd.js new file mode 100644 index 0000000..9d786be --- /dev/null +++ b/Src/Events/Reactions/reactionAdd.js @@ -0,0 +1,20 @@ +const react = require("../../Functions/mongodb-reaction-role"); + +module.exports = { + name: "messageReactionAdd", + run: async (reaction, user, client, container) => { + + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + + if (user.bot) return; + let rolefetch = await react.fetchrr(client, reaction.message.guild.id, reaction.message.id, reaction.emoji.name); + if (!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if (!member.roles.cache.has(rolefetch.roleid)) { + await member.roles.add(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } + } +} \ No newline at end of file diff --git a/Src/Events/Reactions/reactionRemove.js b/Src/Events/Reactions/reactionRemove.js new file mode 100644 index 0000000..a59e096 --- /dev/null +++ b/Src/Events/Reactions/reactionRemove.js @@ -0,0 +1,19 @@ +const react = require("../../Functions/mongodb-reaction-role"); + +module.exports = { + name: "messageReactionRemove", + run: async (reaction, user, client, container) => { + + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + + let rolefetch = await react.fetchrr(client, reaction.message.guild.id, reaction.message.id, reaction.emoji.name); + if (!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if (member.roles.cache.has(rolefetch.roleid)) { + await member.roles.remove(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } + } +} \ No newline at end of file diff --git a/Src/Functions/mongodb-reaction-role/LICENSE b/Src/Functions/mongodb-reaction-role/LICENSE new file mode 100644 index 0000000..41de994 --- /dev/null +++ b/Src/Functions/mongodb-reaction-role/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 meister03 + +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. diff --git a/Src/Functions/mongodb-reaction-role/README.md b/Src/Functions/mongodb-reaction-role/README.md new file mode 100644 index 0000000..0d32a92 --- /dev/null +++ b/Src/Functions/mongodb-reaction-role/README.md @@ -0,0 +1,199 @@ +

+

Discord server

+ +# Discord Mongodb-reaction-role +A lightweight managing package to save/add/remove reaction roles and save them in a db. Intelligent saving ways to lower traffic up to 90% and prevent multipy fetches. This Package can be used for large bots too! + +**If you need help feel free to join our discord server. We will provied you all help ☺** +# Download +You can download it from npm: +```cli +npm i mongodb-reaction-role +npm i mongoose // when u did not installed it +``` + +# Setting Up +First we include the module into the project (into your main bot file). +**Intent must me enabled. See more [here](https://cdn.discordapp.com/attachments/736254990619770981/797536603798634556/unknown.png)** +```js +const react = require("mongodb-reaction-role"); +const client = new Discord.Client({ + autoReconnect: true, + partials: ["MESSAGE", "CHANNEL", "GUILD_MEMBER", "REACTION", "MESSAGE", "USER"] +}); // this is required to get the messages of the reaction roles +client.react = new Map(); // do not rename here something, or else Dx // save all msg id, role id +client.fetchforguild = new Map() //it will be saved, if the reaction roles were fetched from db +``` +After that, you have to provide a valid mongodb url and set the default prefix. +```js +react.setURL("mongodb://..."); //builts a connection with the db + +``` + +# Fetching Reaction Roles/ Add Role + +*Following examples assume that your `Discord.Client` is called `client`.* + +```js +client.on('messageReactionAdd',async (reaction , user ) => { + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + let rolefetch = await react.fetchrr(client, reaction.message.guild.id ,reaction.message.id , reaction.emoji.name); + if(!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if(!member.roles.cache.has(rolefetch.roleid)){ + await member.roles.add(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } + }); +``` +# Remove Role +```js +client.on('messageReactionRemove',async (reaction, user) => { + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + let rolefetch = await react.fetchrr(client, reaction.message.guild.id ,reaction.message.id , reaction.emoji.name); + if(!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if(member.roles.cache.has(rolefetch.roleid)){ + await member.roles.remove(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } +}); +``` +# Create/Delete a Reaction Role +```js +if(command === "createrr"){ /// you can use your command handler to, but look that you overgive the parameters client, message +///await react.createrr(client, message.guild.id ,"message.id" , "roleid" , "emoji"); +/// !createrr +if(!args[0] || !args[1] || !args[2]) return message.channel.send("Pls provide the arguments. ex: `!createrr `") +await react.createrr(client, message.guild.id ,args[0] , args[1] , args[2], "false"); //the last field is : if the person should be dm +message.channel.send("Successfully created the reaction role!") +} +``` +```js +if(command === "deleterr"){ +/// await react.deleterr(client, message.guild.id ,"message.id" , "emoji"); +/// !deleterr +if(!args[0] || !args[1]) return message.channel.send("Pls provide the arguments. ex: `!deleterr `") +await react.deleterr(client, message.guild.id ,args[0] , args[1]); +message.channel.send("Successfully deleted the reaction role!") +} +``` +```js +if(command === "editrr"){ +///await react.createrr(client, message.guild.id ,"message.id" , "roleid" , "emoji"); +/// !editrr +if(!args[0] || !args[1] || !args[2]) return message.channel.send("Pls provide the arguments. ex: `!editrr `") +await react.editrr(client, message.guild.id ,args[0] , args[1] , args[2]); +message.channel.send("Successfully edited the reaction role!") +} +``` +# Whole Code +```js +const Discord = require('discord.js'); +const { prefix, token , url } = require('./config.json'); +const react = require("mongodb-reaction-role"); +const client = new Discord.Client({ + autoReconnect: true, + partials: ["MESSAGE", "CHANNEL", "GUILD_MEMBER", "REACTION", "MESSAGE", "USER"] +}); // this is required to get the messages of the reaction roles + +client.react = new Map(); // do not rename here something, or else Dx // save all msg id, role id +client.fetchforguild = new Map() // it will be saved, if the reaction roles were fetched from db +//// Add this +react.setURL(url); +client.once('ready', () => { + console.log('Ready!'); +}); + +client.on('messageReactionAdd',async (reaction , user ) => { + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + + let rolefetch = await react.fetchrr(client, reaction.message.guild.id ,reaction.message.id , reaction.emoji.name); + if(!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if(!member.roles.cache.has(rolefetch.roleid)){ + await member.roles.add(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } + }); + +client.on('messageReactionRemove',async (reaction, user) => { + if (user.partial) await user.fetch(); + if (reaction.partial) await reaction.fetch(); + if (reaction.message.partial) await reaction.message.fetch(); + + let rolefetch = await react.fetchrr(client, reaction.message.guild.id ,reaction.message.id , reaction.emoji.name); + if(!rolefetch) return; + let member = await reaction.message.guild.members.cache.get(user.id) + if(member.roles.cache.has(rolefetch.roleid)){ + await member.roles.remove(rolefetch.roleid) + console.log(`Role on ${reaction.emoji.name} has been given`) + } +}); + +client.on('message', async message => { + if (message.author.bot) return; +//add this + +/// add this +if (!message.content.startsWith(prefix)) return; +const args = message.content.slice(prefix.length).trim().split(/ +/); +const command = args.shift().toLowerCase(); + +if(command === "createrr"){ /// you can use your command handler to, but look that you overgive the parameters client, message +///await react.createrr(client, message.guild.id ,"message.id" , "roleid" , "emoji"); +/// !createrr +if(!args[0] || !args[1] || !args[2]) return message.channel.send("Pls provide the arguments. ex: `!createrr `") +await react.createrr(client, message.guild.id ,args[0] , args[1] , args[2], "false"); /// the last field is : if the person should be dm +message.channel.send("Successfully created the reaction role!") +} +if(command === "deleterr"){ +/// await react.deleterr(client, message.guild.id ,"message.id" , "emoji"); +/// !deleterr +if(!args[0] || !args[1]) return message.channel.send("Pls provide the arguments. ex: `!deleterr `") +await react.deleterr(client, message.guild.id ,args[0] , args[1]); +message.channel.send("Successfully deleted the reaction role!") +} +if(command === "editrr"){ +///await react.createrr(client, message.guild.id ,"message.id" , "roleid" , "emoji"); +/// !editrr +if(!args[0] || !args[1] || !args[2]) return message.channel.send("Pls provide the arguments. ex: `!editrr `") +await react.editrr(client, message.guild.id ,args[0] , args[1] , args[2]); +message.channel.send("Successfully edited the reaction role!") +} +if(command === "rrstats"){ +const stats = new Discord.MessageEmbed() +.setTitle("Reaction roles stats") +.addField("Reaction roles found:" , "```" + client.react.size + " reaction roles" + "```") +.addField("Fetched Server:" , "```" + client.fetchforguild.size + "```") +.setColor("YELLOW") +return message.channel.send(stats) +} +}); +client.login(token); +``` + +*Is time for you to use the code creative..* + +# Methods +**See if the reaction on the message id exist as reaction role or when not fetched in the db** +```js +let fetch = await react.fetchrr(client, reaction.message.guild.id ,reaction.message.id , reaction.emoji.name); +//undefined || or gives a map entry ==> fetch.roleid, fetch.messageid , fetch.reaction, fetch.guildid , fetch.dm +``` +**Fetch all reaction roles and save them in a map (just use this for stats not for the reaction event)** +```js +await react.fetchallrr(client); +``` + + +**Have fun and feel free to contribute/suggest or contact me on my discord server or per dm on Meister#9667** + +# Bugs, Glitches and Issues +If you encounter any problems fell free to open an issue in our github repository or join the discord server.. diff --git a/Src/Functions/mongodb-reaction-role/index.js b/Src/Functions/mongodb-reaction-role/index.js new file mode 100644 index 0000000..a692498 --- /dev/null +++ b/Src/Functions/mongodb-reaction-role/index.js @@ -0,0 +1,169 @@ +const mongoose = require("mongoose"); +const serverset = require("./models/schema.js"); + +class react { + + /** + * @param {string} [dbUrl] - A valid mongo database URI. + */ + + static async setURL(dbUrl) { + if (!dbUrl) throw new TypeError("A database url was not provided."); + + return mongoose.connect(dbUrl, { + useNewUrlParser: true, + useUnifiedTopology: true + }).then(() => { + console.log("Package Connected to database."); + }); + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [roleid] - Discord guild id. + * @param {string} [emoji] - on which emoji u would get the role + * @param {Boolean} [dm] - Discord guild id. + */ + + static async createrr(client, guildId, msgid, roleid ,emoji , dm) { + if (!client) throw new TypeError("An client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + if(!roleid) throw new TypeError("A role id was not provided."); + dm = dm ? dm : false ; // when dm is undefined // if they should get a message , when they get the role + const issame = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji , roleid: roleid}); + if (issame) return false; + + const newRR = new serverset({ + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: roleid, + dm: dm + }); + + await newRR.save().catch(e => console.log(`Failed to create reaction role: ${e}`)); + client.react.set(msgid+emoji, { ///this saves the msgid in a map to prevent a fetch + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: roleid, + dm: dm + }); + return newRR; + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [emoji] - on which emoji u would get the role + */ + + static async deleterr(client, guildId , msgid, emoji) { + if (!client) throw new TypeError("A client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + + + const reactionRole = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji }); + if (!reactionRole) return false; + + await serverset.findOneAndDelete({guildid: guildId , msgid: msgid , reaction: emoji }).catch(e => console.log(`Failed to reaction: ${e}`)); + + client.react.delete(msgid+emoji); + + + return reactionRole; + + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. + * @param {string} [msgid] - on which should the reaction roles be. + * @param {string} [newroleid] - Discord guild id. + * @param {string} [emoji] - on which emoji u would get the role + */ + + static async editrr(client, guildId , msgid, newroleid , emoji) { + if (!client) throw new TypeError("An client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if (!msgid) throw new TypeError("A message id was not provided."); + if (!emoji) throw new TypeError("A reaction/emoji was not provided."); + if(!newroleid) throw new TypeError("A role id was not provided."); + + const reactionRole = await serverset.findOne({guildid: guildId , msgid: msgid , reaction: emoji }); + if (!reactionRole) return false; + reactionRole.roleid= newroleid; + + await reactionRole.save().catch(e => console.log(`Failed to save new prefix: ${e}`) ); + client.react.set(msgid+emoji, { ///this saves the msgid in a map to prevent a fetch + guildid: guildId, + msgid: msgid, + reaction: emoji , + roleid: newroleid, + dm: reactionRole.dm + }); + return; + } + + /** + * @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches + * @param {string} [guildId] - Discord guild id. +* @param {string} [msgid] - Discord guild id. + * @param {string} [emoji] - Discord guild id. + */ + + static async fetchrr(client, guildId ,msgid , emoji) { + if (!client) throw new TypeError("A client was not provided."); + if (!guildId) throw new TypeError("A guild id was not provided."); + if(!client.fetchforguild.has(guildId)){ + let allrole = await serverset.find({guildid: guildId}).sort([['guildid', 'descending']]).exec(); + let i = 0; + for(i ; i < Object.keys(allrole).length; i++){ + await client.react.set(allrole[i].msgid+allrole[i].reaction, { ///this saves the msgid in a map to prevent a fetch + guildid: allrole[i].guildid, + msgid: allrole[i].msgid, + reaction: allrole[i].reaction , + roleid: allrole[i].roleid, + dm: allrole[i].dm + }); + } + client.fetchforguild.set(guildId, { ///this saves the msgid in a map to prevent a fetch + guildid: guildId, + totalreactions: Object.keys(allrole).length + }); + } + return client.react.get(msgid + emoji); + } + +/** +* @param {object} [client] - Discord client, will save the data in a Map to prevent multiple fetches +*/ +static async fetchallrr(client) { + if (!client) throw new TypeError("An client was not provided."); + let all = await serverset.find({}).sort([['guildid', 'descending']]).exec(); + + /* let i = 0; + for(i ; i < Object.keys(all).length; i++){ + client.react.set(all[i].msgid+all[i].reaction, { ///this saves the msgid in a map to prevent a fetch + guildid: all[i].guildid, + msgid: all[i].msgid, + reaction: all[i].reaction , + roleid: all[i].roleid, + dm: all[i].dm + }); + }*/ + + return all; + } + + +} + +module.exports = react; diff --git a/Src/Functions/mongodb-reaction-role/models/schema.js b/Src/Functions/mongodb-reaction-role/models/schema.js new file mode 100644 index 0000000..60741f7 --- /dev/null +++ b/Src/Functions/mongodb-reaction-role/models/schema.js @@ -0,0 +1,12 @@ +const mongoose = require("mongoose"); + +const reactionSchema = new mongoose.Schema({ + + guildid: { type: String }, + msgid: { type: String}, + roleid: { type: String}, + reaction: { type: String }, /// Change the field name | add other Fields, do not forget the "," ;) + dm: {type: Boolean } +}); + +module.exports = mongoose.model('reaction', reactionSchema); diff --git a/Src/Functions/mongodb-reaction-role/package.json b/Src/Functions/mongodb-reaction-role/package.json new file mode 100644 index 0000000..134e59f --- /dev/null +++ b/Src/Functions/mongodb-reaction-role/package.json @@ -0,0 +1,35 @@ +{ + "name": "mongodb-reaction-role", + "version": "1.1.0", + "description": "A lightweight and easy to use db managing package to give roles with reactions", + "main": "index.js", + "dependencies": { + "mongoose": "^5.7.1" + }, + "devDependencies": {}, + "repository": { + "type": "git", + "url": "git+https://github.com/meister03/mongodb-reaction-role.git" + }, + + "keywords": [ + "discord", + "discord.js", + "intelligent saving", + "bot", + "bots", + "reaction roles", + "reaction", + "mongo", + "mongoose", + "mongodb", + "manage-roles", + "framework" + ], + "author": "meister03", + "license": "MIT", + "bugs": { + "url": "https://github.com/meister03/mongodb-reaction-role/issues" + }, + "homepage": "https://github.com/meister03/mongodb-reaction-role#readme" +} diff --git a/Src/Structures/CommandOptions/AnyClientPermissions.js b/Src/Structures/CommandOptions/AnyClientPermissions.js new file mode 100644 index 0000000..93b3527 --- /dev/null +++ b/Src/Structures/CommandOptions/AnyClientPermissions.js @@ -0,0 +1,21 @@ +module.exports = async function (message, command, Discord) { + if (!command.anyClientPermission) return false; + if (command.anyClientPermission.some(i => message.member.permissions.has(i))) return false; + else { + if (command.returnAnyClientPermissions == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`I required any one of these permissions for this command.\n•${command.anyClientPermission.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/AnyUserPermissions.js b/Src/Structures/CommandOptions/AnyUserPermissions.js new file mode 100644 index 0000000..a916ec2 --- /dev/null +++ b/Src/Structures/CommandOptions/AnyUserPermissions.js @@ -0,0 +1,21 @@ +module.exports = async function (message, command, Discord) { + if (!command.anyUserPermission) return false; + if (command.anyUserPermission.some(i => message.member.permissions.has(i))) return false; + else { + if (command.returnAnyUserPermissions == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`You require any one of these permissions to be able to run this command..\n•${command.anyUserPermission.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/ClientPermissions.js b/Src/Structures/CommandOptions/ClientPermissions.js new file mode 100644 index 0000000..4bd4391 --- /dev/null +++ b/Src/Structures/CommandOptions/ClientPermissions.js @@ -0,0 +1,25 @@ +module.exports = async function (message, command, Discord) { + if (!command.clientPermissions) return false; + let missing = [] + command.clientPermissions.forEach(i => { + if (!message.guild.me.permissions.has(i)) missing.push(i) + }) + if (missing.length == 0) return false; + else { + if (command.returnClientPermissions == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`I require these permissions to be able to run this command.\n•${missing.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/Cooldown.js b/Src/Structures/CommandOptions/Cooldown.js new file mode 100644 index 0000000..caf99de --- /dev/null +++ b/Src/Structures/CommandOptions/Cooldown.js @@ -0,0 +1,30 @@ +const db = require("quick.db") +module.exports = async function (client, message, command, isInteraction, interactionType, Discord) { + if (!command.cooldown) return false; + const currentTime = Date.now() + const user = message.member.user + const cooldown = command.cooldown + const oldTime = await db.get(`CooldownSystem.${message.guild.id}.${command.name}.${interactionType ?? "Normal"}.${user.id}`) ?? 0 + if (Math.floor(currentTime - oldTime) >= cooldown || oldTime == 0) { + await db.set(`CooldownSystem.${message.guild.id}.${command.name}.${interactionType ?? "Normal"}.${user.id}`, currentTime) + return false; + } else { + if (command.returnCooldown == false || command.returnNoErrors) return true; + else { + message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setTimestamp() + .setColor("RANDOM") + .setDescription(`You are currently at cooldown until `)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/OnlyChannels.js b/Src/Structures/CommandOptions/OnlyChannels.js new file mode 100644 index 0000000..805a633 --- /dev/null +++ b/Src/Structures/CommandOptions/OnlyChannels.js @@ -0,0 +1,25 @@ +module.exports = async function (message, command, Discord) { + if (!command.onlyChannels) return false; + if (command.onlyChannels.some(id => id == message.channel.id)) return false; + else { + let onlyChannels = [] + command.onlyChannels.forEach(id => { + onlyChannels.push(`<#${id}>`) + }) + if (command.returnOnlyChannels == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`This command can only be ran in these channels.\n•${onlyChannels.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true; + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/OnlyGuilds.js b/Src/Structures/CommandOptions/OnlyGuilds.js new file mode 100644 index 0000000..fe6335d --- /dev/null +++ b/Src/Structures/CommandOptions/OnlyGuilds.js @@ -0,0 +1,25 @@ +module.exports = async function (client, message, command, Discord) { + if (!command.onlyGuilds) return false; + if (command.onlyGuilds.some(id => id == message.guild.id)) return false; + else { + let onlyGuilds = [] + command.onlyGuilds.forEach(id => { + onlyGuilds.push(client.guilds.cache.get(id).name) + }) + if (command.returnOnlyGuilds == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`This command can only be ran in these guilds.\n•${onlyGuilds.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } diff --git a/Src/Structures/CommandOptions/OnlyUsers.js b/Src/Structures/CommandOptions/OnlyUsers.js new file mode 100644 index 0000000..a879820 --- /dev/null +++ b/Src/Structures/CommandOptions/OnlyUsers.js @@ -0,0 +1,25 @@ +module.exports = async function (client, message, command, Discord) { + if (!command.onlyUsers) return false; + if (command.onlyUsers.some(i => i == message.member.user.id)) return false; + else { + let onlyUsers = [] + command.onlyUsers.forEach(id => { + onlyUsers.push(`<@${id}>`) + }) + if (command.returnOnlyUsers == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`This command can only be ran by these people.\n• ${onlyUsers.join("\n• ")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true; + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/OwnerOnly.js b/Src/Structures/CommandOptions/OwnerOnly.js new file mode 100644 index 0000000..ed03ef2 --- /dev/null +++ b/Src/Structures/CommandOptions/OwnerOnly.js @@ -0,0 +1,22 @@ +const config = require("../../../Config") +module.exports = async function (message, command, Discord) { + if (!command.ownerOnly) return false; + if (config.developers.some(id => message.member.user.id == id)) return false + else { + if (command.returnOwnerOnly == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`This command is reserved for the developers of the bot.`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/RequiredAnyRole.js b/Src/Structures/CommandOptions/RequiredAnyRole.js new file mode 100644 index 0000000..f3b5a49 --- /dev/null +++ b/Src/Structures/CommandOptions/RequiredAnyRole.js @@ -0,0 +1,23 @@ +module.exports = async function (message, command, Discord) { + if (!command.requiredAnyRole) return false; + if (command.requiredAnyRole.some(i => message.member.roles.cache.has(i))) return false; + else { + let requiredRoles = [] + command.requiredAnyRole.forEach(i => requiredRoles.push(`<@&${i}>`)) + if (command.returnRequiredAnyRole == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`You are required to have any one of these roles to be able to run this command.\n•${requiredRoles.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true; + } + } diff --git a/Src/Structures/CommandOptions/RequiredRoles.js b/Src/Structures/CommandOptions/RequiredRoles.js new file mode 100644 index 0000000..409faa7 --- /dev/null +++ b/Src/Structures/CommandOptions/RequiredRoles.js @@ -0,0 +1,25 @@ +module.exports = async function (message, command, Discord) { + if (!command.requiredRoles) return false; + let missing = [] + command.requiredRoles.forEach(role => { + if (!message.member.roles.cache.has(role)) missing.push(`<@&${role}>`); + }) + if (missing.length == 0) return false; + else { + if (command.returnRequiredRoles == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`You are required to have these roles to be able to run this command.\n•${missing.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/UserPermissions.js b/Src/Structures/CommandOptions/UserPermissions.js new file mode 100644 index 0000000..fe34d42 --- /dev/null +++ b/Src/Structures/CommandOptions/UserPermissions.js @@ -0,0 +1,25 @@ +module.exports = async function (message, command, Discord) { + if (!command.userPermissions) return false; + let missing = [] + command.userPermissions.forEach(i => { + if (!message.member.permissions.has(i)) missing.push(i) + }) + if (missing.length == 0) return false + else { + if (command.returnUserPermissions == false || command.returnNoErrors) return true; + else message.reply({ + embeds: [new Discord.MessageEmbed() + .setAuthor({ + name: message.member.user.tag, + iconURL: message.member.user.displayAvatarURL({ dynamic: true }) + }) + .setColor("RANDOM") + .setTimestamp() + .setDescription(`You are required to have these permissions to be able to run this command.\n•${missing.join("\n•")}`)], + allowedMentions: { + repliedUser: false + } + }) + return true; + } + } \ No newline at end of file diff --git a/Src/Structures/CommandOptions/loadCommandOptions.js b/Src/Structures/CommandOptions/loadCommandOptions.js new file mode 100644 index 0000000..977addc --- /dev/null +++ b/Src/Structures/CommandOptions/loadCommandOptions.js @@ -0,0 +1,35 @@ +const Discord = require("discord.js") +const { path, config } = require("../../../bot") +module.exports = async function (client, message, command, isInteraction, interactionType) { + if (!command) return; + const container = { + RootPath: path, + Config: config, + Discord: Discord + } + if (await require("./Cooldown")(client, message, command, isInteraction, interactionType, Discord)) return; + else if (await require("./OwnerOnly")(message, command, Discord)) return; + else if (await require("./UserPermissions")(message, command, Discord)) return; + else if (await require("./ClientPermissions")(message, command, Discord)) return; + else if (await require("./AnyUserPermissions")(message, command, Discord)) return; + else if (await require("./AnyClientPermissions")(message, command, Discord)) return; + else if (await require("./RequiredAnyRole")(message, command, Discord)) return; + else if (await require("./RequiredRoles")(message, command, Discord)) return; + else if (await require("./OnlyChannels")(message, command, Discord)) return; + else if (await require("./OnlyGuilds")(client, message, command, Discord)) return; + else if (await require("./OnlyUsers")(client, message, command, Discord)) return; + else { + if (isInteraction) command.run(client, message, container) + else { + container.Config.prefix.forEach(prefix => { + if (!message.content.toLowerCase().startsWith(prefix)) return; + const cmdName = message.content.trim().toLowerCase().slice(prefix.length).trim().split(" ")[0] + const command = client.commands.messageCommands.get(cmdName) ?? client.commands.messageCommands.get(client.commands.messageCommands.aliases.get(cmdName)) + if (!command) return; + let args = message.content.slice(prefix.length).trim() + if (args.toLowerCase().startsWith(cmdName)) args = args.slice(cmdName.length).trim().split(" ") + command.run(client, message, args, container) + }) + } + } +} diff --git a/Src/Structures/Handlers/ButtonCommands.js b/Src/Structures/Handlers/ButtonCommands.js new file mode 100644 index 0000000..d1fde1a --- /dev/null +++ b/Src/Structures/Handlers/ButtonCommands.js @@ -0,0 +1,12 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +module.exports = async function(client, path) { + Filer(`${path}/Src/Commands/ButtonCommands`, async function(err, res) { + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const button = require(file) + if (button.ignoreFile) return; + client.commands.buttonCommands.set(button.name, button) + }) + }) +} \ No newline at end of file diff --git a/Src/Structures/Handlers/ContextMenus.js b/Src/Structures/Handlers/ContextMenus.js new file mode 100644 index 0000000..dda15a4 --- /dev/null +++ b/Src/Structures/Handlers/ContextMenus.js @@ -0,0 +1,55 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +module.exports = async function(client, path) { + Filer(`${path}/Src/Commands/ContextMenus`, async function(err, res) { + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const cmd = require(file); + if (cmd.ignoreFile) return; + client.commands.contextMenus.set(require(file).name, require(file)) + }) + let promise = Promise.resolve() + res.forEach(async function(file) { + promise = promise.then(async function() { + const interval = 5000; + if (fs.statSync(file).isDirectory()) return; + const cmd = require(file); + if (cmd.ignoreFile) return; + + if (cmd.guilds && Array.isArray(cmd.guilds)) cmd.guilds.forEach(guildID => { + (async () => { + const guild = client.guilds.cache.get(guildID) ?? await client.guilds.fetch(guildID) + const verifier = guild.commands.cache.find(x => x.name == cmd.name) + if (verifier) await guild.commands.edit(verifier.id, { + name: cmd.name, + options: cmd.options ?? [], + type: cmd.type + }) + else await guild.commands.create({ + name: cmd.name, + options: cmd.options ?? [], + type: cmd.type + }) + })() + }) + else { + const verifier = client.application.commands.cache.find(x => x.name == cmd.name) + if (verifier) await client.application.commands.edit(verifier.id, { + name: cmd.name, + options: cmd.options ?? [], + type: cmd.type + }) + else await client.application.commands.create({ + name: cmd.name, + options: cmd.options ?? [], + type: cmd.type + }) + } + + return new Promise(function(resolve) { + setTimeout(resolve, interval); + }) + }) + }) + }) +} \ No newline at end of file diff --git a/Src/Structures/Handlers/Events.js b/Src/Structures/Handlers/Events.js new file mode 100644 index 0000000..0236fe5 --- /dev/null +++ b/Src/Structures/Handlers/Events.js @@ -0,0 +1,23 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +const Discord = require("discord.js"); +const { path, config } = require("../../../bot") +module.exports = async function(client) { + const container = { + RootPath: path, + Config: config, + Discord: Discord + }; + Filer(`${container.RootPath}/Src/Events`, async function(err, res){ + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const event = require(file); + if (event.ignoreFile) return; + if (event.customEvent) event.run(client, container); + client.events.set(event.name, event); + + if (event.once) client.once(event.name, (...args) => event.run(...args, client, container)); + else client.on(event.name, (...args) => event.run(...args, client, container)); + }) + }) + } \ No newline at end of file diff --git a/Src/Structures/Handlers/Handler.js b/Src/Structures/Handlers/Handler.js new file mode 100644 index 0000000..0a76552 --- /dev/null +++ b/Src/Structures/Handlers/Handler.js @@ -0,0 +1,8 @@ +module.exports = { + loadMessageCommands: require("./MessageCommands"), + loadEvents: require("./Events"), + loadButtonCommands: require("./ButtonCommands"), + loadContextMenus: require("./ContextMenus"), + loadSelectMenus: require("./SelectMenus"), + loadSlashCommands: require("./SlashCommands") +} \ No newline at end of file diff --git a/Src/Structures/Handlers/MessageCommands.js b/Src/Structures/Handlers/MessageCommands.js new file mode 100644 index 0000000..b201a91 --- /dev/null +++ b/Src/Structures/Handlers/MessageCommands.js @@ -0,0 +1,13 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +module.exports = async function(client, path) { + Filer(`${path}/Src/Commands/MessageCommands`, async function(err, res) { + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const command = require(file) + if (command.ignoreFile) return; + client.commands.messageCommands.set(command.name.toLowerCase(), command) + if (command.aliases) command.aliases.forEach(alias => client.commands.messageCommands.aliases.set(alias.toLowerCase(), command.name.toLowerCase())) + }) + }) +} \ No newline at end of file diff --git a/Src/Structures/Handlers/SelectMenus.js b/Src/Structures/Handlers/SelectMenus.js new file mode 100644 index 0000000..1950c6b --- /dev/null +++ b/Src/Structures/Handlers/SelectMenus.js @@ -0,0 +1,12 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +module.exports = async function(client, path) { + Filer(`${path}/Src/Commands/SelectMenus`, async function(err, res) { + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const selectMenu = require(file) + if (selectMenu.ignoreFile) return; + client.commands.selectMenus.set(selectMenu.name, selectMenu) + }) + }) +} \ No newline at end of file diff --git a/Src/Structures/Handlers/SlashCommands.js b/Src/Structures/Handlers/SlashCommands.js new file mode 100644 index 0000000..16af534 --- /dev/null +++ b/Src/Structures/Handlers/SlashCommands.js @@ -0,0 +1,59 @@ +const fs = require("fs"); +const Filer = require("../../Utils/Filer"); +module.exports = async function(client, path) { + Filer(`${path}/Src/Commands/SlashCommands`, async function(err, res) { + res.forEach(file => { + if (fs.statSync(file).isDirectory()) return; + const cmd = require(file); + if (cmd.ignoreFile) return; + client.commands.slashCommands.set(require(file).name, require(file)) + }) + let promise = Promise.resolve() + res.forEach(async function(file) { + promise = promise.then(async function() { + const interval = 5000; + if (fs.statSync(file).isDirectory()) return; + const cmd = require(file); + if (cmd.ignoreFile) return; + + if (cmd.guilds && Array.isArray(cmd.guilds)) cmd.guilds.forEach(guildID => { + (async () => { + const guild = client.guilds.cache.get(guildID) ?? await client.guilds.fetch(guildID) + const verifier = guild.commands.cache.find(x => x.name == cmd.name) + if (verifier) await guild.commands.edit(verifier.id, { + name: cmd.name, + description: cmd.description ?? "None", + options: cmd.options ?? [], + type: cmd.type ?? "CHAT_INPUT" + }) + else await guild.commands.create({ + name: cmd.name, + description: cmd.description ?? "None", + options: cmd.options ?? [], + type: cmd.type ?? "CHAT_INPUT" + }) + })() + }) + else { + const verifier = client.application.commands.cache.find(x => x.name == cmd.name) + if (verifier) await client.application.commands.edit(verifier.id, { + name: cmd.name, + description: cmd.description ?? "None.", + options: cmd.options ?? [], + type: cmd.type ?? "CHAT_INPUT" + }) + else await client.application.commands.create({ + name: cmd.name, + description: cmd.description ?? "None.", + options: cmd.options ?? [], + type: cmd.type ?? "CHAT_INPUT" + }) + } + + return new Promise(function(resolve) { + setTimeout(resolve, interval); + }) + }) + }) + }) +} \ No newline at end of file diff --git a/Src/Utils/Filer.js b/Src/Utils/Filer.js new file mode 100644 index 0000000..f50c70d --- /dev/null +++ b/Src/Utils/Filer.js @@ -0,0 +1,4 @@ +const glob = require('glob') +module.exports = (src, callback) => { + glob(src + '/**/*', callback); +} \ No newline at end of file diff --git a/bot.js b/bot.js new file mode 100644 index 0000000..554b8b9 --- /dev/null +++ b/bot.js @@ -0,0 +1,39 @@ +(async () => { +const Discord = require("discord.js"); +const config = require("./Config"); +const path = __dirname; +const react = require("./Src/Functions/mongodb-reaction-role/index"); +const client = new Discord.Client({ + intents: 32767, + partials: ["MESSAGE", "CHANNEL", "GUILD_MEMBER", "REACTION", "MESSAGE", "USER"] +}); +exports.client = client; +exports.path = path; +exports.config = config; +client.commands = {}; +client.events = new Discord.Collection(); +client.commands.messageCommands = new Discord.Collection(); +client.commands.messageCommands.aliases = new Discord.Collection(); +client.commands.contextMenus = new Discord.Collection(); +client.commands.slashCommands = new Discord.Collection(); +client.commands.buttonCommands = new Discord.Collection(); +client.commands.selectMenus = new Discord.Collection(); + +// The maps of the reactions. uh idk what to call it + +client.react = new Map(); // do not rename here something, or else ded // save all msg id, role id +client.fetchforguild = new Map() +// end of that shit + +const Handler = require(`${path}/Src/Structures/Handlers/Handler`); +await Handler.loadMessageCommands(client, path); +await Handler.loadEvents(client); +await client.login(config.token); +await Handler.loadSlashCommands(client, path); +await Handler.loadContextMenus(client, path); +await Handler.loadButtonCommands(client, path); +await Handler.loadSelectMenus(client, path); + +react.setURL(config.mongo); + +})() \ No newline at end of file diff --git a/json.sqlite b/json.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..033ffb0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1976 @@ +{ + "name": "rr-bot", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "rr-bot", + "version": "1.0.0", + "dependencies": { + "chalk": "^4.1.2", + "child_process": "^1.0.2", + "cli-box": "^6.0.10", + "discord.js": "^13.6.0", + "fs": "^0.0.1-security", + "glob": "^7.2.0", + "mongoose": "^6.3.6", + "quick.db": "^7.1.3" + } + }, + "node_modules/@discordjs/builders": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", + "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "dependencies": { + "@sapphire/shapeshift": "^3.1.0", + "@sindresorhus/is": "^4.6.0", + "discord-api-types": "^0.33.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", + "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", + "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.1.0.tgz", + "integrity": "sha512-PkxFXd3QJ1qAPS05Dy2UkVGYPm/asF1Ugt2Xyzmv4DHzO3+G7l+873C4XFFcJ9M5Je+eCMC7SSifgPTSur5QuA==", + "engines": { + "node": ">=v15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@types/node": { + "version": "17.0.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz", + "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ansi-parser": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.10.tgz", + "integrity": "sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg==" + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/better-sqlite3": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.3.tgz", + "integrity": "sha512-tNIrDsThpWT8j1mg+svI1pqCYROqNOWMbB2qXVg+TJqH9UR5XnbAHyRsLZoJagldGTTqJPj/sUPVOkW0GRpYqw==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cli-box": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/cli-box/-/cli-box-6.0.10.tgz", + "integrity": "sha512-6jjSF6G1gOXaCyBQJKo3L3lZKxP8jzdECG7FBiA4m2w7K8jBxXXwsMb75fBLwoVwOtKwvgKjLJurw8HU5XNciw==", + "dependencies": { + "ansi-parser": "^3.2.1", + "deffy": "^2.2.1", + "is-undefined": "^1.0.0", + "is-win": "^1.0.0", + "ul": "^5.2.1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + }, + "node_modules/discord.js": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.0.tgz", + "integrity": "sha512-EPAA/2VLycYN5wSzavqa4iJ6qj3UtQFtHw5TH/60Fj29ymfEsCQVn//o1mTpwDxzwb+rPIrWhkxKIGGnjfv0Iw==", + "dependencies": { + "@discordjs/builders": "^0.14.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.3.1", + "@types/node-fetch": "^2.6.1", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.1", + "ws": "^8.7.0" + }, + "engines": { + "node": ">=16.6.0", + "npm": ">=7.0.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "dependencies": { + "noop6": "^1.0.1" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/is-undefined": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/is-undefined/-/is-undefined-1.0.11.tgz", + "integrity": "sha512-gRwyH8IRpV73MDlVefPllIjxBjrP9YAB0YCLtxnROhRkedTSzzBJgfxTC6HgP2/dttawQHWNZe88MvXS9Hbn/g==" + }, + "node_modules/is-win": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-win/-/is-win-1.0.10.tgz", + "integrity": "sha512-tJ9PPj5RW2RUaZ2lAIVRqQjMSynA44Ln89h+Ue+pOecoWIv6dLHvN6dtLxeCi/h5epPJPSVyuaNObLAMq62OEA==" + }, + "node_modules/kareem": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz", + "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/mongodb": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz", + "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==", + "dependencies": { + "bson": "^4.6.2", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.5.2", + "socks": "^2.6.2" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.6.tgz", + "integrity": "sha512-/Cixfo+bA32EHQ5Y7sxMj5ZOXFiAFlvA3X4mFruUET9OsbJZfstg4n2FzxovX8Q7EcoQ7Ry1bnOp9AeXtodF7w==", + "dependencies": { + "bson": "^4.6.2", + "kareem": "2.3.5", + "mongodb": "4.5.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/node-abi": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", + "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/quick.db": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/quick.db/-/quick.db-7.1.3.tgz", + "integrity": "sha512-0S1fVb9OAZGhkI4ZIc5Oe4yWMwhz20xSsziwd6+yGWKKMsPt+XOfj/gD5CesGxd2WdqBkZFBiP8ZqWDu55HLHA==", + "dependencies": { + "better-sqlite3": "^7.1.1", + "lodash": "^4.17.20" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sift": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", + "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-mixer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + }, + "dependencies": { + "@discordjs/builders": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", + "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "requires": { + "@sapphire/shapeshift": "^3.1.0", + "@sindresorhus/is": "^4.6.0", + "discord-api-types": "^0.33.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + } + }, + "@discordjs/collection": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", + "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" + }, + "@sapphire/async-queue": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", + "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==" + }, + "@sapphire/shapeshift": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.1.0.tgz", + "integrity": "sha512-PkxFXd3QJ1qAPS05Dy2UkVGYPm/asF1Ugt2Xyzmv4DHzO3+G7l+873C4XFFcJ9M5Je+eCMC7SSifgPTSur5QuA==" + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@types/node": { + "version": "17.0.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz", + "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ==" + }, + "@types/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } + }, + "@types/webidl-conversions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz", + "integrity": "sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==" + }, + "@types/whatwg-url": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.1.tgz", + "integrity": "sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "ansi-parser": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.10.tgz", + "integrity": "sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "better-sqlite3": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.5.3.tgz", + "integrity": "sha512-tNIrDsThpWT8j1mg+svI1pqCYROqNOWMbB2qXVg+TJqH9UR5XnbAHyRsLZoJagldGTTqJPj/sUPVOkW0GRpYqw==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bson": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.6.4.tgz", + "integrity": "sha512-TdQ3FzguAu5HKPPlr0kYQCyrYUYh8tFM+CMTpxjNzVzxeiJY00Rtuj3LXLHSgiGvmaWlZ8PE+4KyM2thqE38pQ==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==" + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "cli-box": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/cli-box/-/cli-box-6.0.10.tgz", + "integrity": "sha512-6jjSF6G1gOXaCyBQJKo3L3lZKxP8jzdECG7FBiA4m2w7K8jBxXXwsMb75fBLwoVwOtKwvgKjLJurw8HU5XNciw==", + "requires": { + "ansi-parser": "^3.2.1", + "deffy": "^2.2.1", + "is-undefined": "^1.0.0", + "is-win": "^1.0.0", + "ul": "^5.2.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "requires": { + "typpy": "^2.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "denque": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", + "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + }, + "discord.js": { + "version": "13.8.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.0.tgz", + "integrity": "sha512-EPAA/2VLycYN5wSzavqa4iJ6qj3UtQFtHw5TH/60Fj29ymfEsCQVn//o1mTpwDxzwb+rPIrWhkxKIGGnjfv0Iw==", + "requires": { + "@discordjs/builders": "^0.14.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.3.1", + "@types/node-fetch": "^2.6.1", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.1", + "ws": "^8.7.0" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "requires": { + "noop6": "^1.0.1" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "is-undefined": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/is-undefined/-/is-undefined-1.0.11.tgz", + "integrity": "sha512-gRwyH8IRpV73MDlVefPllIjxBjrP9YAB0YCLtxnROhRkedTSzzBJgfxTC6HgP2/dttawQHWNZe88MvXS9Hbn/g==" + }, + "is-win": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-win/-/is-win-1.0.10.tgz", + "integrity": "sha512-tJ9PPj5RW2RUaZ2lAIVRqQjMSynA44Ln89h+Ue+pOecoWIv6dLHvN6dtLxeCi/h5epPJPSVyuaNObLAMq62OEA==" + }, + "kareem": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.5.tgz", + "integrity": "sha512-qxCyQtp3ioawkiRNQr/v8xw9KIviMSSNmy+63Wubj7KmMn3g7noRXIZB4vPCAP+ETi2SR8eH6CvmlKZuGpoHOg==" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "mongodb": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.5.0.tgz", + "integrity": "sha512-A2l8MjEpKojnhbCM0MK3+UOGUSGvTNNSv7AkP1fsT7tkambrkkqN/5F2y+PhzsV0Nbv58u04TETpkaSEdI2zKA==", + "requires": { + "bson": "^4.6.2", + "denque": "^2.0.1", + "mongodb-connection-string-url": "^2.5.2", + "saslprep": "^1.0.3", + "socks": "^2.6.2" + } + }, + "mongodb-connection-string-url": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.2.tgz", + "integrity": "sha512-tWDyIG8cQlI5k3skB6ywaEA5F9f5OntrKKsT/Lteub2zgwSUlhqEN2inGgBTm8bpYJf8QYBdA/5naz65XDpczA==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "mongoose": { + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.3.6.tgz", + "integrity": "sha512-/Cixfo+bA32EHQ5Y7sxMj5ZOXFiAFlvA3X4mFruUET9OsbJZfstg4n2FzxovX8Q7EcoQ7Ry1bnOp9AeXtodF7w==", + "requires": { + "bson": "^4.6.2", + "kareem": "2.3.5", + "mongodb": "4.5.0", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.0" + } + }, + "mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + }, + "mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "requires": { + "debug": "4.x" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node-abi": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz", + "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==", + "requires": { + "semver": "^7.3.5" + } + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "quick.db": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/quick.db/-/quick.db-7.1.3.tgz", + "integrity": "sha512-0S1fVb9OAZGhkI4ZIc5Oe4yWMwhz20xSsziwd6+yGWKKMsPt+XOfj/gD5CesGxd2WdqBkZFBiP8ZqWDu55HLHA==", + "requires": { + "better-sqlite3": "^7.1.1", + "lodash": "^4.17.20" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "sift": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.0.tgz", + "integrity": "sha512-ILTjdP2Mv9V1kIxWMXeMTIRbOBrqKc4JAXmFMnFq3fKeyQ2Qwa3Dw1ubcye3vR+Y6ofA0b9gNDr/y2t6eUeIzQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-mixer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "requires": { + "function.name": "^1.0.3" + } + }, + "ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "requires": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..c0de948 --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "rr-bot", + "version": "1.0.0", + "description": "A reaction role bot in discord.js", + "main": "bot.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node bot.js" + }, + "author": "Josh S.", + "dependencies": { + "chalk": "^4.1.2", + "child_process": "^1.0.2", + "cli-box": "^6.0.10", + "discord.js": "^13.6.0", + "fs": "^0.0.1-security", + "glob": "^7.2.0", + "mongoose": "^6.3.6", + "quick.db": "^7.1.3" + } +}