├── .dockerignore ├── .env.example ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .prettierignore ├── .prettierrc ├── Dockerfile ├── LICENSE ├── README.md ├── commands ├── bug.js ├── chart.js ├── help.js ├── ip.js ├── log.js ├── news.js ├── ping.js ├── rmchann.js ├── setip.js └── setup.js ├── database ├── ServerSchema.js └── logSchema.js ├── docker-compose.yml ├── events ├── guildadd.js ├── guildleave.js ├── messageCreate.js └── ready.js ├── index.js ├── miscellaneous ├── Privacy_policy.md └── icon.png ├── modules ├── cache.js ├── channupd.js ├── guildscan.js ├── logger.js ├── nodeLogger.js └── pinger.js ├── package.json └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Dependency directories 7 | **/node_modules/** 8 | 9 | # Git 10 | .git/ 11 | .gitignore 12 | .gitattributes 13 | 14 | # VSCode 15 | .vscode/ 16 | 17 | #dist 18 | dist/ 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | #docker 30 | docker/ 31 | docker-compose.yml 32 | docker-compose.override.yml -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | # This is a sample .env file. 2 | # Duplicate this file as .env in the root of the project 3 | # and input your link and token. 4 | 5 | # TOKEN is the discord token and DBURL is the mongo db link 6 | 7 | TOKEN= 8 | DBURL= 9 | 10 | # Top.gg api key 11 | TOPGGAPI= 12 | 13 | # Your user ID for the bug report command 14 | OWNERID= -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report a bug in the bot 4 | labels: 'bug' 5 | --- 6 | 7 | **Please describe the problem you are having in as much detail as possible:** 8 | 9 | **Steps to reproduce the behavior:** 10 | 11 | **Expected behavior:** 12 | 13 | **Screenshots:** 14 | If applicable, add screenshots to help explain your problem. 15 | 16 | **Additional Details:** 17 | - Are you hosting the bot yourself? 18 | - bot version (commit and branch) 19 | - nodejs version 20 | - operating system 21 | 22 | **Additional context** 23 | Add any other context about the problem here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest a new Feature or command 4 | labels: 'enhancement' 5 | --- 6 | 7 | **Is your feature request related to a problem? Please describe.** 8 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 9 | 10 | **Describe the solution you'd like** 11 | A clear and concise description of what you want to happen. 12 | 13 | **Describe alternatives you've considered** 14 | A clear and concise description of any alternative solutions or features you've considered. 15 | 16 | **Additional context** 17 | Add any other context or screenshots about the feature request here. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .github/ 3 | README.md 4 | miscellaneous/Privacy_policy.md 5 | LICENSE 6 | yarn.lock 7 | package.json -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 180, 3 | "tabWidth": 2, 4 | "semi": false, 5 | "singleQuote": true, 6 | "trailingComma": "none", 7 | "bracketSpacing": true 8 | } 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:17 2 | 3 | WORKDIR /app 4 | 5 | COPY package*.json ./ 6 | 7 | RUN yarn install --production 8 | 9 | COPY . . 10 | 11 | CMD ["yarn", "run", "start"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021-2022 cappig 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :warning: *This project is archived and im no longer working on it* :warning: 2 | 3 |
4 | 5 | ## MC status bot :robot: :chart_with_upwards_trend: 6 | 7 | [![Discord Bot status](https://top.gg/api/widget/status/816747912888975362.svg)](https://top.gg/bot/816747912888975362) 8 | [![Discord Bots](https://top.gg/api/widget/servers/816747912888975362.svg) ](https://top.gg/bot/816747912888975362) 9 | 10 |
11 | 12 | Let everyone in your Discord server quickly see the status of a minecraft server: 13 | 14 | ![img1](https://i.ibb.co/kQ05Pjx/example1.png) 15 | 16 | Create graphs, and log the status of a server: 17 | 18 | ![img2](https://i.ibb.co/grR1NY9/chartex.png) 19 | 20 | ### :arrow_right: **[Add this bot to your server](https://discord.com/oauth2/authorize?client_id=816747912888975362&permissions=269798480&scope=bot%20applications.commands)** 21 | 22 | ## *Commands* 23 | By putting the word 'bedrock' or just the letter 'b' the bot will ping this ip using the bedrock protocol. 24 | 25 |
26 | 27 | **Admin command:** 28 | 29 | `mc!log [on/off]` Turn logging on or off. 30 | 31 | `mc!setip [ip] [bedrock]` Set the ip that will be monitored. You can use this command to change the ip at any time. 32 | 33 | `mc!setup [ip] [bedrock]` Create the two channels that will display the server status. 34 | 35 | `mc!rmchann` Removes the monitoring channels 36 | 37 |
38 | 39 | **Normal commands:** 40 | 41 | `mc!help` List all the commands and what they do. 42 | 43 | `mc!ping [ip] [bedrock]` Ping a specified ip. You can use the command with no arguments to ping the ip specified by using the `mc!setip` command. 44 | 45 | `mc!chart uptime` Create a chart of players online over time on the server. 46 | 47 | `mc!chart playersonline` Create a chart of server uptime and calculate the uptime percentage. 48 | 49 | `mc!chart mostactive` Create a bar chart with the number of minutes each player spent on th server. 50 | 51 | `mc!news` Get the latest articles from minecraft.net 52 | 53 | `mc!ip` Return the default ip of the guild 54 | 55 | `mc!bug` Report a bug in the bot 56 | 57 |
58 | 59 | ## :information_source: *Notes and additional info* 60 | * Logging is turned off by default! You can turn it on by using the `mc!log` command. 61 | * The bot logs the status of the server every 5 minutes and it keeps 24 hours of logs. 62 | * When the bot leaves a server all logs and info connected to that servers guild id will be deleted. 63 | * Have questions? Join the [Support server](https://discord.gg/YzX5KdF4kq) and ask. 64 | 65 |
66 | 67 | ## *Maintainers* 68 | This project is currently maintained by: 69 | * [@404invalid-user](https://github.com/404invalid-user) 70 | * [@Cappig](https://github.com/cappig) 71 | 72 |
73 |
74 | 75 | * Read the privacy policy [here.](https://github.com/cappig/MC-status-bot/blob/main/miscellaneous/Privacy_policy.md) 76 | * The profile picture for this bot is based on the computer from the [ComputerCraft mod](https://www.computercraft.info/). The original picture can be found [here](https://feed-the-beast.fandom.com/wiki/ComputerCraft?file=Iso_Computer.png). The original image is licensed under the Creative Commons Attribution-Share Alike License, thus the [modified image](https://github.com/cappig/MC-status-bot/blob/main/miscellaneous/icon.png) is licensed under the same [license](https://creativecommons.org/licenses/by-sa/3.0/). 77 | -------------------------------------------------------------------------------- /commands/bug.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | 3 | module.exports = { 4 | name: 'bug', 5 | async execute(message, args, client) { 6 | const owner = await client.users.fetch(process.env.OWNERID) 7 | const bug = args.slice(0).join(' ') 8 | 9 | if (!bug) { 10 | message.channel.send('Please specify a bug that you would like to report.') 11 | } else { 12 | const embed = new Discord.MessageEmbed() 13 | .setTitle('New Bug report!') 14 | .addField('Author', message.author.toString(), true) 15 | .addField('Guild', `name: ${message.guild.name}\nid: ${message.guild.id}`, true) 16 | .addField('Report', bug) 17 | .setThumbnail(message.author.displayAvatarURL({ dynamic: true })) 18 | .setTimestamp() 19 | owner.send({ embeds: [embed] }) 20 | 21 | message.channel.send('Thank You for reporting a bug and helping to improve this bot! Your feedback is greatly appreciated!') 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /commands/chart.js: -------------------------------------------------------------------------------- 1 | const { ChartJSNodeCanvas } = require('chartjs-node-canvas') 2 | const moment = require('moment') 3 | const Discord = require('discord.js') 4 | const { lookup } = require('../modules/cache.js') 5 | 6 | module.exports = { 7 | name: 'chart', 8 | async execute(message, args) { 9 | if (!args.toString()) { 10 | message.channel.send('Please specify what you want to chart! Use `mc!chart uptime`, `mc!chart playersonline` or `mc!chart mostactive`') 11 | return 12 | } 13 | 14 | //message.channel.sendTyping(); 15 | // Get the ip. data.IP holds the ip 16 | const data = await lookup('Server', message.guild.id) 17 | if (!data.Logging) { 18 | return message.channel.send('This server has logging set to off. please ask an admin to do `mc!log on`') 19 | } 20 | 21 | // Get the logs 22 | const logs = await lookup('Log', message.guild.id) 23 | // Check if logs exist 24 | if (logs.length <= 1 || logs == null || !data.IP) { 25 | message.channel.send("This server doesn't have any logs. Make sure that logging is turned on by using the `mc!log on` command.") 26 | return 27 | } 28 | 29 | var xLabels = [], 30 | yLabels = [] 31 | 32 | if (args == 'playersonline') { 33 | // Check if logs are empty 34 | if (logs.length == 0) { 35 | message.channel.send('The logs are empty right now, please wait for them to update!') 36 | return 37 | } 38 | 39 | // Set the options for chart.js 40 | var type = 'line', 41 | label = 'number of players', 42 | line = 2, 43 | embedTitle = `Number of players online on ${data.IP}` 44 | 45 | logs.forEach((log) => { 46 | if (log.online == false) yLabels.push(0) 47 | else yLabels.push(log.playersOnline) 48 | 49 | xLabels.push(moment(log.timestamp).format('HH:mm')) 50 | }) 51 | 52 | var embedDescription = `There have been a maximum of ${Math.max(...yLabels)} players online at once, and a minimum of ${Math.min(...yLabels)}.` 53 | } else if (args == 'uptime') { 54 | // Check if logs are empty 55 | if (logs.length == 0) { 56 | message.channel.send('The logs are empty right now, please wait for them to update!') 57 | return 58 | } 59 | 60 | // Set the options for chart.js 61 | var type = 'line', 62 | label = 'uptime', 63 | embedTitle = `${data.IP}'s uptime`, 64 | line = 2, 65 | max = 1 66 | 67 | var up = 0, 68 | down = 0 69 | 70 | // calculate the uptime and percentage 71 | logs.forEach((log) => { 72 | if (log.online == true) { 73 | up++ 74 | yLabels.push(1) 75 | } else { 76 | down++ 77 | yLabels.push(0) 78 | } 79 | xLabels.push(moment(log.timestamp).format('HH:mm')) 80 | }) 81 | var embedDescription = `${data.IP} was up for ${up * 5} minutes and down for ${down * 5} minutes. This means that ${data.IP} has a uptime percentage of ${ 82 | Math.round(((up / (up + down)) * 100 + Number.EPSILON) * 100) / 100 83 | }%` 84 | } else if (args == 'mostactive') { 85 | // Set the options for chart.js 86 | var type = 'bar', 87 | label = 'number of minutes played', 88 | line = 1, 89 | embedTitle = `Most active players on ${data.IP} in the last 24 hours` 90 | 91 | var numberOfOccurrences = {}, 92 | playersList = [] 93 | 94 | // Get all the players recorded in the logs into a array 95 | logs.forEach((log) => { 96 | if (log.playerNamesOnline) { 97 | const players = log.playerNamesOnline.split(',') 98 | playersList.push(...players) 99 | } 100 | }) 101 | 102 | if (playersList.length == 0) { 103 | message.channel.send(`There were no player names logged. Either there were no players on the server or your server doesn't provide the list of connected players.`) 104 | return 105 | } 106 | 107 | // Create a object with the number of times a player has been online 108 | playersList.forEach(function (e) { 109 | if (numberOfOccurrences.hasOwnProperty(e)) numberOfOccurrences[e]++ 110 | else numberOfOccurrences[e] = 1 111 | }) 112 | 113 | // Sort it by the value 114 | const sorted = Object.entries(numberOfOccurrences) 115 | .sort(([c1, v1], [c2, v2]) => { 116 | return v2 - v1 117 | }) 118 | .reduce((o, [k, v]) => ((o[k] = v), o), {}) 119 | const arr = Object.entries(sorted) 120 | 121 | arr.forEach((element) => { 122 | xLabels.push(element[0]) 123 | yLabels.push(element[1] * 5) 124 | }) 125 | var embedDescription = `${xLabels[0]} was the most active player with ${yLabels[0]} minutes spent online in the last 24 hours.` 126 | } else { 127 | message.channel.send('mc!`' + args.toString() + "` isn't a valid option! Use `mc!chart uptime`, `mc!chart playersonline` or `mc!chart mostactive`") 128 | return 129 | } 130 | 131 | // Change the width of the chart based on the number of lines in the log 132 | switch (true) { 133 | case yLabels.length <= 30: 134 | var width = 500 135 | break 136 | case yLabels.length <= 40: 137 | var width = 600 138 | break 139 | case yLabels.length <= 50: 140 | var width = 700 141 | break 142 | case yLabels.length <= 60: 143 | var width = 900 144 | break 145 | default: 146 | var width = 1000 147 | break 148 | } 149 | 150 | // Chart.js 151 | const chartJSNodeCanvas = new ChartJSNodeCanvas({ 152 | width, 153 | height: 400 154 | }) 155 | ;(async () => { 156 | const configuration = { 157 | type, 158 | data: { 159 | labels: xLabels, 160 | datasets: [ 161 | { 162 | label, 163 | data: yLabels, 164 | fill: true, 165 | color: 'rgb(247, 247, 247)', 166 | backgroundColor: 'rgba(255, 99, 132, 0.2)', 167 | borderColor: 'rgba(255,99,132,1)', 168 | borderWidth: line, 169 | steppedLine: true 170 | } 171 | ] 172 | }, 173 | options: { 174 | elements: { 175 | point: { 176 | radius: 0 177 | } 178 | }, 179 | plugins: { 180 | legend: { 181 | labels: { 182 | color: 'rgb(247, 247, 247)', 183 | font: { 184 | size: 15 185 | } 186 | } 187 | } 188 | }, 189 | scales: { 190 | y: { 191 | beginAtZero: true, 192 | ticks: { 193 | color: 'rgb(247, 247, 247)', 194 | fontSize: 15, 195 | stepSize: 1, 196 | max, 197 | callback: function (value) { 198 | if (args == 'uptime') { 199 | if (value == 1) return 'online' 200 | if (value == 0) return 'offline' 201 | } else return value 202 | } 203 | } 204 | }, 205 | x: { 206 | ticks: { 207 | color: 'rgb(247, 247, 247)', 208 | fontSize: 13, 209 | stepSize: 1 210 | } 211 | } 212 | } 213 | } 214 | } 215 | 216 | const image = await chartJSNodeCanvas.renderToBuffer(configuration) 217 | 218 | // Send embed 219 | const attachment = new Discord.MessageAttachment(image, 'chart.png') 220 | const embed = new Discord.MessageEmbed().setColor('#23272A').setTitle(embedTitle).setDescription(embedDescription).setImage('attachment://chart.png') 221 | message.channel.send({ embeds: [embed], files: [attachment] }) 222 | })() 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /commands/help.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | 3 | module.exports = { 4 | name: 'help', 5 | 6 | execute(message) { 7 | const description = 8 | 'Please report any bugs that you encounter on [Github](https://github.com/cappig/MC-status-bot/issues) or use the `mc!bug` command!\n' + 9 | '> By putting the word bedrock or just the letter b after an ip the bot will ping this ip using the bedrock protocol.\n\n' + 10 | '**Admin commands:**\n' + 11 | '`mc!setip [ip] [bedrock]` - set an ip that the bot will monitor\n' + 12 | '`mc!log [on/off]` - turn logging on or off\n' + 13 | '`mc!setup [ip] [bedrock]` - set up the channels that will display the status of a selected server\n' + 14 | '`mc!rmchann` - remove the monitoring channels\n' + 15 | '\n**User commands:**\n' + 16 | '`mc!ip` - return the default ip of the server\n' + 17 | '`mc!ping [ip] [bedrock]` - ping a minecraft server\n' + 18 | '`mc!news` - see the latest articles from minecraft.net\n' + 19 | '`mc!chart [uptime/playersonline/mostactive]` - make a chart with the logged info\n' + 20 | '`mc!bug [bug]` - Report a bug in the bot\n' + 21 | '\n[Invite to a server](https://discord.com/oauth2/authorize?client_id=816747912888975362&scope=bot&permissions=268749904) | [Privacy policy](https://github.com/cappig/MC-status-bot/blob/main/miscellaneous/Privacy_policy.md) | [Github](https://github.com/cappig/MC-status-bot) | [Support server](https://discord.gg/YzX5KdF4kq)' 22 | 23 | const embed = new Discord.MessageEmbed() 24 | .setColor('#008000') 25 | .setTitle(' About the bot') 26 | .setDescription(description) 27 | .setFooter({ text: 'Made by Cappig#3296 | Check out by blog - cappig.ga' }) 28 | message.channel.send({ embeds: [embed] }) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /commands/ip.js: -------------------------------------------------------------------------------- 1 | const { lookup } = require('../modules/cache.js') 2 | 3 | module.exports = { 4 | name: 'ip', 5 | 6 | async execute(message) { 7 | // Fetch data from db 8 | // By using redis caching this function's execution time dropped from a average of 29ms to less then one 9 | const data = await lookup('Server', message.guild.id) 10 | 11 | if (!data.IP) { 12 | message.channel.send('This server doest have a default ip set! A admin can do that by using the `mc!setip` command.') 13 | } else { 14 | if (data.Bedrock == true) message.channel.send("This server's default ip is `" + data.IP + '`. This is a bedrock server.') 15 | else message.channel.send("This server's default ip is `" + data.IP + '` This is a java server.') 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /commands/log.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const Log = require('../database/logSchema') 3 | const { Permissions } = require('discord.js') 4 | require('../modules/cache.js') 5 | const logger = require('../modules/nodeLogger.js') 6 | 7 | module.exports = { 8 | name: 'log', 9 | 10 | execute(message, args) { 11 | // Check if the person is admin 12 | if (!message.member.permissions.has(Permissions.FLAGS.ADMINISTRATOR) && message.member.id != process.env.OWNERID.toString()) { 13 | message.channel.send('You have to be a admin to use this command!') 14 | return 15 | } 16 | 17 | if (args == 'on') var logging = true 18 | else if (args == 'off') var logging = false 19 | else { 20 | message.channel.send('Please specify a valid option (on/off)') 21 | return 22 | } 23 | 24 | // Write to database 25 | Server.findByIdAndUpdate( 26 | { 27 | _id: message.guild.id 28 | }, 29 | { 30 | Logging: logging 31 | }, 32 | { 33 | useFindAndModify: false, 34 | new: true 35 | } 36 | ) 37 | .cache() 38 | .catch((err) => logger.error(err)) 39 | 40 | if (logging == true) { 41 | // Create a log document 42 | Log.findByIdAndUpdate( 43 | { 44 | _id: message.guild.id 45 | }, 46 | { 47 | logs: [] 48 | }, 49 | { 50 | useFindAndModify: false, 51 | new: true, 52 | upsert: true 53 | } 54 | ) 55 | .cache() 56 | .catch((err) => { 57 | // This code means that the document already exists. We can just ignore this since no new document is created 58 | if (!err.code == 11000) { 59 | logger.error(err) 60 | } 61 | }) 62 | .then(message.channel.send(`Logging has been turned on`)) 63 | } else { 64 | Log.findOneAndRemove( 65 | { 66 | _id: message.guild.id 67 | }, 68 | { 69 | useFindAndModify: false, 70 | new: true 71 | } 72 | ) 73 | .cache() 74 | .catch((err) => logger.error(err)) 75 | .then(message.channel.send(`Logging has been turned off`)) 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /commands/news.js: -------------------------------------------------------------------------------- 1 | const Discord = require('discord.js') 2 | const axios = require('axios') 3 | const { XMLParser } = require('fast-xml-parser') 4 | const logger = require('../modules/nodeLogger.js') 5 | 6 | module.exports = { 7 | name: 'news', 8 | async execute(message) { 9 | message.channel.sendTyping() 10 | 11 | // Get the xml, we emulate a browser by including the user-agent header 12 | let data = await axios.get('https://www.minecraft.net/en-us/feeds/community-content/rss', { 13 | headers: { 14 | httpHeader: 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' 15 | } 16 | }) 17 | let responseOK = data && data.status === 200 // && data.statusText === 'OK' 18 | 19 | if (!responseOK) { 20 | logger.error(data) 21 | return message.channel.send('Uh oh, an error occurred while trying to fetch the news! Try again later!') 22 | } 23 | 24 | const parser = new XMLParser() 25 | const feed = parser.parse(data.data.toString()) 26 | 27 | const embed = new Discord.MessageEmbed() 28 | .setColor('#008000') 29 | .setThumbnail('https://emojipedia-us.s3.dualstack.us-west-1.amazonaws.com/thumbs/120/samsung/265/newspaper_1f4f0.png') 30 | .setTitle('The latest news:') 31 | .setDescription('The latest articles posted on [minecraft.net](https://www.minecraft.net/) \nYou can read them in full there. \n‎‎ ‎') 32 | .addFields( 33 | { 34 | name: '1. ' + feed.rss.channel.item[0].title, 35 | value: feed.rss.channel.item[0].description + '\n → *' + feed.rss.channel.item[0].pubDate.split(' ', 4).join(' ') + '*' 36 | }, 37 | { 38 | name: '2. ' + feed.rss.channel.item[1].title, 39 | value: feed.rss.channel.item[1].description + '\n → *' + feed.rss.channel.item[1].pubDate.split(' ', 4).join(' ') + '*' 40 | }, 41 | { 42 | name: '3. ' + feed.rss.channel.item[2].title, 43 | value: feed.rss.channel.item[2].description + '\n → *' + feed.rss.channel.item[2].pubDate.split(' ', 4).join(' ') + '*' 44 | }, 45 | { 46 | name: '4. ' + feed.rss.channel.item[3].title, 47 | value: feed.rss.channel.item[3].description + '\n → *' + feed.rss.channel.item[3].pubDate.split(' ', 4).join(' ') + '*' 48 | } 49 | ) 50 | 51 | message.channel.send({ embeds: [embed] }) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /commands/ping.js: -------------------------------------------------------------------------------- 1 | const util = require('minecraft-server-util') 2 | const Discord = require('discord.js') 3 | const { lookup } = require('../modules/cache.js') 4 | const logger = require('../modules/nodeLogger.js') 5 | 6 | module.exports = { 7 | name: 'ping', 8 | async execute(message, args) { 9 | message.channel.sendTyping() 10 | 11 | if (!args[0]) { 12 | let data = await lookup('Server', message.guild.id) 13 | 14 | if (!data.IP) { 15 | message.channel.send('Please specify a IP address to ping!') 16 | return 17 | } 18 | 19 | if (data.Bedrock == true) var bedrock = true 20 | 21 | var ip = data.IP.split(':')[0].toLowerCase() 22 | var portnum = parseInt(data.IP.split(':')[1]) 23 | } else { 24 | var ip = args[0].split(':')[0].toLowerCase() 25 | var portnum = parseInt(args[0].split(':')[1]) 26 | } 27 | 28 | const port = portnum < 65536 && portnum > 0 ? portnum : undefined 29 | 30 | if (bedrock || args[1] == 'bedrock' || args[1] == 'b') { 31 | var pinger = util.statusBedrock(ip.split(':')[0].toLowerCase(), port ? port : 19132) 32 | } else { 33 | var pinger = util.status(ip.split(':')[0].toLowerCase(), port ? port : 25565) 34 | } 35 | 36 | pinger 37 | .then((result) => { 38 | if (result.version.protocol) online(result) 39 | else offline(`${ip} didn't return a ping.`, ip) 40 | }) 41 | .catch((error) => { 42 | if (error.code == 'ENOTFOUND') offline(`Unable to resolve ${ip}.\nCheck if you entered the correct ip!`, ip) 43 | else if (error.code == 'ECONNREFUSED') offline(`Unable to resolve ${ip}.\nCan't find a route to the host!`, ip) 44 | else if (error.code == 'EHOSTUNREACH') offline(`${ip} refused to connect.\nCheck if you specified the correct port!`, ip) 45 | else if (error.code == 'ECONNRESET') offline(`${ip} abruptly closed the connection.\nThere is some kind of issue on the server side!`, ip) 46 | else if (error == 'Error: Timed out while retrieving server status') offline(`${ip} didn't return a ping.\nTimed out.`, ip) 47 | else { 48 | logger.error('A error occurred while trying to ping: ' + error) 49 | offline(`${ip} refused to connect.`, ip) 50 | } 51 | return 52 | }) 53 | 54 | // Server is online 55 | function online(result) { 56 | // If there is no icon use pack.png 57 | if (result.favicon == null) { 58 | var attachment = new Discord.MessageAttachment('https://i.ibb.co/YkRLWG8/down.png', 'icon.png') 59 | } else { 60 | var attachment = new Discord.MessageAttachment(Buffer.from(result.favicon.substr('data:image/png;base64,'.length), 'base64'), 'icon.png') 61 | } 62 | const embed = new Discord.MessageEmbed().setColor('#008000').setTitle(`${ip} is online`).setDescription(result.motd.clean) 63 | 64 | // Add a players connected field if available 65 | if (result.players.samples && result.players.sample != null && result.players.sample.length > 0) { 66 | const playernames = result.players.sample.map(function (obj) { 67 | return obj.name 68 | }) 69 | 70 | embed.addField('Players connected:', '`' + playernames.toString().replace(/,/g, ', ') + '`', false) 71 | } 72 | 73 | embed 74 | .addFields( 75 | { 76 | name: 'Players: ', 77 | value: 'Online: ' + '`' + result.players.online + '`' + '\nMax: ' + '`' + result.players.max + '`', 78 | inline: true 79 | }, 80 | { 81 | name: 'Version: ', 82 | value: '`' + result.version.name + '`', 83 | inline: true 84 | } 85 | ) 86 | .setThumbnail('attachment://icon.png') 87 | 88 | message.channel.send({ embeds: [embed], files: [attachment] }) 89 | 90 | return 91 | } 92 | 93 | // Server is offline or error 94 | function offline(errortxt, ip) { 95 | const embed = new Discord.MessageEmbed() 96 | .setColor('#FF0000') 97 | .setTitle(`${ip} is offline`) 98 | .setDescription(errortxt + '\n\n *If the server you are trying to ping\n is a bedrock server use `mc!ping [ip] bedrock`*') 99 | .setThumbnail('https://i.ibb.co/YkRLWG8/down.png') 100 | message.channel.send({ embeds: [embed] }) 101 | return 102 | } 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /commands/rmchann.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const { Permissions } = require('discord.js') 3 | const { lookup } = require('../modules/cache.js') 4 | const logger = require('../modules/nodeLogger.js') 5 | 6 | module.exports = { 7 | name: 'rmchann', 8 | async execute(message) { 9 | // Check if the person is admin 10 | if (!message.member.permissions.has(Permissions.FLAGS.ADMINISTRATOR)) { 11 | message.channel.send('You have to be a admin to use this command!') 12 | return 13 | } 14 | 15 | // Get the db entry for 16 | const result = await lookup('Server', message.guild.id) 17 | 18 | // server didn't define a ip or id of all the channels 19 | if (!result.StatusChannId || !result.NumberChannId || !result.CategoryId) { 20 | message.channel.send('This server doest have the monitoring channels set up. use `mc!setup` to do so.') 21 | return 22 | } 23 | 24 | // Remove the channels 25 | try { 26 | await message.guild.channels.cache.get(result.StatusChannId).delete() 27 | await message.guild.channels.cache.get(result.NumberChannId).delete() 28 | await message.guild.channels.cache.get(result.CategoryId).delete() 29 | } catch (err) { 30 | if (!err == "TypeError: Cannot read properties of undefined (reading 'delete')") logger.error(err) 31 | } 32 | 33 | // Remove from db 34 | Server.findByIdAndUpdate( 35 | { 36 | _id: message.guild.id 37 | }, 38 | { 39 | $unset: { 40 | StatusChannId: '', 41 | NumberChannId: '', 42 | CategoryId: '' 43 | } 44 | }, 45 | { 46 | useFindAndModify: false, 47 | new: true 48 | } 49 | ) 50 | .cache() 51 | .then(() => message.channel.send('The channels have been removed!')) 52 | .catch((err) => logger.error(err)) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /commands/setip.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const Log = require('../database/logSchema') 3 | const sanitize = require('mongo-sanitize') 4 | const { Permissions } = require('discord.js') 5 | const logger = require('../modules/nodeLogger.js') 6 | require('../modules/cache.js') 7 | 8 | module.exports = { 9 | name: 'setip', 10 | execute(message, args) { 11 | // Check if the person is admin 12 | if (!message.member.permissions.has(Permissions.FLAGS.ADMINISTRATOR) && message.member.id != process.env.OWNERID.toString()) { 13 | message.channel.send('You have to be a admin to use this command!') 14 | return 15 | } 16 | if (!args.toString()) { 17 | message.channel.send('Please specify a valid IP!') 18 | return 19 | } 20 | 21 | var ip = args[0].toString().toLowerCase() 22 | const bedrock = args[1] == 'bedrock' || args[1] == 'b' ? true : false 23 | 24 | // Write changes to database 25 | Server.findByIdAndUpdate( 26 | { 27 | _id: message.guild.id 28 | }, 29 | { 30 | IP: sanitize(ip), 31 | Bedrock: bedrock 32 | }, 33 | { 34 | useFindAndModify: false, 35 | new: true 36 | } 37 | ) 38 | .cache() 39 | .catch((err) => logger.error(err)) 40 | 41 | // Remove all logs 42 | Log.findByIdAndUpdate( 43 | { 44 | _id: message.guild.id 45 | }, 46 | { 47 | $set: { 48 | logs: [] 49 | } 50 | }, 51 | { 52 | useFindAndModify: false, 53 | new: true 54 | } 55 | ) 56 | .cache() 57 | .catch((err) => logger.error(err)) 58 | 59 | message.channel.send('The main IP has been set to: `' + args[0] + '`') 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /commands/setup.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const { Permissions } = require('discord.js') 3 | const setip = require('../commands/setip.js') 4 | const util = require('minecraft-server-util') 5 | const logger = require('../modules/nodeLogger.js') 6 | const { lookup } = require('../modules/cache.js') 7 | 8 | module.exports = { 9 | name: 'setup', 10 | async execute(message, args, client) { 11 | // Check if the person is admin 12 | if (!message.member.permissions.has(Permissions.FLAGS.ADMINISTRATOR) && message.member.id != process.env.OWNERID.toString()) { 13 | message.channel.send('You have to be a admin to use this command!') 14 | return 15 | } 16 | 17 | if (args.length > 0) { 18 | try { 19 | setip.execute(message, args, client) 20 | } catch (error) { 21 | logger.error(error) 22 | message.reply({ 23 | content: 'Uh, oh! An error occurred while trying to set the ip! (**X _ X**)', 24 | allowedMentions: { repliedUser: false } 25 | }) 26 | } 27 | } 28 | 29 | // Check if bot has all the permissions 30 | if (!message.guild.me.permissions.has([Permissions.FLAGS.MANAGE_ROLES, Permissions.FLAGS.MANAGE_CHANNELS])) { 31 | message.channel.send("I don't have the necessary permissions to perform this action! - `Manage roles` and `Manage channels`") 32 | return 33 | } else if (!message.guild.me.permissions.has(Permissions.FLAGS.MANAGE_CHANNELS)) { 34 | message.channel.send("I don't have the necessary permissions to perform this action! - `Manage channels`") 35 | return 36 | } else if (!message.guild.me.permissions.has(Permissions.FLAGS.MANAGE_ROLES)) { 37 | message.channel.send("I don't have the necessary permissions to perform this action! - `Manage roles`") 38 | return 39 | } 40 | 41 | // Get the ip of the server 42 | const result = await lookup('Server', message.guild.id) 43 | const ip = result.IP.split(':')[0].toLowerCase() 44 | 45 | // check if server has a defined ip 46 | if (!ip) { 47 | message.channel.send('Please use`mc!setip` to set a ip to monitor!') 48 | return 49 | } 50 | 51 | // Check if monitoring channels already exist. if they do remove them 52 | if (result.StatusChannId) { 53 | await message.guild.channels.cache 54 | .get(result.StatusChannId) 55 | .delete() 56 | .catch((err) => logger.error(err)) 57 | } 58 | if (result.NumberChannId) { 59 | await message.guild.channels.cache 60 | .get(result.NumberChannId) 61 | .delete() 62 | .catch((err) => logger.error(err)) 63 | } 64 | if (result.CategoryId) { 65 | await message.guild.channels.cache 66 | .get(result.CategoryId) 67 | .delete() 68 | .catch((err) => logger.error(err)) 69 | } 70 | 71 | // Create category 72 | let Category 73 | await message.guild.channels 74 | .create(`${ip}'s status`, { 75 | type: 'GUILD_CATEGORY', 76 | permissionOverwrites: [ 77 | { 78 | id: message.guild.me.roles.highest, 79 | allow: ['CONNECT', 'VIEW_CHANNEL'] 80 | }, 81 | { 82 | id: message.guild.roles.everyone, 83 | deny: ['CONNECT'] 84 | } 85 | ] 86 | }) 87 | .then((channel) => { 88 | Category = channel 89 | }) 90 | 91 | // Crate channels and add to category 92 | let StatusChan 93 | await message.guild.channels 94 | .create('Updating status. . .', { 95 | type: 'GUILD_VOICE' 96 | }) 97 | .then(async function (channel) { 98 | await channel.setParent(Category.id) 99 | StatusChan = channel 100 | }) 101 | let NumberChan 102 | await message.guild.channels 103 | .create('Updating players . . .', { 104 | type: 'GUILD_VOICE' 105 | }) 106 | .then(async function (channel) { 107 | await channel.setParent(Category.id) 108 | NumberChan = channel 109 | }) 110 | 111 | // Write to database 112 | Server.findByIdAndUpdate( 113 | { 114 | _id: message.guild.id 115 | }, 116 | { 117 | StatusChannId: StatusChan.id, 118 | NumberChannId: NumberChan.id, 119 | CategoryId: Category.id 120 | }, 121 | { 122 | useFindAndModify: false, 123 | new: true 124 | } 125 | ) 126 | .cache() 127 | .then(() => message.channel.send('The channels have been created successfully! Please allow up to five minutes for the channels to update.')) 128 | .catch((err) => logger.error(err)) 129 | 130 | const portnum = parseInt(result.IP.split(':')[1]) 131 | const port = portnum < 65536 && portnum > 0 ? portnum : undefined 132 | 133 | if (result.Bedrock == true) { 134 | var pinger = util.statusBedrock(ip.split(':')[0].toLowerCase(), port ? port : 19132) 135 | } else { 136 | var pinger = util.status(ip.split(':')[0].toLowerCase(), port ? port : 25565) 137 | } 138 | 139 | pinger 140 | .then((pingresult) => { 141 | // Aternos servers stay online and display Offline in their MOTD when they are actually offline 142 | if (!pingresult || (ip.includes('aternos.me') && pingresult.version == '● Offline')) { 143 | // server is offline 144 | servoffline() 145 | } else { 146 | // server is online 147 | servonline(pingresult) 148 | } 149 | }) 150 | .catch((error) => { 151 | // server is offline 152 | servoffline() 153 | }) 154 | 155 | async function servonline(pingresult) { 156 | // server is online 157 | await client.channels.cache.get(StatusChan.id).setName('🟢 ONLINE') 158 | const chann = client.channels.cache.get(NumberChan.id) 159 | await chann.permissionOverwrites.edit(chann.guild.roles.everyone, { 160 | VIEW_CHANNEL: true 161 | }) 162 | await chann.setName(`👥 Players online: ${pingresult.players.online}`) 163 | } 164 | async function servoffline() { 165 | await client.channels.cache.get(StatusChan.id).setName('🔴 OFFLINE') 166 | const chann = client.channels.cache.get(NumberChan.id) 167 | await chann.permissionOverwrites.edit(chann.guild.roles.everyone, { 168 | VIEW_CHANNEL: false 169 | }) 170 | await chann.setName(`👥 Players online: 0`) 171 | } 172 | } 173 | } 174 | -------------------------------------------------------------------------------- /database/ServerSchema.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const serverSchema = new Schema( 5 | { 6 | _id: { 7 | type: String, 8 | required: true 9 | }, 10 | IP: { 11 | type: String, 12 | default: '' 13 | }, 14 | Bedrock: { 15 | type: Boolean, 16 | required: false 17 | }, 18 | Logging: { 19 | type: Boolean, 20 | default: false 21 | }, 22 | StatusChannId: { 23 | type: String, 24 | required: false 25 | }, 26 | NumberChannId: { 27 | type: String, 28 | required: false 29 | }, 30 | CategoryId: { 31 | type: String, 32 | required: false 33 | } 34 | }, 35 | { 36 | versionKey: false 37 | } 38 | ) 39 | 40 | const Server = mongoose.model('Server', serverSchema) 41 | module.exports = Server 42 | -------------------------------------------------------------------------------- /database/logSchema.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const logSchema = new Schema( 5 | { 6 | _id: { 7 | type: String, 8 | required: true 9 | }, 10 | logs: [ 11 | { 12 | timestamp: { 13 | type: Date, 14 | default: Date.now 15 | }, 16 | online: { 17 | required: true, 18 | type: Boolean 19 | }, 20 | playersOnline: { 21 | type: Number 22 | }, 23 | playerNamesOnline: { 24 | type: String 25 | } 26 | } 27 | ] 28 | }, 29 | { 30 | versionKey: false, 31 | _id: false 32 | } 33 | ) 34 | 35 | const Log = mongoose.model('Log', logSchema) 36 | module.exports = Log 37 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.9' 2 | 3 | services: 4 | database: 5 | image: mongo 6 | container_name: mongo 7 | restart: unless-stopped 8 | ports: 9 | - 27017-27019:27017-27019 10 | volumes: 11 | - database:/bot 12 | 13 | cache: 14 | image: redis 15 | container_name: redis 16 | restart: unless-stopped 17 | ports: 18 | - '6379:6379' 19 | 20 | bot: 21 | build: . 22 | image: mcbot 23 | restart: unless-stopped 24 | env_file: .env 25 | depends_on: 26 | - database 27 | - cache 28 | 29 | volumes: 30 | database: 31 | -------------------------------------------------------------------------------- /events/guildadd.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const logger = require('../modules/nodeLogger.js') 3 | const { createCache } = require('../modules/cache.js') 4 | 5 | module.exports = { 6 | name: 'guildCreate', 7 | execute(guild) { 8 | logger.info(`Joined new guild: ${guild.name}`) 9 | 10 | const server = new Server({ 11 | _id: guild.id 12 | }) 13 | server 14 | .save() 15 | .then(() => { 16 | logger.info('Added the server db entry.') 17 | createCache('Server', guild.id) 18 | }) 19 | .catch((err) => logger.error(err)) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /events/guildleave.js: -------------------------------------------------------------------------------- 1 | const Server = require('../database/ServerSchema') 2 | const Log = require('../database/logSchema') 3 | const { removeCache } = require('../modules/cache.js') 4 | const logger = require('../modules/nodeLogger.js') 5 | 6 | module.exports = { 7 | name: 'guildDelete', 8 | execute(guild) { 9 | if (!guild.name) return 10 | 11 | logger.info(`Left guild: ${guild.name}`) 12 | 13 | Server.findOneAndRemove( 14 | { 15 | _id: guild.id 16 | }, 17 | { 18 | useFindAndModify: false, 19 | new: true 20 | } 21 | ) 22 | .cache() 23 | .then(() => { 24 | removeCache('Server', guild.id) 25 | logger.info('Deleted the server db entry.') 26 | }) 27 | .catch((err) => logger.error(err)) 28 | 29 | Log.findOneAndRemove( 30 | { 31 | _id: guild.id 32 | }, 33 | { 34 | useFindAndModify: false, 35 | new: true 36 | } 37 | ) 38 | .cache() 39 | .then(() => logger.info('Deleted the log db entry.')) 40 | .catch((err) => logger.error(err)) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /events/messageCreate.js: -------------------------------------------------------------------------------- 1 | const logger = require('../modules/nodeLogger.js') 2 | 3 | module.exports = { 4 | name: 'messageCreate', 5 | execute(message, client) { 6 | // check if the command exist 7 | const args = message.content.slice(3).trim().split(/ +/) 8 | const commandName = args.shift().toLowerCase() 9 | if (!client.commands.has(commandName)) return 10 | 11 | // Ignore messages: 12 | // if the message starts with the prefix 13 | if (!message.content.startsWith('mc!')) return 14 | // if the bot is the author 15 | if (message.author.bot) return 16 | // if its a dm 17 | if (message.channel.type == 'GUILD_DM') return 18 | // if its a reply 19 | if (message.type === 'REPLY') return 20 | 21 | // Check if user is rate limited 22 | const limited = client.rateLimiter.take(message.author.id) 23 | if (limited) return // No response is sent if the user is rate limited 24 | 25 | const command = client.commands.get(commandName) 26 | 27 | try { 28 | command.execute(message, args, client) 29 | } catch (error) { 30 | logger.error(error) 31 | message.reply({ 32 | content: 'Uh, oh! An error occurred while trying to execute that command! (**X _ X**)', 33 | allowedMentions: { repliedUser: false } 34 | }) 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /events/ready.js: -------------------------------------------------------------------------------- 1 | const pinger = require('../modules/pinger.js') 2 | var cron = require('node-cron') 3 | const guildscan = require('../modules/guildscan.js') 4 | const logger = require('../modules/nodeLogger.js') 5 | const { AutoPoster } = require('topgg-autoposter') 6 | 7 | module.exports = { 8 | name: 'ready', 9 | execute(client) { 10 | logger.success('The bot is up and running!') 11 | 12 | // Update activity every hour so that it doesn't expire 13 | client.user.setActivity('for mc!help', { type: 'WATCHING' }) 14 | setInterval(() => { 15 | client.user.setActivity('for mc!help', { type: 'WATCHING' }) 16 | }, 3600000) 17 | 18 | // Scan for guilds not in the db, the ones that were added when the bot was offline 19 | if (process.argv.slice(2) != '--noguildscan') { 20 | ;(async () => { 21 | logger.info('Started guild scan.') 22 | await guildscan.execute(client) 23 | })() 24 | } 25 | 26 | // Post stats to top.gg 27 | if (process.env.TOPGGAPI) { 28 | AutoPoster(process.env.TOPGGAPI, client).on('posted', () => { 29 | logger.info('Posted stats to Top.gg!') 30 | }) 31 | } else logger.info("No topgg token was provided - stats won't be posted to top.gg!") 32 | 33 | // Call the pinger every 5 minutes 34 | cron.schedule('*/5 * * * *', () => { 35 | try { 36 | pinger.execute(client) 37 | } catch (err) { 38 | logger.error('Error while updating channels: ' + err) 39 | } finally { 40 | logger.info('Done updating channels') 41 | } 42 | }) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { Client, Intents, Collection } = require('discord.js') 2 | const { RateLimiter } = require('discord.js-rate-limiter') 3 | const fs = require('fs') 4 | const mongoose = require('mongoose') 5 | require('dotenv').config() 6 | 7 | const logger = require('./modules/nodeLogger.js') 8 | 9 | const Log = require('./database/logSchema') 10 | const Server = require('./database/ServerSchema') 11 | const Redis = require('ioredis') 12 | 13 | // Handle and log and crashes 14 | process.on('uncaughtException', (error, source) => { 15 | logger.crash(error + 'at' + source) 16 | process.exit(1) 17 | }) 18 | 19 | const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] }) 20 | client.rateLimiter = new RateLimiter(1, 2000) // Rate limit to one message every two seconds 21 | client.commands = new Collection() 22 | 23 | logger.success('Starting the bot!') 24 | 25 | // Connect to database 26 | mongoose 27 | .connect(process.env.DBURL, { 28 | useNewUrlParser: true, 29 | useUnifiedTopology: true 30 | }) 31 | .then(() => logger.info('Connected to database!')) 32 | .catch((err) => logger.error(err)) 33 | 34 | const redisclient = new Redis({ 35 | port: 6379, 36 | host: '127.0.0.1' 37 | }) 38 | 39 | // Flush redis 40 | redisclient.flushall('SYNC', async function (err, succeeded) { 41 | logger.info(`Flushing Redis - ${err ? err : succeeded}`) 42 | 43 | // Cache the entire mongo database to redis. 44 | // Cache it only after redis gets flushed 45 | logger.info('Started caching the databases') 46 | 47 | await Log.find() 48 | .then((result) => { 49 | result.forEach((log) => redisclient.hset('Log', log._id, JSON.stringify(log.logs))) 50 | logger.info('Cached logs') 51 | }) 52 | .catch((err) => logger.error(err)) 53 | 54 | await Server.find() 55 | .then((result) => { 56 | result.forEach((server) => { 57 | var value = { ...server.toObject() } // Copy server object 58 | value._id = undefined // Remove the _id from the value 59 | redisclient.hset('Server', server._id, JSON.stringify(value)) 60 | }) 61 | logger.info('Cached servers') 62 | 63 | // Log the client in here to prevent the bot from starting before 64 | // the db has been completely cached. 65 | client.login(process.env.TOKEN) 66 | }) 67 | .catch((err) => logger.error(err)) 68 | }) 69 | 70 | // Make the redis client global 71 | global.redisclient = redisclient 72 | 73 | // Command handling 74 | const commandFiles = fs.readdirSync('./commands').filter((file) => file.endsWith('.js')) 75 | for (const file of commandFiles) { 76 | const command = require(`./commands/${file}`) 77 | client.commands.set(command.name, command) 78 | } 79 | 80 | // Event handling 81 | const eventFiles = fs.readdirSync('./events').filter((file) => file.endsWith('.js')) 82 | for (const file of eventFiles) { 83 | const event = require(`./events/${file}`) 84 | if (event.once) { 85 | client.once(event.name, (...args) => event.execute(...args, client)) 86 | } else { 87 | client.on(event.name, (...args) => event.execute(...args, client)) 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /miscellaneous/Privacy_policy.md: -------------------------------------------------------------------------------- 1 | # Privacy policy 2 | 3 | *Last updated: 31.7.2021* 4 | 5 |
6 | 7 | MCstatus bot (“we”, “our”, "us" or "bot") provides a discord bot service subject to the privacy policy described below (“Privacy Policy”). 8 | 9 | By using the bot, you agree to the Policy policy. If you do not agree with the Policy policy, you may not use the Services. 10 | 11 | This service is completely free to use and is in no way affiliated with Discord or Mojang/Microsoft. 12 | 13 | Your privacy is very important to us. It is our policy to respect your privacy. 14 | 15 |
16 | 17 | 1. **Personal Information** 18 | * We collect and process your personal information in order to provide our services. 19 | 20 | * Information we may collect about you includes the following: 21 | 22 | * Discord identification (“ID”) for any guilds you invite the bot to join. 23 | * Discord channel IDs for channels set up for the bot to use. 24 | * The status and other relevant information of the Minecraft server. 25 | 26 |
27 | 28 | * All personal information stored in our database is linked to a particular Discord guild ID. When the bot leaves the guild, all information stored under the guild ID will be permanently deleted. 29 | 30 |
31 | 32 | 2. **Changes to the policy** 33 | * Any changes to the Privacy policy shall go into effect immediately after the change unless stated otherwise. 34 | * We may at any moment change the privacy policy without prior notice. If you use the Service after the changes went into effect you agree to be bound by such modification(s). 35 | 36 |

37 | 38 | 39 | **End of the policy** 40 | 41 | --- 42 | 43 | *If you need any more information or help feel free to contact me at `matt@cappig.ga` or preferably DM me on Discord at `Cappig#3296`. Thanks for using the bot!* -------------------------------------------------------------------------------- /miscellaneous/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cappig/MC-status-bot/a2bd2879b83b0c4eb6adbc8affd7ec91566beade/miscellaneous/icon.png -------------------------------------------------------------------------------- /modules/cache.js: -------------------------------------------------------------------------------- 1 | const Log = require('../database/logSchema') 2 | const Server = require('../database/ServerSchema') 3 | 4 | const util = require('util') 5 | const mongoose = require('mongoose') 6 | const logger = require('../modules/nodeLogger.js') 7 | 8 | const client = global.redisclient 9 | client.hget = util.promisify(client.hget) 10 | client.hgetall = util.promisify(client.hgetall) 11 | 12 | const exec = mongoose.Query.prototype.exec 13 | 14 | // Lookup function, Looks up redis, 15 | // if the key is not in redis it fallbacks to mongo 16 | module.exports = { 17 | async lookup(collection, key) { 18 | // collection can be 'Server' or 'Log' 19 | const cacheValue = await client.hget(collection, key) 20 | 21 | if (cacheValue) { 22 | const doc = JSON.parse(cacheValue) 23 | return doc 24 | } 25 | 26 | // Mongo fallback 27 | else { 28 | logger.info(`${key} just fellback to mongo while looking for the ${collection} collection!`) 29 | var result 30 | if (collection == 'Log') { 31 | result = await Log.findById({ _id: key }) 32 | if (result != null) { 33 | client.hset(collection, key, JSON.stringify(result.logs)) 34 | } 35 | } else if (collection == 'Server') { 36 | result = await Server.findById({ _id: key }) 37 | //make doc if it does not exist in mongodb 38 | if (result == null) { 39 | Server.create({ _id: key }) 40 | } 41 | result = await Server.findById({ _id: key }) 42 | var value = { ...result.toObject() } // Copy server object 43 | value._id = undefined // Remove the _id from the value 44 | client.hset(collection, key, JSON.stringify(value)) 45 | } else { 46 | logger.error(`${collection} is not a valid collection name - Log or Server!`) 47 | return 48 | } 49 | 50 | return result 51 | } 52 | }, 53 | 54 | // Create a Redis cache document 55 | async createCache(collection, key) { 56 | if (collection == 'Log') { 57 | client.hset(collection, key, '[]') 58 | } else if (collection == 'Server') { 59 | client.hset(collection, key, '{"IP": "", "Logging": false}') 60 | } else { 61 | logger.error(`${collection} is not a valid collection name - Log or Server!`) 62 | return 63 | } 64 | }, 65 | 66 | // Remove document from redis 67 | // collection has to be 'Server' or 'Log' 68 | removeCache(collection, key) { 69 | client.hdel(collection, key) 70 | }, 71 | 72 | // Get all values and kays from collection 73 | // This returns the same array that mongo does. 74 | async geetallCache(collection) { 75 | const all = await client.hgetall(collection) 76 | 77 | const map = new Map(Object.entries(all)) // Convert to map 78 | const res = [] 79 | map.forEach(function callbackFn(value, key) { 80 | const json = JSON.parse(value) 81 | json._id = key 82 | 83 | res.push(json) 84 | }) 85 | return res 86 | } 87 | } 88 | 89 | // Insert element in redis after ith as already been sent to mongo 90 | // For this to work the new option needs to be set to true 91 | mongoose.Query.prototype.cache = async function () { 92 | const result = await exec.apply(this, arguments) 93 | 94 | const key = JSON.stringify(this.getQuery()).replace(/[^0-9]/g, '') 95 | 96 | if (this.mongooseCollection.name == 'logs') { 97 | // Pass a empty array if the result is undefined 98 | if (!result) { 99 | await client.hset('Log', key, '[]') 100 | } else { 101 | await client.hset('Log', key, JSON.stringify(result.logs)) 102 | } 103 | return 104 | } else if (this.mongooseCollection.name == 'servers') { 105 | var value = { ...result.toObject() } // Copy server object 106 | value._id = undefined // Remove the _id from the value 107 | await client.hset('Server', key, JSON.stringify(value)) 108 | return 109 | } else { 110 | logger.error(`${this.mongooseCollection.name} is not a valid collection name!`) 111 | return 112 | } 113 | } 114 | -------------------------------------------------------------------------------- /modules/channupd.js: -------------------------------------------------------------------------------- 1 | const logger = require('../modules/nodeLogger.js') 2 | 3 | module.exports = { 4 | execute(client, server, result) { 5 | // Check if channels are defined 6 | if (!server.StatusChannId || !server.NumberChannId || !server.CategoryId) return 7 | if (!client.channels.cache.get(server.StatusChannId) || !client.channels.cache.get(server.NumberChannId) || !client.channels.cache.get(server.CategoryId)) return 8 | 9 | try { 10 | // Change the name of the category to the right ip if it isn't 11 | if (!(client.channels.cache.get(server.CategoryId).name == server.IP + `'s status`)) { 12 | client.channels.cache 13 | .get(server.CategoryId) 14 | .setName(server.IP + `'s status`) 15 | .catch((e) => logger.warn('Error in cahannupd:' + e)) 16 | } 17 | 18 | // server is online 19 | if (result) { 20 | client.channels.cache 21 | .get(server.StatusChannId) 22 | .setName('🟢 ONLINE') 23 | .catch((e) => logger.warn('Error in cahannupd:' + e)) 24 | 25 | const chann = client.channels.cache.get(server.NumberChannId) 26 | chann.permissionOverwrites 27 | .edit(chann.guild.roles.everyone, { 28 | VIEW_CHANNEL: true 29 | }) 30 | .catch((e) => logger.warn('Error in cahannupd:' + e)) 31 | chann.setName(`👥 Players online: ${result.players.online}`).catch((e) => logger.warn('Error in cahannupd:' + e)) 32 | } 33 | 34 | // server is offline 35 | else { 36 | client.channels.cache 37 | .get(server.StatusChannId) 38 | .setName('🔴 OFFLINE') 39 | .catch((e) => logger.warn('Error in cahannupd:' + e)) 40 | 41 | const chann = client.channels.cache.get(server.NumberChannId) 42 | chann.permissionOverwrites 43 | .edit(chann.guild.roles.everyone, { 44 | VIEW_CHANNEL: false 45 | }) 46 | .catch((e) => logger.warn('Error in cahannupd:' + e)) 47 | chann.setName(`👥 Players online: 0`).catch((e) => logger.warn('Error in cahannupd:' + e)) 48 | } 49 | } catch (err) { 50 | console.error('Error in cahannupd: ' + err) 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /modules/guildscan.js: -------------------------------------------------------------------------------- 1 | /* This script can be run if the bot was offline for a time. 2 | * It will check if the bot is in a guild that isn't in 3 | * the database. This happens if it the bot was invited 4 | * while it was offline. 5 | */ 6 | const Server = require('../database/ServerSchema') 7 | const { geetallCache } = require('../modules/cache.js') 8 | require('../modules/cache.js') 9 | const logger = require('../modules/nodeLogger.js') 10 | 11 | module.exports = { 12 | async execute(client) { 13 | // Array of guild ids that the bot is in 14 | const guilds = client.guilds.cache.map((guild) => guild.id) 15 | 16 | const docs = await geetallCache('Server') 17 | // Array of guild ids that are in the database 18 | const database = docs.map((docs) => docs._id) 19 | 20 | let a = 0 21 | let l = 0 22 | for (const guild of guilds) { 23 | if (!database.includes(guild)) { 24 | a++ 25 | await Server.create({ _id: guild }) 26 | Server.findOne({ _id: guild }) 27 | .cache() 28 | .catch((err) => logger.error(err)) 29 | logger.info(`guildscan added: ${guild}`) 30 | } 31 | } 32 | 33 | for (const entry of database) { 34 | if (!guilds.includes(entry)) { 35 | l++ 36 | 37 | Server.findOneAndRemove( 38 | { 39 | _id: entry 40 | }, 41 | { 42 | useFindAndModify: false 43 | } 44 | ) 45 | .cache() 46 | .catch((err) => logger.error(err)) 47 | logger.info(`guildscan removed: ${entry}`) 48 | } 49 | } 50 | 51 | logger.success(`Ended guild scan. Added ${a} new guilds, and removed ${l} old guilds from the database`) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /modules/logger.js: -------------------------------------------------------------------------------- 1 | const Log = require('../database/logSchema') 2 | const { lookup } = require('../modules/cache.js') 3 | const logger = require('../modules/nodeLogger.js') 4 | 5 | module.exports = { 6 | async execute(result, server) { 7 | // Check if server has more than 288 logs 8 | const logs = await lookup('Log', server._id) 9 | 10 | if (logs.length >= 289) { 11 | Log.findByIdAndUpdate( 12 | { 13 | _id: server._id 14 | }, 15 | { 16 | $pop: { 17 | logs: -1 18 | } 19 | }, 20 | { 21 | useFindAndModify: false, 22 | new: true 23 | } 24 | ) 25 | .cache() 26 | .catch((err) => logger.error(err)) 27 | } 28 | 29 | // Log the status 30 | if (result) { 31 | if (result.players.sample && result.players.sample != null && result.players.sample.length > 0) { 32 | const playernames = result.players.sample.map(function (obj) { 33 | return obj.name 34 | }) 35 | 36 | dbdata = { 37 | $push: { 38 | logs: { 39 | online: true, 40 | playersOnline: result.players.online, 41 | playerNamesOnline: playernames.toString() 42 | } 43 | } 44 | } 45 | } else { 46 | dbdata = { 47 | $push: { 48 | logs: { 49 | online: true, 50 | playersOnline: result.players.online 51 | } 52 | } 53 | } 54 | } 55 | } else { 56 | dbdata = { 57 | $push: { 58 | logs: { 59 | online: false 60 | } 61 | } 62 | } 63 | } 64 | Log.findByIdAndUpdate( 65 | { 66 | _id: server._id 67 | }, 68 | dbdata, 69 | { 70 | useFindAndModify: false, 71 | new: true 72 | } 73 | ) 74 | .cache() 75 | .catch((err) => logger.error(err)) 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /modules/nodeLogger.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | const moment = require('moment') 3 | const chalk = require('chalk') 4 | 5 | function append(text) { 6 | fs.appendFileSync('log.log', text + '\n', function (err) { 7 | if (err) console.error(chalk.red('Error writing logs to file: ' + err)) 8 | }) 9 | } 10 | 11 | module.exports = logger = { 12 | info: function (text) { 13 | let time = moment().format('YYYY-MM-DD HH:mm:ss') 14 | process.stdout.write(chalk.gray(`${time} [info]: `) + text + '\n') 15 | 16 | append(time + ' [info]: ' + text) 17 | }, 18 | success: function (text) { 19 | let time = moment().format('YYYY-MM-DD HH:mm:ss') 20 | process.stdout.write(chalk.gray(`${time} [${chalk.green('success')}]: `) + text + '\n') 21 | 22 | append(time + ' [success]: ' + text) 23 | }, 24 | error: function (text) { 25 | let time = moment().format('YYYY-MM-DD HH:mm:ss') 26 | process.stderr.write(chalk.gray(`${time} [${chalk.red('error')}]: `) + chalk.red(text) + '\n') 27 | 28 | append(time + ' [error]: ' + text) 29 | }, 30 | warn: function (text) { 31 | let time = moment().format('YYYY-MM-DD HH:mm:ss') 32 | process.stderr.write(chalk.gray(`${time} [${chalk.yellow('warn')}]: `) + text + '\n') 33 | 34 | append(time + ' [warn]: ' + text) 35 | }, 36 | crash: function (text) { 37 | let time = moment().format('YYYY-MM-DD HH:mm:ss') 38 | process.stderr.write(chalk.gray(`${time} [${chalk.red('CRASH')}]: `) + text + '\n') 39 | 40 | append(time + ' [CRASH]: ' + text) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /modules/pinger.js: -------------------------------------------------------------------------------- 1 | const util = require('minecraft-server-util') 2 | const logger = require('./logger.js') 3 | const channupd = require('./channupd.js') 4 | const { geetallCache } = require('../modules/cache.js') 5 | 6 | module.exports = { 7 | async execute(client) { 8 | const servers = await geetallCache('Server') 9 | 10 | for (const server of servers) { 11 | if (!server.IP) continue 12 | 13 | const ip = server.IP.split(':')[0] 14 | 15 | const portnum = parseInt(server.IP.split(':')[1]) 16 | const port = portnum < 65536 && portnum > 0 ? portnum : undefined 17 | 18 | if (server.Bedrock == true) { 19 | var pinger = util.statusBedrock(ip.split(':')[0].toLowerCase(), port ? port : 19132) 20 | } else { 21 | var pinger = util.status(ip.split(':')[0].toLowerCase(), port ? port : 25565) 22 | } 23 | 24 | pinger 25 | .then((result) => { 26 | // Aternos servers stay online and display Offline in their MOTD when they are actually offline 27 | if (!result || (server.IP.includes('aternos.me') && result.version == '§4● Offline')) { 28 | // server is offline 29 | if (server.Logging == true) { 30 | logger.execute('', server) 31 | } 32 | channupd.execute(client, server, '') 33 | } else { 34 | // server is online 35 | if (server.Logging == true) { 36 | logger.execute(result, server) 37 | } 38 | channupd.execute(client, server, result) 39 | } 40 | }) 41 | .catch((error) => { 42 | // server is offline 43 | if (server.Logging == true) { 44 | logger.execute('', server) 45 | } 46 | channupd.execute(client, server, '') 47 | }) 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mc-server-status-bot", 3 | "version": "1.0.0", 4 | "description": "A discord bot that displays if a MC server is online", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node index.js", 8 | "dev": "npx nodemon .", 9 | "format": "prettier --write .", 10 | "start:pm2": "pm2 start index.js", 11 | "stop:pm2": "pm2 kill", 12 | "restart:pm2": "npm run stop:pm2 && npm run start:pm2" 13 | }, 14 | "pre-commit": "format", 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/cappig/MC-server-status-bot.git" 18 | }, 19 | "keywords": [ 20 | "discord", 21 | "bot", 22 | "minecraft" 23 | ], 24 | "author": "Cappig", 25 | "license": "MIT", 26 | "bugs": { 27 | "url": "https://github.com/cappig/MC-server-status-bot/issues" 28 | }, 29 | "homepage": "https://github.com/cappig/MC-server-status-bot#readme", 30 | "dependencies": { 31 | "axios": "^0.25.0", 32 | "chalk": "4.1.2", 33 | "chart.js": "^3.7.0", 34 | "chartjs-node-canvas": "^4.1.5", 35 | "discord.js": "^13.5.0", 36 | "discord.js-rate-limiter": "^1.2.3", 37 | "dotenv": "^14.3.2", 38 | "fast-xml-parser": "^4.0.0-beta.8", 39 | "ioredis": "^4.28.2", 40 | "minecraft-server-util": "^5.2.8", 41 | "moment": "^2.29.1", 42 | "mongo-sanitize": "^1.1.0", 43 | "mongoose": "^6.1.4", 44 | "node-cron": "^3.0.0", 45 | "topgg-autoposter": "^2.0.1" 46 | }, 47 | "devDependencies": { 48 | "nodemon": "^2.0.15", 49 | "pre-commit": "^1.2.2", 50 | "prettier": "^2.5.1" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discordjs/builders@^0.11.0": 6 | version "0.11.0" 7 | resolved "https://registry.yarnpkg.com/@discordjs/builders/-/builders-0.11.0.tgz#4102abe3e0cd093501f3f71931df43eb92f5b0cc" 8 | integrity sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg== 9 | dependencies: 10 | "@sindresorhus/is" "^4.2.0" 11 | discord-api-types "^0.26.0" 12 | ts-mixer "^6.0.0" 13 | tslib "^2.3.1" 14 | zod "^3.11.6" 15 | 16 | "@discordjs/collection@^0.4.0": 17 | version "0.4.0" 18 | resolved "https://registry.yarnpkg.com/@discordjs/collection/-/collection-0.4.0.tgz#b6488286a1cc7b41b644d7e6086f25a1c1e6f837" 19 | integrity sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw== 20 | 21 | "@jpbberry/typed-emitter@^1.0.1": 22 | version "1.2.1" 23 | resolved "https://registry.yarnpkg.com/@jpbberry/typed-emitter/-/typed-emitter-1.2.1.tgz#3a83d712cd4d40fed1aa7df32791131070c096f9" 24 | integrity sha512-XTYlVkcj329NNQfo+Fcix/ZcTQHn0F+5gt2lJvI5rBeulT+tq0uzeIIk3oAlwJg7GT9u4mqG0bNLq/kqKXxf4Q== 25 | 26 | "@mapbox/node-pre-gyp@^1.0.0": 27 | version "1.0.8" 28 | resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz#32abc8a5c624bc4e46c43d84dfb8b26d33a96f58" 29 | integrity sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg== 30 | dependencies: 31 | detect-libc "^1.0.3" 32 | https-proxy-agent "^5.0.0" 33 | make-dir "^3.1.0" 34 | node-fetch "^2.6.5" 35 | nopt "^5.0.0" 36 | npmlog "^5.0.1" 37 | rimraf "^3.0.2" 38 | semver "^7.3.5" 39 | tar "^6.1.11" 40 | 41 | "@sapphire/async-queue@^1.1.9": 42 | version "1.2.0" 43 | resolved "https://registry.yarnpkg.com/@sapphire/async-queue/-/async-queue-1.2.0.tgz#7a56afd318101d338433d7180ebd6af349243268" 44 | integrity sha512-O5ND5Ljpef86X5oy8zXorQ754TMjWALcPSAgPBu4+76HLtDTrNoDyzU2uGE2G4A8Wv51u0MXHzGQ0WZ4GMtpIw== 45 | 46 | "@sindresorhus/is@^0.14.0": 47 | version "0.14.0" 48 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 49 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 50 | 51 | "@sindresorhus/is@^4.2.0": 52 | version "4.4.0" 53 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.4.0.tgz#e277e5bdbdf7cb1e20d320f02f5e2ed113cd3185" 54 | integrity sha512-QppPM/8l3Mawvh4rn9CNEYIU9bxpXUCRMaX9yUpvBk1nMKusLKpfXGDEKExKaPhLzcn3lzil7pR6rnJ11HgeRQ== 55 | 56 | "@szmarczak/http-timer@^1.1.2": 57 | version "1.1.2" 58 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 59 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 60 | dependencies: 61 | defer-to-connect "^1.0.1" 62 | 63 | "@top-gg/sdk@^3.1.3": 64 | version "3.1.3" 65 | resolved "https://registry.yarnpkg.com/@top-gg/sdk/-/sdk-3.1.3.tgz#197e2726c76cb80ec19b83d7e2a68e212ee913e7" 66 | integrity sha512-jvj3jH8BY35AXKFXkap2cJRuFMOz1yBvBvCvNq90gfvplKWDYqGPQKt+nOhT/hdYc+XcKskY/c5OOWDX0xbg2Q== 67 | dependencies: 68 | node-fetch "^2.6.1" 69 | raw-body "^2.4.1" 70 | 71 | "@types/node-fetch@^2.5.12": 72 | version "2.5.12" 73 | resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" 74 | integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== 75 | dependencies: 76 | "@types/node" "*" 77 | form-data "^3.0.0" 78 | 79 | "@types/node@*": 80 | version "17.0.13" 81 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.13.tgz#5ed7ed7c662948335fcad6c412bb42d99ea754e3" 82 | integrity sha512-Y86MAxASe25hNzlDbsviXl8jQHb0RDvKt4c40ZJQ1Don0AAL0STLZSs4N+6gLEO55pedy7r2cLwS+ZDxPm/2Bw== 83 | 84 | "@types/node@< 17.0.6": 85 | version "17.0.5" 86 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.5.tgz#57ca67ec4e57ad9e4ef5a6bab48a15387a1c83e0" 87 | integrity sha512-w3mrvNXLeDYV1GKTZorGJQivK6XLCoGwpnyJFbJVK/aTBQUxOCaa/GlFAAN3OTDFcb7h5tiFG+YXCO2By+riZw== 88 | 89 | "@types/webidl-conversions@*": 90 | version "6.1.1" 91 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e" 92 | integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q== 93 | 94 | "@types/whatwg-url@^8.2.1": 95 | version "8.2.1" 96 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4" 97 | integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ== 98 | dependencies: 99 | "@types/node" "*" 100 | "@types/webidl-conversions" "*" 101 | 102 | "@types/ws@^8.2.2": 103 | version "8.2.2" 104 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" 105 | integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== 106 | dependencies: 107 | "@types/node" "*" 108 | 109 | abbrev@1: 110 | version "1.1.1" 111 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 112 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 113 | 114 | agent-base@6: 115 | version "6.0.2" 116 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 117 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 118 | dependencies: 119 | debug "4" 120 | 121 | ansi-align@^3.0.0: 122 | version "3.0.1" 123 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" 124 | integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== 125 | dependencies: 126 | string-width "^4.1.0" 127 | 128 | ansi-regex@^5.0.1: 129 | version "5.0.1" 130 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 131 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 132 | 133 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 134 | version "4.3.0" 135 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 136 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 137 | dependencies: 138 | color-convert "^2.0.1" 139 | 140 | anymatch@~3.1.2: 141 | version "3.1.2" 142 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 143 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 144 | dependencies: 145 | normalize-path "^3.0.0" 146 | picomatch "^2.0.4" 147 | 148 | "aproba@^1.0.3 || ^2.0.0": 149 | version "2.0.0" 150 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" 151 | integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== 152 | 153 | are-we-there-yet@^2.0.0: 154 | version "2.0.0" 155 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz#372e0e7bd279d8e94c653aaa1f67200884bf3e1c" 156 | integrity sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw== 157 | dependencies: 158 | delegates "^1.0.0" 159 | readable-stream "^3.6.0" 160 | 161 | asynckit@^0.4.0: 162 | version "0.4.0" 163 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 164 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 165 | 166 | axios@^0.25.0: 167 | version "0.25.0" 168 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" 169 | integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== 170 | dependencies: 171 | follow-redirects "^1.14.7" 172 | 173 | balanced-match@^1.0.0: 174 | version "1.0.2" 175 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 176 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 177 | 178 | base64-js@^1.3.1: 179 | version "1.5.1" 180 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 181 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 182 | 183 | binary-extensions@^2.0.0: 184 | version "2.2.0" 185 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 186 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 187 | 188 | boxen@^5.0.0: 189 | version "5.1.2" 190 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" 191 | integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== 192 | dependencies: 193 | ansi-align "^3.0.0" 194 | camelcase "^6.2.0" 195 | chalk "^4.1.0" 196 | cli-boxes "^2.2.1" 197 | string-width "^4.2.2" 198 | type-fest "^0.20.2" 199 | widest-line "^3.1.0" 200 | wrap-ansi "^7.0.0" 201 | 202 | brace-expansion@^1.1.7: 203 | version "1.1.11" 204 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 205 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 206 | dependencies: 207 | balanced-match "^1.0.0" 208 | concat-map "0.0.1" 209 | 210 | braces@~3.0.2: 211 | version "3.0.2" 212 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 213 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 214 | dependencies: 215 | fill-range "^7.0.1" 216 | 217 | bson@^4.2.2, bson@^4.6.0: 218 | version "4.6.1" 219 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.1.tgz#2b5da517539bb0f7f3ffb54ac70a384ca899641c" 220 | integrity sha512-I1LQ7Hz5zgwR4QquilLNZwbhPw0Apx7i7X9kGMBTsqPdml/03Q9NBtD9nt/19ahjlphktQImrnderxqpzeVDjw== 221 | dependencies: 222 | buffer "^5.6.0" 223 | 224 | buffer-from@^1.0.0: 225 | version "1.1.2" 226 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 227 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 228 | 229 | buffer@^5.6.0: 230 | version "5.7.1" 231 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 232 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 233 | dependencies: 234 | base64-js "^1.3.1" 235 | ieee754 "^1.1.13" 236 | 237 | bytes@3.1.1: 238 | version "3.1.1" 239 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" 240 | integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== 241 | 242 | cacheable-request@^6.0.0: 243 | version "6.1.0" 244 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 245 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 246 | dependencies: 247 | clone-response "^1.0.2" 248 | get-stream "^5.1.0" 249 | http-cache-semantics "^4.0.0" 250 | keyv "^3.0.0" 251 | lowercase-keys "^2.0.0" 252 | normalize-url "^4.1.0" 253 | responselike "^1.0.2" 254 | 255 | camelcase@^6.2.0: 256 | version "6.3.0" 257 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 258 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 259 | 260 | canvas@^2.8.0: 261 | version "2.9.0" 262 | resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.9.0.tgz#7df0400b141a7e42e597824f377935ba96880f2a" 263 | integrity sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ== 264 | dependencies: 265 | "@mapbox/node-pre-gyp" "^1.0.0" 266 | nan "^2.15.0" 267 | simple-get "^3.0.3" 268 | 269 | chalk@4.1.2, chalk@^4.1.0: 270 | version "4.1.2" 271 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 272 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 273 | dependencies: 274 | ansi-styles "^4.1.0" 275 | supports-color "^7.1.0" 276 | 277 | chart.js@^3.7.0: 278 | version "3.7.0" 279 | resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-3.7.0.tgz#7a19c93035341df801d613993c2170a1fcf1d882" 280 | integrity sha512-31gVuqqKp3lDIFmzpKIrBeum4OpZsQjSIAqlOpgjosHDJZlULtvwLEZKtEhIAZc7JMPaHlYMys40Qy9Mf+1AAg== 281 | 282 | chartjs-node-canvas@^4.1.5: 283 | version "4.1.6" 284 | resolved "https://registry.yarnpkg.com/chartjs-node-canvas/-/chartjs-node-canvas-4.1.6.tgz#034b0428a8accfa4963dd681497f00f900fefc81" 285 | integrity sha512-UQJbPWrvqB/FoLclGA9BaLQmZbzSYlujF4w8NZd6Xzb+sqgACBb2owDX6m7ifCXLjUW5Nz0Qx0qqrTtQkkSoYw== 286 | dependencies: 287 | canvas "^2.8.0" 288 | tslib "^2.3.1" 289 | 290 | chokidar@^3.5.2: 291 | version "3.5.3" 292 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 293 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 294 | dependencies: 295 | anymatch "~3.1.2" 296 | braces "~3.0.2" 297 | glob-parent "~5.1.2" 298 | is-binary-path "~2.1.0" 299 | is-glob "~4.0.1" 300 | normalize-path "~3.0.0" 301 | readdirp "~3.6.0" 302 | optionalDependencies: 303 | fsevents "~2.3.2" 304 | 305 | chownr@^2.0.0: 306 | version "2.0.0" 307 | resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" 308 | integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== 309 | 310 | ci-info@^2.0.0: 311 | version "2.0.0" 312 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 313 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 314 | 315 | cli-boxes@^2.2.1: 316 | version "2.2.1" 317 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" 318 | integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== 319 | 320 | clone-response@^1.0.2: 321 | version "1.0.2" 322 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 323 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 324 | dependencies: 325 | mimic-response "^1.0.0" 326 | 327 | cluster-key-slot@^1.1.0: 328 | version "1.1.0" 329 | resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" 330 | integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== 331 | 332 | color-convert@^2.0.1: 333 | version "2.0.1" 334 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 335 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 336 | dependencies: 337 | color-name "~1.1.4" 338 | 339 | color-name@~1.1.4: 340 | version "1.1.4" 341 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 342 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 343 | 344 | color-support@^1.1.2: 345 | version "1.1.3" 346 | resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" 347 | integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== 348 | 349 | combined-stream@^1.0.8: 350 | version "1.0.8" 351 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 352 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 353 | dependencies: 354 | delayed-stream "~1.0.0" 355 | 356 | concat-map@0.0.1: 357 | version "0.0.1" 358 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 359 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 360 | 361 | concat-stream@^1.4.7: 362 | version "1.6.2" 363 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 364 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 365 | dependencies: 366 | buffer-from "^1.0.0" 367 | inherits "^2.0.3" 368 | readable-stream "^2.2.2" 369 | typedarray "^0.0.6" 370 | 371 | configstore@^5.0.1: 372 | version "5.0.1" 373 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 374 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 375 | dependencies: 376 | dot-prop "^5.2.0" 377 | graceful-fs "^4.1.2" 378 | make-dir "^3.0.0" 379 | unique-string "^2.0.0" 380 | write-file-atomic "^3.0.0" 381 | xdg-basedir "^4.0.0" 382 | 383 | console-control-strings@^1.0.0, console-control-strings@^1.1.0: 384 | version "1.1.0" 385 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 386 | integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 387 | 388 | core-util-is@~1.0.0: 389 | version "1.0.3" 390 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 391 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 392 | 393 | cross-spawn@^5.0.1: 394 | version "5.1.0" 395 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 396 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 397 | dependencies: 398 | lru-cache "^4.0.1" 399 | shebang-command "^1.2.0" 400 | which "^1.2.9" 401 | 402 | crypto-random-string@^2.0.0: 403 | version "2.0.0" 404 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 405 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 406 | 407 | debug@4, debug@4.x, debug@^4.3.1: 408 | version "4.3.3" 409 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" 410 | integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== 411 | dependencies: 412 | ms "2.1.2" 413 | 414 | debug@^3.2.7: 415 | version "3.2.7" 416 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 417 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 418 | dependencies: 419 | ms "^2.1.1" 420 | 421 | decompress-response@^3.3.0: 422 | version "3.3.0" 423 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 424 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 425 | dependencies: 426 | mimic-response "^1.0.0" 427 | 428 | decompress-response@^4.2.0: 429 | version "4.2.1" 430 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" 431 | integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== 432 | dependencies: 433 | mimic-response "^2.0.0" 434 | 435 | deep-extend@^0.6.0: 436 | version "0.6.0" 437 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 438 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 439 | 440 | defer-to-connect@^1.0.1: 441 | version "1.1.3" 442 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 443 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 444 | 445 | delayed-stream@~1.0.0: 446 | version "1.0.0" 447 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 448 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 449 | 450 | delegates@^1.0.0: 451 | version "1.0.0" 452 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 453 | integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= 454 | 455 | denque@^1.1.0: 456 | version "1.5.1" 457 | resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" 458 | integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== 459 | 460 | denque@^2.0.1: 461 | version "2.0.1" 462 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a" 463 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ== 464 | 465 | depd@~1.1.2: 466 | version "1.1.2" 467 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 468 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 469 | 470 | detect-libc@^1.0.3: 471 | version "1.0.3" 472 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" 473 | integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= 474 | 475 | discord-api-types@^0.26.0: 476 | version "0.26.1" 477 | resolved "https://registry.yarnpkg.com/discord-api-types/-/discord-api-types-0.26.1.tgz#726f766ddc37d60da95740991d22cb6ef2ed787b" 478 | integrity sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ== 479 | 480 | discord.js-rate-limiter@^1.2.3: 481 | version "1.3.1" 482 | resolved "https://registry.yarnpkg.com/discord.js-rate-limiter/-/discord.js-rate-limiter-1.3.1.tgz#af514dcfe4819b03b508a32dd577f588214842d1" 483 | integrity sha512-8cly795mEkQk1I8QELPOgVsdSzX96180XbE/rFcA+TTdH8Yw13CceA80+WTnULmmmNC/D3wxpIFGY9748w5/Hg== 484 | dependencies: 485 | limiter "2.1.0" 486 | 487 | discord.js@^13.5.0: 488 | version "13.6.0" 489 | resolved "https://registry.yarnpkg.com/discord.js/-/discord.js-13.6.0.tgz#d8a8a591dbf25cbcf9c783d5ddf22c4694860475" 490 | integrity sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g== 491 | dependencies: 492 | "@discordjs/builders" "^0.11.0" 493 | "@discordjs/collection" "^0.4.0" 494 | "@sapphire/async-queue" "^1.1.9" 495 | "@types/node-fetch" "^2.5.12" 496 | "@types/ws" "^8.2.2" 497 | discord-api-types "^0.26.0" 498 | form-data "^4.0.0" 499 | node-fetch "^2.6.1" 500 | ws "^8.4.0" 501 | 502 | dot-prop@^5.2.0: 503 | version "5.3.0" 504 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" 505 | integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== 506 | dependencies: 507 | is-obj "^2.0.0" 508 | 509 | dotenv@^14.3.2: 510 | version "14.3.2" 511 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" 512 | integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== 513 | 514 | duplexer3@^0.1.4: 515 | version "0.1.4" 516 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 517 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 518 | 519 | emoji-regex@^8.0.0: 520 | version "8.0.0" 521 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 522 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 523 | 524 | end-of-stream@^1.1.0: 525 | version "1.4.4" 526 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 527 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 528 | dependencies: 529 | once "^1.4.0" 530 | 531 | escape-goat@^2.0.0: 532 | version "2.1.1" 533 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 534 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 535 | 536 | fast-xml-parser@^4.0.0-beta.8: 537 | version "4.0.1" 538 | resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.0.1.tgz#bea0d20ca1d7ad1a5963d609096e8e83e526a7d9" 539 | integrity sha512-EN1yOXDmMqpHrqkwTlCJDvFjepJBoBxjLRDtDxFmqrBILGV3NyFWpmcsofSKCCzc+YxhvNreB5rcKzG+TlyWpg== 540 | dependencies: 541 | strnum "^1.0.5" 542 | 543 | fill-range@^7.0.1: 544 | version "7.0.1" 545 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 546 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 547 | dependencies: 548 | to-regex-range "^5.0.1" 549 | 550 | follow-redirects@^1.14.7: 551 | version "1.14.7" 552 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.7.tgz#2004c02eb9436eee9a21446a6477debf17e81685" 553 | integrity sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ== 554 | 555 | form-data@^3.0.0: 556 | version "3.0.1" 557 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" 558 | integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== 559 | dependencies: 560 | asynckit "^0.4.0" 561 | combined-stream "^1.0.8" 562 | mime-types "^2.1.12" 563 | 564 | form-data@^4.0.0: 565 | version "4.0.0" 566 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 567 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 568 | dependencies: 569 | asynckit "^0.4.0" 570 | combined-stream "^1.0.8" 571 | mime-types "^2.1.12" 572 | 573 | fs-minipass@^2.0.0: 574 | version "2.1.0" 575 | resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" 576 | integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== 577 | dependencies: 578 | minipass "^3.0.0" 579 | 580 | fs.realpath@^1.0.0: 581 | version "1.0.0" 582 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 583 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 584 | 585 | fsevents@~2.3.2: 586 | version "2.3.2" 587 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 588 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 589 | 590 | gauge@^3.0.0: 591 | version "3.0.2" 592 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-3.0.2.tgz#03bf4441c044383908bcfa0656ad91803259b395" 593 | integrity sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q== 594 | dependencies: 595 | aproba "^1.0.3 || ^2.0.0" 596 | color-support "^1.1.2" 597 | console-control-strings "^1.0.0" 598 | has-unicode "^2.0.1" 599 | object-assign "^4.1.1" 600 | signal-exit "^3.0.0" 601 | string-width "^4.2.3" 602 | strip-ansi "^6.0.1" 603 | wide-align "^1.1.2" 604 | 605 | get-stream@^4.1.0: 606 | version "4.1.0" 607 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 608 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 609 | dependencies: 610 | pump "^3.0.0" 611 | 612 | get-stream@^5.1.0: 613 | version "5.2.0" 614 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" 615 | integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== 616 | dependencies: 617 | pump "^3.0.0" 618 | 619 | glob-parent@~5.1.2: 620 | version "5.1.2" 621 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 622 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 623 | dependencies: 624 | is-glob "^4.0.1" 625 | 626 | glob@^7.1.3: 627 | version "7.2.0" 628 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" 629 | integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== 630 | dependencies: 631 | fs.realpath "^1.0.0" 632 | inflight "^1.0.4" 633 | inherits "2" 634 | minimatch "^3.0.4" 635 | once "^1.3.0" 636 | path-is-absolute "^1.0.0" 637 | 638 | global-dirs@^3.0.0: 639 | version "3.0.0" 640 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" 641 | integrity sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA== 642 | dependencies: 643 | ini "2.0.0" 644 | 645 | got@^9.6.0: 646 | version "9.6.0" 647 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 648 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 649 | dependencies: 650 | "@sindresorhus/is" "^0.14.0" 651 | "@szmarczak/http-timer" "^1.1.2" 652 | cacheable-request "^6.0.0" 653 | decompress-response "^3.3.0" 654 | duplexer3 "^0.1.4" 655 | get-stream "^4.1.0" 656 | lowercase-keys "^1.0.1" 657 | mimic-response "^1.0.1" 658 | p-cancelable "^1.0.0" 659 | to-readable-stream "^1.0.0" 660 | url-parse-lax "^3.0.0" 661 | 662 | graceful-fs@^4.1.2: 663 | version "4.2.9" 664 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 665 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 666 | 667 | has-flag@^3.0.0: 668 | version "3.0.0" 669 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 670 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 671 | 672 | has-flag@^4.0.0: 673 | version "4.0.0" 674 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 675 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 676 | 677 | has-unicode@^2.0.1: 678 | version "2.0.1" 679 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 680 | integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= 681 | 682 | has-yarn@^2.1.0: 683 | version "2.1.0" 684 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 685 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 686 | 687 | http-cache-semantics@^4.0.0: 688 | version "4.1.0" 689 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 690 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 691 | 692 | http-errors@1.8.1: 693 | version "1.8.1" 694 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" 695 | integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== 696 | dependencies: 697 | depd "~1.1.2" 698 | inherits "2.0.4" 699 | setprototypeof "1.2.0" 700 | statuses ">= 1.5.0 < 2" 701 | toidentifier "1.0.1" 702 | 703 | https-proxy-agent@^5.0.0: 704 | version "5.0.0" 705 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" 706 | integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== 707 | dependencies: 708 | agent-base "6" 709 | debug "4" 710 | 711 | iconv-lite@0.4.24: 712 | version "0.4.24" 713 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 714 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 715 | dependencies: 716 | safer-buffer ">= 2.1.2 < 3" 717 | 718 | ieee754@^1.1.13: 719 | version "1.2.1" 720 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 721 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 722 | 723 | ignore-by-default@^1.0.1: 724 | version "1.0.1" 725 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 726 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 727 | 728 | import-lazy@^2.1.0: 729 | version "2.1.0" 730 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 731 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 732 | 733 | imurmurhash@^0.1.4: 734 | version "0.1.4" 735 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 736 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 737 | 738 | inflight@^1.0.4: 739 | version "1.0.6" 740 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 741 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 742 | dependencies: 743 | once "^1.3.0" 744 | wrappy "1" 745 | 746 | inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: 747 | version "2.0.4" 748 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 749 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 750 | 751 | ini@2.0.0: 752 | version "2.0.0" 753 | resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" 754 | integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== 755 | 756 | ini@~1.3.0: 757 | version "1.3.8" 758 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 759 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 760 | 761 | ioredis@^4.28.2: 762 | version "4.28.3" 763 | resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.3.tgz#b13fce8a6a7c525ba22e666d72980a3c0ba799aa" 764 | integrity sha512-9JOWVgBnuSxpIgfpjc1OeY1OLmA4t2KOWWURTDRXky+eWO0LZhI33pQNT9gYxANUXfh5p/zYephYni6GPRsksQ== 765 | dependencies: 766 | cluster-key-slot "^1.1.0" 767 | debug "^4.3.1" 768 | denque "^1.1.0" 769 | lodash.defaults "^4.2.0" 770 | lodash.flatten "^4.4.0" 771 | lodash.isarguments "^3.1.0" 772 | p-map "^2.1.0" 773 | redis-commands "1.7.0" 774 | redis-errors "^1.2.0" 775 | redis-parser "^3.0.0" 776 | standard-as-callback "^2.1.0" 777 | 778 | is-binary-path@~2.1.0: 779 | version "2.1.0" 780 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 781 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 782 | dependencies: 783 | binary-extensions "^2.0.0" 784 | 785 | is-ci@^2.0.0: 786 | version "2.0.0" 787 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 788 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 789 | dependencies: 790 | ci-info "^2.0.0" 791 | 792 | is-extglob@^2.1.1: 793 | version "2.1.1" 794 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 795 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 796 | 797 | is-fullwidth-code-point@^3.0.0: 798 | version "3.0.0" 799 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 800 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 801 | 802 | is-glob@^4.0.1, is-glob@~4.0.1: 803 | version "4.0.3" 804 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 805 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 806 | dependencies: 807 | is-extglob "^2.1.1" 808 | 809 | is-installed-globally@^0.4.0: 810 | version "0.4.0" 811 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" 812 | integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== 813 | dependencies: 814 | global-dirs "^3.0.0" 815 | is-path-inside "^3.0.2" 816 | 817 | is-npm@^5.0.0: 818 | version "5.0.0" 819 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" 820 | integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== 821 | 822 | is-number@^7.0.0: 823 | version "7.0.0" 824 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 825 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 826 | 827 | is-obj@^2.0.0: 828 | version "2.0.0" 829 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 830 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 831 | 832 | is-path-inside@^3.0.2: 833 | version "3.0.3" 834 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 835 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 836 | 837 | is-typedarray@^1.0.0: 838 | version "1.0.0" 839 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 840 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 841 | 842 | is-yarn-global@^0.3.0: 843 | version "0.3.0" 844 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 845 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 846 | 847 | isarray@~1.0.0: 848 | version "1.0.0" 849 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 850 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 851 | 852 | isexe@^2.0.0: 853 | version "2.0.0" 854 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 855 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 856 | 857 | json-buffer@3.0.0: 858 | version "3.0.0" 859 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 860 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 861 | 862 | just-performance@4.3.0: 863 | version "4.3.0" 864 | resolved "https://registry.yarnpkg.com/just-performance/-/just-performance-4.3.0.tgz#cc2bc8c9227f09e97b6b1df4cd0de2df7ae16db1" 865 | integrity sha512-L7RjvtJsL0QO8xFs5wEoDDzzJwoiowRw6Rn/GnvldlchS2JQr9wFYPiwZcDfrbbujEKqKN0tvENdbjXdYhDp5Q== 866 | 867 | kareem@2.3.3: 868 | version "2.3.3" 869 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.3.tgz#a4432d7965a5bb06fc2b4eeae71317344c9a756a" 870 | integrity sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg== 871 | 872 | keyv@^3.0.0: 873 | version "3.1.0" 874 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 875 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 876 | dependencies: 877 | json-buffer "3.0.0" 878 | 879 | latest-version@^5.1.0: 880 | version "5.1.0" 881 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 882 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 883 | dependencies: 884 | package-json "^6.3.0" 885 | 886 | limiter@2.1.0: 887 | version "2.1.0" 888 | resolved "https://registry.yarnpkg.com/limiter/-/limiter-2.1.0.tgz#d38d7c5b63729bb84fb0c4d8594b7e955a5182a2" 889 | integrity sha512-361TYz6iay6n+9KvUUImqdLuFigK+K79qrUtBsXhJTLdH4rIt/r1y8r1iozwh8KbZNpujbFTSh74mJ7bwbAMOw== 890 | dependencies: 891 | just-performance "4.3.0" 892 | 893 | lodash.defaults@^4.2.0: 894 | version "4.2.0" 895 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 896 | integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 897 | 898 | lodash.flatten@^4.4.0: 899 | version "4.4.0" 900 | resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 901 | integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 902 | 903 | lodash.isarguments@^3.1.0: 904 | version "3.1.0" 905 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 906 | integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= 907 | 908 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 909 | version "1.0.1" 910 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 911 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 912 | 913 | lowercase-keys@^2.0.0: 914 | version "2.0.0" 915 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 916 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 917 | 918 | lru-cache@^4.0.1: 919 | version "4.1.5" 920 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 921 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 922 | dependencies: 923 | pseudomap "^1.0.2" 924 | yallist "^2.1.2" 925 | 926 | lru-cache@^6.0.0: 927 | version "6.0.0" 928 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 929 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 930 | dependencies: 931 | yallist "^4.0.0" 932 | 933 | make-dir@^3.0.0, make-dir@^3.1.0: 934 | version "3.1.0" 935 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 936 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 937 | dependencies: 938 | semver "^6.0.0" 939 | 940 | memory-pager@^1.0.2: 941 | version "1.5.0" 942 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 943 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 944 | 945 | mime-db@1.51.0: 946 | version "1.51.0" 947 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 948 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 949 | 950 | mime-types@^2.1.12: 951 | version "2.1.34" 952 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 953 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 954 | dependencies: 955 | mime-db "1.51.0" 956 | 957 | mimic-response@^1.0.0, mimic-response@^1.0.1: 958 | version "1.0.1" 959 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 960 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 961 | 962 | mimic-response@^2.0.0: 963 | version "2.1.0" 964 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 965 | integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== 966 | 967 | minecraft-motd-util@^1.1.9: 968 | version "1.1.12" 969 | resolved "https://registry.yarnpkg.com/minecraft-motd-util/-/minecraft-motd-util-1.1.12.tgz#b1e3627329a770c015e5c32261510eb9ff0a2f81" 970 | integrity sha512-5TuTRjrRupSTruea0nRC37r0FdhkS1O4wIJKAYfwJRCQd/X4Zyl/dVIs96h9UVW6N8jhIuz9pNkrDsqyN7VBdA== 971 | 972 | minecraft-server-util@^5.2.8: 973 | version "5.2.9" 974 | resolved "https://registry.yarnpkg.com/minecraft-server-util/-/minecraft-server-util-5.2.9.tgz#01b2dfd91c0cfa9bafab9995885b07793c68db39" 975 | integrity sha512-MLaST5JnTlutO8++8FRa4RBck2EM4QMfkdkJ8b4LsjSTHtZQihD/zma2Bks9weEJnH3Q0xWmb5wLScv/UNDQyg== 976 | dependencies: 977 | minecraft-motd-util "^1.1.9" 978 | 979 | minimatch@^3.0.4: 980 | version "3.0.4" 981 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 982 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 983 | dependencies: 984 | brace-expansion "^1.1.7" 985 | 986 | minimist@^1.2.0: 987 | version "1.2.5" 988 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 989 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 990 | 991 | minipass@^3.0.0: 992 | version "3.1.6" 993 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.6.tgz#3b8150aa688a711a1521af5e8779c1d3bb4f45ee" 994 | integrity sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ== 995 | dependencies: 996 | yallist "^4.0.0" 997 | 998 | minizlib@^2.1.1: 999 | version "2.1.2" 1000 | resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" 1001 | integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== 1002 | dependencies: 1003 | minipass "^3.0.0" 1004 | yallist "^4.0.0" 1005 | 1006 | mkdirp@^1.0.3: 1007 | version "1.0.4" 1008 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 1009 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 1010 | 1011 | moment-timezone@^0.5.31: 1012 | version "0.5.34" 1013 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.34.tgz#a75938f7476b88f155d3504a9343f7519d9a405c" 1014 | integrity sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg== 1015 | dependencies: 1016 | moment ">= 2.9.0" 1017 | 1018 | "moment@>= 2.9.0", moment@^2.29.1: 1019 | version "2.29.1" 1020 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" 1021 | integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== 1022 | 1023 | mongo-sanitize@^1.1.0: 1024 | version "1.1.0" 1025 | resolved "https://registry.yarnpkg.com/mongo-sanitize/-/mongo-sanitize-1.1.0.tgz#01346b55f90716a42de3a1f957500a11c0752c36" 1026 | integrity sha512-6gB9AiJD+om2eZLxaPKIP5Q8P3Fr+s+17rVWso7hU0+MAzmIvIMlgTYuyvalDLTtE/p0gczcvJ8A3pbN1XmQ/A== 1027 | 1028 | mongodb-connection-string-url@^2.3.2: 1029 | version "2.4.1" 1030 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz#6b3c6c40133a0ad059fe9a0abda64b2a1cb4e8b4" 1031 | integrity sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug== 1032 | dependencies: 1033 | "@types/whatwg-url" "^8.2.1" 1034 | whatwg-url "^11.0.0" 1035 | 1036 | mongodb@4.2.2: 1037 | version "4.2.2" 1038 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.2.2.tgz#cd70568bd96003877e35358ad17a0c5de35c6dfd" 1039 | integrity sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug== 1040 | dependencies: 1041 | bson "^4.6.0" 1042 | denque "^2.0.1" 1043 | mongodb-connection-string-url "^2.3.2" 1044 | optionalDependencies: 1045 | saslprep "^1.0.3" 1046 | 1047 | mongoose@^6.1.4: 1048 | version "6.1.8" 1049 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.1.8.tgz#8565c7610ceb81a9b0416ceb4bf0b709c8b83f6a" 1050 | integrity sha512-/voqwU2dtet3zAR73r8jdPhqluU1VzIAnk7ecXPJBgyXKREnwQrz40lfW7fLpaqhmMhsAbA+JQ7ICUn2vAVFLw== 1051 | dependencies: 1052 | "@types/node" "< 17.0.6" 1053 | bson "^4.2.2" 1054 | kareem "2.3.3" 1055 | mongodb "4.2.2" 1056 | mpath "0.8.4" 1057 | mquery "4.0.2" 1058 | ms "2.1.2" 1059 | regexp-clone "1.0.0" 1060 | sift "13.5.2" 1061 | 1062 | mpath@0.8.4: 1063 | version "0.8.4" 1064 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313" 1065 | integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g== 1066 | 1067 | mquery@4.0.2: 1068 | version "4.0.2" 1069 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.2.tgz#a13add5ecd7c2e5a67e0f814b3c7acdfb6772804" 1070 | integrity sha512-oAVF0Nil1mT3rxty6Zln4YiD6x6QsUWYz927jZzjMxOK2aqmhEz5JQ7xmrKK7xRFA2dwV+YaOpKU/S+vfNqKxA== 1071 | dependencies: 1072 | debug "4.x" 1073 | 1074 | ms@2.1.2: 1075 | version "2.1.2" 1076 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1077 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1078 | 1079 | ms@^2.1.1: 1080 | version "2.1.3" 1081 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1082 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1083 | 1084 | nan@^2.15.0: 1085 | version "2.15.0" 1086 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" 1087 | integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== 1088 | 1089 | node-cron@^3.0.0: 1090 | version "3.0.0" 1091 | resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.0.tgz#b33252803e430f9cd8590cf85738efa1497a9522" 1092 | integrity sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA== 1093 | dependencies: 1094 | moment-timezone "^0.5.31" 1095 | 1096 | node-fetch@^2.6.1, node-fetch@^2.6.5: 1097 | version "2.6.7" 1098 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 1099 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 1100 | dependencies: 1101 | whatwg-url "^5.0.0" 1102 | 1103 | nodemon@^2.0.15: 1104 | version "2.0.15" 1105 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.15.tgz#504516ce3b43d9dc9a955ccd9ec57550a31a8d4e" 1106 | integrity sha512-gdHMNx47Gw7b3kWxJV64NI+Q5nfl0y5DgDbiVtShiwa7Z0IZ07Ll4RLFo6AjrhzMtoEZn5PDE3/c2AbVsiCkpA== 1107 | dependencies: 1108 | chokidar "^3.5.2" 1109 | debug "^3.2.7" 1110 | ignore-by-default "^1.0.1" 1111 | minimatch "^3.0.4" 1112 | pstree.remy "^1.1.8" 1113 | semver "^5.7.1" 1114 | supports-color "^5.5.0" 1115 | touch "^3.1.0" 1116 | undefsafe "^2.0.5" 1117 | update-notifier "^5.1.0" 1118 | 1119 | nopt@^5.0.0: 1120 | version "5.0.0" 1121 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" 1122 | integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== 1123 | dependencies: 1124 | abbrev "1" 1125 | 1126 | nopt@~1.0.10: 1127 | version "1.0.10" 1128 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1129 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1130 | dependencies: 1131 | abbrev "1" 1132 | 1133 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1134 | version "3.0.0" 1135 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1136 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1137 | 1138 | normalize-url@^4.1.0: 1139 | version "4.5.1" 1140 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 1141 | integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== 1142 | 1143 | npmlog@^5.0.1: 1144 | version "5.0.1" 1145 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" 1146 | integrity sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw== 1147 | dependencies: 1148 | are-we-there-yet "^2.0.0" 1149 | console-control-strings "^1.1.0" 1150 | gauge "^3.0.0" 1151 | set-blocking "^2.0.0" 1152 | 1153 | object-assign@^4.1.1: 1154 | version "4.1.1" 1155 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1156 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 1157 | 1158 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1159 | version "1.4.0" 1160 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1161 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1162 | dependencies: 1163 | wrappy "1" 1164 | 1165 | os-shim@^0.1.2: 1166 | version "0.1.3" 1167 | resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" 1168 | integrity sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc= 1169 | 1170 | p-cancelable@^1.0.0: 1171 | version "1.1.0" 1172 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1173 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1174 | 1175 | p-map@^2.1.0: 1176 | version "2.1.0" 1177 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" 1178 | integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== 1179 | 1180 | package-json@^6.3.0: 1181 | version "6.5.0" 1182 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1183 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1184 | dependencies: 1185 | got "^9.6.0" 1186 | registry-auth-token "^4.0.0" 1187 | registry-url "^5.0.0" 1188 | semver "^6.2.0" 1189 | 1190 | path-is-absolute@^1.0.0: 1191 | version "1.0.1" 1192 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1193 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1194 | 1195 | picomatch@^2.0.4, picomatch@^2.2.1: 1196 | version "2.3.1" 1197 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1198 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1199 | 1200 | pre-commit@^1.2.2: 1201 | version "1.2.2" 1202 | resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.2.tgz#dbcee0ee9de7235e57f79c56d7ce94641a69eec6" 1203 | integrity sha1-287g7p3nI15X95xW186UZBpp7sY= 1204 | dependencies: 1205 | cross-spawn "^5.0.1" 1206 | spawn-sync "^1.0.15" 1207 | which "1.2.x" 1208 | 1209 | prepend-http@^2.0.0: 1210 | version "2.0.0" 1211 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1212 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1213 | 1214 | prettier@^2.5.1: 1215 | version "2.5.1" 1216 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" 1217 | integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== 1218 | 1219 | process-nextick-args@~2.0.0: 1220 | version "2.0.1" 1221 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1222 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1223 | 1224 | pseudomap@^1.0.2: 1225 | version "1.0.2" 1226 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1227 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1228 | 1229 | pstree.remy@^1.1.8: 1230 | version "1.1.8" 1231 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 1232 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1233 | 1234 | pump@^3.0.0: 1235 | version "3.0.0" 1236 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1237 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1238 | dependencies: 1239 | end-of-stream "^1.1.0" 1240 | once "^1.3.1" 1241 | 1242 | punycode@^2.1.1: 1243 | version "2.1.1" 1244 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1245 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1246 | 1247 | pupa@^2.1.1: 1248 | version "2.1.1" 1249 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" 1250 | integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== 1251 | dependencies: 1252 | escape-goat "^2.0.0" 1253 | 1254 | raw-body@^2.4.1: 1255 | version "2.4.2" 1256 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" 1257 | integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== 1258 | dependencies: 1259 | bytes "3.1.1" 1260 | http-errors "1.8.1" 1261 | iconv-lite "0.4.24" 1262 | unpipe "1.0.0" 1263 | 1264 | rc@^1.2.8: 1265 | version "1.2.8" 1266 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1267 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1268 | dependencies: 1269 | deep-extend "^0.6.0" 1270 | ini "~1.3.0" 1271 | minimist "^1.2.0" 1272 | strip-json-comments "~2.0.1" 1273 | 1274 | readable-stream@^2.2.2: 1275 | version "2.3.7" 1276 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1277 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1278 | dependencies: 1279 | core-util-is "~1.0.0" 1280 | inherits "~2.0.3" 1281 | isarray "~1.0.0" 1282 | process-nextick-args "~2.0.0" 1283 | safe-buffer "~5.1.1" 1284 | string_decoder "~1.1.1" 1285 | util-deprecate "~1.0.1" 1286 | 1287 | readable-stream@^3.6.0: 1288 | version "3.6.0" 1289 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1290 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1291 | dependencies: 1292 | inherits "^2.0.3" 1293 | string_decoder "^1.1.1" 1294 | util-deprecate "^1.0.1" 1295 | 1296 | readdirp@~3.6.0: 1297 | version "3.6.0" 1298 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1299 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1300 | dependencies: 1301 | picomatch "^2.2.1" 1302 | 1303 | redis-commands@1.7.0: 1304 | version "1.7.0" 1305 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" 1306 | integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== 1307 | 1308 | redis-errors@^1.0.0, redis-errors@^1.2.0: 1309 | version "1.2.0" 1310 | resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" 1311 | integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= 1312 | 1313 | redis-parser@^3.0.0: 1314 | version "3.0.0" 1315 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" 1316 | integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= 1317 | dependencies: 1318 | redis-errors "^1.0.0" 1319 | 1320 | regexp-clone@1.0.0: 1321 | version "1.0.0" 1322 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" 1323 | integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== 1324 | 1325 | registry-auth-token@^4.0.0: 1326 | version "4.2.1" 1327 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" 1328 | integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== 1329 | dependencies: 1330 | rc "^1.2.8" 1331 | 1332 | registry-url@^5.0.0: 1333 | version "5.1.0" 1334 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1335 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1336 | dependencies: 1337 | rc "^1.2.8" 1338 | 1339 | responselike@^1.0.2: 1340 | version "1.0.2" 1341 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1342 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1343 | dependencies: 1344 | lowercase-keys "^1.0.0" 1345 | 1346 | rimraf@^3.0.2: 1347 | version "3.0.2" 1348 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1349 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1350 | dependencies: 1351 | glob "^7.1.3" 1352 | 1353 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1354 | version "5.1.2" 1355 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1356 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1357 | 1358 | safe-buffer@~5.2.0: 1359 | version "5.2.1" 1360 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1361 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1362 | 1363 | "safer-buffer@>= 2.1.2 < 3": 1364 | version "2.1.2" 1365 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1366 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1367 | 1368 | saslprep@^1.0.3: 1369 | version "1.0.3" 1370 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 1371 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 1372 | dependencies: 1373 | sparse-bitfield "^3.0.3" 1374 | 1375 | semver-diff@^3.1.1: 1376 | version "3.1.1" 1377 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1378 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1379 | dependencies: 1380 | semver "^6.3.0" 1381 | 1382 | semver@^5.7.1: 1383 | version "5.7.1" 1384 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1385 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1386 | 1387 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1388 | version "6.3.0" 1389 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1390 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1391 | 1392 | semver@^7.3.4, semver@^7.3.5: 1393 | version "7.3.5" 1394 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 1395 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 1396 | dependencies: 1397 | lru-cache "^6.0.0" 1398 | 1399 | set-blocking@^2.0.0: 1400 | version "2.0.0" 1401 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1402 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1403 | 1404 | setprototypeof@1.2.0: 1405 | version "1.2.0" 1406 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1407 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1408 | 1409 | shebang-command@^1.2.0: 1410 | version "1.2.0" 1411 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1412 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1413 | dependencies: 1414 | shebang-regex "^1.0.0" 1415 | 1416 | shebang-regex@^1.0.0: 1417 | version "1.0.0" 1418 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1419 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1420 | 1421 | sift@13.5.2: 1422 | version "13.5.2" 1423 | resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6" 1424 | integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA== 1425 | 1426 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1427 | version "3.0.6" 1428 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 1429 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 1430 | 1431 | simple-concat@^1.0.0: 1432 | version "1.0.1" 1433 | resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" 1434 | integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== 1435 | 1436 | simple-get@^3.0.3: 1437 | version "3.1.0" 1438 | resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" 1439 | integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== 1440 | dependencies: 1441 | decompress-response "^4.2.0" 1442 | once "^1.3.1" 1443 | simple-concat "^1.0.0" 1444 | 1445 | sparse-bitfield@^3.0.3: 1446 | version "3.0.3" 1447 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 1448 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 1449 | dependencies: 1450 | memory-pager "^1.0.2" 1451 | 1452 | spawn-sync@^1.0.15: 1453 | version "1.0.15" 1454 | resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" 1455 | integrity sha1-sAeZVX63+wyDdsKdROih6mfldHY= 1456 | dependencies: 1457 | concat-stream "^1.4.7" 1458 | os-shim "^0.1.2" 1459 | 1460 | standard-as-callback@^2.1.0: 1461 | version "2.1.0" 1462 | resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" 1463 | integrity sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A== 1464 | 1465 | "statuses@>= 1.5.0 < 2": 1466 | version "1.5.0" 1467 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1468 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1469 | 1470 | "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.2, string-width@^4.2.3: 1471 | version "4.2.3" 1472 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1473 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1474 | dependencies: 1475 | emoji-regex "^8.0.0" 1476 | is-fullwidth-code-point "^3.0.0" 1477 | strip-ansi "^6.0.1" 1478 | 1479 | string_decoder@^1.1.1: 1480 | version "1.3.0" 1481 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1482 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1483 | dependencies: 1484 | safe-buffer "~5.2.0" 1485 | 1486 | string_decoder@~1.1.1: 1487 | version "1.1.1" 1488 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1489 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1490 | dependencies: 1491 | safe-buffer "~5.1.0" 1492 | 1493 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1494 | version "6.0.1" 1495 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1496 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1497 | dependencies: 1498 | ansi-regex "^5.0.1" 1499 | 1500 | strip-json-comments@~2.0.1: 1501 | version "2.0.1" 1502 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1503 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1504 | 1505 | strnum@^1.0.5: 1506 | version "1.0.5" 1507 | resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" 1508 | integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== 1509 | 1510 | supports-color@^5.5.0: 1511 | version "5.5.0" 1512 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1513 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1514 | dependencies: 1515 | has-flag "^3.0.0" 1516 | 1517 | supports-color@^7.1.0: 1518 | version "7.2.0" 1519 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1520 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1521 | dependencies: 1522 | has-flag "^4.0.0" 1523 | 1524 | tar@^6.1.11: 1525 | version "6.1.11" 1526 | resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" 1527 | integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== 1528 | dependencies: 1529 | chownr "^2.0.0" 1530 | fs-minipass "^2.0.0" 1531 | minipass "^3.0.0" 1532 | minizlib "^2.1.1" 1533 | mkdirp "^1.0.3" 1534 | yallist "^4.0.0" 1535 | 1536 | to-readable-stream@^1.0.0: 1537 | version "1.0.0" 1538 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 1539 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1540 | 1541 | to-regex-range@^5.0.1: 1542 | version "5.0.1" 1543 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1544 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1545 | dependencies: 1546 | is-number "^7.0.0" 1547 | 1548 | toidentifier@1.0.1: 1549 | version "1.0.1" 1550 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1551 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1552 | 1553 | topgg-autoposter@^2.0.1: 1554 | version "2.0.1" 1555 | resolved "https://registry.yarnpkg.com/topgg-autoposter/-/topgg-autoposter-2.0.1.tgz#321d295836743cb19b90a434e7cbb319f9f3cc69" 1556 | integrity sha512-zoiNqXdcZiTC2C3U1Yz8QI4kibsbKBcSn6Kexf9pKs2RfHgDD3DOhZGUqENkXA7p2yKbk13e1mw5mWGa7Wpyfw== 1557 | dependencies: 1558 | "@jpbberry/typed-emitter" "^1.0.1" 1559 | "@top-gg/sdk" "^3.1.3" 1560 | typescript "^4.2.3" 1561 | 1562 | touch@^3.1.0: 1563 | version "3.1.0" 1564 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1565 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1566 | dependencies: 1567 | nopt "~1.0.10" 1568 | 1569 | tr46@^3.0.0: 1570 | version "3.0.0" 1571 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 1572 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 1573 | dependencies: 1574 | punycode "^2.1.1" 1575 | 1576 | tr46@~0.0.3: 1577 | version "0.0.3" 1578 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1579 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 1580 | 1581 | ts-mixer@^6.0.0: 1582 | version "6.0.0" 1583 | resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.0.tgz#4e631d3a36e3fa9521b973b132e8353bc7267f9f" 1584 | integrity sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ== 1585 | 1586 | tslib@^2.3.1: 1587 | version "2.3.1" 1588 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 1589 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 1590 | 1591 | type-fest@^0.20.2: 1592 | version "0.20.2" 1593 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1594 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1595 | 1596 | typedarray-to-buffer@^3.1.5: 1597 | version "3.1.5" 1598 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1599 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1600 | dependencies: 1601 | is-typedarray "^1.0.0" 1602 | 1603 | typedarray@^0.0.6: 1604 | version "0.0.6" 1605 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1606 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 1607 | 1608 | typescript@^4.2.3: 1609 | version "4.5.5" 1610 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" 1611 | integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== 1612 | 1613 | undefsafe@^2.0.5: 1614 | version "2.0.5" 1615 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" 1616 | integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== 1617 | 1618 | unique-string@^2.0.0: 1619 | version "2.0.0" 1620 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1621 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1622 | dependencies: 1623 | crypto-random-string "^2.0.0" 1624 | 1625 | unpipe@1.0.0: 1626 | version "1.0.0" 1627 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1628 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1629 | 1630 | update-notifier@^5.1.0: 1631 | version "5.1.0" 1632 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" 1633 | integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== 1634 | dependencies: 1635 | boxen "^5.0.0" 1636 | chalk "^4.1.0" 1637 | configstore "^5.0.1" 1638 | has-yarn "^2.1.0" 1639 | import-lazy "^2.1.0" 1640 | is-ci "^2.0.0" 1641 | is-installed-globally "^0.4.0" 1642 | is-npm "^5.0.0" 1643 | is-yarn-global "^0.3.0" 1644 | latest-version "^5.1.0" 1645 | pupa "^2.1.1" 1646 | semver "^7.3.4" 1647 | semver-diff "^3.1.1" 1648 | xdg-basedir "^4.0.0" 1649 | 1650 | url-parse-lax@^3.0.0: 1651 | version "3.0.0" 1652 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1653 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1654 | dependencies: 1655 | prepend-http "^2.0.0" 1656 | 1657 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1658 | version "1.0.2" 1659 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1660 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1661 | 1662 | webidl-conversions@^3.0.0: 1663 | version "3.0.1" 1664 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1665 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 1666 | 1667 | webidl-conversions@^7.0.0: 1668 | version "7.0.0" 1669 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 1670 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 1671 | 1672 | whatwg-url@^11.0.0: 1673 | version "11.0.0" 1674 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 1675 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 1676 | dependencies: 1677 | tr46 "^3.0.0" 1678 | webidl-conversions "^7.0.0" 1679 | 1680 | whatwg-url@^5.0.0: 1681 | version "5.0.0" 1682 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1683 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 1684 | dependencies: 1685 | tr46 "~0.0.3" 1686 | webidl-conversions "^3.0.0" 1687 | 1688 | which@1.2.x: 1689 | version "1.2.14" 1690 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" 1691 | integrity sha1-mofEN48D6CfOyvGs31bHNsAcFOU= 1692 | dependencies: 1693 | isexe "^2.0.0" 1694 | 1695 | which@^1.2.9: 1696 | version "1.3.1" 1697 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1698 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1699 | dependencies: 1700 | isexe "^2.0.0" 1701 | 1702 | wide-align@^1.1.2: 1703 | version "1.1.5" 1704 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" 1705 | integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== 1706 | dependencies: 1707 | string-width "^1.0.2 || 2 || 3 || 4" 1708 | 1709 | widest-line@^3.1.0: 1710 | version "3.1.0" 1711 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1712 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1713 | dependencies: 1714 | string-width "^4.0.0" 1715 | 1716 | wrap-ansi@^7.0.0: 1717 | version "7.0.0" 1718 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1719 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1720 | dependencies: 1721 | ansi-styles "^4.0.0" 1722 | string-width "^4.1.0" 1723 | strip-ansi "^6.0.0" 1724 | 1725 | wrappy@1: 1726 | version "1.0.2" 1727 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1728 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1729 | 1730 | write-file-atomic@^3.0.0: 1731 | version "3.0.3" 1732 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1733 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1734 | dependencies: 1735 | imurmurhash "^0.1.4" 1736 | is-typedarray "^1.0.0" 1737 | signal-exit "^3.0.2" 1738 | typedarray-to-buffer "^3.1.5" 1739 | 1740 | ws@^8.4.0: 1741 | version "8.4.2" 1742 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.2.tgz#18e749868d8439f2268368829042894b6907aa0b" 1743 | integrity sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA== 1744 | 1745 | xdg-basedir@^4.0.0: 1746 | version "4.0.0" 1747 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1748 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1749 | 1750 | yallist@^2.1.2: 1751 | version "2.1.2" 1752 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1753 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1754 | 1755 | yallist@^4.0.0: 1756 | version "4.0.0" 1757 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1758 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1759 | 1760 | zod@^3.11.6: 1761 | version "3.11.6" 1762 | resolved "https://registry.yarnpkg.com/zod/-/zod-3.11.6.tgz#e43a5e0c213ae2e02aefe7cb2b1a6fa3d7f1f483" 1763 | integrity sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg== 1764 | --------------------------------------------------------------------------------