From e22c9bc87ed1ca63a8a7543157bb228777e7542d Mon Sep 17 00:00:00 2001 From: jasonfoknxu Date: Sat, 1 Apr 2023 19:51:57 +0800 Subject: [PATCH] initial commit --- .gitignore | 25 ++ .readme/discord.png | Bin 0 -> 77823 bytes .readme/discord_400.png | Bin 0 -> 11829 bytes LICENSE | 21 + README.md | 69 ++++ ecosystem.config.js | 15 + package.json | 25 ++ sample.env | 12 + src/app.ts | 144 +++++++ src/commands/minecraft.ts | 67 +++ src/commands/playerInfo.ts | 54 +++ src/commands/serverInfo.ts | 30 ++ src/config.ts | 40 ++ src/interface/Player.ts | 7 + src/interface/PlayerProfile.ts | 20 + src/interface/ServerInfo.ts | 25 ++ src/render.ts | 205 +++++++++ src/util.ts | 8 + tsconfig.json | 16 + yarn.lock | 734 +++++++++++++++++++++++++++++++++ 20 files changed, 1517 insertions(+) create mode 100644 .gitignore create mode 100644 .readme/discord.png create mode 100644 .readme/discord_400.png create mode 100644 LICENSE create mode 100644 README.md create mode 100644 ecosystem.config.js create mode 100644 package.json create mode 100644 sample.env create mode 100644 src/app.ts create mode 100644 src/commands/minecraft.ts create mode 100644 src/commands/playerInfo.ts create mode 100644 src/commands/serverInfo.ts create mode 100644 src/config.ts create mode 100644 src/interface/Player.ts create mode 100644 src/interface/PlayerProfile.ts create mode 100644 src/interface/ServerInfo.ts create mode 100644 src/render.ts create mode 100644 src/util.ts create mode 100644 tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..47a4f6d --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# config +.env + +# Compiled script +/run + +# logs +/logs + +# dependencies +/node_modules +/.pnp +.pnp.js + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/.readme/discord.png b/.readme/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..e4875f8e477c557d944378a6aaf5a40fe6a7b276 GIT binary patch literal 77823 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

4@K`ueO_|MMVK&KxOLB&Sp|%WuuD|dma&49 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 Z9p%veX{(n^|6lpFvb=^|jf`3F{{uh38cF~F literal 0 HcmV?d00001 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1507737 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 nxu@nxu.biz + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7767ee8 --- /dev/null +++ b/README.md @@ -0,0 +1,69 @@ +# FreeCityHK Minecraft Discord Bot + +專門為 FreeCityHK Minecraft 制作的 Discord Bot + + +``` +✨ FreeCityHK 係一個以 RP [RPG] 的 生存 Minecraft 伺服器 ✨ + +💫 仲記唔記得你曾經喺 Minecraft 起過嘅偉大建築,面對宏大嘅城堡有冇諗過真真正正成為一方霸主!?💫 + +🪙 面對霸權,你有冇一種革命情意結 ?! 或者,相比建築,更加響往冷兵器、傭兵、國戰、荒島生活!? 🪙 + +🏵️ 玩慣咗 GTA RP 又有冇諗過換個方式,以 Minecraft 嚟過一個另類人生RP !? 🏵️ + +🌅 FreeCityHK 可能就係你可以嘗試嘅選擇,你可以建立你嘅國家、城邦。🌅 + +🍻 你可以喺依度招兵買馬造就你嘅軍團,廣交結社成立你嘅暗部。 🍻 + +☀️ 每個人都有你嘅過往,而唔知喺依個世界你嘅選擇,又會造就點嘅全新篇章呢!?☀️ + +🥠 你嘅 RP 故事正在由你編寫中,我地期待著... 🥠 +``` + +[FreeCityHK Minecraft 3.0介紹影片](https://www.youtube.com/watch?v=gmT4nW-8rFk) + +## 功能 & 指令 +- 頻道名顯示在線人數,每10分鐘更新一次 +- 查看玩家ID和skin `/player {玩家名}` +- 查看在線玩家 `/online` +- 查看伺服器狀態 `/server` +- 加白名單 `/whitelist {玩家名} ` +- 遊戲畫面公告 `/noti {公告内容}` +- 聊天訊息 `/say {訊息内容}` + +## 設定 (.env) +- `TOKEN` —— Discord Bot 的 Token +- `CHANNEL_ID` —— 可以使用 Bot 指令的頻道ID(如多個頻道可用`,`分隔) +- `UPDATE_CHANNEL` —— 顯示在線人數的頻道ID(如多個頻道可用`,`分隔) +- `SERVER` —— Minecraft Server 地址 +- `QUERY_PORT` —— Minecraft Server Query Port +- `RCON_PORT` —— Minecraft Server Rcon Port +- `RCON_PW` —— Minecraft Server Rcon 密碼 +- `PLAYER_API` —— 以玩家名取得玩家ID的API,使用`{{NAME}}`取代玩家名 +- `PROFILE_API` —— 以玩家ID取得玩家資料的API,使用`{{PLAYER_ID}}`取代玩家ID + +## 使用方法 + +> 有關建立和設定 Discord Bot 的方法,請自行了解。 + +1. `yarn install` 或 `npm install` 安裝所需的 dependencies +2. 把 `sample.env` 重新命名為 `.env` +3. 填寫設定 +4. `yarn run build` 或 `npm run build` 進行編譯 +5. `yarn start` 或 `npm start` 使用 PM2 運行 +6. 如果沒有/不想用PM2,可以 `yarn run test` 或 `npm run test` 使用 Node.js 直接運行 + + +## 歡迎加入 FreeCityHK Minecraft Discord +[![FreeCityHK Minecraft Discord](.readme/discord_400.png 'Discord')](https://discord.freecityhk.city) + + +## Credits +- [axios](https://github.com/axios/axios) +- [Crafatar](https://github.com/crafatar/crafatar/) (Minecraft Skin render 方法) +- [node-canvas](https://github.com/Automattic/node-canvas) +- [discord.js](https://github.com/discordjs/discord.js) +- [dotenv](https://github.com/motdotla/dotenv) +- [minecraft-server-util](https://github.com/PassTheMayo/minecraft-server-util) +- [node-schedule](https://github.com/node-schedule/node-schedule) diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 0000000..c542b6f --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,15 @@ +module.exports = { + apps : [{ + name : "freecityhk-mc-dc-bot", + script: 'run/app.js', + watch: false, + watch_delay: 1000, + ignore_watch : ["node_modules"], + //exec_mode: "cluster", + //instances: 2, + max_memory_restart: "2G", + log_date_format: "YYYY-MM-DD HH:mm:ss", + error_file: "./logs/error.log", + out_file: "./logs/out.log" + }], +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000..0af2dd7 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "name": "freecityhk-minecraft-discord-bot", + "version": "1.0.0", + "main": "run/app.js", + "license": "MIT", + "author": "jasonfoknxu (https://nxuweb.net)", + "repository": "github:jasonfoknxu/freecityhk-minecraft-discord-bot", + "scripts": { + "start": "pm2 start ecosystem.config.js --no-daemon", + "build": "tsc -p tsconfig.json", + "test": "node run/app.js" + }, + "dependencies": { + "axios": "^1.3.4", + "canvas": "^2.11.0", + "discord.js": "^14.8.0", + "dotenv": "^16.0.3", + "minecraft-server-util": "^5.4.0", + "node-schedule": "^2.1.1" + }, + "devDependencies": { + "@types/node-schedule": "^2.1.0", + "typescript": "^5.0.2" + } +} diff --git a/sample.env b/sample.env new file mode 100644 index 0000000..8179ebb --- /dev/null +++ b/sample.env @@ -0,0 +1,12 @@ +# Discord +TOKEN= +CHANNEL_ID= +UPDATE_CHANNEL= + +# Minecraft +SERVER= +QUERY_PORT= +RCON_PORT= +RCON_PW= +PLAYER_API=https://api.mojang.com/users/profiles/minecraft/{{NAME}} +PROFILE_API=https://sessionserver.mojang.com/session/minecraft/profile/{{PLAYER_ID}} \ No newline at end of file diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..b766163 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,144 @@ +import { Client, GatewayIntentBits, VoiceChannel } from 'discord.js'; +import { config } from './config'; +import { getServerInfo, getOnlinePlayers, onlineCommand, serverCommand } from './commands/ServerInfo'; +import { playerCommand, getPlayer } from './commands/playerInfo'; +import { add2Whitelist, notiPlayer, notiPlayerCommand, say, sayCommand, whitelistCommand } from './commands/minecraft'; +import { render } from './render'; +import * as schedule from "node-schedule"; + +const client = new Client({ intents: [GatewayIntentBits.Guilds ] }); + +client.on('ready', async () => { + if (client.user) { + console.log(`已登入 Discord: ${client.user.tag}`); + const allCommands = [playerCommand, onlineCommand, serverCommand, whitelistCommand, notiPlayerCommand, sayCommand]; + allCommands.forEach(async (command) => { + await client.application?.commands.create(command.toJSON()); + }); + } +}); + +client.on('interactionCreate', async (interaction) => { + if (!interaction.isChatInputCommand()) return; + + if (config.CHANNEL_ID.includes(interaction.channelId)) { + await interaction.deferReply(); + switch (interaction.commandName) { + case 'player': + const playerName = interaction.options.getString('玩家名'); + if (!playerName) { + await interaction.editReply('請輸入玩家名稱。'); + } else { + const getPlayerInfo = await getPlayer(playerName); + if (!getPlayerInfo) { + await interaction.editReply('\:warning: 出錯了,請稍後再試一次。'); + } else { + let model; + if (getPlayerInfo.textures.SKIN.url) { + model = await render(getPlayerInfo.textures.SKIN.url); + } + let replyMessage: { files?: any; content: string } = { + content: `玩家名:\`${getPlayerInfo.profileName}\`\n玩家ID:\`${getPlayerInfo.profileId}\`\n`, + }; + if (model) { + replyMessage = { ...replyMessage, files: [{ attachment: model }] }; + } + await interaction.editReply(replyMessage); + } + } + break; + case 'online': + const onlinePlayers = await getOnlinePlayers(); + if (!onlinePlayers?.list) { + await interaction.editReply('伺服器目前為離線狀態,或無法取得在線玩家數,請稍後再試一次。'); + } else { + let reply = '目前有 `' + onlinePlayers.online + '` 名玩家在線'; + if (onlinePlayers.online > 0) { + reply += ':\n'; + } + onlinePlayers.list.forEach((player) => { + reply += '\n\:bust_in_silhouette: ' + player; + }); + await interaction.editReply(reply); + } + break; + case 'server': + const serverInfo = await getServerInfo(); + if (!serverInfo) { + await interaction.editReply('伺服器目前為離線狀態。'); + } else { + let result = `【FreeCityHK Minecraft】\n${serverInfo.motd.clean}\n版本:\`${serverInfo.version}\`\n玩家人數:\`${serverInfo.players.online}/${serverInfo.players.max}\``; + await interaction.editReply(result); + } + break; + case 'whitelist': + const newPlayerName = interaction.options.getString('玩家名'); + if (!newPlayerName) { + await interaction.editReply('請輸入玩家名稱。'); + } else { + const updateWhitelist = await add2Whitelist(newPlayerName); + if (!updateWhitelist) { + await interaction.editReply('\:warning: 出錯了,請稍後再試一次。'); + } else { + await interaction.editReply(updateWhitelist); + } + } + break; + case 'noti': + const notiMessage = interaction.options.getString('公告訊息'); + if (!notiMessage) { + await interaction.editReply('請輸入要發放的公告通知。'); + } else { + const notiResult = await notiPlayer(notiMessage); + if (!notiResult) { + await interaction.editReply('\:warning: 出錯了,請稍後再試一次。'); + } else { + await interaction.editReply(notiResult); + } + } + break; + case 'say': + const sayMessage = interaction.options.getString('訊息'); + if (!sayMessage) { + await interaction.editReply('請輸入要發送的訊息。'); + } else { + await say(sayMessage); + await interaction.editReply(`已發送訊息:${sayMessage}`); + } + break; + } + } +}); + + +const updateChannelName = async () => { + if (config.UPDATE_CHANNEL) { + const serverInfo = await getServerInfo(); + const onlinePlayers = serverInfo?.players.online ?? '🔴'; + let title = `🎲|在線人數:${onlinePlayers}`; // 𝐅𝐫𝐞𝐞𝐂𝐢𝐭𝐲𝐇𝐊 + + config.UPDATE_CHANNEL.forEach(async (channelId) => { + const channel = await client.channels.fetch(channelId) as VoiceChannel; + + if (channel.name !== title) { + channel.setName(title); + } + }); + } +} + +const start = () => { + try { + client.login(config.TOKEN); + } catch (err) { + console.error(err); + process.exit(1); + } +}; + +start(); + + +const job = schedule.scheduleJob('*/10 * * * *', async () => { + await updateChannelName(); +}); \ No newline at end of file diff --git a/src/commands/minecraft.ts b/src/commands/minecraft.ts new file mode 100644 index 0000000..996e5a2 --- /dev/null +++ b/src/commands/minecraft.ts @@ -0,0 +1,67 @@ +import { config } from '../config'; +import * as util from 'minecraft-server-util'; +import { SlashCommandBuilder } from 'discord.js'; + +const add2Whitelist = async (playerName: string) => { + try { + const client = new util.RCON(); + await client.connect(config.SERVER, config.RCON_PORT /* , options */); + await client.login(config.RCON_PW); + const message = await client.execute(`whitelist add ${playerName}`); + return message; + } catch (e) { + return null; + } +}; + +const notiPlayer = async (message: string, color: string = 'light_purple') => { + try { + const client = new util.RCON(); + await client.connect(config.SERVER, config.RCON_PORT /* , options */); + await client.login(config.RCON_PW); + const result = await client.execute( + `/title @a title {"text":"${string2Unicode(message)}","bold":true,"color":"${color}"}` + ); + return result; + } catch (e) { + return null; + } +}; + +const say = async (message: string) => { + try { + const client = new util.RCON(); + await client.connect(config.SERVER, config.RCON_PORT /* , options */); + await client.login(config.RCON_PW); + const result = await client.execute(`say ${message}`); + return result; + } catch (e) { + return null; + } +}; + +const string2Unicode = (str: string) => { + let result = ''; + for (let i = 0; i < str.length; i++) { + const code = str.charCodeAt(i).toString(16).toUpperCase(); + result += '\\u' + '0'.repeat(4 - code.length) + code; + } + return result; +}; + +const whitelistCommand = new SlashCommandBuilder() + .setName('whitelist') + .setDescription('將玩家加入白名單') + .addStringOption((option) => option.setName('玩家名').setDescription('Minecraft 玩家的名稱').setRequired(true)); + +const notiPlayerCommand = new SlashCommandBuilder() + .setName('noti') + .setDescription('發放公告通知,將會在玩家畫面中間顯示') + .addStringOption((option) => option.setName('公告訊息').setDescription('公告内容').setRequired(true)); + +const sayCommand = new SlashCommandBuilder() + .setName('say') + .setDescription('透過聊天向多個玩家發送訊息') + .addStringOption((option) => option.setName('訊息').setDescription('訊息内容').setRequired(true)); + +export { add2Whitelist, notiPlayer, say, whitelistCommand, notiPlayerCommand, sayCommand }; diff --git a/src/commands/playerInfo.ts b/src/commands/playerInfo.ts new file mode 100644 index 0000000..66a0248 --- /dev/null +++ b/src/commands/playerInfo.ts @@ -0,0 +1,54 @@ +import { SlashCommandBuilder } from 'discord.js'; +import { config } from '../config'; +import axios, { AxiosResponse } from 'axios'; +import { Player } from '../interface/Player'; +import { PlayerProfile } from '../interface/PlayerProfile'; + +const getPlayerId = async (name: string): Promise => { + const name2IdApi = config.PLAYER_API.replace('{{NAME}}', name); + const player: AxiosResponse | null = await axios.get(name2IdApi).catch(() => { + return null; + }); + if (!player?.data) { + return null; + } + return player.data; +}; + +const getPlayerProfile = async (playerId: string): Promise => { + const profileApi = config.PROFILE_API.replace('{{PLAYER_ID}}', playerId); + const playerProfile = await axios.get(profileApi).catch(() => { + return null; + }); + if (!playerProfile?.data) { + return null; + } + + if (playerProfile.data.properties[0]?.value) { + const playerData: PlayerProfile = JSON.parse( + Buffer.from(playerProfile.data.properties[0].value, 'base64').toString('binary') + ); + return playerData; + } + + return null; +}; + +const getPlayer = async (name: string) => { + const playerInfo = await getPlayerId(name); + if (!playerInfo) { + return null; + } + const profile = await getPlayerProfile(playerInfo.id); + if (!profile) { + return { profileId: playerInfo.id, profileName: playerInfo.name }; + } + return profile; +}; + +const playerCommand = new SlashCommandBuilder() + .setName('player') + .setDescription('查看 Minecraft 玩家資料') + .addStringOption((option) => option.setName('玩家名').setDescription('Minecraft 玩家的名稱').setRequired(true)); + +export { playerCommand, getPlayerId, getPlayerProfile, getPlayer }; diff --git a/src/commands/serverInfo.ts b/src/commands/serverInfo.ts new file mode 100644 index 0000000..2bf6b7d --- /dev/null +++ b/src/commands/serverInfo.ts @@ -0,0 +1,30 @@ +import { SlashCommandBuilder, Client } from 'discord.js'; +import * as util from 'minecraft-server-util'; +import { config } from '../config'; +import { ServerInfo } from '../interface/ServerInfo'; + +const getServerInfo = async (): Promise => { + try { + const query: ServerInfo = await util.queryFull(config.SERVER, config.QUERY_PORT /* , options */); + if (!query) { + return null; + } + return query; + } catch (e) { + return null; + } +}; + +const getOnlinePlayers = async () => { + const serverInfo = await getServerInfo(); + if (!serverInfo?.players) { + return null; + } + return serverInfo.players; +}; + +const onlineCommand = new SlashCommandBuilder().setName('online').setDescription('查看 FreeCityHK 在線玩家'); + +const serverCommand = new SlashCommandBuilder().setName('server').setDescription('FreeCityHK Minecraft 伺服器'); + +export { getServerInfo, getOnlinePlayers, onlineCommand, serverCommand }; diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..b823869 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,40 @@ +import * as dotenv from 'dotenv'; + +const loadConfig = dotenv.config(); +if (loadConfig.error) { + console.error('[ERROR] Cannot load config'); + throw loadConfig.error; +} + +const parsedConfig = loadConfig.parsed; + +if (!parsedConfig) { + console.error('[ERROR] Cannot parse config'); + throw new Error(); +} + +interface Config { + TOKEN: string; + CHANNEL_ID: string[]; + UPDATE_CHANNEL: string[]; + SERVER: string; + QUERY_PORT: number; + RCON_PORT: number; + RCON_PW: string; + PLAYER_API: string; + PROFILE_API: string; +} + +const config: Config = { + TOKEN: parsedConfig.TOKEN, + CHANNEL_ID: parsedConfig.CHANNEL_ID.split(','), + UPDATE_CHANNEL: parsedConfig.UPDATE_CHANNEL.split(','), + SERVER: parsedConfig.SERVER, + QUERY_PORT: parseInt(parsedConfig.QUERY_PORT ?? '25565'), + RCON_PORT: parseInt(parsedConfig.RCON_PORT ?? '25575'), + RCON_PW: parsedConfig.RCON_PW, + PLAYER_API: parsedConfig.PLAYER_API, + PROFILE_API: parsedConfig.PROFILE_API, +}; + +export { config }; diff --git a/src/interface/Player.ts b/src/interface/Player.ts new file mode 100644 index 0000000..f026259 --- /dev/null +++ b/src/interface/Player.ts @@ -0,0 +1,7 @@ +interface Player { + id: string, + name: string, + properties?: any +} + +export {Player}; \ No newline at end of file diff --git a/src/interface/PlayerProfile.ts b/src/interface/PlayerProfile.ts new file mode 100644 index 0000000..67888d2 --- /dev/null +++ b/src/interface/PlayerProfile.ts @@ -0,0 +1,20 @@ +interface PlayerProfile { + timestamp?: number | string, + profileId: string, + profileName: string, + textures?: PlayerTextures | any, + [key: string]: any +} + +interface PlayerTextures { + SKIN: PlayerSkin, + [key: string]: any +} + +interface PlayerSkin { + url: string, + metadata: any, + [key: string]: any +} + +export {PlayerProfile, PlayerTextures, PlayerSkin} \ No newline at end of file diff --git a/src/interface/ServerInfo.ts b/src/interface/ServerInfo.ts new file mode 100644 index 0000000..b3d0930 --- /dev/null +++ b/src/interface/ServerInfo.ts @@ -0,0 +1,25 @@ +interface ServerInfo { + motd: motd, + version: string, + software?: string, + plugins?: any, + map: string, + players: playerInfo, + hostIP?: string, + hostPort?: number, + [key: string]: any +} + +interface motd { + raw: string, + clean: string, + html: string +} + +interface playerInfo { + online: number, + max: number, + list: string[] +} + +export {ServerInfo} diff --git a/src/render.ts b/src/render.ts new file mode 100644 index 0000000..dbe824a --- /dev/null +++ b/src/render.ts @@ -0,0 +1,205 @@ +// Reference: https://github.com/crafatar/crafatar/ + +import * as cvs from 'canvas'; + +const removeOpacity = (canvas: cvs.Canvas) => { + let ctx = canvas.getContext('2d'); + let imagedata = ctx.getImageData(0, 0, canvas.width, canvas.height); + let data = imagedata.data; + for (let i = 0; i < data.length; i += 4) { + data[i + 3] = 255; + } + ctx.putImageData(imagedata, 0, 0); + return canvas; +}; + +const containsOpacity = (canvas: cvs.Canvas) => { + let ctx = canvas.getContext('2d'); + let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; + for (let i = 3; i < imageData.length; i += 4) { + if (imageData[i] < 255) { + return true; + } + } + return false; +}; + +const resize = (src: cvs.Canvas, scale: number) => { + let dst = cvs.createCanvas(scale * src.width, scale * src.height); + let context = dst.getContext('2d'); + context.patternQuality = 'fast'; + context.drawImage(src, 0, 0, src.width * scale, src.height * scale); + return dst; +}; + +function getPart(src: cvs.Image, x: number, y: number, width: number, height: number, scale: number) { + let dst = cvs.createCanvas(scale * width, scale * height); + let context = dst.getContext('2d'); + context.patternQuality = 'fast'; + context.drawImage(src, x, y, width, height, 0, 0, width * scale, height * scale); + return dst; +} + +function flip(src: cvs.Canvas) { + let dst = cvs.createCanvas(src.width, src.height); + let context = dst.getContext('2d'); + context.scale(-1, 1); + context.drawImage(src, -src.width, 0); + return dst; +} + +const skewA = 26 / 45; // 0.57777777 +const skewB = skewA * 2; // 1.15555555 + +const render = async ( + img: string, + scale: number = 6, + overlay: boolean = true, + renderBody: boolean = true, + slim: boolean = false +) => { + let canvas = cvs.createCanvas(scale * 20, scale * (renderBody ? 45.1 : 18.5)); + let ctx = canvas.getContext('2d'); + const skin = await cvs.loadImage(img); + let oldSkin = skin.height === 32; + let armWidth = slim ? 3 : 4; + + let headTop = resize(removeOpacity(getPart(skin, 8, 0, 8, 8, 1)), scale); + let headFront = resize(removeOpacity(getPart(skin, 8, 8, 8, 8, 1)), scale); + let headRight = resize(removeOpacity(getPart(skin, 0, 8, 8, 8, 1)), scale); + + let armRightTop = resize(removeOpacity(getPart(skin, 44, 16, armWidth, 4, 1)), scale); + let armRightFront = resize(removeOpacity(getPart(skin, 44, 20, armWidth, 12, 1)), scale); + let armRightSide = resize(removeOpacity(getPart(skin, 40, 20, 4, 12, 1)), scale); + + let armLeftTop = oldSkin ? flip(armRightTop) : resize(removeOpacity(getPart(skin, 36, 48, armWidth, 4, 1)), scale); + let armLeftFront = oldSkin + ? flip(armRightFront) + : resize(removeOpacity(getPart(skin, 36, 52, armWidth, 12, 1)), scale); + + let legRightFront = resize(removeOpacity(getPart(skin, 4, 20, 4, 12, 1)), scale); + let legRightSide = resize(removeOpacity(getPart(skin, 0, 20, 4, 12, 1)), scale); + + let legLeftFront = oldSkin ? flip(legRightFront) : resize(removeOpacity(getPart(skin, 20, 52, 4, 12, 1)), scale); + + let bodyFront = resize(removeOpacity(getPart(skin, 20, 20, 8, 12, 1)), scale); + + if (overlay) { + if (containsOpacity(getPart(skin, 32, 0, 32, 32, 1))) { + // render head overlay + headTop.getContext('2d').drawImage(getPart(skin, 40, 0, 8, 8, scale), 0, 0); + headFront.getContext('2d').drawImage(getPart(skin, 40, 8, 8, 8, scale), 0, 0); + headRight.getContext('2d').drawImage(getPart(skin, 32, 8, 8, 8, scale), 0, 0); + } + + if (!oldSkin) { + let bodyArea = getPart(skin, 16, 32, 32, 16, 1); + let rightArm = getPart(skin, 48, 48, 16, 16, 1); + let leftArm = getPart(skin, 40, 32, 16, 16, 1); + let rightLeg = getPart(skin, 0, 32, 16, 16, 1); + let leftLeg = getPart(skin, 0, 48, 16, 16, 1); + + if (containsOpacity(bodyArea)) { + // render body overlay + bodyFront.getContext('2d').drawImage(getPart(skin, 20, 36, 8, 12, scale), 0, 0); + } + + if (containsOpacity(rightArm)) { + // render right arm overlay + armRightTop.getContext('2d').drawImage(getPart(skin, 44, 32, armWidth, 4, scale), 0, 0); + armRightFront.getContext('2d').drawImage(getPart(skin, 44, 36, armWidth, 12, scale), 0, 0); + armRightSide.getContext('2d').drawImage(getPart(skin, 40, 36, 4, 12, scale), 0, 0); + } + + if (containsOpacity(leftArm)) { + // render left arm overlay + armLeftTop.getContext('2d').drawImage(getPart(skin, 36 + 16, 48, armWidth, 4, scale), 0, 0); + armLeftFront.getContext('2d').drawImage(getPart(skin, 36 + 16, 52, armWidth, 12, scale), 0, 0); + } + + if (containsOpacity(rightLeg)) { + // render right leg overlay + legRightFront.getContext('2d').drawImage(getPart(skin, 4, 36, 4, 12, scale), 0, 0); + legRightSide.getContext('2d').drawImage(getPart(skin, 0, 36, 4, 12, scale), 0, 0); + } + + if (containsOpacity(leftLeg)) { + // render left leg overlay + legLeftFront.getContext('2d').drawImage(getPart(skin, 4, 52, 4, 12, scale), 0, 0); + } + } + } + + let x = 0; + let y = 0; + let z = 0; + + let zOffset = scale * 3; + let xOffset = scale * 2; + + if (renderBody) { + // pre-render front onto separate canvas + let front = cvs.createCanvas(scale * 16, scale * 24); + let frontCtx = front.getContext('2d'); + frontCtx.patternQuality = 'fast'; + + frontCtx.drawImage(armRightFront, (4 - armWidth) * scale, 0 * scale, armWidth * scale, 12 * scale); + frontCtx.drawImage(armLeftFront, 12 * scale, 0 * scale, armWidth * scale, 12 * scale); + frontCtx.drawImage(bodyFront, 4 * scale, 0 * scale, 8 * scale, 12 * scale); + frontCtx.drawImage(legRightFront, 4 * scale, 12 * scale, 4 * scale, 12 * scale); + frontCtx.drawImage(legLeftFront, 8 * scale, 12 * scale, 4 * scale, 12 * scale); + + // top + x = xOffset + scale * 2; + y = scale * -armWidth; + z = zOffset + scale * 8; + ctx.setTransform(new cvs.DOMMatrix([1, -skewA, 1, skewA, 0, 0])); + ctx.drawImage(armRightTop, y - z - 0.5, x + z, armRightTop.width + 1, armRightTop.height + 1); + + y = scale * 8; + ctx.drawImage(armLeftTop, y - z, x + z, armLeftTop.width, armLeftTop.height + 1); + + // right side + ctx.setTransform(new cvs.DOMMatrix([1, skewA, 0, skewB, 0, 0])); + x = xOffset + scale * 2; + y = 0; + z = zOffset + scale * 20; + ctx.drawImage(legRightSide, x + y, z - y, legRightSide.width, legRightSide.height); + + x = xOffset + scale * 2; + y = scale * -armWidth; + z = zOffset + scale * 8; + ctx.drawImage(armRightSide, x + y, z - y - 0.5, armRightSide.width, armRightSide.height + 1); + + // front + z = zOffset + scale * 12; + y = 0; + ctx.setTransform(new cvs.DOMMatrix([1, -skewA, 0, skewB, 0, skewA])); + ctx.drawImage(front, y + x, x + z - 0.5, front.width, front.height); + } + + // head top + x = xOffset; + y = -0.5; + z = zOffset; + ctx.setTransform(new cvs.DOMMatrix([1, -skewA, 1, skewA, 0, 0])); + ctx.drawImage(headTop, y - z, x + z, headTop.width, headTop.height + 1); + + // head front + x = xOffset + 8 * scale; + y = 0; + z = zOffset - 0.5; + ctx.setTransform(new cvs.DOMMatrix([1, -skewA, 0, skewB, 0, skewA])); + ctx.drawImage(headFront, y + x, x + z, headFront.width, headFront.height); + + // head right + x = xOffset; + y = 0; + z = zOffset; + ctx.setTransform(new cvs.DOMMatrix([1, skewA, 0, skewB, 0, 0])); + ctx.drawImage(headRight, x + y, z - y - 0.5, headRight.width + 0.5, headRight.height + 1); + + return canvas.toBuffer(); +}; + +export { render }; diff --git a/src/util.ts b/src/util.ts new file mode 100644 index 0000000..b41ad69 --- /dev/null +++ b/src/util.ts @@ -0,0 +1,8 @@ +const number2Digit = (num: number | string) => { + const chars = num.toString().split(''); + const digit = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; + const convert = chars.map((char) => digit[parseInt(char)]); + return convert.join(''); +}; + +export { number2Digit }; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..b49fd91 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "lib": ["es6", "dom", "es2017"], + "strict": true, + "outDir": "run", + "rootDir": "src", + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + }, + "include": [ + "src/*" + ], +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..1df78cb --- /dev/null +++ b/yarn.lock @@ -0,0 +1,734 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@discordjs/builders@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.5.0.tgz" + integrity sha512-7XxT78mnNBPigHn2y6KAXkicxIBFtZREGWaRZ249EC1l6gBUEP8IyVY5JTciIjJArxkF+tg675aZvsTNTKBpmA== + dependencies: + "@discordjs/formatters" "^0.2.0" + "@discordjs/util" "^0.2.0" + "@sapphire/shapeshift" "^3.8.1" + discord-api-types "^0.37.35" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.3" + tslib "^2.5.0" + +"@discordjs/collection@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@discordjs/collection/-/collection-1.4.0.tgz" + integrity sha512-hiOJyk2CPFf1+FL3a4VKCuu1f448LlROVuu8nLz1+jCOAPokUcdFAV+l4pd3B3h6uJlJQSASoZzrdyNdjdtfzQ== + +"@discordjs/formatters@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.2.0.tgz" + integrity sha512-vn4oMSXuMZUm8ITqVOtvE7/fMMISj4cI5oLsR09PEQXHKeKDAMLltG/DWeeIs7Idfy6V8Fk3rn1e69h7NfzuNA== + dependencies: + discord-api-types "^0.37.35" + +"@discordjs/rest@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-1.6.0.tgz" + integrity sha512-HGvqNCZ5Z5j0tQHjmT1lFvE5ETO4hvomJ1r0cbnpC1zM23XhCpZ9wgTCiEmaxKz05cyf2CI9p39+9LL+6Yz1bA== + dependencies: + "@discordjs/collection" "^1.4.0" + "@discordjs/util" "^0.2.0" + "@sapphire/async-queue" "^1.5.0" + "@sapphire/snowflake" "^3.4.0" + discord-api-types "^0.37.35" + file-type "^18.2.1" + tslib "^2.5.0" + undici "^5.20.0" + +"@discordjs/util@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@discordjs/util/-/util-0.2.0.tgz" + integrity sha512-/8qNbebFzLWKOOg+UV+RB8itp4SmU5jw0tBUD3ifElW6rYNOj1Ku5JaSW7lLl/WgjjxF01l/1uQPCzkwr110vg== + +"@mapbox/node-pre-gyp@^1.0.0": + version "1.0.10" + resolved "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz" + integrity sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA== + dependencies: + detect-libc "^2.0.0" + https-proxy-agent "^5.0.0" + make-dir "^3.1.0" + node-fetch "^2.6.7" + nopt "^5.0.0" + npmlog "^5.0.1" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.11" + +"@sapphire/async-queue@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz" + integrity sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA== + +"@sapphire/shapeshift@^3.8.1": + version "3.8.1" + resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.8.1.tgz" + integrity sha512-xG1oXXBhCjPKbxrRTlox9ddaZTvVpOhYLmKmApD/vIWOV1xEYXnpoFs68zHIZBGbqztq6FrUPNPerIrO1Hqeaw== + dependencies: + fast-deep-equal "^3.1.3" + lodash "^4.17.21" + +"@sapphire/snowflake@^3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.4.0.tgz" + integrity sha512-zZxymtVO6zeXVMPds+6d7gv/OfnCc25M1Z+7ZLB0oPmeMTPeRWVPQSS16oDJy5ZsyCOLj7M6mbZml5gWXcVRNw== + +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@types/node-schedule@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/node-schedule/-/node-schedule-2.1.0.tgz#60375640c0509bab963573def9d1f417f438c290" + integrity sha512-NiTwl8YN3v/1YCKrDFSmCTkVxFDylueEqsOFdgF+vPsm+AlyJKGAo5yzX1FiOxPsZiN6/r8gJitYx2EaSuBmmg== + dependencies: + "@types/node" "*" + +"@types/node@*": + version "18.15.3" + resolved "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz" + integrity sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw== + +"@types/ws@^8.5.4": + version "8.5.4" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz" + integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== + dependencies: + "@types/node" "*" + +abbrev@1: + 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@6: + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +"aproba@^1.0.3 || ^2.0.0": + 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@^2.0.0: + 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" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz" + integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +brace-expansion@^1.1.7: + 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" + +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +canvas@^2.11.0: + version "2.11.0" + resolved "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz" + integrity sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g== + dependencies: + "@mapbox/node-pre-gyp" "^1.0.0" + nan "^2.17.0" + simple-get "^3.0.3" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +color-support@^1.1.2: + 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== + +combined-stream@^1.0.8: + 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" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +console-control-strings@^1.0.0, console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + +cron-parser@^4.2.0: + version "4.8.1" + resolved "https://registry.npmjs.org/cron-parser/-/cron-parser-4.8.1.tgz" + integrity sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ== + dependencies: + luxon "^3.2.1" + +debug@4: + 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" + +decompress-response@^4.2.0: + version "4.2.1" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz" + integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== + dependencies: + mimic-response "^2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + +detect-libc@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" + integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== + +discord-api-types@^0.37.35: + version "0.37.36" + resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.36.tgz" + integrity sha512-Nlxmp10UpVr/utgZ9uODQvG2Or+5w7LFrvFMswyeKC9l/+UaqGT6H0OVgEFhu9GEO4U6K7NNO5W8Carv7irnCA== + +discord.js@^14.8.0: + version "14.8.0" + resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.8.0.tgz" + integrity sha512-UOxYtc/YnV7jAJ2gISluJyYeBw4e+j8gWn+IoqG8unaHAVuvZ13DdYN0M1f9fbUgUvSarV798inIrYFtDNDjwQ== + dependencies: + "@discordjs/builders" "^1.5.0" + "@discordjs/collection" "^1.4.0" + "@discordjs/formatters" "^0.2.0" + "@discordjs/rest" "^1.6.0" + "@discordjs/util" "^0.2.0" + "@sapphire/snowflake" "^3.4.0" + "@types/ws" "^8.5.4" + discord-api-types "^0.37.35" + fast-deep-equal "^3.1.3" + lodash.snakecase "^4.1.1" + tslib "^2.5.0" + undici "^5.20.0" + ws "^8.12.1" + +dotenv@^16.0.3: + version "16.0.3" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz" + integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +file-type@^18.2.1: + version "18.2.1" + resolved "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz" + integrity sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg== + dependencies: + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0" + token-types "^5.0.1" + +follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +form-data@^4.0.0: + 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" + +fs-minipass@^2.0.0: + 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" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +gauge@^3.0.0: + 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" + +glob@^7.1.3: + 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" + +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== + +https-proxy-agent@^5.0.0: + 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" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + 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" + +inherits@2, inherits@^2.0.3: + 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@^3.0.0: + 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== + +lodash.snakecase@^4.1.1: + version "4.1.1" + 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.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +long-timeout@0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz" + integrity sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w== + +lru-cache@^6.0.0: + 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" + +luxon@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz" + integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg== + +make-dir@^3.1.0: + 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" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + 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" + +mimic-response@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== + +minecraft-motd-util@^1.1.9: + version "1.1.12" + resolved "https://registry.npmjs.org/minecraft-motd-util/-/minecraft-motd-util-1.1.12.tgz" + integrity sha512-5TuTRjrRupSTruea0nRC37r0FdhkS1O4wIJKAYfwJRCQd/X4Zyl/dVIs96h9UVW6N8jhIuz9pNkrDsqyN7VBdA== + +minecraft-server-util@^5.4.0: + version "5.4.0" + resolved "https://registry.npmjs.org/minecraft-server-util/-/minecraft-server-util-5.4.0.tgz" + integrity sha512-KvwS125IxSK5vWvYp2mMuotRCZkHPkEL/iuHcfeDdBtn+GvvSdIgln/Ucy/+yyE9WN64Y64HluSHjd4W8Mlz1Q== + dependencies: + minecraft-motd-util "^1.1.9" + +minimatch@^3.1.1: + 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" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.0.0: + version "4.2.5" + resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz" + integrity sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q== + +minizlib@^2.1.1: + 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" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +nan@^2.17.0: + version "2.17.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" + integrity sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ== + +node-fetch@^2.6.7: + version "2.6.9" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz" + integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg== + dependencies: + whatwg-url "^5.0.0" + +node-schedule@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/node-schedule/-/node-schedule-2.1.1.tgz#6958b2c5af8834954f69bb0a7a97c62b97185de3" + integrity sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ== + dependencies: + cron-parser "^4.2.0" + long-timeout "0.1.1" + sorted-array-functions "^1.3.0" + +nopt@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz" + integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== + dependencies: + abbrev "1" + +npmlog@^5.0.1: + 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" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +once@^1.3.0, once@^1.3.1: + 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" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +peek-readable@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz" + integrity sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A== + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readable-web-to-node-stream@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz" + integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw== + dependencies: + readable-stream "^3.6.0" + +rimraf@^3.0.2: + 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" + +safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.5: + version "7.3.8" + resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + +set-blocking@^2.0.0: + 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@^3.0.0: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^3.0.3: + version "3.1.1" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz" + integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA== + dependencies: + decompress-response "^4.2.0" + once "^1.3.1" + simple-concat "^1.0.0" + +sorted-array-functions@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz" + integrity sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: + 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" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^6.0.1: + 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" + +strtok3@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz" + integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ== + dependencies: + "@tokenizer/token" "^0.3.0" + peek-readable "^5.0.0" + +tar@^6.1.11: + version "6.1.13" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz" + integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^4.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +token-types@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== + dependencies: + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-mixer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz" + integrity sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ== + +tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + +typescript@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz" + integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw== + +undici@^5.20.0: + version "5.21.0" + resolved "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz" + integrity sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA== + dependencies: + busboy "^1.6.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +webidl-conversions@^3.0.0: + 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@^5.0.0: + 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" + +wide-align@^1.1.2: + 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" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^8.12.1: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==