commit
All checks were successful
Deploy bot / build-and-deploy (push) Successful in 14s

This commit is contained in:
koneko 2025-04-29 12:22:45 +02:00
commit 3c29f98027
6 changed files with 610 additions and 0 deletions

View File

@ -0,0 +1,20 @@
name: Deploy bot
on:
push:
branches:
- master
jobs:
build-and-deploy:
env:
TOKEN: ${{ secrets.TOKEN }}
PREFIX: ${{ secrets.PREFIX }}
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy with Docker Compose
run: |
docker compose down
docker compose up -d --build

15
Dockerfile Normal file
View File

@ -0,0 +1,15 @@
ARG NODE_VERSION=18.0.0
FROM node:${NODE_VERSION}-alpine
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
USER node
COPY . .
CMD node index.js

10
docker-compose.yml Normal file
View File

@ -0,0 +1,10 @@
services:
shirocalc:
container_name: shirocalc-discord-bot
restart: unless-stopped
environment:
- TOKEN=${TOKEN}
- PREFIX=${PREFIX}
build:
context: .
dockerfile: Dockerfile

367
index.js Normal file
View File

@ -0,0 +1,367 @@
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 = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent,
],
});
// When the client is ready, run this code (only once).
// The distinction between `client: Client<boolean>` and `readyClient: Client<true>` 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}`);
});
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 <<help."
);
// sum all args
try {
args.forEach((arg) => {
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 <<help."
);
let ab1 = parseInt(args[0]);
let ab2 = parseInt(args[1]);
let ab1ratio = 1.063;
let ab2ratio = 0.937;
message.channel.send(
`Aiming for ${ab1 * ab1ratio} and ${ab2 * ab2ratio}`
);
}
if (command == "lt") {
return message.channel.send("not implemented.");
if (!args[0] || !args[1])
return message.channel.send(
"Not enough arguments, consult <<help."
);
let ab1 = parseInt(args[0]);
let ab2 = parseInt(args[1]);
let ab1ratio = 1.101;
let ab2ratio = 0.899;
message.channel.send(
`Aiming for ${ab1 * ab1ratio} and ${ab2 * ab2ratio}`
);
}
if (command == "cb") {
if (!args[0] || !args[1])
return message.channel.send(
"Not enough arguments, consult <<help."
);
let cb = parseInt(args[0]);
let ups = parseInt(args[1]);
let initialspeed = null;
if (args[2]) {
initialspeed = parseInt(args[2]);
initialspeed = 30000 - initialspeed;
let t = Math.ceil(initialspeed / 1200);
console.log(t);
ups = ups - t;
}
console.log(ups);
message.channel.send(`Should be ${cb + ups * 192}.`);
}
if (command == "ms") {
if (!args[0] || !args[1])
return message.channel.send(
"Not enough arguments, consult <<help."
);
let cb = parseInt(args[0]);
let ups = parseInt(args[1]);
let initialspeed = null;
if (args[2]) {
initialspeed = parseInt(args[2]);
initialspeed = 30000 - initialspeed;
let t = Math.ceil(initialspeed / 1200);
console.log(t);
ups = ups - t;
}
console.log(ups);
message.channel.send(`Should be ${cb + ups * 99}.`);
}
if (command == "res") {
for (let i = 0; i < args.length; i++) {
if (args[i] == "|") continue;
args[i] = parseInt(args[i]);
}
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 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 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 <<help."
);
let boost = parseInt(args[0]);
let levels = parseInt(args[1]);
let extraboost = Math.floor(levels / 3 - 3);
let players = Math.floor(levels / 29) + 1;
if (players > 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 <<help."
);
let damage = parseInt(args[0]);
let ups = parseInt(args[1]);
let initialcharge = null;
let initialspeed = null;
if (args[2]) {
initialspeed = parseInt(args[2]);
initialspeed = 30000 - initialspeed;
let t = Math.ceil(initialspeed / 1200);
console.log(t);
ups = ups - t;
}
if (args[3]) {
initialcharge = parseInt(args[3]);
initialcharge = 128 - initialcharge;
let t = Math.ceil(initialcharge / 4);
console.log(t);
ups = ups - t;
}
message.channel.send(`Should be ${damage + ups * 144}.`);
}
if (command == "cdrag") {
if (!args[0] || !args[1] || !args[2])
return message.channel.send(
"Not enough arguments, consult <<help."
);
let damage = parseInt(args[0]);
let upgrades = parseInt(args[1]);
let additional = parseInt(args[2]);
if (additional < 3) upgrades = upgrades - (3 - additional);
message.channel.send(
`Should be ${
damage + upgrades * 112
} damage with maxed additional projectiles.`
);
}
if (command == "owl") {
if (!args[0])
return message.channel.send(
"Not enough arguments, consult <<help."
);
let ingPercent = parseFloat(args[0]);
return message.channel.send(
`Should be approximately ${
Math.round(ingPercent * 0.8777066594 * 100) / 100
}%.`
);
}
if (command == "help") {
let embed = new EmbedBuilder();
embed.setTitle("Commands");
if (prefix == "?")
embed.setDescription("**development build, subject to change**");
embed.addFields(
{
name: "res",
value: ":shield: Calculates how much upgrades you need to max your resistances. (<<res <res> <res> <res> [res] | [hero stat] [levels] [second hero stat])",
},
{
name: "bonus",
value: ":star: Sums and calculates bonus for numbers. (<<bonus <number> <number> [inf optional extra numbers])",
},
{
name: "cat",
value: ":cat: Calculates boost for cat. (<<cat <boost> <levels>)",
},
{
name: "cdrag",
value: ":dragon: Calculate damage for crystaline dragon taking into account upgrades and additional projectiles. (<<cdrag <base> <ups> <extra projectiles>)",
},
{
name: "cb",
value: ":crossed_swords: Calculate calamity blade damage taking in to account speed. (<<cb <damage> <ups> [proj speed])",
},
{
name: "bident",
value: ":trident: Calculate bident damage taking in to account speed and charge speed. (<<bident <damage> <ups> [proj speed] [charge speed])",
},
{
name: "ms",
value: ":tada: Calculate moon staff damage taking in to account speed (<<ms <elemental damage> <ups> [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] });
}
});
// Log in to Discord with your client's token
client.login(token);

9
package.json Normal file
View File

@ -0,0 +1,9 @@
{
"name": "shirocalc",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"dependencies": {
"discord.js": "^14.14.1"
}
}

189
yarn.lock Normal file
View File

@ -0,0 +1,189 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@discordjs/builders@^1.7.0":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-1.7.0.tgz#e2478c7e55b0f4c40837edb8f102bce977323a37"
integrity sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==
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"
"@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"
integrity sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==
"@discordjs/formatters@^0.3.3":
version "0.3.3"
resolved "https://registry.yarnpkg.com/@discordjs/formatters/-/formatters-0.3.3.tgz#b16fdd79bb819680ab7e519193004e9dc124a749"
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"
integrity sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==
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"
"@discordjs/util@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@discordjs/util/-/util-1.0.2.tgz#dc1896d764452b1bd9707eb9aa99ccfbb30bd1c0"
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"
integrity sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==
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"
"@fastify/busboy@^2.0.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff"
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"
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"
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":
version "3.5.1"
resolved "https://registry.yarnpkg.com/@sapphire/snowflake/-/snowflake-3.5.1.tgz#254521c188b49e8b2d4cc048b475fb2b38737fec"
integrity sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==
"@types/node@*":
version "20.10.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.0.tgz#16ddf9c0a72b832ec4fcce35b8249cf149214617"
integrity sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==
dependencies:
undici-types "~5.26.4"
"@types/ws@8.5.9":
version "8.5.9"
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.9.tgz#384c489f99c83225a53f01ebc3eddf3b8e202a8c"
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"
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"
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"
integrity sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==
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"
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"
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"
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"
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"
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"
integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==
tslib@2.6.2, tslib@^2.6.2:
version "2.6.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
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"
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"
integrity sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==
dependencies:
"@fastify/busboy" "^2.0.0"
ws@8.14.2, ws@^8.14.2:
version "8.14.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-8.14.2.tgz#6c249a806eb2db7a20d26d51e7709eab7b2e6c7f"
integrity sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==