diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9592af0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +config.json +node_modules/ \ No newline at end of file diff --git a/commands/bonus.js b/commands/bonus.js new file mode 100644 index 0000000..982b087 --- /dev/null +++ b/commands/bonus.js @@ -0,0 +1,29 @@ +exports.name = "bonus"; +exports.description = + ":star: Sums and calculates bonus for player stat numbers."; +exports.usage = "< [inf optional extra numbers]"; +exports.example = "< { + let is1nan = false; + if (!args[0]) + return message.channel.send("Not enough arguments, consult < { + if (isNaN(parseInt(arg))) { + is1nan = true; + } + arg = parseInt(arg); + }); + if (is1nan) + return message.channel.send( + "You have provided invalid arguments to this command, please consult < { + if (arg > 2000) arg = 2000; // just dont bother for anything higher than 2000 + sum += parseInt(arg); + }); + sum--; + message.channel.send( + `Will reach ${sum}, ${Math.ceil(sum * 1.4)} with bonus.` + ); +}; diff --git a/commands/cat.js b/commands/cat.js new file mode 100644 index 0000000..6e27482 --- /dev/null +++ b/commands/cat.js @@ -0,0 +1,22 @@ +exports.name = "cat"; +exports.description = ":cat: Calculates boost for cat."; +exports.usage = "< "; +exports.example = "< { + if (!args[0] || !args[1]) + return message.channel.send("Not enough arguments, consult < 4) players = 4; + message.channel.send( + `Your cat's boost should be atleast **${ + boost + extraboost + }**. It will boost atleast **${players}** players.` + ); +}; diff --git a/commands/cb.js b/commands/cb.js new file mode 100644 index 0000000..6b42427 --- /dev/null +++ b/commands/cb.js @@ -0,0 +1,25 @@ +exports.name = "cb"; +exports.description = + ":crossed_swords: Calculate calamity blade damage taking in to account projectile speed."; +exports.usage = "< [projectile speed]"; +exports.example = "< { + if (!args[0] || !args[1]) + return message.channel.send("Not enough arguments, consult < { + let embed = new EmbedBuilder(); + embed.setTitle("Commands Helper"); + if (args[0]) { + const cmd = client.commands.get(args[0]); + if (!cmd) + return message.channel.send( + "Command not found, try `< { + embed.addFields({ + name: cmd.name, + value: cmd.description, + }); + }); + } + embed.setColor(0x00ff00); + message.channel.send({ embeds: [embed] }); +}; diff --git a/commands/ms.js b/commands/ms.js new file mode 100644 index 0000000..3e290e2 --- /dev/null +++ b/commands/ms.js @@ -0,0 +1,25 @@ +exports.name = "ms"; +exports.description = + ":tada: Calculate moon staff damage taking in to account projectile speed."; +exports.usage = "< [projectile speed]"; +exports.example = "< { + if (!args[0] || !args[1]) + return message.channel.send("Not enough arguments, consult < [res] | [second hero stat]"; +exports.example = "< { + for (let i = 0; i < args.length; i++) { + if (args[i] == "|") continue; + args[i] = parseInt(args[i]); + if (isNaN(args[i])) + message.channel.send( + "Unable to parse argument `" + + i + + 1 + + "` as number, try again or report this issue." + ); + } + let type; + if (args[4] == "|") type = 4; + else if (args[3] == "|") type = 3; + else return message.channel.send("Please provide 3 or 4 resistances."); + let resistances = [args[0], args[1], args[2], type == 4 ? args[3] : null]; + let mainStat = type == 4 ? args[5] : args[4]; + let upgrades = type == 4 ? args[6] : args[5]; + let substat = type == 4 ? args[7] : args[6]; + upgrades = upgrades - 1; + if (!mainStat || !upgrades) + return message.channel.send("Please provide atleast 2 stats."); + if (!substat) substat = 0; + let resUpgrades = 0; + resistances.forEach((res) => { + if (res == null) return; + if (res > 29) + return message.channel.send( + "Please provide a number less than 29 for resistances." + ); + if (res < 29) { + if (res < 0) { + let underzero = Math.abs(res); + if (underzero < 13) { + resUpgrades += 23 + Math.abs(res); + } else { + if (underzero == 13 || underzero == 14) { + resUpgrades += 23 + 13; + } + if (underzero == 15 || underzero == 16) { + resUpgrades += 23 + 13 + 1; + } + if (underzero == 17 || underzero == 18) { + resUpgrades += 23 + 13 + 2; + } + if (underzero == 19 || underzero == 20 || underzero == 22) { + resUpgrades += 23 + 13 + 3; + } + if (underzero == 21 || underzero == 23) { + resUpgrades += 23 + 13 + 4; + } + if (underzero > 23) { + resUpgrades += 29 - underzero; + } + } + + // from 1% to 23% takes 17-18 ups + // from 23% to 29% takes 6 ups + // from 1% to 29% takes 23 ups + // 23 + Math.abs(res) + } else { + //14 skips 15 to 16 + //15 skips 16 to 17 + //17 skips 18 to 19 + //19 skips 20 to 21 + //21 skips to 24 + // list: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // possible if 15,17,19,21,24 + //amount of numbers: 18 + // skipped 5 upgrades + //example 4 + // 5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // count: 14 + // to 29% + 6, result 20 + if (res < 14) { + let am = 14 - res; + resUpgrades += am + 4 + 6; + } else { + if (res == 14) { + resUpgrades += 4 + 6; + } + if (res == 15 || res == 16) { + resUpgrades += 3 + 6; + } + if (res == 17 || res == 18) { + resUpgrades += 2 + 6; + } + if (res == 19 || res == 20 || res == 22) { + resUpgrades += 1 + 6; + } + if (res == 21 || res == 23) { + resUpgrades += 6; + } + if (res > 23) { + resUpgrades += 29 - res; + } + } + } + } + }); + upgrades -= resUpgrades; + mainStat += upgrades; + let over = 0; + if (mainStat > 999) { + let over = mainStat - 999; + mainStat -= over; + substat += over; + } + message.channel.send( + `With ${resUpgrades} upgrades spent in resistances, your piece will reach ${ + mainStat + substat + }, or ${Math.ceil(mainStat * 1.4 + substat * 1.4)} with set bonus!` + ); +}; diff --git a/index.js b/index.js index ef56431..611ff04 100644 --- a/index.js +++ b/index.js @@ -1,366 +1,73 @@ -const { - Client, - Events, - GatewayIntentBits, - EmbedBuilder, -} = require("discord.js"); -const token = process.env.TOKEN; -const prefix = process.env.PREFIX; -// Create a new client instance +const { Client, Events, GatewayIntentBits, Collection } = require("discord.js"); +const fs = require("fs"); +const path = require("path"); +let cfg = {}; +try { + cfg = require("./config.json"); +} catch (e) { + console.warn( + "config.json not found or invalid. Falling back to environment variables." + ); +} +const token = process.env.TOKEN || cfg.TOKEN; +const prefix = process.env.PREFIX || cfg.PREFIX; const client = new Client({ - intents: [ - GatewayIntentBits.Guilds, - GatewayIntentBits.GuildMessages, - GatewayIntentBits.MessageContent, - ], + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + ], +}); +client.commands = new Collection(); + +fs.readdir("./commands/", (err, files) => { + if (err) return console.error(err); + files.forEach((file) => { + if (!file.endsWith(".js")) return; + let props = require(`./commands/${file}`); + let commandName = file.split(".")[0]; + console.log("Loaded command " + commandName); + client.commands.set(commandName, props); + }); }); -// When the client is ready, run this code (only once). -// The distinction between `client: Client` and `readyClient: Client` is important for TypeScript developers. -// It makes some properties non-nullable. -client.once(Events.ClientReady, (readyClient) => { - console.log(`Ready! Logged in as ${readyClient.user.tag}`); +const url = "https://drive.overflow.fun/public/react.json"; +let userstoreact = []; +client.once(Events.ClientReady, async (readyClient) => { + const res = await fetch(url); + const data = await res.json(); + + userstoreact = data.map((entry) => { + const [userId, emoji] = entry.split(":"); + return { userId, emoji }; + }); + console.log(`Ready! Logged in as ${readyClient.user.tag}`); }); -client.on(Events.MessageCreate, (message) => { - if (message.author.bot) return; - if (message.content.indexOf(prefix) !== 0) return; - const args = message.content.slice(prefix.length).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - if (command == "bonus") { - if (!args[0]) - return message.channel.send( - "Not enough arguments, consult < { - if (isNaN(parseInt(arg))) - return message.channel.send( - "Please provide atleast 1 number." - ); - arg = parseInt(arg); - }); - } catch (e) { - return message.channel.send("Please provide 1 number."); - } - let sum = 0; - args.forEach((arg) => { - if (arg > 2000) arg = 2000; - sum += parseInt(arg); - }); - message.channel.send( - `Will reach ${sum}, ${Math.ceil(sum * 1.4)} with bonus.` - ); - } - if (command == "ev") { - return message.channel.send("not implemented."); - if (!args[0] || !args[1]) - return message.channel.send( - "Not enough arguments, consult < { - if (res == null) return; - if (res > 29) - return message.channel.send( - "Please provide a number between 0 and 29. LMAO" - ); - if (res < 29) { - if (res < 0) { - let underzero = Math.abs(res); - if (underzero < 13) { - resUpgrades += 23 + Math.abs(res); - } else { - if (underzero == 13 || underzero == 14) { - resUpgrades += 23 + 13; - } - if (underzero == 15 || underzero == 16) { - resUpgrades += 23 + 13 + 1; - } - if (underzero == 17 || underzero == 18) { - resUpgrades += 23 + 13 + 2; - } - if ( - underzero == 19 || - underzero == 20 || - underzero == 22 - ) { - resUpgrades += 23 + 13 + 3; - } - if (underzero == 21 || underzero == 23) { - resUpgrades += 23 + 13 + 4; - } - if (underzero > 23) { - resUpgrades += 29 - underzero; - } - } +client.on(Events.MessageCreate, async (message) => { + if (message.author.bot) return; + console.log(message.mentions.users); - // from 1% to 23% takes 17-18 ups - // from 23% to 29% takes 6 ups - // from 1% to 29% takes 23 ups - // 23 + Math.abs(res) - console.log( - "gotta spend " + - (23 + Math.abs(res)) + - " upgrades to max res for negative" - ); - } else { - //14 skips 15 to 16 - //15 skips 16 to 17 - //17 skips 18 to 19 - //19 skips 20 to 21 - //21 skips to 24 - // list: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,20,23 - // possible if 15,17,19,21,24 - //amount of numbers: 18 - // skipped 5 upgrades - //example 4 - // 5,6,7,8,9,10,11,12,13,14,16,18,20,23 - // count: 14 - // to 29% + 6, result 20 - if (res < 14) { - let am = 14 - res; - resUpgrades += am + 4 + 6; - console.log( - "gotta spend " + - (am + 4 + 6) + - " upgrades to max res for positive, am: " + - am - ); - } else { - if (res == 14) { - resUpgrades += 4 + 6; - } - if (res == 15 || res == 16) { - resUpgrades += 3 + 6; - } - if (res == 17 || res == 18) { - resUpgrades += 2 + 6; - } - if (res == 19 || res == 20 || res == 22) { - resUpgrades += 1 + 6; - } - if (res == 21 || res == 23) { - resUpgrades += 6; - } - if (res > 23) { - resUpgrades += 29 - res; - } - console.log( - "gotta spend " + - resUpgrades + - " upgrades to max res for positive, res: " + - res - ); - } - } - } - }); - upgrades -= resUpgrades; - mainStat += upgrades; - let over = 0; - if (mainStat > 999) { - let over = mainStat - 999; - mainStat -= over; - substat += over; - } - message.channel.send( - `With ${resUpgrades} upgrades spent in resistances, your piece will reach ${ - mainStat + substat - }, or ${Math.ceil(mainStat * 1.4 + substat * 1.4)} with set bonus!` - ); - } - if (command == "cat") { - if (!args[0] || !args[1]) - return message.channel.send( - "Not enough arguments, consult < 4) players = 4; - message.channel.send( - `Should be atleast ${ - boost + extraboost - }. Will boost atleast ${players} players.` - ); - } - if (command == "bident") { - if (!args[0] || !args[1]) - return message.channel.send( - "Not enough arguments, consult < [res] | [hero stat] [levels] [second hero stat])", - }, - { - name: "bonus", - value: ":star: Sums and calculates bonus for numbers. (< [inf optional extra numbers])", - }, - { - name: "cat", - value: ":cat: Calculates boost for cat. (< )", - }, - { - name: "cdrag", - value: ":dragon: Calculate damage for crystaline dragon taking into account upgrades and additional projectiles. (< )", - }, - { - name: "cb", - value: ":crossed_swords: Calculate calamity blade damage taking in to account speed. (< [proj speed])", - }, - { - name: "bident", - value: ":trident: Calculate bident damage taking in to account speed and charge speed. (< [proj speed] [charge speed])", - }, - { - name: "ms", - value: ":tada: Calculate moon staff damage taking in to account speed (< [proj speed])", - }, - { - name: "help", - value: ":scroll: Shows this message. (bot is a tbot replacement for this server :P)", - } - ); - embed.setColor(0x00ff00); - message.channel.send({ embeds: [embed] }); - } + userstoreact.forEach(async (usr) => { + if (message.mentions.users.find((u) => u.id == usr.userId)) { + try { + await message.react(emoji); + } catch (err) { + console.error("Failed to react to message:", err); + } + } + }); + + if (message.content.indexOf(prefix) !== 0) return; + + const args = message.content.slice(prefix.length).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + + const cmd = client.commands.get(command); + + if (!cmd) return; + + cmd.run(client, message, args); }); // Log in to Discord with your client's token diff --git a/old.js b/old.js new file mode 100644 index 0000000..46d783a --- /dev/null +++ b/old.js @@ -0,0 +1,302 @@ +const { + Client, + Events, + GatewayIntentBits, + EmbedBuilder, +} = require("discord.js"); +let cfg = require("./config.json"); +const token = process.env.TOKEN || cfg.TOKEN; +const prefix = process.env.PREFIX || cfg.PREFIX; +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + ], +}); + +client.once(Events.ClientReady, (readyClient) => { + console.log(`Ready! Logged in as ${readyClient.user.tag}`); +}); + +client.on(Events.MessageCreate, (message) => { + if (message.author.bot) return; + if (message.content.indexOf(prefix) !== 0) return; + const args = message.content.slice(prefix.length).trim().split(/ +/g); + const command = args.shift().toLowerCase(); + if (command == "ev") { + return message.channel.send("not implemented."); + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < { + if (res == null) return; + if (res > 29) + return message.channel.send( + "Please provide a number between 0 and 29. LMAO" + ); + if (res < 29) { + if (res < 0) { + let underzero = Math.abs(res); + if (underzero < 13) { + resUpgrades += 23 + Math.abs(res); + } else { + if (underzero == 13 || underzero == 14) { + resUpgrades += 23 + 13; + } + if (underzero == 15 || underzero == 16) { + resUpgrades += 23 + 13 + 1; + } + if (underzero == 17 || underzero == 18) { + resUpgrades += 23 + 13 + 2; + } + if ( + underzero == 19 || + underzero == 20 || + underzero == 22 + ) { + resUpgrades += 23 + 13 + 3; + } + if (underzero == 21 || underzero == 23) { + resUpgrades += 23 + 13 + 4; + } + if (underzero > 23) { + resUpgrades += 29 - underzero; + } + } + + // from 1% to 23% takes 17-18 ups + // from 23% to 29% takes 6 ups + // from 1% to 29% takes 23 ups + // 23 + Math.abs(res) + console.log( + "gotta spend " + + (23 + Math.abs(res)) + + " upgrades to max res for negative" + ); + } else { + //14 skips 15 to 16 + //15 skips 16 to 17 + //17 skips 18 to 19 + //19 skips 20 to 21 + //21 skips to 24 + // list: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // possible if 15,17,19,21,24 + //amount of numbers: 18 + // skipped 5 upgrades + //example 4 + // 5,6,7,8,9,10,11,12,13,14,16,18,20,23 + // count: 14 + // to 29% + 6, result 20 + if (res < 14) { + let am = 14 - res; + resUpgrades += am + 4 + 6; + console.log( + "gotta spend " + + (am + 4 + 6) + + " upgrades to max res for positive, am: " + + am + ); + } else { + if (res == 14) { + resUpgrades += 4 + 6; + } + if (res == 15 || res == 16) { + resUpgrades += 3 + 6; + } + if (res == 17 || res == 18) { + resUpgrades += 2 + 6; + } + if (res == 19 || res == 20 || res == 22) { + resUpgrades += 1 + 6; + } + if (res == 21 || res == 23) { + resUpgrades += 6; + } + if (res > 23) { + resUpgrades += 29 - res; + } + console.log( + "gotta spend " + + resUpgrades + + " upgrades to max res for positive, res: " + + res + ); + } + } + } + }); + upgrades -= resUpgrades; + mainStat += upgrades; + let over = 0; + if (mainStat > 999) { + let over = mainStat - 999; + mainStat -= over; + substat += over; + } + message.channel.send( + `With ${resUpgrades} upgrades spent in resistances, your piece will reach ${ + mainStat + substat + }, or ${Math.ceil(mainStat * 1.4 + substat * 1.4)} with set bonus!` + ); + } + if (command == "cat") { + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < 4) players = 4; + message.channel.send( + `Should be atleast ${ + boost + extraboost + }. Will boost atleast ${players} players.` + ); + } + if (command == "bident") { + if (!args[0] || !args[1]) + return message.channel.send( + "Not enough arguments, consult < )", + }, + { + name: "cdrag", + value: ":dragon: Calculate damage for crystaline dragon taking into account upgrades and additional projectiles. (< )", + }, + { + name: "cb", + value: ":crossed_swords: Calculate calamity blade damage taking in to account speed. (< [proj speed])", + }, + { + name: "bident", + value: ":trident: Calculate bident damage taking in to account speed and charge speed. (< [proj speed] [charge speed])", + }, + { + name: "ms", + value: "", + }, + { + name: "help", + value: ":scroll: Shows this message. (bot is a tbot replacement for this server :P)", + } + ); + embed.setColor(0x00ff00); + message.channel.send({ embeds: [embed] }); + } +}); + +// Log in to Discord with your client's token +client.login(token); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5c03740 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,299 @@ +{ + "name": "shirocalc", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shirocalc", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "discord.js": "^14.14.1" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", + "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/formatters": "^0.3.3", + "@discordjs/util": "^1.0.2", + "@sapphire/shapeshift": "^3.9.3", + "discord-api-types": "0.37.61", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", + "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", + "license": "Apache-2.0", + "dependencies": { + "discord-api-types": "0.37.61" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/rest": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", + "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.0.0", + "@discordjs/util": "^1.0.2", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "magic-bytes.js": "^1.5.0", + "tslib": "^2.6.2", + "undici": "5.27.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@discordjs/util": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", + "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", + "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/collection": "^2.0.0", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.9", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "tslib": "^2.6.2", + "ws": "^8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.9.3", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz", + "integrity": "sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.10.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz", + "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ws": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz", + "integrity": "sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ==", + "license": "MIT", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.37.61", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", + "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==", + "license": "MIT" + }, + "node_modules/discord.js": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", + "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "license": "Apache-2.0", + "dependencies": { + "@discordjs/builders": "^1.7.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.3.3", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@discordjs/ws": "^1.0.2", + "@sapphire/snowflake": "3.5.1", + "@types/ws": "8.5.9", + "discord-api-types": "0.37.61", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "2.6.2", + "undici": "5.27.2", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "license": "MIT" + }, + "node_modules/magic-bytes.js": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz", + "integrity": "sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw==", + "license": "MIT" + }, + "node_modules/ts-mixer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", + "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==", + "license": "MIT" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "license": "MIT", + "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 + } + } + } + } +} diff --git a/yarn.lock b/yarn.lock index fb3f928..adfb858 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,7 +4,7 @@ "@discordjs/builders@^1.7.0": version "1.7.0" - resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37" + resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz" integrity sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw== dependencies: "@discordjs/formatters" "^0.3.3" @@ -15,26 +15,26 @@ ts-mixer "^6.0.3" tslib "^2.6.2" -"@discordjs/collection@1.5.3": - version "1.5.3" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-1.5.3.tgz#5a1250159ebfff9efa4f963cfa7e97f1b291be18" - integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== - "@discordjs/collection@^2.0.0": version "2.0.0" - resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-2.0.0.tgz#409b80c74eb8486cc4ee6a9b83426aaff1380f8c" + resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz" integrity sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w== +"@discordjs/collection@1.5.3": + version "1.5.3" + resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz" + integrity sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ== + "@discordjs/formatters@^0.3.3": version "0.3.3" - resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.3.tgz#b16fdd79bb819680ab7e519193004e9dc124a749" + resolved "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz" integrity sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w== dependencies: discord-api-types "0.37.61" "@discordjs/rest@^2.1.0": version "2.2.0" - resolved "https://registry.yarnpkg.com/@discordjs/rest/-/rest-2.2.0.tgz#f4ec00d3faff965c00a879b7e87bb4b6f4446966" + resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz" integrity sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A== dependencies: "@discordjs/collection" "^2.0.0" @@ -49,12 +49,12 @@ "@discordjs/util@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.2.tgz#dc1896d764452b1bd9707eb9aa99ccfbb30bd1c0" + resolved "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz" integrity sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw== "@discordjs/ws@^1.0.2": version "1.0.2" - resolved "https://registry.yarnpkg.com/@discordjs/ws/-/ws-1.0.2.tgz#3933b12d4686aabf6a95dfe5fb6e744342a661d1" + resolved "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz" integrity sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q== dependencies: "@discordjs/collection" "^2.0.0" @@ -69,61 +69,54 @@ "@fastify/busboy@^2.0.0": version "2.1.0" - resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" + resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz" integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== "@sapphire/async-queue@^1.5.0": version "1.5.0" - resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.5.0.tgz#2f255a3f186635c4fb5a2381e375d3dfbc5312d8" + resolved "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz" integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== "@sapphire/shapeshift@^3.9.3": version "3.9.3" - resolved "https://registry.yarnpkg.com/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz#89d26713044bc21cc5e0845e61a8a328ca3c1a84" + resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.3.tgz" integrity sha512-WzKJSwDYloSkHoBbE8rkRW8UNKJiSRJ/P8NqJ5iVq7U2Yr/kriIBx2hW+wj2Z5e5EnXL1hgYomgaFsdK6b+zqQ== dependencies: fast-deep-equal "^3.1.3" lodash "^4.17.21" -"@sapphire/snowflake@3.5.1", "@sapphire/snowflake@^3.5.1": +"@sapphire/snowflake@^3.5.1", "@sapphire/snowflake@3.5.1": version "3.5.1" - resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec" + resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz" integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA== "@types/node@*": version "20.10.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617" + resolved "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz" integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ== dependencies: undici-types "~5.26.4" -"@types/ws@8.5.9": +"@types/ws@^8.5.9", "@types/ws@8.5.9": version "8.5.9" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz" integrity sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg== dependencies: "@types/node" "*" -"@types/ws@^8.5.9": - version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== - dependencies: - "@types/node" "*" - "@vladfrangu/async_event_emitter@^2.2.2": version "2.2.2" - resolved "https://registry.yarnpkg.com/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz#84c5a3f8d648842cec5cc649b88df599af32ed88" + resolved "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.2.tgz" integrity sha512-HIzRG7sy88UZjBJamssEczH5q7t5+axva19UbZLO6u0ySbYPrwzWiXBcC0WuHyhKKoeCyneH+FvYzKQq/zTtkQ== discord-api-types@0.37.61: version "0.37.61" - resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.37.61.tgz#9dd8e58c624237e6f1b23be2d29579af268b8c5b" + resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz" integrity sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw== discord.js@^14.14.1: version "14.14.1" - resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-14.14.1.tgz#9a2bea23bba13819705ab87612837610abce9ee3" + resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz" integrity sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w== dependencies: "@discordjs/builders" "^1.7.0" @@ -141,49 +134,49 @@ discord.js@^14.14.1: undici "5.27.2" ws "8.14.2" -fast-deep-equal@3.1.3, fast-deep-equal@^3.1.3: +fast-deep-equal@^3.1.3, fast-deep-equal@3.1.3: version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== lodash.snakecase@4.1.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== lodash@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== magic-bytes.js@^1.5.0: version "1.5.0" - resolved "https://registry.yarnpkg.com/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz#f5531ca53e1c8dab5692b8dcfb360f7ca6c6b6bc" + resolved "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.5.0.tgz" integrity sha512-wJkXvutRbNWcc37tt5j1HyOK1nosspdh3dj6LUYYAvF6JYNqs53IfRvK9oEpcwiDA1NdoIi64yAMfdivPeVAyw== ts-mixer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" + resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz" integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== -tslib@2.6.2, tslib@^2.6.2: +tslib@^2.6.2, tslib@2.6.2: version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== undici-types@~5.26.4: version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== undici@5.27.2: version "5.27.2" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.2.tgz#a270c563aea5b46cc0df2550523638c95c5d4411" + resolved "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz" integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ== dependencies: "@fastify/busboy" "^2.0.0" -ws@8.14.2, ws@^8.14.2: +ws@^8.14.2, ws@8.14.2: version "8.14.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f" + resolved "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz" integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==