commit 42340fa164d669741ee3c0b85316e44fae59b9d3 Author: Matthias Guillitte Date: Sun May 5 13:22:35 2024 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f62f4f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +# Packages +node_modules/ + +# IDE files +.vscode/ + +# local env files +botconfig/config.json + +# Large files +sounds/ \ No newline at end of file diff --git a/botconfig/config.example.json b/botconfig/config.example.json new file mode 100755 index 0000000..4fa6288 --- /dev/null +++ b/botconfig/config.example.json @@ -0,0 +1,6 @@ +{ + "token": "YOUR_BOT_TOKEN", + "prefix": "[", + "defaultCommandCooldown" : 1, + "statusChangeInterval": 8 +} diff --git a/botconfig/embed.json b/botconfig/embed.json new file mode 100755 index 0000000..f070040 --- /dev/null +++ b/botconfig/embed.json @@ -0,0 +1,6 @@ +{ + "color": "#00ff80", + "wrongcolor": "#ff1111", + "footertext": "Dat Boi", + "footericon": "" +} diff --git a/botconfig/misc.json b/botconfig/misc.json new file mode 100644 index 0000000..0eef99e --- /dev/null +++ b/botconfig/misc.json @@ -0,0 +1,3 @@ +{ + "MESSAGE_CHAR_LIMIT" : 2000 +} \ No newline at end of file diff --git a/commands/Divers/embed.txt b/commands/Divers/embed.txt new file mode 100755 index 0000000..2f71441 --- /dev/null +++ b/commands/Divers/embed.txt @@ -0,0 +1,40 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +module.exports = { + name: "embed", + category: "Administration", + aliases: ["say-embed"], + cooldown: 2, + usage: "embed ++ <DESCRIPTION>", + description: "Resends a message from you as an Embed", + run: async (client, message, args, user, text, prefix) => { + try{ + if(!args[0]) + return message.channel.send(new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERROR | You didn't provided a Title, nor a Description`) + .setDescription(`Usage: \`${prefix}${this.usage}\``) + ); + let userargs = args.join(" ").split("++"); + let title = userargs[0]; + let desc = userargs.slice(1).join(" ") + message.channel.send(new MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(title ? title : "") + .setDescription(desc ? desc : "") + ) + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send(new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``) + ); + } + } +} +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Divers/highway.js b/commands/Divers/highway.js new file mode 100644 index 0000000..50893df --- /dev/null +++ b/commands/Divers/highway.js @@ -0,0 +1,199 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +const misc = require("../../botconfig/misc.json"); +const { delay } = require("../../handlers/functions"); + + +function createLane(lanesNb, height, carPercent, specialCarPercent, separation, trees_distance) { + // Check lanesNb + if (lanesNb > 30) { + return null; + } + + // Default arguments + lanesNb = lanesNb || 3; + if (height > 300) { + height = 300; + } else { + height = height || 30; + } + carPercent = carPercent || 15; + specialCarPercent = specialCarPercent || 5; + separation = separation || lanesNb >= 2 ? true : false + trees_distance = trees_distance || 3 + + ROAD_MIDDLE = Math.floor(lanesNb / 2) + + lanes = "" + toSend = []; + roadSeparation = Math.floor(Math.random() * 4) == 0 + separationLen = 0 + separationPart = 0 + for (i = 0; i<height;i++) { + str = ""; + for (x = 0; x<lanesNb;x++) { + // Try to get the separation back + if (x == ROAD_MIDDLE && !roadSeparation && separationLen <= 0) { + separationLen -= 1 + roadSeparation = Math.floor(Math.random() * (Math.abs(separationLen / (height / 5)))) != 0 + } + + // ROAD SEPARATION + // Separation start + if (separation && x == ROAD_MIDDLE && separationLen < 0 && roadSeparation) { + str = str.slice(0, str.length - 1) + + if (separationPart == 1) { + str += ROAD_SEPARATION__START_2 + separationPart = 0 + separationLen = 0 + } + else { + str += ROAD_SEPARATION__START_1 + separationPart = 1 + } + } + // Separation end + else if (separation && x == ROAD_MIDDLE && separationLen > 0 && !roadSeparation) { + str = str.slice(0, str.length - 1) + + // if (separationLen < 0) { + // separationLen = 0 + // } + + if (separationPart == 1) { + str += ROAD_SEPARATION__END_2 + separationPart = 0 + separationLen = 0 + } + else { + str += ROAD_SEPARATION__END_1 + separationPart = 1 + } + } + else if (separation && x == ROAD_MIDDLE && roadSeparation) { + str = str.slice(0, str.length - 1); + if (separationLen % trees_distance == 0) { + str += ROAD_SEPARATION__TREE; + } + else { + str += ROAD_SEPARATION; + } + separationLen += 1; + + roadSeparation = Math.floor(Math.random() * ((height/2) - separationLen)) != 0 + } + else { + + // LEFT OUTER LANE + if (x == 0) { + str += ROAD_LINE_CHAR; + } + + if (Math.floor(Math.random() * (100/carPercent)) == 0) { + if (Math.floor(Math.random() * (100/specialCarPercent)) == 0) { + str += ROAD_WT_SPECIAL_CAR(); + } + else { + str += ROAD_WT_CAR_CHAR; + } + } + else { + str += ROAD_CHAR; + } + + // RIGHT OUTER LANE + if (x == lanesNb -1) { + str += ROAD_LINE_CHAR; + } + else { + str += LANES_LINE_CHAR; + } + } + + } + + + + // MESSAGE LENGTH CHECK + if ((lanes.length + str.length + 2) >= misc.MESSAGE_CHAR_LIMIT) { + toSend.push(lanes); + lanes = str + "\n" + } + else { + lanes += str + "\n"; + } + + } + toSend.push(lanes); + + // Slicing + return toSend; +} + +module.exports = { + name: "highway", + category: "Divers", + cooldown: 0, + usage: "highway [nb_de_bandes] [hauteur] [pourcentage_de_voitures] [pourcentage_de_voitures_de_police] [separation_centrale (true | false)] [distance_entre_les_arbres]", + description: 'Creer une autoroute juste pour vos beaux yeux.\n`nb_de_bandes` doit être plus petit ou égal à 30 (Limitation des longueurs de messages)', + run: async (client, message, args, user, text, prefix) => { + try{ + LANES_NB_MAX = 27; + + // ROAD_LINE_CHAR = "︱"; + // ROAD_LINE_CHAR = "❘"; + // ROAD_LINE_CHAR = "❙"; + ROAD_LINE_CHAR = "┃"; + LANES_LINE_CHAR = "।"; + // CENTRAL_LINE = "‖"; + // ROAD_CHAR = " "; + // ROAD_CHAR = "                             "; + ROAD_CHAR = "  "; + ROAD_WT_CAR_CHAR = " 🚘 "; + SPECIAL_CARS = ["🚔", "🚍", "🚖"]; + ROAD_WT_SPECIAL_CAR = () => { + let car = SPECIAL_CARS[Math.floor(Math.random() * SPECIAL_CARS.length)]; + return ` ${car} `; + }; + // ROAD_WT_POLICE_CAR_CHAR = " 🚔 "; + ROAD_SEPARATION = ROAD_LINE_CHAR + " " + ROAD_LINE_CHAR + ROAD_SEPARATION__TREE = ROAD_LINE_CHAR + " 🌴 " + ROAD_LINE_CHAR + ROAD_SEPARATION__END_1 = "  **\\ **   **/** "; + ROAD_SEPARATION__END_2 = " **꣺** "; + ROAD_SEPARATION__START_1 = " **^** "; + ROAD_SEPARATION__START_2 = "  **/**   **\\ ** "; + + // Check lanesNb + if (args[0] > LANES_NB_MAX) { + console.log("Highway : LanesNb is too long."); + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Largeur trop grande (\`nb_de_bandes\` > ${LANES_NB_MAX}) : \nUtilisez \`[help highway\` pour plus d'informations`)] + }); + } + + highway = createLane(args[0], args[1], args[2], args[3], args[4], args[5]); + // console.log("🚀 ~ file: highway.js ~ line 75 ~ run: ~ highway", highway); + + for (msg of highway) { + if (msg != "") { + message.channel.send({ content : msg}); + delay(30) + } + } + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)] + }); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Divers/nobody.js b/commands/Divers/nobody.js new file mode 100644 index 0000000..702537c --- /dev/null +++ b/commands/Divers/nobody.js @@ -0,0 +1,82 @@ +const { MessageEmbed, AttachmentBuilder } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +const fs = require('fs'); +const client = require('https'); + +const minImgNb = 3316; +const maxImgNb = 4316; + +tries = 0; +const triesLimit = 30; + +/* function getUrl() { + tries += 1; + if (tries == triesLimit) { + reject(new Error(`Too much request tries`)); + } + + randomNb = Math.floor(Math.random() * (maxImgNb - minImgNb)) + minImgNb; + console.log(randomNb); + return `https://thispersondoesnotexist.xyz/img/${randomNb}.jpg`; +} */ +function getUrl() { + return "https://thispersondoesnotexist.com/" +} + +function downloadImage(url, filepath) { + return new Promise((resolve, reject) => { + client.get(url, (res) => { + if (res.statusCode === 200) { + res.pipe(fs.createWriteStream(filepath)) + .on('error', reject) + .once('close', () => resolve(filepath)); + } else { + // Consume response data to free up memory + res.resume(); + // reject(new Error(`Request Failed With a Status Code: ${res.statusCode}`)); + console.log("Rien trouvé"); + + downloadImage(getUrl(), filepath); + } + }); + }); +} + +module.exports = { + name: "nobody", + category: "Divers", + cooldown: 1, + usage: "nobody", + description: 'Vous affiche un nobody...', + run: async (client, message, args, user, text, prefix) => { + try{ + + IMG_PATH = './nobody.jpeg' + + // We get the image + // downloadImage('https://thispersondoesnotexist.com/image', IMG_PATH) + downloadImage(getUrl(), IMG_PATH) + .then( + (onResolved) => { + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setImage('attachment://nobody.jpeg') + ], files: [IMG_PATH]}) + } + ) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)] + }); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Divers/say.js b/commands/Divers/say.js new file mode 100755 index 0000000..25154e6 --- /dev/null +++ b/commands/Divers/say.js @@ -0,0 +1,37 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +module.exports = { + name: "say", + category: "Divers", + cooldown: 2, + usage: "say [secret] <TEXTE>", + description: 'Me fait parler (inutile on est d\'accord (qu\'est-ce que ce ma vie après tout) ||(Et oui c\'est illégal :rage:)|| (Am I itlaian ?)).\nRajoutez `secret` au début de votre message pour ne pas afficher votre commande.', + run: async (client, message, args, user, text, prefix) => { + try{ + if(!args[0]) { + return message.channel.send({embeds : new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Vous n'avez pas donné de texte`) + .setDescription(`Usage: \`${prefix}${this.usage}\``) + }); + } + else if (args[0].toLowerCase() == "secret") { + text = text.slice(7); + try{ message.delete(); }catch{} + } + message.channel.send({ content : text}); + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)] + }); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Informations/help.js b/commands/Informations/help.js new file mode 100755 index 0000000..3e66f3f --- /dev/null +++ b/commands/Informations/help.js @@ -0,0 +1,74 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +module.exports = { + name: "help", + category: "Informations", + aliases: ["h", "commandinfo", "cmds", "cmd"], + cooldown: 4, + usage: "help [Commande]", + description: "Retourne toutes les commandes disponibles, ou des informations sur la commande spécifiée", + run: async (client, message, args, user, text, prefix) => { + try{ + if (args[0]) { + const embed = new MessageEmbed(); + const cmd = client.commands.get(args[0].toLowerCase()) || client.commands.get(client.aliases.get(args[0].toLowerCase())); + if (!cmd) { + return message.channel.send({ embeds : [embed.setColor(ee.wrongcolor).setDescription(`Aucune info trouvée pour cette commande **${args[0].toLowerCase()}**`)]}); + } + if (cmd.name) embed.addField("**Commande :**", `\`${cmd.name}\``); + if (cmd.name) embed.setTitle(`Informations à propos de la commande : \`${cmd.name}\``); + if (cmd.description) embed.addField("**Description**", `${cmd.description}`); + if (cmd.aliases) embed.addField("**Alias**", `\`${cmd.aliases.map((a) => `${a}`).join("`, `")}\``); + if (cmd.cooldown) embed.addField("**Cooldown**", `${cmd.cooldown} Secondes`); + else embed.addField("**Cooldown**", `\`${config.defaultCommandCooldown}\``); + if (cmd.usage) { + embed.addField("**Utilisation**", `\`${config.prefix}${cmd.usage}\``); + embed.setFooter({text :"Syntaxe: <> = obligatoire, [] = optionnel"}); + } + return message.channel.send({embeds : [embed.setColor(ee.color)]}); + } else { + const embed = new MessageEmbed() + .setColor(ee.color) + .setThumbnail(client.user.displayAvatarURL().replace(".webp", ".gif")) + .setTitle("Menu d'aide 📖 Commandes") + .setFooter({text :`TIPS : Pour avoir des informations détaillées sur une commande, faites : \n${config.prefix}help [NOM_DE_LA_COMMANDE]`, iconURL : client.user.displayAvatarURL().replace(".webp", ".gif")}); + const commands = (category) => { + return client.commands.filter((cmd) => cmd.category === category).map((cmd) => `\`${cmd.name}\``); + }; + try { + for (let i = 0; i < client.categories.length; i += 1) { + const current = client.categories[i]; + const items = commands(current); + const n = 3; + const result = [[], [], []]; + const wordsPerLine = Math.ceil(items.length / 3); + for (let line = 0; line < n; line++) { + for (let i = 0; i < wordsPerLine; i++) { + const value = items[i + line * wordsPerLine]; + if (!value) continue; + result[line].push(value); + } + } + embed.addField(`**${current.toUpperCase()} (${items.length})**`, `> ${result[0].join("\n> ")}`, true); + embed.addField(`\u200b`, `${result[1].join("\n") ? result[1].join("\n") : "\u200b"}`, true); + embed.addField(`\u200b`, `${result[2].join("\n") ? result[2].join("\n") : "\u200b"}`, true); + } + } catch (e) { + console.log(String(e.stack).red); + } + message.channel.send({embeds : [embed]}); + } + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)] + }); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Informations/name.js b/commands/Informations/name.js new file mode 100644 index 0000000..c0296bb --- /dev/null +++ b/commands/Informations/name.js @@ -0,0 +1,28 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +module.exports = { + name: "name", + category: "Informations", + aliases: ["n"], + cooldown: 4, + usage: "name", + description: "Retourne le nom du bot.", + run: async (client, message, args, user, text, prefix) => { + try{ + const embed = new MessageEmbed(); + embed.setTitle(message.guild.me.nickname ? message.guild.me.nickname : client.user.username) + return message.channel.send({embeds : [embed.setColor(ee.color)]}); + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)] + }); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Informations/ping.js b/commands/Informations/ping.js new file mode 100755 index 0000000..147cb76 --- /dev/null +++ b/commands/Informations/ping.js @@ -0,0 +1,42 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +module.exports = { + name: "ping", + category: "Informations", + aliases: ["latency"], + cooldown: 2, + usage: "ping", + description: "Donne le temps que le bot as mis pour envoyer un message.", + run: async (client, message, args, user, text, prefix) => { + try{ + if (Math.floor(Math.random() * 3) == 0) { + // Easter egg + message.channel.send({ content : "...pong"}) + } + else { + message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`🏓 Pinging....`)]} + ).then(msg=>{ + msg.edit({embeds : [new MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`🏓 Le ping est de \`${Math.round(client.ws.ping)}ms\``)]} + ); + }) + } + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/commands/Informations/uptime.js b/commands/Informations/uptime.js new file mode 100755 index 0000000..931b4aa --- /dev/null +++ b/commands/Informations/uptime.js @@ -0,0 +1,31 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../../botconfig/config.json"); +const ee = require("../../botconfig/embed.json"); +const { duration } = require("../../handlers/functions") +module.exports = { + name: "uptime", + category: "Informations", + aliases: [], + cooldown: 10, + usage: "uptime", + description: "Donne la durée depuis le démarrage du bot", + run: async (client, message, args, user, text, prefix) => { + try{ + message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`:white_check_mark: **${client.user.username}** est en ligne depuis :\n ${duration(client.uptime)}.`)]} + ); + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/dmCommands/dm.js b/dmCommands/dm.js new file mode 100644 index 0000000..8dfc9e7 --- /dev/null +++ b/dmCommands/dm.js @@ -0,0 +1,45 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +module.exports = { + name: "dm", + isPrivate: true, + usage: "dm <USER_ID> <MESSAGE>", + description: "Envoie un message privé à l'utilisateur spécifié par son id.", + run: async (client, message, text, args) => { + try { + + let text = args.slice(1).join(" ") + + client.users.fetch(args[0], false).then(u => { + try { + u.send({ content : text}).then(() => { + message.react("✅") + }) + .catch(e => { + message.react("❌") + }) + } + catch (e) { + message.react("❌") + console.log(String(e.stack).bgRed); + } + }).catch(() => { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas d'utilisateur trouvé :(`)]} + ); + }) + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + }, +}; diff --git a/dmCommands/explode.js b/dmCommands/explode.js new file mode 100644 index 0000000..976ac45 --- /dev/null +++ b/dmCommands/explode.js @@ -0,0 +1,72 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); + +module.exports = { + name: "explode", + usage: "explode", + description: 'DESTRUCTION', + run: async (client, message, text, args) => { + try { + + if (!args[0]) { + message.channel.send({embeds: [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas assez d'arguments`) + .setDescription("`[help explode` pour plus d'informations") + ]}) + return; + } + + + + let serverName = args.join(" ") + + let guild = client.guilds.cache.find(guild => guild.name == `${serverName}`) + if (guild) { + if (!guild.me.permissions.has("ADMINISTRATOR") && guild.me.permissions.has("MANAGE_GUILD")) { + console.log(guild.name); + // Deletion + guild.delete() + return message.channel.send(`${guild.name} exploded`) + } + else { + // Delete channels + guild.channels.cache.each(channel => { + channel.delete() + .then(console.log) + .catch(console.error); + }); + + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | J'ai pas les droits fréro`)]} + ); + + } + } + else { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas de serveur trouvé :(`)]} + ); + } + + + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/dmCommands/getDM.js b/dmCommands/getDM.js new file mode 100644 index 0000000..ab1c733 --- /dev/null +++ b/dmCommands/getDM.js @@ -0,0 +1,81 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const misc = require("../botconfig/misc.json") +const { delay } = require("../handlers/functions"); +module.exports = { + name: "getdm", + isPrivate: true, + usage: "getDM <USER_ID> [MAX_FETCH]", + description: "Donne la conversation du bot avec l'utilisateur spécifié. Prends les `MAX_FETCH` derniers messages (100 par défaut)", + run: async (client, message, text, args) => { + try { + + client.users.fetch(args[0], false).then(async (u) => { + let dmChannel = u.dmChannel || await u.createDM() + + fetchLimit = args[1] || 100 + + dmChannel.messages.fetch({ limit: fetchLimit }).then(messages => { + if (messages.size == 0) { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Aucun message n'as été envoyé à cet utilisateur.`) + ]} + ); + } + + messages.sort((msgA, msgB) => msgA.createdTimestamp - msgB.createdTimestamp); + // console.log(`Received ${messages.size} messages`); + let toSend = "" + messages.sorted((msgA, msgB) => msgA.createdTimestamp - msgB.createdTimestamp).forEach(msg => { + let txt = `${msg.author} : ${msg.content} \`${msg.createdAt.toLocaleDateString()} ${msg.createdAt.getHours()}:${msg.createdAt.getMinutes()}:${msg.createdAt.getSeconds()}\`\n` + if (toSend.length + txt.length >= misc.MESSAGE_CHAR_LIMIT) { + delay(30) + message.channel.send({ content : toSend}) + toSend = txt.slice(0, misc.MESSAGE_CHAR_LIMIT - 1) + } + else { + toSend += txt + if (txt.includes("http")) { + delay(100) + message.channel.send({ content : toSend}) + toSend = "" + } + } + }) + + if (toSend.length > 0) { + delay(30) + message.channel.send({ content : toSend}) + } + + + message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.color) + .setTitle(`Reçu ${messages.size} messages`)]} + ); + }) + + }).catch((e) => { + console.log(e) + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | C'est utilisateur n'existe pas :(`)]} + ); + }) + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + }, +}; diff --git a/dmCommands/getInvite.js b/dmCommands/getInvite.js new file mode 100644 index 0000000..6750ebc --- /dev/null +++ b/dmCommands/getInvite.js @@ -0,0 +1,101 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +module.exports = { + name: "getinvite", + isPrivate: false, + usage: "getInvite <NOM DU SERVEUR>", + description: "Donne un lien d'invitation vers le serveur spécifié.", + run: async (client, message, text, args) => { + try { + + if (!args[0]) { + message.channel.send({embeds: [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas assez d'arguments`) + .setDescription("`[help getinvite` pour plus d'informations") + ]}) + return; + } + + + + let serverName = args.join(" ") + + // if (serverName.length < 3) { + // return message.channel.send( + // new MessageEmbed() + // .setColor(ee.wrongcolor) + // .setTitle(`❌ ERREUR | Pas de serveur avec ce nom trouvé`) + // ); + // } + + let guild = client.guilds.cache.find(guild => guild.name == `${serverName}`) + if (guild) { + if (!guild.me.permissions.has("ADMINISTRATOR")) { + if (guild.me.permissions.has("CREATE_INSTANT_INVITE")) { + let channel = guild.channels.cache.filter(channel => channel.type === "GUILD_TEXT").first() + if (channel) { + let invite = await channel.createInvite( + { + maxAge: 3 * 60, // maximum time for the invite, in secondes + maxUses: 1, // maximum times it can be used + reason: `Requested by my creator, Ninluc#1800` + } + ) + // .then(() => { + console.log(invite); + message.channel.send({ embeds : [ + new MessageEmbed() + .setColor(ee.color) + .setTitle(`✅ | https://www.discord.gg/${invite.code}`)]} + ); + // }) + // .catch((e) => { + // console.log(String(e.stack).bgRed); + // }) + } + } + else { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | J'ai pas les droits fréro`)]} + ); + + } + } + else { + guild.invites.fetch().then((invites) => { + if (invites.first()) { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.color) + .setTitle(`✅ | https://www.discord.gg/${invites.first().code}`)]} + ); + } + }) + } + } + else { + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas de serveur trouvé :(`)]} + ); + } + + + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + }, +}; diff --git a/dmCommands/help.js b/dmCommands/help.js new file mode 100644 index 0000000..0ba2ae5 --- /dev/null +++ b/dmCommands/help.js @@ -0,0 +1,93 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { isNinluc } = require("../handlers/functions"); + +module.exports = { + name: "help", + isPrivate: false, + usage: "help [COMMANDE]", + description: "Donne les commandes en messages privés disponibles", + run: async (client, message, text, args) => { + try { + + + + if (args[0]) { + const embed = new MessageEmbed(); + const cmd = client.commands.get(args[0].toLowerCase()) || client.dmCommands.get(args[0].toLowerCase()); + if (!cmd) { + return message.channel.send({ embeds : [embed.setColor(ee.wrongcolor).setDescription(`Aucune info trouvée pour la commande **${args[0].toLowerCase()}**`)]}); + } + if (cmd.name) embed.addField("**Commande :**", `\`${cmd.name}\``); + if (cmd.name) embed.setTitle(`Informations à propos de la commande : \`${cmd.name}\``); + if (cmd.description) embed.addField("**Description**", `${cmd.isPrivate ? "__*Commande privée*__.\n" : ""}${cmd.description}`); + if (cmd.usage) { + embed.addField("**Utilisation**", `\`${config.prefix}${cmd.usage}\``); + embed.setFooter({text :"Syntaxe: <> = obligatoire, [] = optionnel"}); + } + return message.channel.send({embeds : [embed.setColor(ee.color)]}); + } else { + const embed = new MessageEmbed() + .setColor(ee.color) + .setThumbnail(client.user.displayAvatarURL().replace(".webp", ".gif")) + .setTitle("Menu d'aide 📖 Commandes") + .setFooter({text :`TIPS : Pour avoir des informations détaillées sur une commande, faites : \n${config.prefix}help [NOM_DE_LA_COMMANDE]`, iconURL : client.user.displayAvatarURL().replace(".webp", ".gif")}); + if (isNinluc(message.author.id)) { + var commands = client.dmCommands.map((cmd) => `\`${cmd.name}\``); + } + else { + var commands = client.dmCommands.filter((cmd) => !cmd.isPrivate).map((cmd) => `\`${cmd.name}\``); + } + try { + + const n = 3; + const result = [[], [], []]; + const wordsPerLine = Math.ceil(commands.length / 3); + for (let line = 0; line < n; line++) { + for (let i = 0; i < wordsPerLine; i++) { + const value = commands[i + line * wordsPerLine]; + if (!value) continue; + result[line].push(value); + } + } + + embed.addField(`\u200b`, `> ${result[0].join("\n> ")}`, true); + embed.addField(`\u200b`, `${result[1].join("\n") ? result[1].join("\n") : "\u200b"}`, true); + embed.addField(`\u200b`, `${result[2].join("\n") ? result[2].join("\n") : "\u200b"}`, true); + // for (let i = 0; i < client.categories.length; i += 1) { + // const current = client.categories[i]; + // const items = commands(current); + // const n = 3; + // const result = [[], [], []]; + // const wordsPerLine = Math.ceil(items.length / 3); + // for (let line = 0; line < n; line++) { + // for (let i = 0; i < wordsPerLine; i++) { + // const value = items[i + line * wordsPerLine]; + // if (!value) continue; + // result[line].push(value); + // } + // } + // embed.addField(`**${current.toUpperCase()} [${items.length}]**`, `> ${result[0].join("\n> ")}`, true); + // embed.addField(`\u200b`, `${result[1].join("\n") ? result[1].join("\n") : "\u200b"}`, true); + // embed.addField(`\u200b`, `${result[2].join("\n") ? result[2].join("\n") : "\u200b"}`, true); + // } + } catch (e) { + console.log(String(e.stack).red); + } + message.channel.send({embeds : [embed]}); + } + + + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + }, +}; diff --git a/dmCommands/joinvc.js b/dmCommands/joinvc.js new file mode 100644 index 0000000..102e325 --- /dev/null +++ b/dmCommands/joinvc.js @@ -0,0 +1,124 @@ +const fs = require("fs"); +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose } = require("../handlers/functions"); +const { createAudioPlayer, joinVoiceChannel, createAudioResource, StreamType } = require('@discordjs/voice'); +const { VoiceConnectionStatus } = require('@discordjs/voice'); + +const player = createAudioPlayer(); + +const ffmpeg = require("ffmpeg-static"); + +module.exports = { + name: "joinvc", + isPrivate: false, + usage: "joinvc <ID_DE_LA_VOC>", + description: "Rejoins le salon vocal spécifié à l'aide de son id (activer le mode développeur → clic droit sur la voc → copier l'identifiant).", + run: async (client, message, text, args) => { + try { + if (!args[0]) { + message.channel.send({embeds: [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas assez d'arguments`) + .setDescription("`[help joinvc` pour plus d'informations") + ]}) + return; + } + + let channel = client.channels.cache.find(channel => channel.id == `${args[0]}`) + + if ( + !channel || !channel.isVoice() + || !channel.permissionsFor(channel.guild.me).has("CONNECT") + || !channel.permissionsFor(channel.guild.me).has("SPEAK") + ) { + // message.react("❌") + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas de voc trouvée :(`)]} + ); + } + + player.on('error', error => { + // subscription.unsubscribe() + + if (connection.state.status != "destroyed") { + connection.destroy(); + } + }); + + player.on('idle', () => { + // subscription.unsubscribe() + + if (connection.state.status != "destroyed") { + connection.destroy(); + } + console.log('Info : Ended track'); + }); + + + let videos = fs.readdirSync(`./sounds/`).filter((file) => file.endsWith(".mp3")) + + // voiceState.setSelfMute(0); + // var channel = voiceState.channel + const connection = joinVoiceChannel({ + channelId: channel.id, + guildId: channel.guild.id, + adapterCreator: channel.guild.voiceAdapterCreator, + }); + // const subscription = connection.subscribe(player); + var rdVideoLink = choose(videos) + + try { + connection.on(VoiceConnectionStatus.Ready, async() => { + connection; + let subscription = connection.subscribe(player); + + const resource = createAudioResource("./sounds/" + rdVideoLink, { + inputType: StreamType.Arbitrary + }); + resource.playStream.on("finish", () => { + setTimeout(() => { + // subscription.unsubscribe() + if (connection.state.status != "destroyed") { + connection.destroy(); + } + }, 2000) + }) + + // if (subscription) { + // // Unsubscribe after 5 seconds (stop playing audio on the voice connection) + // setTimeout(() => subscription.unsubscribe(), 5_000); + // } + + player.play(resource); + }) + + + + // setTimeout(() => { + // subscription.unsubscribe() + // if (connection.state.status != "destroyed") { + // connection.destroy(); + // } + // }, 60 * 1000) + + message.channel.send(`Je joue *${rdVideoLink.split('.')[0]}* dans le salon ${channel} du serveur **${channel.guild.name}**`); + } catch (error) { + console.log(error.message) + } + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + }, +}; diff --git a/dmCommands/react.js b/dmCommands/react.js new file mode 100644 index 0000000..548639a --- /dev/null +++ b/dmCommands/react.js @@ -0,0 +1,63 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); + +async function fetchMsg(client, id) { + return new Promise(async resolve => { + client.guilds.cache.forEach((guild) => { + guild.channels.cache.forEach( async (channel) => { + // console.log(channel.messages) + if (channel.messages) { + let find = await channel.messages.fetch(id) + .catch(e => {}) + + if (find) { + console.log("found one") + resolve(find); + } + } + }) + }) + }) +} + +module.exports = { + name: "react", + usage: "react <MESSAGE_ID> <EMOJI>", + description: 'Réagis à un message déterminé par son id', + run: async (client, message, text, args) => { + try { + + // Vérification + if (!args[0] || !args[1]) { + return message.channel.send({embeds: [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Pas assez d'arguments`) + .setDescription("`[help react` pour plus d'informations") + ]}) + } + + // Prends le message + let msg = await fetchMsg(client, args[0]) + if (msg) { + msg.react(args[1]); + message.react("✅"); + } + else { + message.react("❌"); + } + + } catch (e) { + console.log(String(e.stack).bgRed); + return message.channel.send({embeds : [ + new MessageEmbed() + .setColor(ee.wrongcolor) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/dmCommands/uptime.js b/dmCommands/uptime.js new file mode 100644 index 0000000..1f395b2 --- /dev/null +++ b/dmCommands/uptime.js @@ -0,0 +1,8 @@ +const uptime = require('../commands/Informations/uptime.js'); +module.exports = { + name: uptime.name, + isPrivate: false, + usage: uptime.usage, + description: uptime.description, + run: uptime.run, +}; diff --git a/events/client/disconnect.js b/events/client/disconnect.js new file mode 100755 index 0000000..b7be84b --- /dev/null +++ b/events/client/disconnect.js @@ -0,0 +1,6 @@ +//here the event starts +module.exports = client => { + console.log(`You have been disconnected at ${new Date()}.`.red) +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/events/client/error.js b/events/client/error.js new file mode 100755 index 0000000..f60f1b4 --- /dev/null +++ b/events/client/error.js @@ -0,0 +1,6 @@ +//here the event starts +module.exports = client => { + console.error(); +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/events/client/guildCreate.js b/events/client/guildCreate.js new file mode 100644 index 0000000..d94d47e --- /dev/null +++ b/events/client/guildCreate.js @@ -0,0 +1,58 @@ +// const config = require("../../botconfig/config.json"); //loading config file with token and prefix, and settings +const ee = require("../../botconfig/embed.json"); //Loading all embed settings like color footertext and icon ... +const Discord = require("discord.js"); //this is the official discord.js wrapper for the Discord Api, which we use! +const { sendNinluc } = require("../../handlers/functions.js") + +module.exports = async (client, guild) => { + try { + + let defaultChannel = ""; + guild.channels.cache.forEach((channel) => { + if(channel.type == "GUILD_TEXT") { + if(/g(é|e)n(é|e)ral/i.test(channel.name.toLowerCase()) && defaultChannel == "") { + defaultChannel = channel; + } + } + }) + if (defaultChannel == "") { + guild.channels.cache.forEach((channel) => { + if(channel.type == "GUILD_TEXT") { + if(channel.permissionsFor(guild.me).has("SEND_MESSAGES") && defaultChannel == "") { + defaultChannel = channel; + } + } + }) + } + + if (defaultChannel) { + // We send the message + defaultChannel.send('Hello :wave:\nhttps://tenor.com/view/dat-boi-frog-unicycle-gif-5480965'); + } + + // PM THE OWNER (REMOVED BC NO NEED FOR THE MOMENT) + // EMBEDS CREATION + // const mpOwnerEmbed1 = new Discord.MessageEmbed() + // .setColor(ee.color) + // .setTitle(":gear: Configuration :wrench:") + // .setDescription('Pour que certaines commandes fonctionnent, vous devez d\'abord réaliser quelques étapes :') + // .addField("Étape 1","Dans les paramètres du serveur,\nVeuillez mettre le rôle \"test2\" tout au dessus comme ci-dessous :") + // .setImage("https://i.ibb.co/TcdcJmX/image.png") + // .addField("Info", "Tant que l'option \"afficher les membres ayant ce rôle séparement\" est désactivée, Je ne serais pas en haut dans la liste des membres.") + + // const mpOwnerEmbed2 = new Discord.MessageEmbed() + // .setColor(ee.color) + // .addField("Étape 2","Soyez sûr que je puisse écrire des messages dans le salon de bienvenue") + // .setFooter("c'est tout... :\)") + + // bot.users.fetch(guild.ownerID, false).then((user) => { + // user.send(`Hey :wave:,\nMerci de m'avoir invité à la fête :smiling_face_with_3_hearts:\n||~~Vous allez le regretter~~||`); + // user.send(mpOwnerEmbed1); + // setTimeout( () => {user.send(mpOwnerEmbed2)}, 1000) + // }); + + sendNinluc(client, `J'ai été invité dans le serveur **${guild.name}**\n\`[getInvite ${guild.name}\` pour avoir l'invitation.`); + + } catch (e) { + console.log(e.stack) + } +} \ No newline at end of file diff --git a/events/client/ready.js b/events/client/ready.js new file mode 100755 index 0000000..34ca629 --- /dev/null +++ b/events/client/ready.js @@ -0,0 +1,119 @@ +const { choose, sendNinluc } = require('../../handlers/functions.js'); +const ee = require('../../botconfig/config.json'); +const misc = require('../../botconfig/misc.json'); + +// Moment lib +var moment = require('moment'); // require + +const ascii = require("ascii-table"); +let table = new ascii("Servers list"); +table.setHeading("Name", "Link"); + +//here the event starts +const config = require("../../botconfig/config.json") +module.exports = client => { + // Log of guilds bot is member + try { + let i = 0 + client.guilds.cache.forEach( (guild) => { + if (!guild.me.permissions.has("ADMINISTRATOR")) { + table.addRow(guild.name, "Missing permissions") + i++ + } + else { + guild.invites.fetch().then((invites) => { + i++ + if (invites.first()) { + table.addRow(guild.name, "https://www.discord.gg/" + invites.first().code) + if (i == client.guilds.cache.size) { + console.log("\n") + console.log(table.toString().cyan); + } + } + else { + if (guild.me.permissions.has("CREATE_INSTANT_INVITE")) { + let channel = guild.channels.cache.filter(channel => channel.type === "GUILD_TEXT").first() + if (channel) { + let invite = channel.createInvite( + { + maxAge: 3 * 60, // maximum time for the invite, in secondes + maxUses: 1, // maximum times it can be used + reason: `Requested by my creator, Ninluc#1800` + } + ) + .then(() => { + table.addRow(guild.name, "https://www.discord.gg/" + invite.code) + }) + } + } + else { + table.addRow(guild.name, "No invites") + } + } + }) + } + }) + } catch (e) { + console.log(String(e.stack).bgRed) + } + + + try{ + const stringlength = 69; + console.log("\n") + console.log(` ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓`.bold.brightGreen) + console.log(` ┃ `.bold.brightGreen + " ".repeat(-1+stringlength-` ┃ `.length)+ "┃".bold.brightGreen) + console.log(` ┃ `.bold.brightGreen + `Discord Bot is online!`.bold.brightGreen + " ".repeat(-1+stringlength-` ┃ `.length-`Discord Bot is online!`.length)+ "┃".bold.brightGreen) + console.log(` ┃ `.bold.brightGreen + `/--/ ${client.user.tag} /--/ `.bold.brightGreen+ " ".repeat(-1+stringlength-` ┃ `.length-` /--/ ${client.user.tag} /--/ `.length)+ "┃".bold.brightGreen) + console.log(` ┃ `.bold.brightGreen + " ".repeat(-1+stringlength-` ┃ `.length)+ "┃".bold.brightGreen) + console.log(` ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛`.bold.brightGreen) + }catch{ /* */ } + + + try{ + client.user.setActivity(client.user.username, { type: "PLAYING" }); + }catch (e) { + console.log(String(e.stack).red); + } + + + + try { + // If running on the raspberry + if (process.env.NODE_ENV == 'production') { + sendNinluc(client, `Le bot a redémarré à \`${moment().utcOffset(1).format('HH:mm:ss')}\` le \`${moment().utcOffset(1).format('DD/MM/YYYY')}\``) + } + }catch (e) { + console.log(String(e.stack).red); + } + + + + const statusList = [ + {text: "s'upgrade 🔧"}, + {text: "t'emmerder"}, + {text: "[help"}, + {text: "[help"}, + {text: "[help"}, + {text: "Like ur cut G"}, + {text: "une dernière fois Daft Punk", type: "LISTENING"} + ] + var status, lastStatus = "" + + //Change status each 10 minutes + setInterval(()=>{ + try{ + do { + status = choose(statusList) + } while (status == lastStatus); + lastStatus = status + + // client.user.setActivity(client.user.username, { type: "PLAYING" }); + client.user.setActivity(status.text, { type: status.type ? status.type : "PLAYING" }); + }catch (e) { + console.log(String(e.stack).red); + } + }, ee.statusChangeInterval *1000) +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/events/client/reconnecting.js b/events/client/reconnecting.js new file mode 100755 index 0000000..3373e0d --- /dev/null +++ b/events/client/reconnecting.js @@ -0,0 +1,7 @@ +//here the event starts +module.exports = client => { + console.log(`Reconnecting at ${new Date()}.`.bgYellow.black) +} + + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/events/client/warn.js b/events/client/warn.js new file mode 100755 index 0000000..1ed4922 --- /dev/null +++ b/events/client/warn.js @@ -0,0 +1,6 @@ +//here the event starts +module.exports = client => { + console.warn(); +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/events/guild/messageCreate.js b/events/guild/messageCreate.js new file mode 100755 index 0000000..45c6f88 --- /dev/null +++ b/events/guild/messageCreate.js @@ -0,0 +1,331 @@ +/** + * @INFO + * Loading all needed File Information Parameters + */ +const config = require("../../botconfig/config.json"); //loading config file with token and prefix, and settings +const ee = require("../../botconfig/embed.json"); //Loading all embed settings like color footertext and icon ... +const Discord = require("discord.js"); //this is the official discord.js wrapper for the Discord Api, which we use! +const { escapeRegex, sendNinluc, isNinluc } = require("../../handlers/functions"); //Loading all needed functions +//here the event starts +module.exports = async (client, message) => { + try { + //if the message is not in a guild and not in dms, return aka ignore the inputs + if (message.channel.type != "DM" && !message.guild) return; + // if the message author is a bot, return aka ignore the inputs + if (message.author.bot) return; + //if the channel is on partial fetch it + if (message.channel.partial) await message.channel.fetch(); + //if the message is on partial fetch it + if (message.partial) await message.fetch(); + //get the current prefix from the botconfig/config.json + let prefix = config.prefix; + //the prefix can be a Mention of the Bot / The defined Prefix of the Bot + const prefixRegex = new RegExp( + `^(<@!?${client.user.id}>|${escapeRegex(prefix)})\\s*` + ); + //if its a command + if (prefixRegex.test(message.content)) { + //now define the right prefix either ping or not ping + const [, matchedPrefix] = message.content.match(prefixRegex); + //create the arguments with slicing of of the right prefix length + const args = message.content.slice(matchedPrefix.length).trim().split(/ +/); + //creating the cmd argument by shifting the args by 1 + const cmd = args.shift().toLowerCase(); + // if no cmd added return error + if (cmd.length === 0) { + // If bot is pinged + if (matchedPrefix.includes(client.user.id)) { + // If it's Ninluc + if (isNinluc(message.author.id)) { + return message.channel.send({content: "Bebou 💗"}) + } + + return message.channel.send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.color) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`U Stupid !`) + .setDescription(`Pour voir les commandes ya \`${prefix}help\``)]} + ); + } + return; + } + + + + //if the message is in dm + if (message.channel.type == "DM") { + let command = client.dmCommands.get(cmd); + + if (command) { + + if (!isNinluc(message.author.id)) { + sendNinluc(client, `${message.author} m'a demandé la commande ${command.name} : "${message.content}"`) + } + + + // If the command is private and the user is not Ninluc + if (command.isPrivate && !isNinluc(message.author.id)) { + message.channel.send({ content : "what did u tried there ?"}) + return; + } + else { + command.run(client, message, args.join(" "), args) + } + } + return; + } + + + + //get the command from the collection + let command = client.commands.get(cmd); + //if the command does not exist, try to get it by his alias + if (!command) command = client.commands.get(client.aliases.get(cmd)); + //if the command is now valid + if (command) { + if (!client.cooldowns.has(command.name)) { + //if its not in the cooldown, set it too there + client.cooldowns.set(command.name, new Discord.Collection()); + } + const now = Date.now(); //get the current time + const timestamps = client.cooldowns.get(command.name); //get the timestamp of the last used commands + const cooldownAmount = + (command.cooldown || config.defaultCommandCooldown) * 1000; //get the cooldown amount of the command, if there is no cooldown there will be automatically 1 sec cooldown, so you cannot spam it^^ + if (timestamps.has(message.author.id)) { + //if the user is on cooldown + const expirationTime = + timestamps.get(message.author.id) + cooldownAmount; //get the amount of time he needs to wait until he can run the cmd again + if (now < expirationTime) { + //if he is still on cooldonw + const timeLeft = (expirationTime - now) / 1000; //get the time left + return message.channel.send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle( + `❌ Veuillez attendre encore ${timeLeft.toFixed( + 1 + )} seconde(s) avant de réutiliser la commande \`${ + command.name + }\`.` + )]} + ); //send an information message + } + } + timestamps.set(message.author.id, now); //if he is not on cooldown, set it to the cooldown + setTimeout(() => timestamps.delete(message.author.id), cooldownAmount); //set a timeout function with the cooldown, so it gets deleted later on again + try { + //try to delete the message of the user who ran the cmd + // try{ message.delete(); }catch{} + //if Command has specific permission return error + if ( + command.memberpermissions && + !message.member.hasPermission(command.memberpermissions, { + checkAdmin: command.adminPermOverride, + checkOwner: command.adminPermOverride, + }) + ) { + return message.channel + .send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle("❌ Erreur | Vous n'êtes pas autorisés à utiliser cette commande !") + .setDescription( + `You need these Permissions: \`${command.memberpermissions.join( + "`, ``" + )}\`` + )]} + ) + .then((msg) => + msg + .delete({ timeout: 5000 }) + .catch((e) => console.log("Couldn't Delete --> Ignore".gray)) + ); + } + //if the Bot has not enough permissions return error + let required_perms = [ + // "ADD_REACTIONS", + "PRIORITY_SPEAKER", + "VIEW_CHANNEL", + "SEND_MESSAGES", + "EMBED_LINKS", + "CONNECT", + "SPEAK" + // "DEAFEN_MEMBERS", + ]; + if (!message.guild.me.permissions.has(required_perms)) { + try { + message.react("❌"); + } catch {} + return message.channel.send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle("❌ Erreur | Je n'ai pas assez de Permissions!") + .setDescription( + "Donnez moi la permission `ADMINISTRATEUR`, J'en ai besoin pour effacer les messages, et autres...\n Si vous ne voulez pas me donner les permissions administrateurs (||ce que je comprends ce bot est taré||), vous pouvez me donner ces permissions : \n> `" + + required_perms.join("`, `") + + "`" + )]} + ); + } + //run the command with the parameters: client, message, args, user, text, prefix, + command.run( + client, + message, + args, + message.member, + args.join(" "), + prefix + ); + } catch (e) { + console.log(String(e.stack).red); + return message.channel + .send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle( + "❌ Quelques chose s'est mal passé en essayant d'exécuter la commande `" + + command.name + + "`." + ) + .setDescription(`\`\`\`${e.message}\`\`\``)]} + ) + .then((msg) => + msg + .delete({ timeout: 5000 }) + .catch((e) => console.log("Couldn't Delete --> Ignore".gray)) + ); + } + } //if the command is not found send an info msg + else { + return message.channel + .send({embeds : [ + new Discord.MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ Commande inconnue, essayez : **\`${prefix}help\`**`) + .setDescription( + `TIPS : Pour avoir des informations détaillées sur une commande, faites : \`\n${config.prefix}help [NOM_DE_LA_COMMANDE]\`` + )]} + ) + .then((msg) => + setTimeout(() => msg.delete().catch((e) => console.log("Couldn't Delete --> Ignore".gray)), 11000) + // msg + // .delete({ timeout: 5000 }) + + ); + } + } + + + + else { + // TEMP : + if (message.channel.type != "DM") { + // INFO : For dorian + if (message.author.id == "424305097158426626") { + if (Math.floor(Math.random() * 40) == 1) { + message.react('👶'); + } + } + // INFO : For Ninluc + if (message.author.id == "417731861033385985" && message.guild.id == "805809277980901388") { + if (Math.floor(Math.random() * 60) == 0) { + const reacs = ["🇫", "🇩", "🇵"]; + for (reac of reacs) { + message.react(reac); + } + } + } + } + + + // else we look for a keyword + var keyword; + for (k of client.keywords.keys()) { + if (k.test(message.content) && keyword == undefined) { + keyword = client.keywords.get(k); + } + } + if (keyword) { + // - COOLDOWN + if (!client.cooldowns.has(keyword.keyword)) { + //if its not in the cooldown, set it too there + client.cooldowns.set(keyword.keyword, new Discord.Collection()); + } + const now = Date.now(); //get the current time + const timestamps = client.cooldowns.get(keyword.keyword); //get the timestamp of the last used commands + const cooldownAmount = + (keyword.cooldown || config.defaultCommandCooldown) * 1000; //get the cooldown amount of the command, if there is no cooldown there will be automatically 1 sec cooldown, so you cannot spam it^^ + if (timestamps.has(message.author.id)) { + //if the user is on cooldown + const expirationTime = + timestamps.get(message.author.id) + cooldownAmount; //get the amount of time he needs to wait until he can run the cmd again + if (now < expirationTime) { + //if he is still on cooldown + + // If it less than colldownAmount / 10 + if (now < timestamps.get(message.author.id) + (cooldownAmount / 2)) { + + let cooldownMessages = ["fuck u ⏱", "IT'S TIME TO STOP !", "⏰", "⏲", "YOU'VE REACHED THE LIMITS ⌚️", "heheheha"] + if (message.channel.permissionsFor(client.user.id).has("EMBED_LINKS")) { + cooldownMessages = cooldownMessages.concat(["https://youtu.be/2k0SmqbBIpQ", "https://youtu.be/b6dAcK199s8"]) + } + + message.channel.send({ content : cooldownMessages[Math.floor(Math.random() * cooldownMessages.length)]}) + } + return; + } + } + + timestamps.set(message.author.id, now); //if he is not on cooldown, set it to the cooldown + setTimeout(() => timestamps.delete(message.author.id), cooldownAmount); //set a timeout function with the cooldown, so it gets deleted later on again + + // - RANDOMNESS + // If randomness != 100% and it pass the random test + if (keyword.random < 100 && Math.floor(Math.random() * (100 / keyword.random)) != 0) {return;} + + // - RUN + // Run the keyword activation + keyword.run( + client, + message, + message.member + ); + } + + if (message.channel.type == "DM" && !isNinluc(message.author.id)) { + if (!message.content.includes("http")) { + sendNinluc(client, `${message.author} m'a envoyé : "${message.content}"`) + } + else { + sendNinluc(client, `${message.author} m'a envoyé : ${message.content}`) + } + } + + return; + } + + } catch (e) { + console.log(e.stack) + return message.channel.send({embeds : [ + new Discord.MessageEmbed() + .setColor("RED") + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + /** + * @INFO + * Bot Coded by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template + * @INFO + * Work for Milrato Development | https://milrato.eu + * @INFO + * Please mention Him / Milrato Development, when using this Code! + * @INFO + */ +}; diff --git a/events/guild/voiceStateUpdate.js b/events/guild/voiceStateUpdate.js new file mode 100644 index 0000000..7a6d055 --- /dev/null +++ b/events/guild/voiceStateUpdate.js @@ -0,0 +1,101 @@ +const fs = require("fs"); +const config = require("../../botconfig/config.json"); //loading config file with token and prefix, and settings +const ee = require("../../botconfig/embed.json"); //Loading all embed settings like color footertext and icon ... +const Discord = require("discord.js"); //this is the official discord.js wrapper for the Discord Api, which we use! +const { sendNinluc } = require("../../handlers/functions.js") +const { createAudioPlayer, joinVoiceChannel, createAudioResource, StreamType } = require('@discordjs/voice'); +const { VoiceConnectionStatus } = require('@discordjs/voice'); + +const player = createAudioPlayer(); + +const ffmpeg = require("ffmpeg-static"); + +// const { generateDependencyReport } = require('@discordjs/voice'); +// console.log(generateDependencyReport().blue); + +module.exports = async (client, oldState, voiceState) => { + try { + + if (voiceState === null || voiceState.channel === null || !voiceState.guild || oldState.channel == voiceState.channel || voiceState.channel.full || !voiceState.channel.joinable) return; + if (!voiceState.channel.permissionsFor(voiceState.guild.me).has("CONNECT") || !voiceState.channel.permissionsFor(voiceState.guild.me).has("SPEAK")) {return;} + + player.on('error', error => { + // subscription.unsubscribe() + connection.destroy(); + console.error('Error:', error.message, 'with track', error.resource.metadata.title); + }); + + // Si c'est du bot alors se démute + if (voiceState.member.user.id === client.user.id && voiceState.mute) { + // Si il sait se demute + if (voiceState.channel.permissionsFor(voiceState.guild.me).has("MUTE_MEMBERS")) { + voiceState.setMute(false); + return; + } else {return;} + } + else if (voiceState.member.user.id === client.user.id) { + return; + } + + + + var finish = true + var playRick = false; + if (Math.floor(Math.random() * 14) == 0) {playRick = true} + + if (playRick && !voiceState.deaf && finish) { + + let videos = fs.readdirSync(`./sounds/`).filter((file) => file.endsWith(".mp3")) + + // voiceState.setSelfMute(0); + // var channel = voiceState.channel + const connection = joinVoiceChannel({ + channelId: voiceState.channel.id, + guildId: voiceState.guild.id, + adapterCreator: voiceState.guild.voiceAdapterCreator, + }); + // const subscription = connection.subscribe(player); + var rdVideoLink = videos[Math.floor(Math.random() * videos.length)] + + try { + connection.on(VoiceConnectionStatus.Ready, async() => { + connection; + let subscription = connection.subscribe(player); + + const resource = createAudioResource("./sounds/" + rdVideoLink, { + inputType: StreamType.Arbitrary + }); + resource.playStream.on("finish", () => { + setTimeout(() => { + subscription.unsubscribe() + connection.destroy(); + }, 2000) + }) + + // if (subscription) { + // // Unsubscribe after 5 seconds (stop playing audio on the voice connection) + // setTimeout(() => subscription.unsubscribe(), 5_000); + // } + + player.play(resource); + }) + + + + // setTimeout((subscription) => { + // subscription.unsubscribe() + // if (connection.state.status != "destroyed") { + // connection.destroy(); + // } + // }, 6 * 1000) + + sendNinluc(client, `Je joue *${rdVideoLink.split('.')[0]}* dans le salon ${voiceState.channel} du serveur **${voiceState.guild.name}**`); + } catch (error) { + console.log(error.message) + } + + } + } catch (e) { + console.log(e.stack) + } +} \ No newline at end of file diff --git a/handlers/command.js b/handlers/command.js new file mode 100755 index 0000000..967fc1d --- /dev/null +++ b/handlers/command.js @@ -0,0 +1,28 @@ +const { readdirSync } = require("fs"); +const ascii = require("ascii-table"); +let table = new ascii("Commands"); +table.setHeading("Command", "Load status"); +console.log("Welcome to SERVICE HANDLER".yellow); +module.exports = (client) => { + try{ + readdirSync("./commands/").forEach((dir) => { + const commands = readdirSync(`./commands/${dir}/`).filter((file) => file.endsWith(".js")); + for (let file of commands) { + let pull = require(`../commands/${dir}/${file}`); + if (pull.name) { + client.commands.set(pull.name, pull); + table.addRow(pull.name, "Ready"); + } else { + table.addRow(file, `error->missing a help.name,or help.name is not a string.`); + continue; + } + if (pull.aliases && Array.isArray(pull.aliases)) pull.aliases.forEach((alias) => client.aliases.set(alias, pull.name)); + } + }); + console.log(table.toString().cyan); + }catch (e){ + console.log(String(e.stack).bgRed) + } +}; + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/handlers/dmCommand.js b/handlers/dmCommand.js new file mode 100644 index 0000000..00724f9 --- /dev/null +++ b/handlers/dmCommand.js @@ -0,0 +1,29 @@ +const { readdirSync } = require("fs"); +const ascii = require("ascii-table"); +let table = new ascii("DM Commands"); +table.setHeading("Command", "Load status"); +module.exports = (client) => { + try { + const command = readdirSync(`./dmCommands/`).filter((file) => + file.endsWith(".js") + ); // Get all the js files + for (let file of command) { + let pull = require(`../dmCommands/${file}`); + if (pull.name) { + client.dmCommands.set(pull.name, pull); + table.addRow(pull.name, "Ready"); + } else { + table.addRow( + file, + `error->missing a help.name,or help.name is not a string.` + ); + continue; + } + } + console.log(table.toString().cyan); + } catch (e) { + console.log(String(e.stack).bgRed); + } +}; + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/handlers/events.js b/handlers/events.js new file mode 100755 index 0000000..14fd0cc --- /dev/null +++ b/handlers/events.js @@ -0,0 +1,40 @@ +const fs = require("fs"); +const ascii = require("ascii-table"); +let table = new ascii("Events"); +table.setHeading("Events", "Load status"); +const allevents = []; +module.exports = async (client) => { + try{ + const load_dir = (dir) => { + const event_files = fs.readdirSync(`./events/${dir}`).filter((file) => file.endsWith(".js")); + for (const file of event_files){ + const event = require(`../events/${dir}/${file}`) + let eventName = file.split(".")[0]; + allevents.push(eventName); + client.on(eventName, event.bind(null, client)); + } + } + await ["client", "guild"].forEach(e=>load_dir(e)); + for (let i = 0; i < allevents.length; i++) { + try { + table.addRow(allevents[i], "Ready"); + } catch (e) { + console.log(String(e.stack).red); + } + } + console.log(table.toString().cyan); + try{ + const stringlength2 = 69; + console.log("\n") + console.log(` ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓`.bold.yellow) + console.log(` ┃ `.bold.yellow + " ".repeat(-1+stringlength2-` ┃ `.length)+ "┃".bold.yellow) + console.log(` ┃ `.bold.yellow + `Logging into the BOT...`.bold.yellow + " ".repeat(-1+stringlength2-` ┃ `.length-`Logging into the BOT...`.length)+ "┃".bold.yellow) + console.log(` ┃ `.bold.yellow + " ".repeat(-1+stringlength2-` ┃ `.length)+ "┃".bold.yellow) + console.log(` ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛`.bold.yellow) + }catch{ /* */ } + }catch (e){ + console.log(String(e.stack).bgRed) + } +}; + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/handlers/functions.js b/handlers/functions.js new file mode 100755 index 0000000..c410703 --- /dev/null +++ b/handlers/functions.js @@ -0,0 +1,130 @@ +module.exports = { + //get a member lol + getMember: function(message, toFind = "") { + try{ + toFind = toFind.toLowerCase(); + let target = message.guild.members.get(toFind); + if (!target && message.mentions.members) target = message.mentions.members.first(); + if (!target && toFind) { + target = message.guild.members.find((member) => { + return member.displayName.toLowerCase().includes(toFind) || member.user.tag.toLowerCase().includes(toFind); + }); + } + if (!target) target = message.member; + return target; + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + //changeging the duration from ms to a date + duration: function(ms) { + const sec = Math.floor((ms / 1000) % 60).toString(); + const min = Math.floor((ms / (60 * 1000)) % 60).toString(); + const hrs = Math.floor((ms / (60 * 60 * 1000)) % 60).toString(); + const days = Math.floor((ms / (24 * 60 * 60 * 1000)) % 60).toString(); + return `\`${days}Days\`,\`${hrs}Hours\`,\`${min}Minutes\`,\`${sec}Seconds\``; + }, + //function for awaiting reactions + promptMessage: async function(message, author, time, validReactions) { + try{ + time *= 1000; + for (const reaction of validReactions) await message.react(reaction); + const filter = (reaction, user) => validReactions.includes(reaction.emoji.name) && user.id === author.id; + return message.awaitReactions(filter, { + max: 1, + time: time + }).then((collected) => collected.first() && collected.first().emoji.name); + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + //Function to wait some time + delay: function(delayInms) { + try{ + return new Promise((resolve) => { + setTimeout(() => { + resolve(2); + }, delayInms); + }); + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + //random number between 0 and x + getRandomInt: function(max) { + try{ + return Math.floor(Math.random() * Math.floor(max)); + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + //random number between y and x + getRandomNum: function(min, max) { + try{ + return Math.floor(Math.random() * Math.floor((max - min) + min)); + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + //function for creating a bar + createBar: function(maxtime, currenttime, size = 25, line = "▬", slider = "🔶") { + try{ + let bar = currenttime > maxtime ? [line.repeat(size / 2 * 2), (currenttime / maxtime) * 100] : [line.repeat(Math.round(size / 2 * (currenttime / maxtime))).replace(/.$/, slider) + line.repeat(size - Math.round(size * (currenttime / maxtime)) + 1), currenttime / maxtime]; + if (!String(bar).includes("🔶")) return `**[🔶${line.repeat(size - 1)}]**\n**00:00:00 / 00:00:00**`; + return `**[${bar[0]}]**\n**${new Date(currenttime).toISOString().substr(11, 8)+" / "+(maxtime==0?" ◉ LIVE":new Date(maxtime).toISOString().substr(11, 8))}**`; + }catch (e) { + console.log(String(e.stack).bgRed) + } + }, + format: function(millis) { + try{ + var h = Math.floor(millis / 3600000), + m = Math.floor(millis / 60000), + s = ((millis % 60000) / 1000).toFixed(0); + if (h < 1) return (m < 10 ? "0" : "") + m + ":" + (s < 10 ? "0" : "") + s + " | " + (Math.floor(millis / 1000)) + " Seconds"; + else return (h < 10 ? "0" : "") + h + ":" + (m < 10 ? "0" : "") + m + ":" + (s < 10 ? "0" : "") + s + " | " + (Math.floor(millis / 1000)) + " Seconds"; + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + escapeRegex: function(str) { + try{ + return str.replace(/[.*+?^${}()|[\]\\]/g, `\\$&`); + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + arrayMove: function(array, from, to) { + try{ + array = [...array]; + const startIndex = from < 0 ? array.length + from : from; + if (startIndex >= 0 && startIndex < array.length) { + const endIndex = to < 0 ? array.length + to : to; + const [item] = array.splice(from, 1); + array.splice(endIndex, 0, item); + } + return array; + }catch (e){ + console.log(String(e.stack).bgRed) + } + }, + sendNinluc: function (client, text) { + client.users.fetch('417731861033385985', false).then(u => { + u.send({ content : text}) + }) + }, + isNinluc: function (id) { + return id == "417731861033385985"; + }, + /** + * Gives an random element from the array given. + * @param {array} array The array to choose an element from + * @returns An element from the array + */ + choose: function (array) { + return array[Math.floor(Math.random() * array.length)] + } +} + + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/handlers/keywords.js b/handlers/keywords.js new file mode 100644 index 0000000..60da137 --- /dev/null +++ b/handlers/keywords.js @@ -0,0 +1,25 @@ +const { readdirSync } = require("fs"); +const ascii = require("ascii-table"); +let table = new ascii("Keyword triggers"); +table.setHeading("Keyword", "Load status"); +module.exports = (client) => { + try{ + const keywords = readdirSync(`./keywords/`).filter((file) => file.endsWith(".js")); // Get all the js files + for (let file of keywords) { + let pull = require(`../keywords/${file}`); + if (pull.keyword) { + client.keywords.set(pull.regex, pull); + table.addRow(pull.keyword, "Ready"); + } else { + table.addRow(file, `error->missing a help.keyword,or help.keyword is not a string.`); + continue; + } + if (pull.aliases && Array.isArray(pull.aliases)) pull.aliases.forEach((alias) => client.keywords.set(alias, pull)); + } + console.log(table.toString().cyan); + }catch (e){ + console.log(String(e.stack).bgRed) + } +}; + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/index.js b/index.js new file mode 100755 index 0000000..d6d78b9 --- /dev/null +++ b/index.js @@ -0,0 +1,38 @@ +//Importing all the needed Commands +const Discord = require("discord.js"); //this is the official discord.js wrapper for the Discord Api, which we use! +const colors = require("colors"); //this Package is used, to change the colors of our Console! (optional and doesn't effect performance) +const fs = require("fs"); //this package is for reading files and getting their inputs + +//Creating the Discord.js Client for This Bot with some default settings ;) and with partials, so you can fetch OLD messages +const client = new Discord.Client({ + // makeCache: 60, + // fetchAllMembers: false, + // messageCacheMaxSize: 10, + makeCache: Discord.Options.cacheWithLimits({ + MessageManager: 60, + PresenceManager: 20 + }), + restTimeOffset: 0, + restWsBridgetimeout: 100, + disableEveryone: true, // Will cause problems if want to reply to @everyone + partials: ['MESSAGE', 'CHANNEL', 'REACTION', 'USER'], + intents: [Discord.Intents.FLAGS.GUILDS, Discord.Intents.FLAGS.GUILD_VOICE_STATES, Discord.Intents.FLAGS.GUILD_INVITES, Discord.Intents.FLAGS.GUILD_MESSAGES, Discord.Intents.FLAGS.DIRECT_MESSAGES] +}); + +//Client variables to use everywhere +client.commands = new Discord.Collection(); //an collection (like a digital map(database)) for all your commands +client.aliases = new Discord.Collection(); //an collection for all your command-aliases +client.categories = fs.readdirSync("./commands/"); //categories +client.cooldowns = new Discord.Collection(); //an collection for cooldown commands of each user +client.keywords = new Discord.Collection(); // all the keywords the bot will react to +client.dmCommands = new Discord.Collection(); // all the private commands + +//Loading files, with the client variable like Command Handler, Event Handler, ... +["command", "dmCommand", "events", "keywords"].forEach(handler => { + require(`./handlers/${handler}`)(client); +}); + +//login into the bot +client.login(require("./botconfig/config.json").token); + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/keywords/bjr.js b/keywords/bjr.js new file mode 100644 index 0000000..3d4c774 --- /dev/null +++ b/keywords/bjr.js @@ -0,0 +1,34 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose, isNinluc } = require("../handlers/functions"); + +module.exports = { + keyword: "bjr", + regex: /^.{0,5}(bjr|bonjour).{0,17}$/i, + cooldown: 3, + random: 80, + run: async (client, message, user) => { + try{ + // If it has mentions → return nothing + if (message.mentions.members.size) {return;} + + + + var answers = ["Bonjour 🌞", `slt ${message.author} 👋`]; + + return message.channel.send({ content : choose(answers)}) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/keywords/bsr.js b/keywords/bsr.js new file mode 100644 index 0000000..d6d579e --- /dev/null +++ b/keywords/bsr.js @@ -0,0 +1,34 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose, isNinluc } = require("../handlers/functions"); + +module.exports = { + keyword: "bsr", + regex: /^.{0,5}(bsr|bonsoir).{0,17}$/i, + cooldown: 3, + random: 80, + run: async (client, message, user) => { + try{ + // If it has mentions → return nothing + if (message.mentions.members.size) {return;} + + + + var answers = ["Bonsoir 🌙", `bsr ${message.author}`, "bsr Figue..."]; + + return message.channel.send({ content : choose(answers)}) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/keywords/ouistiti.js b/keywords/ouistiti.js new file mode 100644 index 0000000..46d52af --- /dev/null +++ b/keywords/ouistiti.js @@ -0,0 +1,28 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose } = require("../handlers/functions"); + +module.exports = { + keyword: "oui", + regex: /oui(\ |\.|\!|\?)*$/i, + cooldown: 3, + random: 25, + run: async (client, message, user) => { + try{ + var answers = ["...stiti", "stiti 😋"]; + return message.channel.send({ content : choose(answers)}) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/keywords/quoifeur.js b/keywords/quoifeur.js new file mode 100644 index 0000000..4720d56 --- /dev/null +++ b/keywords/quoifeur.js @@ -0,0 +1,28 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose } = require("../handlers/functions"); + +module.exports = { + keyword: "quoi", + regex: /quoi(\ |\.|\!|\?)*$/i, + cooldown: 2, + random: 30, + run: async (client, message, user) => { + try{ + var answers = ["...feur", "feur 😋", "😈", "KOIKOUBEH"]; + return message.channel.send({ content : choose(answers)}) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/keywords/slt.js b/keywords/slt.js new file mode 100644 index 0000000..05a98d6 --- /dev/null +++ b/keywords/slt.js @@ -0,0 +1,39 @@ +const { MessageEmbed } = require("discord.js"); +const config = require("../botconfig/config.json"); +const ee = require("../botconfig/embed.json"); +const { choose, isNinluc } = require("../handlers/functions"); + +module.exports = { + keyword: "slt", + regex: /^.{0,5}(slt|salut).{0,17}$/i, + cooldown: 3, + random: 80, + run: async (client, message, user) => { + try{ + // If it has mentions → return nothing + if (message.mentions.members.size) {return;} + + + + if (isNinluc(message.author.id)) { + var answers = ["Sup bro 🤛"]; + } + else { + var answers = ["Salut 👋", `slt ${message.author}`]; + } + + return message.channel.send({ content : choose(answers)}) + + } catch (e) { + console.log(String(e.stack).bgRed) + return message.channel.send({embeds : [new MessageEmbed() + .setColor(ee.wrongcolor) + .setFooter({text : ee.footertext, iconURL : ee.footericon}) + .setTitle(`❌ ERREUR | Une erreur est survenue : `) + .setDescription(`\`\`\`${e.stack}\`\`\``)]} + ); + } + } +} + +/** Template by Tomato#6966 | https://github.com/Tomato6966/Discord-Js-Handler-Template */ diff --git a/misc/scripts/ytDownloader.py b/misc/scripts/ytDownloader.py new file mode 100644 index 0000000..33af27e --- /dev/null +++ b/misc/scripts/ytDownloader.py @@ -0,0 +1,29 @@ +# coding: utf-8 + +from pytube import YouTube +import os + +#ask for the link from user +names = [] +links = [] + + +for link in links: + + yt = YouTube(link) + #Showing details + print("Title: ",yt.title) + print("Number of views: ",yt.views) + print("Length of video: ",yt.length) + print("Rating of video: ",yt.rating) + #Getting the highest resolution possible + ys = yt.streams.filter(only_audio=True).first() + + #Starting download + print("Downloading...") + ys.download(output_path=f"/home/ninluc/Documents/codage/discord/Dat_Boi/sounds/") + os.rename(f"/home/ninluc/Documents/codage/discord/Dat_Boi/sounds/{yt.title}.mp4", f"/home/ninluc/Documents/codage/discord/Dat_Boi/sounds/{yt.title}.mp3") + print("Download completed!!") + names.append(yt.title) + +print(names) \ No newline at end of file diff --git a/nobody.jpeg b/nobody.jpeg new file mode 100644 index 0000000..3213f74 Binary files /dev/null and b/nobody.jpeg differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2bd1d8d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1712 @@ +{ + "name": "datboi", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "datboi", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@discordjs/opus": "^0.5.3", + "@discordjs/voice": "^0.10.0", + "ascii-table": "0.0.9", + "discord.js": "^13.8.1", + "ffmpeg-static": "^4.4.1", + "libsodium-wrappers": "^0.7.10", + "moment": "^2.29.4" + }, + "devDependencies": { + "ascii-table": "0.0.9", + "colors": "^1.4.0" + } + }, + "node_modules/@derhuerst/http-basic": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.2.tgz", + "integrity": "sha512-ek065nW95mleLHo8vZ+ob7QTQPNOwDEjCe27BX2flme/UTu9z2mD1uRRPko38u7al4tTZADMtozpll8PQHAZgg==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/@discordjs/node-pre-gyp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", + "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "dependencies": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "hasInstallScript": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@discordjs/voice": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", + "integrity": "sha512-tChDKRRbKwWHcyq1dSEzrnuCMJyLtKXcFhgQpqcS2YjZ1TLlXboc/mhrR8jA1Yb1rB81u8dgj/lPkkHsk0ItEg==", + "dependencies": { + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "prism-media": "^1.3.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "ws": "^8.7.0" + }, + "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.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.3.1.tgz", + "integrity": "sha512-PB2e5JHWIMRz9HiN/sIWcNIzXjYvzc3OmeRHYICXreKhetDYf4Zufypr8A48Z/XZLzbMqIka6uoR+2dH58nksg==", + "engines": { + "node": ">=v14.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": "18.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "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/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/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/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/ascii-table": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ascii-table/-/ascii-table-0.0.9.tgz", + "integrity": "sha512-xpkr6sCDIYTPqzvjG8M3ncw1YOTaloWZOyrUmicoEifBEKzQzt+ooUpRpQ/AbOoJfO/p2ZKiyp79qHThzJDulQ==", + "dev": true + }, + "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/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/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "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/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "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/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/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "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.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", + "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "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/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "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/ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "hasInstallScript": true, + "dependencies": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "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/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "dependencies": { + "libsodium": "^0.7.0" + } + }, + "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/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "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/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/minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "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/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "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/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "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/prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "peerDependencies": { + "@discordjs/opus": "^0.5.0", + "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "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/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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": { + "@derhuerst/http-basic": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.2.tgz", + "integrity": "sha512-ek065nW95mleLHo8vZ+ob7QTQPNOwDEjCe27BX2flme/UTu9z2mD1uRRPko38u7al4tTZADMtozpll8PQHAZgg==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "@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==" + }, + "@discordjs/node-pre-gyp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", + "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "requires": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + } + }, + "@discordjs/voice": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", + "integrity": "sha512-tChDKRRbKwWHcyq1dSEzrnuCMJyLtKXcFhgQpqcS2YjZ1TLlXboc/mhrR8jA1Yb1rB81u8dgj/lPkkHsk0ItEg==", + "requires": { + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "prism-media": "^1.3.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "ws": "^8.7.0" + } + }, + "@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.3.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.3.1.tgz", + "integrity": "sha512-PB2e5JHWIMRz9HiN/sIWcNIzXjYvzc3OmeRHYICXreKhetDYf4Zufypr8A48Z/XZLzbMqIka6uoR+2dH58nksg==" + }, + "@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": "18.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" + }, + "@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "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/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "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" + } + } + } + }, + "ascii-table": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ascii-table/-/ascii-table-0.0.9.tgz", + "integrity": "sha512-xpkr6sCDIYTPqzvjG8M3ncw1YOTaloWZOyrUmicoEifBEKzQzt+ooUpRpQ/AbOoJfO/p2ZKiyp79qHThzJDulQ==", + "dev": true + }, + "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==" + }, + "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" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "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==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "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" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "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.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", + "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "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" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "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==" + }, + "ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "requires": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + } + }, + "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-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "requires": { + "libsodium": "^0.7.0" + } + }, + "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" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "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" + } + }, + "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" + } + }, + "minipass": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", + "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "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" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "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" + } + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "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==" + }, + "prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "requires": {} + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "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==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "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 100755 index 0000000..f5b8e07 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "datboi", + "version": "1.0.0", + "description": "Dat boi, the annoying discord bot", + "main": "index.js", + "scripts": { + "start": "node --trace-warnings index.js", + "stop": "sh ~/scripts/sshKill.sh" + }, + "author": "Tomato#6966 (author of this template), Ninluc", + "license": "ISC", + "dependencies": { + "@discordjs/opus": "^0.5.3", + "@discordjs/voice": "^0.10.0", + "ascii-table": "0.0.9", + "discord.js": "^13.8.1", + "ffmpeg-static": "^4.4.1", + "libsodium-wrappers": "^0.7.10", + "moment": "^2.29.4" + }, + "devDependencies": { + "ascii-table": "0.0.9", + "colors": "^1.4.0" + } +}