From ec94c2080bd4127b0f7524051a88c878693b26d7 Mon Sep 17 00:00:00 2001 From: 404invalid-user Date: Wed, 25 Aug 2021 01:01:46 +0100 Subject: [PATCH] first commit probably lots of errors --- .gitignore | 1 + .vscode/settings.json | 3 + LICENSE | 13 + README.md | 40 + TODO | 5 + package-lock.json | 5458 +++++++++++++++++ package.json | 36 + src/applications/bot.js | 22 + src/applications/webserver.js | 48 + src/bot/addons/caps.js | 17 + src/bot/addons/swearfilter.js | 42 + src/bot/commands/fun/fivem.js | 119 + src/bot/commands/fun/mcstat.js | 35 + src/bot/commands/fun/memes.js | 55 + src/bot/commands/fun/play.js | 203 + src/bot/commands/info/about.js | 38 + src/bot/commands/info/help.js | 49 + src/bot/commands/info/ping.js | 11 + src/bot/commands/moderation/addstaff.js | 0 src/bot/commands/moderation/editfilter.js | 45 + src/bot/commands/moderation/embed-img.js | 32 + src/bot/commands/moderation/embed.js | 30 + src/bot/commands/moderation/filter.js | 26 + src/bot/commands/moderation/gameroles.js | 28 + src/bot/commands/moderation/mute.js | 0 src/bot/commands/moderation/note.js | 7 + src/bot/commands/moderation/say.js | 16 + src/bot/commands/moderation/setnote.js | 0 src/bot/commands/moderation/townhall.js | 45 + src/bot/commands/moderation/userinfo.js | 48 + src/bot/events/error.js | 8 + src/bot/events/guildMemberAdd.js | 55 + src/bot/events/message.js | 74 + src/bot/events/messageReactionAdd.js | 26 + src/bot/events/messageReactionRemove.js | 29 + src/bot/events/ready.js | 9 + src/bot/events/voicestateupdate.js | 71 + src/bot/handlers/addon.js | 13 + src/bot/handlers/command.js | 37 + src/bot/handlers/event.js | 10 + src/conf/conf.json | 24 + src/conf/functions.js | 105 + src/conf/reactionroles.json | 34 + src/conf/tokens.js | 15 + src/express/get/api/api.js | 14 + src/express/get/dashboard/dashboard.js | 159 + src/express/get/dashboard/filter.js | 45 + src/express/get/dashboard/message.js | 29 + src/express/get/dashboard/reactionroles.js | 52 + src/express/get/dashboard/server.js | 44 + src/express/get/er/er.js | 6 + src/express/get/root/login.js | 8 + src/express/get/root/root.js | 11 + src/express/handlers/get.js | 38 + src/express/handlers/post.js | 29 + src/express/post/api/api.js | 16 + src/express/post/api/updatefilter.js | 35 + src/express/post/api/updateoverview.js | 42 + src/express/post/api/updatereactionroles.js | 78 + src/express/post/api/userinfo-update.js | 24 + src/express/post/api/userinfo.js | 14 + src/express/www/static/404.html | 17 + src/express/www/static/500.html | 18 + src/express/www/static/css/dashboard.css | 192 + src/express/www/static/css/main.css | 65 + src/express/www/static/css/navbar.css | 132 + src/express/www/static/css/styles.css | 232 + src/express/www/static/favicon.ico | Bin 0 -> 4286 bytes src/express/www/static/js/client.js | 11 + src/express/www/static/js/filter.js | 109 + src/express/www/static/js/overview.js | 116 + src/express/www/static/js/reactionroles.js | 67 + src/express/www/static/loading.gif | Bin 0 -> 20688 bytes src/express/www/static/logo.png | Bin 0 -> 28302 bytes src/express/www/views/404.ejs | 1 + src/express/www/views/admin.ejs | 77 + .../www/views/dashboard/admin-message.ejs | 246 + src/express/www/views/dashboard/filter.ejs | 62 + src/express/www/views/dashboard/index.ejs | 82 + .../www/views/dashboard/reactionroles.ejs | 81 + src/express/www/views/dashboard/server.ejs | 111 + src/express/www/views/dashboard/userinfo.ejs | 201 + src/express/www/views/embed.html | 108 + src/express/www/views/er/er.ejs | 0 src/express/www/views/error.ejs | 68 + src/express/www/views/index.ejs | 76 + .../www/views/partials/dash-navbar.ejs | 19 + .../www/views/partials/dashboard-menu.ejs | 39 + src/express/www/views/partials/footer.ejs | 4 + src/express/www/views/partials/navbar.ejs | 15 + src/funcs/getserver.js | 14 + src/funcs/getuser.js | 14 + src/funcs/otr.js | 50 + src/funcs/reporterror.js | 33 + src/funcs/startuplog.js | 30 + src/knightrider.js | 17 + src/models/server.js | 214 + src/models/user.js | 32 + src/models/userdashboard.js | 48 + 99 files changed, 10227 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 LICENSE create mode 100644 README.md create mode 100644 TODO create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/applications/bot.js create mode 100644 src/applications/webserver.js create mode 100644 src/bot/addons/caps.js create mode 100644 src/bot/addons/swearfilter.js create mode 100644 src/bot/commands/fun/fivem.js create mode 100644 src/bot/commands/fun/mcstat.js create mode 100644 src/bot/commands/fun/memes.js create mode 100644 src/bot/commands/fun/play.js create mode 100644 src/bot/commands/info/about.js create mode 100644 src/bot/commands/info/help.js create mode 100644 src/bot/commands/info/ping.js create mode 100644 src/bot/commands/moderation/addstaff.js create mode 100644 src/bot/commands/moderation/editfilter.js create mode 100644 src/bot/commands/moderation/embed-img.js create mode 100644 src/bot/commands/moderation/embed.js create mode 100644 src/bot/commands/moderation/filter.js create mode 100644 src/bot/commands/moderation/gameroles.js create mode 100644 src/bot/commands/moderation/mute.js create mode 100644 src/bot/commands/moderation/note.js create mode 100644 src/bot/commands/moderation/say.js create mode 100644 src/bot/commands/moderation/setnote.js create mode 100644 src/bot/commands/moderation/townhall.js create mode 100644 src/bot/commands/moderation/userinfo.js create mode 100644 src/bot/events/error.js create mode 100644 src/bot/events/guildMemberAdd.js create mode 100644 src/bot/events/message.js create mode 100644 src/bot/events/messageReactionAdd.js create mode 100644 src/bot/events/messageReactionRemove.js create mode 100644 src/bot/events/ready.js create mode 100644 src/bot/events/voicestateupdate.js create mode 100644 src/bot/handlers/addon.js create mode 100644 src/bot/handlers/command.js create mode 100644 src/bot/handlers/event.js create mode 100644 src/conf/conf.json create mode 100644 src/conf/functions.js create mode 100644 src/conf/reactionroles.json create mode 100644 src/conf/tokens.js create mode 100644 src/express/get/api/api.js create mode 100644 src/express/get/dashboard/dashboard.js create mode 100644 src/express/get/dashboard/filter.js create mode 100644 src/express/get/dashboard/message.js create mode 100644 src/express/get/dashboard/reactionroles.js create mode 100644 src/express/get/dashboard/server.js create mode 100644 src/express/get/er/er.js create mode 100644 src/express/get/root/login.js create mode 100644 src/express/get/root/root.js create mode 100644 src/express/handlers/get.js create mode 100644 src/express/handlers/post.js create mode 100644 src/express/post/api/api.js create mode 100644 src/express/post/api/updatefilter.js create mode 100644 src/express/post/api/updateoverview.js create mode 100644 src/express/post/api/updatereactionroles.js create mode 100644 src/express/post/api/userinfo-update.js create mode 100644 src/express/post/api/userinfo.js create mode 100644 src/express/www/static/404.html create mode 100644 src/express/www/static/500.html create mode 100644 src/express/www/static/css/dashboard.css create mode 100644 src/express/www/static/css/main.css create mode 100644 src/express/www/static/css/navbar.css create mode 100644 src/express/www/static/css/styles.css create mode 100644 src/express/www/static/favicon.ico create mode 100644 src/express/www/static/js/client.js create mode 100644 src/express/www/static/js/filter.js create mode 100644 src/express/www/static/js/overview.js create mode 100644 src/express/www/static/js/reactionroles.js create mode 100644 src/express/www/static/loading.gif create mode 100644 src/express/www/static/logo.png create mode 100644 src/express/www/views/404.ejs create mode 100644 src/express/www/views/admin.ejs create mode 100644 src/express/www/views/dashboard/admin-message.ejs create mode 100644 src/express/www/views/dashboard/filter.ejs create mode 100644 src/express/www/views/dashboard/index.ejs create mode 100644 src/express/www/views/dashboard/reactionroles.ejs create mode 100644 src/express/www/views/dashboard/server.ejs create mode 100644 src/express/www/views/dashboard/userinfo.ejs create mode 100644 src/express/www/views/embed.html create mode 100644 src/express/www/views/er/er.ejs create mode 100644 src/express/www/views/error.ejs create mode 100644 src/express/www/views/index.ejs create mode 100644 src/express/www/views/partials/dash-navbar.ejs create mode 100644 src/express/www/views/partials/dashboard-menu.ejs create mode 100644 src/express/www/views/partials/footer.ejs create mode 100644 src/express/www/views/partials/navbar.ejs create mode 100644 src/funcs/getserver.js create mode 100644 src/funcs/getuser.js create mode 100644 src/funcs/otr.js create mode 100644 src/funcs/reporterror.js create mode 100644 src/funcs/startuplog.js create mode 100644 src/knightrider.js create mode 100644 src/models/server.js create mode 100644 src/models/user.js create mode 100644 src/models/userdashboard.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3b66410 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "git.ignoreLimitWarning": true +} \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d96dc95 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 404invalid-user (invalidlag.con) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..cc9727a --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +### file structure +this is the guide on what is where + +``` +| - src - | - applications - \ - bot.js +| | / - webserver.js +| | +| | - bot - | - addons +| | | - commands +| | | - events +| | | - handlers +| | +| | - conf - \ conf.json +| | / tokens.js +| | +| | - express +| | +| | - funcs +| | +| | - models +``` + +# knightrider +the all-purpose open source discord bot for CWH11's Hangout Crew. + + +### set up +- go to discord.com/developers and make a bot token + - bot token goes in src/conf/tokens.js under { bot: {token: "here"} } + +- make a mongo db with the schemas "servers" "users" + - put the mongo db connect uri in src/conf/tokens.js under { db: {URI: "here"} } + +- edit neccery information and details in src/conf/conf.json + +- npm install + +- npm start + +yeah it will be more detailed with the next update. \ No newline at end of file diff --git a/TODO b/TODO new file mode 100644 index 0000000..ab0643a --- /dev/null +++ b/TODO @@ -0,0 +1,5 @@ +better nav bar +better main page +batter server page +better error checking for fivem cmd +fix discord tag not showing up in fivem commands \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3f93a5e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5458 @@ +{ + "name": "knightrider", + "version": "4.8.420", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "knightrider", + "version": "4.8.420", + "license": "Apache license 2.0", + "dependencies": { + "@discordjs/opus": "*", + "body-parser": "*", + "discord-bitfield-calculator": "^1.0.0", + "discord.js": "^12.5.3", + "ejs": "*", + "express": "*", + "express-rate-limit": "*", + "ffmpeg-static": "*", + "minecraft-server-util": "*", + "mongoose": "*", + "node-fetch": "*", + "randomstring": "*", + "request": "*", + "url": "^*", + "util": "*", + "yt-search": "*", + "ytdl-core": "*" + } + }, + "node_modules/@derhuerst/http-basic": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.1.tgz", + "integrity": "sha512-Rmn7qQQulw2sxJ8qGfZ7OuqMWuhz8V+L5xnYKMF5cXVcYqmgWqlVEAme90pF7Ya8OVhxVxLmhh0rI2k6t7ITWw==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "node_modules/@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@discordjs/node-pre-gyp": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.0.tgz", + "integrity": "sha512-CXLpoM2hgS94i9+EAVowR92y8o3KdKc9fmoe8/FTp5XTzvoXzJln3+Ctl0oBpE6c9+11zd9oJnZPdkkOBkDPSA==", + "dependencies": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "hasInstallScript": true, + "dependencies": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@joeattardi/emoji-button": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@joeattardi/emoji-button/-/emoji-button-4.6.0.tgz", + "integrity": "sha512-KwOE1j+YxX47JmT0pXNCa+9Ai4Wf2fmABtvuxy6JBJ5QV0HdoThRKjL6CxAreVwwLbNQ/PDoR36xpc5QJjLXPA==", + "dependencies": { + "@fortawesome/fontawesome-svg-core": "^1.2.28", + "@fortawesome/free-regular-svg-icons": "^5.13.0", + "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@popperjs/core": "^2.4.0", + "@types/twemoji": "^12.1.1", + "focus-trap": "^5.1.0", + "fuzzysort": "^1.1.4", + "tiny-emitter": "^2.1.0", + "tslib": "^2.0.0", + "twemoji": "^13.0.0" + } + }, + "node_modules/@popperjs/core": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", + "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "dependencies": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/@types/twemoji": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@types/twemoji/-/twemoji-12.1.2.tgz", + "integrity": "sha512-3eMyKenMi0R1CeKzBYtk/Z2JIHsTMQrIrTah0q54o45pHTpWVNofU2oHx0jS8tqsDRhis2TbB6238WP9oh2l2w==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "node_modules/async.parallellimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.parallellimit/-/async.parallellimit-0.5.2.tgz", + "integrity": "sha1-v9y/Lwgy8f/0wLM1S09jIGY91R8=", + "dependencies": { + "async.util.eachoflimit": "0.5.2", + "async.util.parallel": "0.5.2" + } + }, + "node_modules/async.util.eachoflimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz", + "integrity": "sha1-i4y4z7AniqXOtQqPgAwcJmjbV+8=", + "dependencies": { + "async.util.keyiterator": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.once": "0.5.2", + "async.util.onlyonce": "0.5.2" + } + }, + "node_modules/async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha1-5i2sjyY29lh13PdSHC0k0N+yu98=" + }, + "node_modules/async.util.isarraylike": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz", + "integrity": "sha1-jn+H2pFB8vCZboBAR30NTv4/UPg=", + "dependencies": { + "async.util.isarray": "0.5.2" + } + }, + "node_modules/async.util.keyiterator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz", + "integrity": "sha1-M55s6PidAAQz+3gU4ico8/F1CQ0=", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.keys": "0.5.2" + } + }, + "node_modules/async.util.keys": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz", + "integrity": "sha1-XDTd2KPtt6eIPJtf4hJngbIJivY=" + }, + "node_modules/async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk=" + }, + "node_modules/async.util.once": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz", + "integrity": "sha1-FFPLdATK0IImlPq6vEepblyqchY=" + }, + "node_modules/async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha1-uOb8AErckjFk154y8oE+5GXCT/I=" + }, + "node_modules/async.util.parallel": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.parallel/-/async.util.parallel-0.5.2.tgz", + "integrity": "sha1-IzUk49b6/9XplddUdrjZJPloCM0=", + "dependencies": { + "async.util.isarraylike": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.restparam": "0.5.2" + } + }, + "node_modules/async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha1-A+/r88Ane5ciDlJaunUPXgT8gM0=" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boolstring": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/boolstring/-/boolstring-1.0.2.tgz", + "integrity": "sha512-0JLNSmZUv1m/O8sVayFm2t0naiOXwQ9O2Gq9u1eoIkhvu6U5NQER/e3k4BGpjZ33G775lWMT7TzJ7r5VtmEnbQ==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dependencies": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz", + "integrity": "sha1-OlrnT9drYmevZm5p4q+70B3vNNE=", + "dependencies": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "node_modules/css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dasu": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/dasu/-/dasu-0.4.2.tgz", + "integrity": "sha512-3iZKDAKqv0APFwpqP40gpro5msM+pwhQN7IhB42mjbL1W4M2V6A+MJy7RhA8y6lUM+1mQoLls3OePidmzVbncQ==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/discord-bitfield-calculator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discord-bitfield-calculator/-/discord-bitfield-calculator-1.0.0.tgz", + "integrity": "sha512-I1istpckG90n/kTId2OGFLz4Bm1uaJUXx6B7CsazMo3MvoQHOsLk0OWzIRlQnOyGynr8A/q9b+6Eo+Ep0UUaCA==" + }, + "node_modules/discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "deprecated": "no longer supported", + "dependencies": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "node_modules/domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dependencies": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express-rate-limit": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.3.0.tgz", + "integrity": "sha512-qJhfEgCnmteSeZAeuOKQ2WEIFTX5ajrzE0xS6gCOBCoRQcU+xEzQmgYQQTpzCcqUAAzTEtu4YEih4pnLfvNtew==" + }, + "node_modules/ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "dependencies": { + "type": "^2.0.0" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/ffmpeg-static": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.3.0.tgz", + "integrity": "sha512-w/tXYGlOSeAkPHjypjzylaChLrG5wRzHFyB47KFRDsGyBxUJJWiq9I/39/e6r9Y4aY1gzpejTLg5Aa0aqb0XXA==", + "hasInstallScript": true, + "dependencies": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/focus-trap": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-5.1.0.tgz", + "integrity": "sha512-CkB/nrO55069QAUjWFBpX6oc+9V90Qhgpe6fBWApzruMq5gnlh90Oo7iSSDK7pKiV5ugG6OY2AXM5mxcmL3lwQ==", + "dependencies": { + "tabbable": "^4.0.0", + "xtend": "^4.0.1" + } + }, + "node_modules/foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dependencies": { + "graceful-fs": "^4.1.6" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/fuzzysort": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-1.1.4.tgz", + "integrity": "sha512-JzK/lHjVZ6joAg3OnCjylwYXYVjRiwTY6Yb25LvfpJHK8bjisfnZJ5bY8aVWwTwCXgxPNgLAtmHL+Hs5q1ddLQ==" + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/human-time": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/human-time/-/human-time-0.0.2.tgz", + "integrity": "sha512-sbYI90YhYmstslPTb70BLGjy6mdESa0lxL7uDR4fIVAx9Iobz8fLEqi7FqF4Q/6vblrzZALg//MsYJlIPBU8SA==" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^0.1.2" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "node_modules/keypress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", + "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/m3u8stream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.4.tgz", + "integrity": "sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w==", + "dependencies": { + "miniget": "^4.0.0", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + } + }, + "node_modules/memoizee/node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minecraft-server-util": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/minecraft-server-util/-/minecraft-server-util-3.5.1.tgz", + "integrity": "sha512-vjyJiB/fYwRvd71BSq+yp/eyz1n/osZNGHlmzGsCyU6UoolWm/IPRq5jnu99jlneVXtGpFDnGewCX9js3Km7nQ==", + "dependencies": { + "ansi-styles": "^5.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/minecraft-server-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/miniget": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.1.tgz", + "integrity": "sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz", + "integrity": "sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.0.3", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mongoose": { + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", + "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", + "dependencies": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.11", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "peerDependencies": { + "mongoose": "*" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mongoose/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [{ + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "dependencies": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-fzf": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/node-fzf/-/node-fzf-0.5.3.tgz", + "integrity": "sha512-crN8rRfApu/GUrtKq+zJ6LueUyNAOJpFHxoT2Ru1Q+OYRa/F/H7CXvzcMrFc7D964yakYZEZ9XR3YbdSHXgyCw==", + "dependencies": { + "cli-color": "~1.2.0", + "keypress": "~0.2.1", + "minimist": "~1.2.0", + "redstar": "0.0.2", + "string-width": "~2.1.1", + "ttys": "0.0.3" + }, + "bin": { + "nfzf": "bin/cli.js" + } + }, + "node_modules/node-fzf/node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/node-fzf/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "peerDependencies": { + "@discordjs/opus": "^0.5.0", + "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + }, + "node_modules/randomstring": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", + "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", + "dependencies": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + }, + "bin": { + "randomstring": "bin/randomstring" + }, + "engines": { + "node": "*" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/redstar": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/redstar/-/redstar-0.0.2.tgz", + "integrity": "sha1-nVammAY4yYUaEAsMs799PrkCBcs=", + "dependencies": { + "minimatch": "~3.0.4" + } + }, + "node_modules/regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tabbable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", + "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" + }, + "node_modules/tar": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz", + "integrity": "sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dependencies": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ttys": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ttys/-/ttys-0.0.3.tgz", + "integrity": "sha1-FbrN54MQIN5fLyjwGxcy7wNlH00=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/twemoji": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-13.1.0.tgz", + "integrity": "sha512-e3fZRl2S9UQQdBFLYXtTBT6o4vidJMnpWUAhJA+yLGR+kaUTZAt3PixC0cGvvxWSuq2MSz/o0rJraOXrWw/4Ew==", + "dependencies": { + "fs-extra": "^8.0.1", + "jsonfile": "^5.0.0", + "twemoji-parser": "13.1.0", + "universalify": "^0.1.2" + } + }, + "node_modules/twemoji-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-13.1.0.tgz", + "integrity": "sha512-AQOzLJpYlpWMy8n+0ATyKKZzWlZBJN+G0C+5lhX7Ftc2PeEVdUU/7ns2Pn2vVje26AIZ/OHwFoUbdv6YYD/wGg==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "dependencies": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yt-search": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yt-search/-/yt-search-2.9.0.tgz", + "integrity": "sha512-ywA7ej+SrIozcSKNvfdwJFao/Tq6MJZ/S1k2ZNL4xeFgwrotJZ0SrwGNi0T+Ka+lpSaj5ylnAAhDK1NGDrYdRA==", + "dependencies": { + "async.parallellimit": "~0.5.2", + "boolstring": "~1.0.2", + "cheerio": "^1.0.0-rc.10", + "dasu": "~0.4.2", + "human-time": "0.0.2", + "jsonpath-plus": "~5.0.2", + "minimist": "~1.2.5", + "node-fzf": "~0.5.1" + }, + "bin": { + "yt-search": "bin/cli.js", + "yt-search-audio": "bin/mpv_audio.sh", + "yt-search-video": "bin/mpv_video.sh" + } + }, + "node_modules/ytdl-core": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.8.2.tgz", + "integrity": "sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg==", + "dependencies": { + "m3u8stream": "^0.8.3", + "miniget": "^4.0.0", + "sax": "^1.1.3" + }, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@derhuerst/http-basic": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.1.tgz", + "integrity": "sha512-Rmn7qQQulw2sxJ8qGfZ7OuqMWuhz8V+L5xnYKMF5cXVcYqmgWqlVEAme90pF7Ya8OVhxVxLmhh0rI2k6t7ITWw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "@discordjs/collection": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.1.6.tgz", + "integrity": "sha512-utRNxnd9kSS2qhyivo9lMlt5qgAUasH2gb7BEOn6p0efFh24gjGomHzWKMAPn2hEReOPQZCJaRKoURwRotKucQ==" + }, + "@discordjs/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-ZfFsbgEXW71Rw/6EtBdrP5VxBJy4dthyC0tpQKGKmYFImlmmrykO14Za+BiIVduwjte0jXEBlhSKf0MWbFp9Eg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "@discordjs/node-pre-gyp": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.0.tgz", + "integrity": "sha512-CXLpoM2hgS94i9+EAVowR92y8o3KdKc9fmoe8/FTp5XTzvoXzJln3+Ctl0oBpE6c9+11zd9oJnZPdkkOBkDPSA==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.0" + } + }, + "@discordjs/opus": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.5.3.tgz", + "integrity": "sha512-IQhCwCy2WKXLe+qkOkwO1Wjgk20uqeAbqM62tCbzIqbTsXX4YAge8Me9RFnI77Lx+UTkgm4rSVM3VPVdS/GsUw==", + "requires": { + "@discordjs/node-pre-gyp": "^0.4.0", + "node-addon-api": "^3.2.1" + } + }, + "@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==" + }, + "@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "requires": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + } + }, + "@joeattardi/emoji-button": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@joeattardi/emoji-button/-/emoji-button-4.6.0.tgz", + "integrity": "sha512-KwOE1j+YxX47JmT0pXNCa+9Ai4Wf2fmABtvuxy6JBJ5QV0HdoThRKjL6CxAreVwwLbNQ/PDoR36xpc5QJjLXPA==", + "requires": { + "@fortawesome/fontawesome-svg-core": "^1.2.28", + "@fortawesome/free-regular-svg-icons": "^5.13.0", + "@fortawesome/free-solid-svg-icons": "^5.13.0", + "@popperjs/core": "^2.4.0", + "@types/twemoji": "^12.1.1", + "focus-trap": "^5.1.0", + "fuzzysort": "^1.1.4", + "tiny-emitter": "^2.1.0", + "tslib": "^2.0.0", + "twemoji": "^13.0.0" + } + }, + "@popperjs/core": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz", + "integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ==" + }, + "@types/bson": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", + "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", + "requires": { + "@types/node": "*" + } + }, + "@types/mongodb": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", + "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==", + "requires": { + "@types/bson": "*", + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "@types/twemoji": { + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@types/twemoji/-/twemoji-12.1.2.tgz", + "integrity": "sha512-3eMyKenMi0R1CeKzBYtk/Z2JIHsTMQrIrTah0q54o45pHTpWVNofU2oHx0jS8tqsDRhis2TbB6238WP9oh2l2w==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-uniq": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.2.tgz", + "integrity": "sha1-X8w3OSB3VyPP1k1lxkvvU7+eum0=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "async.parallellimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.parallellimit/-/async.parallellimit-0.5.2.tgz", + "integrity": "sha1-v9y/Lwgy8f/0wLM1S09jIGY91R8=", + "requires": { + "async.util.eachoflimit": "0.5.2", + "async.util.parallel": "0.5.2" + } + }, + "async.util.eachoflimit": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.eachoflimit/-/async.util.eachoflimit-0.5.2.tgz", + "integrity": "sha1-i4y4z7AniqXOtQqPgAwcJmjbV+8=", + "requires": { + "async.util.keyiterator": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.once": "0.5.2", + "async.util.onlyonce": "0.5.2" + } + }, + "async.util.isarray": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarray/-/async.util.isarray-0.5.2.tgz", + "integrity": "sha1-5i2sjyY29lh13PdSHC0k0N+yu98=" + }, + "async.util.isarraylike": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.isarraylike/-/async.util.isarraylike-0.5.2.tgz", + "integrity": "sha1-jn+H2pFB8vCZboBAR30NTv4/UPg=", + "requires": { + "async.util.isarray": "0.5.2" + } + }, + "async.util.keyiterator": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keyiterator/-/async.util.keyiterator-0.5.2.tgz", + "integrity": "sha1-M55s6PidAAQz+3gU4ico8/F1CQ0=", + "requires": { + "async.util.isarraylike": "0.5.2", + "async.util.keys": "0.5.2" + } + }, + "async.util.keys": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.keys/-/async.util.keys-0.5.2.tgz", + "integrity": "sha1-XDTd2KPtt6eIPJtf4hJngbIJivY=" + }, + "async.util.noop": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.noop/-/async.util.noop-0.5.2.tgz", + "integrity": "sha1-vdYrl8sKo/YLWGrRSEaGmJdeWLk=" + }, + "async.util.once": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.once/-/async.util.once-0.5.2.tgz", + "integrity": "sha1-FFPLdATK0IImlPq6vEepblyqchY=" + }, + "async.util.onlyonce": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.onlyonce/-/async.util.onlyonce-0.5.2.tgz", + "integrity": "sha1-uOb8AErckjFk154y8oE+5GXCT/I=" + }, + "async.util.parallel": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.parallel/-/async.util.parallel-0.5.2.tgz", + "integrity": "sha1-IzUk49b6/9XplddUdrjZJPloCM0=", + "requires": { + "async.util.isarraylike": "0.5.2", + "async.util.noop": "0.5.2", + "async.util.restparam": "0.5.2" + } + }, + "async.util.restparam": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/async.util.restparam/-/async.util.restparam-0.5.2.tgz", + "integrity": "sha1-A+/r88Ane5ciDlJaunUPXgT8gM0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "available-typed-arrays": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.4.tgz", + "integrity": "sha512-SA5mXJWrId1TaQjfxUYghbqQ/hYioKmLJvPJyDuYRtXXenFNMjj4hSSt1Cf1xsuXSXrtxrVC5Ot4eU6cOtBDdA==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boolstring": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/boolstring/-/boolstring-1.0.2.tgz", + "integrity": "sha512-0JLNSmZUv1m/O8sVayFm2t0naiOXwQ9O2Gq9u1eoIkhvu6U5NQER/e3k4BGpjZ33G775lWMT7TzJ7r5VtmEnbQ==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cli-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.2.0.tgz", + "integrity": "sha1-OlrnT9drYmevZm5p4q+70B3vNNE=", + "requires": { + "ansi-regex": "^2.1.1", + "d": "1", + "es5-ext": "^0.10.12", + "es6-iterator": "2", + "memoizee": "^0.4.3", + "timers-ext": "0.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz", + "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dasu": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/dasu/-/dasu-0.4.2.tgz", + "integrity": "sha512-3iZKDAKqv0APFwpqP40gpro5msM+pwhQN7IhB42mjbL1W4M2V6A+MJy7RhA8y6lUM+1mQoLls3OePidmzVbncQ==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "denque": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz", + "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "discord-bitfield-calculator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discord-bitfield-calculator/-/discord-bitfield-calculator-1.0.0.tgz", + "integrity": "sha512-I1istpckG90n/kTId2OGFLz4Bm1uaJUXx6B7CsazMo3MvoQHOsLk0OWzIRlQnOyGynr8A/q9b+6Eo+Ep0UUaCA==" + }, + "discord.js": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-12.5.3.tgz", + "integrity": "sha512-D3nkOa/pCkNyn6jLZnAiJApw2N9XrIsXUAdThf01i7yrEuqUmDGc7/CexVWwEcgbQR97XQ+mcnqJpmJ/92B4Aw==", + "requires": { + "@discordjs/collection": "^0.1.6", + "@discordjs/form-data": "^3.0.1", + "abort-controller": "^3.0.0", + "node-fetch": "^2.6.1", + "prism-media": "^1.2.9", + "setimmediate": "^1.0.5", + "tweetnacl": "^1.0.3", + "ws": "^7.4.4" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz", + "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz", + "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "requires": { + "jake": "^10.6.1" + } + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "es6-weak-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", + "requires": { + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "express-rate-limit": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.3.0.tgz", + "integrity": "sha512-qJhfEgCnmteSeZAeuOKQ2WEIFTX5ajrzE0xS6gCOBCoRQcU+xEzQmgYQQTpzCcqUAAzTEtu4YEih4pnLfvNtew==" + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "ffmpeg-static": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.3.0.tgz", + "integrity": "sha512-w/tXYGlOSeAkPHjypjzylaChLrG5wRzHFyB47KFRDsGyBxUJJWiq9I/39/e6r9Y4aY1gzpejTLg5Aa0aqb0XXA==", + "requires": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + } + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "focus-trap": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-5.1.0.tgz", + "integrity": "sha512-CkB/nrO55069QAUjWFBpX6oc+9V90Qhgpe6fBWApzruMq5gnlh90Oo7iSSDK7pKiV5ugG6OY2AXM5mxcmL3lwQ==", + "requires": { + "tabbable": "^4.0.0", + "xtend": "^4.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "dependencies": { + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "fuzzysort": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fuzzysort/-/fuzzysort-1.1.4.tgz", + "integrity": "sha512-JzK/lHjVZ6joAg3OnCjylwYXYVjRiwTY6Yb25LvfpJHK8bjisfnZJ5bY8aVWwTwCXgxPNgLAtmHL+Hs5q1ddLQ==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "human-time": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/human-time/-/human-time-0.0.2.tgz", + "integrity": "sha512-sbYI90YhYmstslPTb70BLGjy6mdESa0lxL7uDR4fIVAx9Iobz8fLEqi7FqF4Q/6vblrzZALg//MsYJlIPBU8SA==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + }, + "is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" + }, + "is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-generator-function": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz", + "integrity": "sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==" + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "requires": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.5.tgz", + "integrity": "sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.2", + "es-abstract": "^1.18.0-next.2", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-5.0.0.tgz", + "integrity": "sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^0.1.2" + } + }, + "jsonpath-plus": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-5.0.7.tgz", + "integrity": "sha512-7TS6wsiw1s2UMK/A6nA4n0aUJuirCVhJ87nWX5je5MPOl0z5VTr2qs7nMP8NZ2ed3rlt6kePTqddgVPE9F0i0w==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kareem": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz", + "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==" + }, + "keypress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.2.1.tgz", + "integrity": "sha1-HoBFQlABjbrUw/6USX1uZ7YmnHc=" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "m3u8stream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.4.tgz", + "integrity": "sha512-sco80Db+30RvcaIOndenX6E6oQNgTiBKeJbFPc+yDXwPQIkryfboEbCvXPlBRq3mQTCVPQO93TDVlfRwqpD35w==", + "requires": { + "miniget": "^4.0.0", + "sax": "^1.2.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memoizee": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", + "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.53", + "es6-weak-map": "^2.0.3", + "event-emitter": "^0.3.5", + "is-promise": "^2.2.2", + "lru-queue": "^0.1.0", + "next-tick": "^1.1.0", + "timers-ext": "^0.1.7" + }, + "dependencies": { + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + } + } + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==" + }, + "mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "requires": { + "mime-db": "1.48.0" + } + }, + "minecraft-server-util": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/minecraft-server-util/-/minecraft-server-util-3.5.1.tgz", + "integrity": "sha512-vjyJiB/fYwRvd71BSq+yp/eyz1n/osZNGHlmzGsCyU6UoolWm/IPRq5jnu99jlneVXtGpFDnGewCX9js3Km7nQ==", + "requires": { + "ansi-styles": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + } + } + }, + "miniget": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.1.tgz", + "integrity": "sha512-O/DduzDR6f+oDtVype9S/Qu5hhnx73EDYGyZKwU/qN82lehFZdfhoa4DT51SpsO+8epYrB3gcRmws56ROfTIoQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mongodb": { + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.11.tgz", + "integrity": "sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==", + "requires": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.0.3", + "safe-buffer": "^5.1.2", + "saslprep": "^1.0.0" + } + }, + "mongoose": { + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.7.tgz", + "integrity": "sha512-ADIvftZ+KfoTALMZ0n8HvBlezFhcUd73hQaHQDwQ+3X+JZlqE47fUy9yhFZ2SjT+qzmuaCcIXCfhewIc38t2fQ==", + "requires": { + "@types/mongodb": "^3.5.27", + "bson": "^1.1.4", + "kareem": "2.3.2", + "mongodb": "3.6.11", + "mongoose-legacy-pluralize": "1.0.2", + "mpath": "0.8.3", + "mquery": "3.2.5", + "ms": "2.1.2", + "optional-require": "1.0.x", + "regexp-clone": "1.0.0", + "safe-buffer": "5.2.1", + "sift": "13.5.2", + "sliced": "1.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "mongoose-legacy-pluralize": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", + "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", + "requires": {} + }, + "mpath": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz", + "integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==" + }, + "mquery": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz", + "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==", + "requires": { + "bluebird": "3.5.1", + "debug": "3.1.0", + "regexp-clone": "^1.0.0", + "safe-buffer": "5.1.2", + "sliced": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-fzf": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/node-fzf/-/node-fzf-0.5.3.tgz", + "integrity": "sha512-crN8rRfApu/GUrtKq+zJ6LueUyNAOJpFHxoT2Ru1Q+OYRa/F/H7CXvzcMrFc7D964yakYZEZ9XR3YbdSHXgyCw==", + "requires": { + "cli-color": "~1.2.0", + "keypress": "~0.2.1", + "minimist": "~1.2.0", + "redstar": "0.0.2", + "string-width": "~2.1.1", + "ttys": "0.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz", + "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optional-require": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", + "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==" + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "prism-media": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz", + "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==", + "requires": {} + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "randombytes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.3.tgz", + "integrity": "sha1-Z0yZdgkBw8QRJ3GjHlIdw0nMCew=" + }, + "randomstring": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/randomstring/-/randomstring-1.2.1.tgz", + "integrity": "sha512-eMnfell9XuU3jfCx3f4xCaFAt0YMFPZhx9R3PSStmLarDKg5j5vivqKhf/8pvG+VX/YkxsckHK/VPUrKa5V07A==", + "requires": { + "array-uniq": "1.0.2", + "randombytes": "2.0.3" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "redstar": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/redstar/-/redstar-0.0.2.tgz", + "integrity": "sha1-nVammAY4yYUaEAsMs799PrkCBcs=", + "requires": { + "minimatch": "~3.0.4" + } + }, + "regexp-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", + "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + } + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sift": { + "version": "13.5.2", + "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz", + "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA==" + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "tabbable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-4.0.0.tgz", + "integrity": "sha512-H1XoH1URcBOa/rZZWxLxHCtOdVUEev+9vo5YdYhC9tCY4wnybX+VQrCYuy9ubkg69fCBxCONJOSLGfw0DWMffQ==" + }, + "tar": { + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.8.tgz", + "integrity": "sha512-sb9b0cp855NbkMJcskdSYA7b11Q8JsX4qe4pyUAfHp+Y6jBjJeek2ZVlwEfWayshEIwlIzXx0Fain3QG9JPm2A==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "requires": { + "es5-ext": "~0.10.46", + "next-tick": "1" + } + }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "ttys": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/ttys/-/ttys-0.0.3.tgz", + "integrity": "sha1-FbrN54MQIN5fLyjwGxcy7wNlH00=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "twemoji": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/twemoji/-/twemoji-13.1.0.tgz", + "integrity": "sha512-e3fZRl2S9UQQdBFLYXtTBT6o4vidJMnpWUAhJA+yLGR+kaUTZAt3PixC0cGvvxWSuq2MSz/o0rJraOXrWw/4Ew==", + "requires": { + "fs-extra": "^8.0.1", + "jsonfile": "^5.0.0", + "twemoji-parser": "13.1.0", + "universalify": "^0.1.2" + } + }, + "twemoji-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-13.1.0.tgz", + "integrity": "sha512-AQOzLJpYlpWMy8n+0ATyKKZzWlZBJN+G0C+5lhX7Ftc2PeEVdUU/7ns2Pn2vVje26AIZ/OHwFoUbdv6YYD/wGg==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.12.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", + "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.4.tgz", + "integrity": "sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==", + "requires": { + "available-typed-arrays": "^1.0.2", + "call-bind": "^1.0.0", + "es-abstract": "^1.18.0-next.1", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", + "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==", + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yt-search": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yt-search/-/yt-search-2.9.0.tgz", + "integrity": "sha512-ywA7ej+SrIozcSKNvfdwJFao/Tq6MJZ/S1k2ZNL4xeFgwrotJZ0SrwGNi0T+Ka+lpSaj5ylnAAhDK1NGDrYdRA==", + "requires": { + "async.parallellimit": "~0.5.2", + "boolstring": "~1.0.2", + "cheerio": "^1.0.0-rc.10", + "dasu": "~0.4.2", + "human-time": "0.0.2", + "jsonpath-plus": "~5.0.2", + "minimist": "~1.2.5", + "node-fzf": "~0.5.1" + } + }, + "ytdl-core": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.8.2.tgz", + "integrity": "sha512-O3n++YcgZawaXJwbPmnRDgfN6b4kU0DpNdkI9Na5yM3JAdfJmoq5UHc8v9Xjgjr1RilQUUh7mhDnRRPDtKr0Kg==", + "requires": { + "m3u8stream": "^0.8.3", + "miniget": "^4.0.0", + "sax": "^1.1.3" + } + } + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..163d2da --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "knightrider", + "version": "4.8.420", + "description": "a bot for a private discord server", + "updatenote": "major update: now using a database, fixed exploit that allowed users to add the bot to their server give themself the Staff role and edit staff only options in CWH11's Hangout Crew, multiple server support, a better dashboard and now opensource.", + "main": "./src/knightrider.js", + "scripts": { + "start": "node ./src/knightrider.js", + "help": "if you need help with this bot please look at http://knightrider.invalidlag.com/help/" + }, + "author": "404invalid-user", + "repository": { + "type": "git", + "url": "https://github.com/404invalid-user/knightrider.git" + }, + "license": "Apache license 2.0", + "dependencies": { + "@discordjs/opus": "*", + "body-parser": "*", + "discord-bitfield-calculator": "^1.0.0", + "discord.js": "^12.5.3", + "ejs": "*", + "express": "*", + "express-rate-limit": "*", + "ffmpeg-static": "*", + "minecraft-server-util": "*", + "mongoose": "*", + "node-fetch": "*", + "randomstring": "*", + "request": "*", + "url": "^*", + "util": "*", + "yt-search": "*", + "ytdl-core": "*" + } +} \ No newline at end of file diff --git a/src/applications/bot.js b/src/applications/bot.js new file mode 100644 index 0000000..5fffbc3 --- /dev/null +++ b/src/applications/bot.js @@ -0,0 +1,22 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const chalk = require('chalk') +const { readdirSync } = require('fs') +const Discord = require('discord.js') +module.exports = (client, webServer) => { + + client.commands = new Discord.Collection(); + client.addons = []; + const handlers = readdirSync(__dirname + '/../bot/handlers/').filter((file) => file.endsWith(".js")); + for (let handler of handlers) { + require(`../bot/handlers/${handler}`)(client); + } + + try { + client.login(require('../conf/tokens').bot.token); + } catch (error) { + console.log(chalk.blue('[bot]: ') + chalk.red('(error): ') + "cant login error: " + error); + + } +} \ No newline at end of file diff --git a/src/applications/webserver.js b/src/applications/webserver.js new file mode 100644 index 0000000..0c9accd --- /dev/null +++ b/src/applications/webserver.js @@ -0,0 +1,48 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const chalk = require('chalk') +const bodyParser = require('body-parser'); +const rateLimit = require("express-rate-limit"); +const express = require('express') +const fs = require('fs') +const conf = require('../conf/conf.json') + +module.exports = (client, webServer) => { + + webServer.use(bodyParser.json()); + webServer.use(bodyParser.urlencoded({ extended: true })); + webServer.use(express.static(__dirname + '/../express/www/static')); + webServer.set('view engine', 'ejs'); + webServer.set('views', __dirname + '/../express/www/views'); + webServer.use((req, res, next) => { + const { headers: { cookie } } = req; + if (cookie) { + const values = cookie.split(';').reduce((res, item) => { + const data = item.trim().split('='); + return {...res, [data[0]]: data[1] }; + }, {}); + res.locals.cookie = values; + } else res.locals.cookie = {}; + next(); + }); + //rate limit the api so we dont have spam + const apiLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, // 15 minutes + max: 400 + }); + + webServer.use("/api/", apiLimiter); + + ['get', 'post'].forEach(handler => { + require(`../express/handlers/${handler}`)(client, webServer) + }) + + try { + webServer.listen(conf.port, () => { + console.log(chalk.cyan('[webServer]: ') + 'running at ' + conf.domain + ' (port:' + conf.port + ')') + }); + } catch (error) { + console.log(chalk.cyan('[webServer]: ') + chalk.cyan('(error): ') + 'could not start the web server error: ' + error) + } +} \ No newline at end of file diff --git a/src/bot/addons/caps.js b/src/bot/addons/caps.js new file mode 100644 index 0000000..9208c18 --- /dev/null +++ b/src/bot/addons/caps.js @@ -0,0 +1,17 @@ +const Server = require('../../models/server'); +const conf = require('../../conf/conf.json') +module.exports = async(message, server, user, client) => { + if (server.addons.caps == true) { + if (!message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + const textRegex = new RegExp(/[^a-zA-Z0-9]/, 'g'); + const capsRegex = new RegExp(/[A-Z]/, 'g'); + + const capsText = message.content.replace(textRegex, ''); + const capsPerc = 1 - (capsText.replace(capsRegex, '').length / capsText.length); + + if (capsText.length > 6 && capsPerc > 0.7) { + message.channel.send("too many caps") + } + } + } +} \ No newline at end of file diff --git a/src/bot/addons/swearfilter.js b/src/bot/addons/swearfilter.js new file mode 100644 index 0000000..5abbfab --- /dev/null +++ b/src/bot/addons/swearfilter.js @@ -0,0 +1,42 @@ +const conf = require('../../conf/conf.json') +module.exports = (message, server, user, client) => { + //filter banned words at different levels + try { + if (server.addons.filter == true) { + if (!message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + if (server.filter.level == 'safe') { + server.filter.safe.forEach(async(word) => { + let msgContent = message.content.toLowerCase(); + if (msgContent.includes(word)) { + await message.delete().catch(error => {}); + addstrike(user); + if (parseInt(server.channels.modLogs) !== 'NaW') { + client.guilds.cache.get(server.id).channels.cache.get(server.channels.modLogs).send({ embed: { color: conf.colour.ok, title: 'filter has been triggered', url: conf.domain + '/server/' + user.guildID + '/user/' + user.id, author: { name: conf.bot.name, icon_url: conf.bot.logo, url: conf.bot.url, }, thumbnail: { url: message.author.displayAvatarURL() }, fields: [{ name: '__**Member**__', value: message.author.tag + '<@!' + message.author.id + '> (' + message.author.id + ')', inline: true, }, { name: '__**Channel**__', value: '<#' + message.channel.id + '>', inline: true }, { name: '__**Filter level**__', value: '`safe`' }, { name: '__**Mesage Content**__', value: '`"' + message.content + '"`', }, { name: '__**Filtered Word**__', value: '`"' + word + '"`' }], timestamp: new Date(), footer: { text: 'moderation log', } } }); + }; + message.reply(`please dont swear.\nwas this a miss trigger? fill in ${conf.domain}/server/${server.id}/er`).then(m => m.delete({ timeout: 30000 })); + return; + }; + }); + //filter normal mode + } else if (server.filter.level == 'normal') { + server.filter.normal.forEach(async(word) => { + let msgContent = message.content.toLowerCase(); + if (msgContent.includes(word)) { + await message.delete().catch(error => {}); + functions.addstrike(message); + if (parseInt(server.channels.modLogs) !== 'NaW') { + client.guilds.cache.get(conf.server.id).channels.cache.get(conf.server.channels.modLogs).send({ embed: { color: conf.colour.ok, title: 'filter has been triggered', url: conf.domain + '/server/' + user.guildID + '/user/' + user.id, author: { name: conf.bot.name, icon_url: conf.bot.logo, url: conf.bot.url, }, thumbnail: { url: message.author.displayAvatarURL() }, fields: [{ name: '__**Member**__', value: message.author.tag + '<@!' + message.author.id + '> (' + message.author.id + ')', inline: true, }, { name: '__**Channel**__', value: '<#' + message.channel.id + '>', inline: true }, { name: '__**Filter level**__', value: '`normal`' }, { name: '__**Mesage Content**__', value: '`"' + message.content + '"`', }, { name: '__**Filtered Word**__', value: '`"' + word + '"`' }], timestamp: new Date(), footer: { text: 'moderation log', } } }); + }; + message.reply(`please dont swear.\nwas this a miss trigger? fill in ${conf.domain}/server/${server.id}/er`).then(m => m.delete({ timeout: 30000 })); + + return; + }; + }); + }; + }; + }; + + } catch (error) { + console.log(error) + } +} \ No newline at end of file diff --git a/src/bot/commands/fun/fivem.js b/src/bot/commands/fun/fivem.js new file mode 100644 index 0000000..812682d --- /dev/null +++ b/src/bot/commands/fun/fivem.js @@ -0,0 +1,119 @@ +const http = require('http'); +const conf = require('../../../conf/conf.json') +module.exports = { + name: 'fivem-disables', + description: "`.fivem` gets information for the fivem server. do `.fivem players` to see who is online", + async execute(message, args, Discord, currentServer, messageUser, client) { + const url = "http://lxn4gvp-aries1.linuxnodes.net:3000" + + if (!args[1]) { + let serverEmbed = new Discord.MessageEmbed() + .setAuthor("fiveM info") + .setColor(conf.colour.ok) + .setDescription("some info about the server") + try { + await http.get(`${currentServer.configs.fivem.url}/dynamic.json`, (result) => { + let body = '' + result.on('data', (chunk) => { + body += chunk + }) + result.on('end', () => { + let dynamicResponse = JSON.parse(body) + serverEmbed.addField(`__**players:**__`, `${dynamicResponse.clients}/${dynamicResponse.sv_maxclients}`, true) + + + }).on('error', function(error) { + console.log('error: ' + error) + }) + }) + + await http.get(`${currentServer.configs.fivem.url}/info.json`, (result) => { + let body = '' + result.on('data', (chunk) => { + body += chunk + }) + result.on('end', () => { + let infoResponse = JSON.parse(body) + + serverEmbed.addField(`__**server:**__`, `${infoResponse.server}`, true) + + let oneEyncEnabled; + let enhancedHostSupport; + let scriptHookAllowed; + if (infoResponse.vars.onesync_enabled == 'true') { + oneEyncEnabled = ":white_check_mark:" + } else { + oneEyncEnabled = ":x:" + } + + if (infoResponse.vars.sv_enhancedHostSupport == 'true') { + enhancedHostSupport = ":white_check_mark:" + } else { + enhancedHostSupport = ":x:" + } + + if (infoResponse.vars.sv_scriptHookAllowed == 'true') { + scriptHookAllowed = ":white_check_mark:" + } else { + scriptHookAllowed = ":x:" + } + + serverEmbed.addField(`__**server Info:**__`, ` __onesync:__ ${infoResponse.vars.onesync} \n __onesync Enabled:__ ${oneEyncEnabled} \n __Enhanced Host Support:__ ${enhancedHostSupport} \n __Script Hook Allowed:__ ${scriptHookAllowed}`) + serverEmbed.addField(`__**resources:**__`, `${infoResponse.resources}`) + + message.channel.send(serverEmbed) + }) + }) + } catch (error) { + message.reply("__**there has been an error**__\nserver is down maybe.") + console.log('error: ' + error) + } + + } else if (args[1] == 'ip') { + let fivemIpEmbed = new Discord.MessageEmbed() + .setAuthor("fiveM ip") + .setColor(conf.colour.ok) + .setDescription("the fiveM server ip is: `" + currentServer.conf.fivem.ip + "`") + message.channel.send(fivemIpEmbed) + } else if (args[1] == 'players') { + let playersEmbed = new Discord.MessageEmbed() + .setAuthor("fiveM players") + .setColor(conf.colour.ok) + + try { + http.get(`${currentServer.configs.fivem.url}/players.json`, (result) => { + let body = '' + result.on('data', (chunk) => { + body += chunk + }) + + result.on('end', () => { + var response = JSON.parse(body) + if (response.length == 0 || response.length < 0) { + playersEmbed.addField("__info__", `no one is on the server`) + } + + let i; + for (i = 0; i < response.length; i++) { + playersEmbed.addField(`player ${i}:`, `__**name:**__ ${response[i].name} \n __**discord:**__ <@!${response[i].identifiers[3].replace('discord:', '')}> \n __**fiveM id:**__ ${response[i].id} \n __**ping:**__ ${response[i].ping} \n`) + } + if (i == response.length) { + try { + message.channel.send(playersEmbed) + } catch (error) { + message.channel.send("i couldnt sent that maybe there are too many players online and i cant add them all to the embed.") + console.log('error: ' + error) + } + } + + }).on('error', function(error) { + console.log('error: ' + error) + }) + }) + } catch (error) { + message.reply("__**there has been an error**__\nserver is down maybe.") + console.log('error: ' + error) + } + } + } +} \ No newline at end of file diff --git a/src/bot/commands/fun/mcstat.js b/src/bot/commands/fun/mcstat.js new file mode 100644 index 0000000..edea553 --- /dev/null +++ b/src/bot/commands/fun/mcstat.js @@ -0,0 +1,35 @@ +const Discord = require('discord.js'); +const util = require('minecraft-server-util'); + + +module.exports = { + name: 'mcstatus', + description: "mcstat", + execute(message, args, Discord, currentServer, messageUser, client) { + + + util.status('cwh11.mc.sparks.codes' || currentServer.conf.mc) + .then((response) => { + let minecraftEmbed = new Discord.MessageEmbed() + .setColor(conf.colour.ok) + .setAuthor(conf.bot.name, conf.bot.logo) + .setTitle('Minecraft server status') + .setURL('http://cwh11.mc.sparks.codes') + .setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`) + .setDescription('its online!') + .addField('Server IP:', `${response.host}`) + .addField('Version:', `${response.version}`) + .addField('MOTD:', `${response.description.descriptionText}`) + .addFields({ name: 'Online Players', value: `${response.onlinePlayers}`, inline: true }, { name: 'Max Players', value: `${response.maxPlayers}`, inline: true }, ) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + message.channel.send(minecraftEmbed).catch(error => console.log('error: ' + error)); + + }) + .catch((error) => { + console.log('error: ' + error); + message.channel.send('**there has been a error**\n this is probably because the server is down'); + }); + } +} \ No newline at end of file diff --git a/src/bot/commands/fun/memes.js b/src/bot/commands/fun/memes.js new file mode 100644 index 0000000..81cf046 --- /dev/null +++ b/src/bot/commands/fun/memes.js @@ -0,0 +1,55 @@ +const https = require('https'); +const conf = require('../../../conf/conf.json') +module.exports = { + name: 'memes', + description: " shrekbot meme command http://shrekbot.tk/github", + execute(message, args, Discord, currentServer, messageUser, client) { + try { + const url = `https://www.reddit.com/${currentServer.configs.memes || 'r/memes'}/.json?limit=200` + + https.get(url, (result) => { + var body = '' + result.on('data', (chunk) => { + body += chunk + }) + + result.on('end', () => { + var response = JSON.parse(body) + var index = response.data.children[Math.floor(Math.random() * 129) + 1].data + + if (index.post_hint !== 'image') { + message.channel.send('there has been a shrekup retrying...') + } + + if (!index.preview) return message.channel.send('a big shrekup has hapened do that command agian'); + + var image = index.preview.images[0].source.url.replace('&', '&') + var title = index.title + var link = 'https://reddit.com' + index.permalink + var subRedditName = index.subreddit_name_prefixed + + if (index.post_hint !== 'image') { + console.log("error no image") + } + + console.log(image); + + const imageembed = new Discord.MessageEmbed() + .setTitle('a meme provided by reddit') + .setImage(image) + .setColor(`${conf.colour.ok}`) + .setDescription(`[${title}](${link})`) + //.setURL(`https://reddit.com/${subRedditName}`) + .setFooter('powered by ' + `${subRedditName}`) + message.channel.send(imageembed).catch(error => console.log('error: ' + error)) + + }).on('error', function(error) { + console.log('Got an error: ' + error); + }) + }) + } catch (error) { + console.log('error: ' + error); + } + + } +} \ No newline at end of file diff --git a/src/bot/commands/fun/play.js b/src/bot/commands/fun/play.js new file mode 100644 index 0000000..17a99b5 --- /dev/null +++ b/src/bot/commands/fun/play.js @@ -0,0 +1,203 @@ +const ytdl = require('ytdl-core'); +const ytSearch = require('yt-search'); +const Discord = require('discord.js') +const conf = require('../../../conf/conf.json') + +const queue = new Map(); + +module.exports = { + name: 'play', + description: "the moosk command", + aliases: ["p", "q", "skip", "stop", "remove", "queue"], + async execute(message, args, Discord, currentServer, messageUser, client) { + + /*TODO + *make these embeds better and objects + */ + const noContentErrorEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setTitle('Error') + .setURL(conf.domain) + .setColor(conf.colour.okError) + .setDescription("well what do you want to listen to?\ni know i am an amazing bot but i cant read minds ~~yet~~") + .addField("possible fixes:", `You have two spaces between ${currentServer.prefix}play and the url/song name remove one of them`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + const notVoiceErrorEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setTitle('Error') + .setURL(conf.domain) + .setColor(conf.colour.okError) + .setTitle("you need to be in a voice channel to execute this command im not exactly going to send you the cd") + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + const noSongsErrorEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setTitle('Error') + .setURL(conf.domain) + .setColor(conf.colour.okError) + .setTitle("oof there are no songs left in queue") + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + const errorEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setTitle('Error') + .setURL(conf.domain) + .setColor(conf.colour.okError) + .setTitle("There was some error ~~like there always is~~") + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + const videoErrorEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setTitle('Error') + .setURL(conf.domain) + .setColor(conf.colour.okError) + .setTitle("I cant seem to find that video") + .setDescription("try adding more key words or just use the song's url") + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + + + const voiceChannel = message.member.voice.channel; + if (!voiceChannel) return message.channel.send(notVoiceErrorEmbed); + const permissions = voiceChannel.permissionsFor(message.client.user); + if (!permissions.has('connect')) return message.channel.send('i cant connect to this voice channel ask someone that can help me'); + if (!permissions.has('speak')) return message.channel.send('i cant talk in this voice channel aks someone that can help me'); + const serverQueue = queue.get(message.guild.id); + + + if (args[0] === 'play' || args[0] === 'p') { + if (!args[1]) return message.channel.send(noContentErrorEmbed).catch(e => console.log(e)) + let song = {}; + const videoFinder = async(query) => { + const videoResult = await ytSearch(query).catch(e => console.log(e)); + try { + return (videoResult.videos.length > 1) ? videoResult.videos[0] : null; + } catch (err) { + console.log(err) + } + } + + let songQuery = args.slice(1).join(' ').replace('http://', '').replace('https://', '').replace('www.', '').replace('youtube.com/', '').replace('/watch?v=', '').replace('&feature=share', '').replace('youtu.be', '') + + const video = await videoFinder(songQuery); + + if (video) { + song = { title: video.title, url: video.url } + } else { + message.channel.send(videoErrorEmbed).catch(e => console.log(e)) + } + if (!serverQueue) { + const queueConstructor = { + voiceChannel: voiceChannel, + textChannel: message.channel, + connection: null, + songs: [] + } + queue.set(message.guild.id, queueConstructor); + queueConstructor.songs.push(song); + try { + const connection = await voiceChannel.join(); + queueConstructor.connection = connection; + videoPlayer(message.guild, queueConstructor.songs[0], message); + } catch (error) { + queue.delete(message.guild.id); + message.channel.send(errorEmbed).catch(e => console.log(e)) + console.log('error: ' + error) + } + } else { + serverQueue.songs.push(song); + let addSongEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setColor(conf.colour.ok) + .setTitle(`**${song.title}** added to the queue`) + .setURL(`${song.url}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + return message.channel.send(addSongEmbed).catch(e => console.log(e)) + } + } else if (args[0] === 'queue' || args[0] === 'q') serverQueueGet(message, serverQueue, args); + else if (args[0] === 'skip') skipSong(message, serverQueue); + else if (args[0] === 'stop') stopSong(message, serverQueue); + else if (args[0] === 'remove') removeSong(message, serverQueue, args); + } +} +const videoPlayer = async(guild, song, message) => { + const songQueue = queue.get(guild.id); + if (!song) { + songQueue.voiceChannel.leave(); + queue.delete(guild.id); + return; + } + const stream = ytdl(song.url, { filter: 'audioonly' }); + try { + songQueue.connection.play(stream, { seek: 0, volume: 0.5 }) + .on('finish', () => { + songQueue.songs.shift(); + videoPlayer(guild, songQueue.songs[0], message); + }) + } catch (err) { + message.channel.send("i cant connect to the voice channel within the time frame i have high ping or some other error") + } + if (song.url) { + let embedUrl = song.url + if (!embedUrl.includes('http')) { + embedUrl = conf.domain + } + let addSongEmbed = new Discord.MessageEmbed() + .setAuthor('Music', `${conf.bot.logo}`) + .setColor(conf.colour.ok) + .setTitle(`Now playing **${song.title}**`) + .setURL(`${embedUrl}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + await songQueue.textChannel.send(addSongEmbed) + } +} + +const serverQueueGet = async(message, serverQueue, args) => { + if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed); + let serverQueueEmbed = new Discord.MessageEmbed() + .setAuthor('Music Queue', `${conf.bot.logo}`) + .setColor(conf.colour.ok) + .setTitle(`the server queue`) + .setURL(`${conf.domain}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`) + await serverQueue.songs.forEach(theSong => { + serverQueueEmbed.addField(`${serverQueue.songs.indexOf(theSong)}`, `__title:__ ${theSong.title}\n__url:__ ${theSong.url}`) + }) + await message.channel.send(serverQueueEmbed) + +} +const skipSong = (message, serverQueue) => { + if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed); + if (!serverQueue) { + return message.channel.send(noSongsErrorEmbed); + } + serverQueue.connection.dispatcher.end(); +} + +const stopSong = (message, serverQueue) => { + if (!message.member.voice.channel) return message.channel.send(notVoiceErrorEmbed); + serverQueue.songs = []; + serverQueue.connection.dispatcher.end(); +} + +const removeSong = (message, serverQueue) => { + serverQueue.songs.forEach(theSong => { + if (args[1] == serverQueue.songs.indexOf(theSong)) { + try { + serverQueue.songs.indexOf(theSong) > -1 ? serverQueue.songs.splice(serverQueue.songs.indexOf(theSong), 1) : false + } catch (err) { + message.channel.send("there was an error removing that song") + } + } else { + message.channel.send("That song isn't in the queue you can use the url insted.\nYou can find the url by clicking on the blue text in the embed i sent when you requested to play that song.") + } + }) +} \ No newline at end of file diff --git a/src/bot/commands/info/about.js b/src/bot/commands/info/about.js new file mode 100644 index 0000000..b050d6e --- /dev/null +++ b/src/bot/commands/info/about.js @@ -0,0 +1,38 @@ +const { version } = require('../../../../package.json'); +const conf = require('../../../conf/conf.json') + +module.exports = { + name: 'about', + description: "about bot", + async execute(message, args, Discord, currentServer, messageUser, client) { + message.channel.send(conf.domain + '/img/loading.gif').then(m => { + + let totalSeconds = (client.uptime / 1000); + let days = Math.floor(totalSeconds / 86400); + totalSeconds %= 86400; + let hours = Math.floor(totalSeconds / 3600); + totalSeconds %= 3600; + let minutes = Math.floor(totalSeconds / 60); + let seconds = Math.floor(totalSeconds % 60); + + let aboutEmbed = new Discord.MessageEmbed() + .setAuthor(conf.bot.name, `${conf.bot.logo}`, `${conf.domain}`) + .setDescription('everything you need to know.') + .setColor(conf.colour.ok) + .setTitle('about') + .setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`) + .addField('Website:', `${conf.domain}`) + .addField('Coolness level', `epic bot for ${message.guild.name} server`) + .addField('Developer(s)', '<@!522534458071449620>') + .addField('Version', `${version}`) + .addField('Libary', `discord.js v12`) + .addField("commands sent:", `${currentServer.commandCount} commands`) + .addField('Bot version:', `${version}`) + .addField('Up Time', `${days} d, ${hours} h, ${minutes} m, ${seconds} s`) + .addField("Memory usage:", `${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)} MB / 1GB`) + .addField('Ping', `ping: ${m.createdTimestamp - message.createdTimestamp} api ping: ${Math.round(client.ws.ping)}`) + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + m.edit(aboutEmbed).catch(error => console.log('error: ' + error)); + }).catch(error => console.log('error: ' + error)) + } +} \ No newline at end of file diff --git a/src/bot/commands/info/help.js b/src/bot/commands/info/help.js new file mode 100644 index 0000000..fa1a89b --- /dev/null +++ b/src/bot/commands/info/help.js @@ -0,0 +1,49 @@ +const conf = require('../../../conf/conf.json') +module.exports = { + name: 'help', + description: "help command", + execute(message, args, Discord, currentServer, messageUser, client) { + + + if (args[1] == 'embed') { + let helpSomethingEmbed = new Discord.MessageEmbed() + .setAuthor(conf.bot.name, conf.bot.logo) + .setColor('#10FF00') + .setTitle('Help embed') + .setDescription('**For mods and admins only**\nLet’s mods and admin make a custom embed.') + .addField('Command structure', `${currentServer.prefix}embed [title] [description] [colour]`) + .addField('Command example', `${currentServer.prefix}embed [bruv is awesome] [just joking you are] [#FF0000]`) + .addField('Extra info', `To get the # colour code(s) [click here](https://htmlcolorcodes.com/)`) + .setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + message.channel.send(helpSomethingEmbed).catch(error => console.log('error: ' + error)); + } else if (args[1] == 'embed-img') { + let helpSomethingEmbed = new Discord.MessageEmbed() + .setAuthor(conf.bot.name, conf.bot.logo) + .setColor('#10FF00') + .setTitle('Help embed-img') + .setDescription('**For mods and admins only**\nLet’s mods and admin make a custom embed.') + .addField('Command structure', `${currentServer.prefix}}embed [title] [description] [colour] [img-url]`) + .addField('Command example', `${currentServer.prefix}embed [bruv is awesome] [just joking you are] [#FF0000] [http://imgsite.com/knightrider.png]`) + .addField('Extra info', `To get the # colour code(s) [click here](https://htmlcolorcodes.com/)`) + .setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + message.channel.send(helpSomethingEmbed).catch(error => console.log('error: ' + error)); + } else { + let helpEmbed = new Discord.MessageEmbed() + .setColor(conf.colour.ok) + .setTitle('Help!') + .setURL(`${conf.domain}`) + .setAuthor(conf.bot.name, conf.bot.logo) + .addField("util commands:", `${currentServer.prefix}ping - shows ping\n${currentServer.prefix}about - gives general information about the bot`) + .addField("general commands:", `${currentServer.prefix}mcstatus - shows minecraft server status\n${currentServer.prefix}memes - shows a random meme from redid mus be done in memes channel\n${currentServer.prefix}fivem - shows fiveM server status\n${currentServer.prefix}fivem players - shows online players on fiveM\n${currentServer.prefix}fivem ip - gives you the fiveM server ip\n${currentServer.prefix}play (song name) or (youtube-url) - plays selected music in a voice channel\n${currentServer.prefix}skip - skips the current song to the next one on the queue\n${currentServer.prefix}stop - bot stops playing music\n`) + .addField("moderator commands:", `${currentServer.prefix}say #channel message - bot sends message in channel of choice\n${currentServer.prefix}filter - sets the word filter level\n${currentServer.prefix}userinfo <@user> - gives how many strikes a user has and other basic info on the user like nots and join dates.\n${currentServer.prefix}noteset <@user> - sets a note for a user\n${currentServer.prefix}note <@user> - see a moderator note for a user\n${currentServer.prefix}embed [title] [description] [colour] - sends a embed\n${currentServer.prefix}embed-img [title] [description] [colour] [img-url]\n${currentServer.prefix}OTR11 - for <@!276156203770314755> announcment`) + .setThumbnail(`${message.guild.iconURL() || `${conf.domain}/logo.png`}`) + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName}`, `${message.author.displayAvatarURL()}`); + message.channel.send(helpEmbed).catch(error => console.log('error: ' + error)) + } + } +} \ No newline at end of file diff --git a/src/bot/commands/info/ping.js b/src/bot/commands/info/ping.js new file mode 100644 index 0000000..f5cb5dc --- /dev/null +++ b/src/bot/commands/info/ping.js @@ -0,0 +1,11 @@ +module.exports = { + name: 'ping', + description: "about bot", + execute(message, args, Discord, currentServer, messageUser, client) { + message.channel.send("Pinging...").then(m => { + var ping = m.createdTimestamp - message.createdTimestamp; + var apiPing = Math.round(client.ws.ping) + m.edit(`ping: ${ping}\napi ping: ${apiPing}`).catch(error => console.log('error: ' + error)) + }); + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/addstaff.js b/src/bot/commands/moderation/addstaff.js new file mode 100644 index 0000000..e69de29 diff --git a/src/bot/commands/moderation/editfilter.js b/src/bot/commands/moderation/editfilter.js new file mode 100644 index 0000000..d1f285d --- /dev/null +++ b/src/bot/commands/moderation/editfilter.js @@ -0,0 +1,45 @@ +const fs = require('fs') +const conf = require('../../../conf/conf.json') +module.exports = { + name: 'editfilter', + description: "edit the filter array", + execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + + if (!args[1]) { + message.channel.send("please specify an operation "); + return; + }; + if (!args[2]) { + message.channel.send("please specify something to add to the filter"); + return; + }; + if (message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ").includes('@everyone') || message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ").includes('@here')) { + message.channel.send("please dont try and exploit me, if you would like to add that to the filter for a genuing reason please use the admin dashboard"); + return; + }; + + if (args[1] == 'add') { + currentServer.filter[currentServer.filter.level].push(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ")); + currentServer.save(); + message.channel.send(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ") + " has been added to the `" + currentServer.filter.level + "` filter"); + + } else if (args[1] == 'remove') { + const index = currentServer.filter[currentServer.filter.level].indexOf(message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ")); + if (index > -1) { + currentServer.filter[currentServer.filter.level].splice(index, 1); + message.channel.send("`" + message.content.toLowerCase().substring(currentServer.prefix.length).split(" ").slice(2).join(" ") + "` has been removed from the `" + currentServer.filter.level + "` filter"); + } else { + message.channel.send("you cant remove that as it dosnt exist in the `" + currentServer.filter.level + "` filter"); + }; + + } else if (args[1] == 'dash' || args[1] == 'dashboard') { + message.channel.send(conf.domain + "/dashboard"); + }; + + + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/embed-img.js b/src/bot/commands/moderation/embed-img.js new file mode 100644 index 0000000..cf99fbb --- /dev/null +++ b/src/bot/commands/moderation/embed-img.js @@ -0,0 +1,32 @@ +module.exports = { + name: 'embed-img', + description: "embed with image command for mods and admins", + execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + if (!args[1]) return message.reply(`you at leas need to supply a title if you stuck do ${currentServer.prefix}help embed`); + if (!message.content.includes('[')) return message.reply(`something is wrong with that if youre stuck do ${currentServer.prefix}help embed`); + + let mcontent = message.content; + let titleStart = mcontent.indexOf('['); + let titleEnd = mcontent.indexOf(']'); + let title = mcontent.substr(titleStart + 1, titleEnd - titleStart - 1); + + let descStart = mcontent.indexOf('[', titleStart + 1); + let descEnd = mcontent.indexOf(']', titleEnd + 1); + let description = mcontent.substr(descStart + 1, descEnd - descStart - 1); + + let colorstart = mcontent.indexOf('[', descStart + 1); + let colorend = mcontent.indexOf(']', descEnd + 1); + let color = mcontent.substr(colorstart + 1, colorend - colorstart - 1); + + let imgstart = mcontent.indexOf('[', colorstart + 1); + let imgend = mcontent.indexOf(']', colorend + 1); + let img = mcontent.substr(imgstart + 1, imgend - imgstart - 1); + + let custome_embed = new Discord.MessageEmbed().setAuthor(`${message.member.displayName}`, `${message.author.displayAvatarURL()}`).setTitle(title).setDescription(description).setColor(color).setImage(`${img}`); + message.channel.send(custome_embed); + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/embed.js b/src/bot/commands/moderation/embed.js new file mode 100644 index 0000000..169bc20 --- /dev/null +++ b/src/bot/commands/moderation/embed.js @@ -0,0 +1,30 @@ +module.exports = { + name: 'embed', + description: "embed command for mods and admins", + execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + if (!args[1]) return message.reply(`you at leas need to supply a title if you stuck do ${currentServer.prefix}help embed`); + if (!message.content.includes('[')) return message.reply(`something is wrong with that if youre stuck do ${currentServer.prefix}help embed`); + + + let mcontent = message.content; + let titleStart = mcontent.indexOf('['); + let titleEnd = mcontent.indexOf(']'); + let title = mcontent.substr(titleStart + 1, titleEnd - titleStart - 1); + + let descStart = mcontent.indexOf('[', titleStart + 1); + let descEnd = mcontent.indexOf(']', titleEnd + 1); + let description = mcontent.substr(descStart + 1, descEnd - descStart - 1); + + let colorstart = mcontent.indexOf('[', descStart + 1); + let colorend = mcontent.indexOf(']', descEnd + 1); + let color = mcontent.substr(colorstart + 1, colorend - colorstart - 1); + + let custome_embed = new Discord.MessageEmbed().setAuthor(`${message.member.displayName}`, `${message.author.displayAvatarURL()}`).setTitle(title).setDescription(description).setColor(color); + message.channel.send(custome_embed); + + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/filter.js b/src/bot/commands/moderation/filter.js new file mode 100644 index 0000000..b44952c --- /dev/null +++ b/src/bot/commands/moderation/filter.js @@ -0,0 +1,26 @@ +module.exports = { + name: 'filter', + description: "sets filter", + async execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + if (args[1] == 'off') { + currentServer.filter.level = 'off'; + currentServer.save(); + message.channel.send("filter has been set to " + currentServer.filter.level); + } else if (args[1] == 'normal') { + currentServer.filter.level = 'normal'; + currentServer.save(); + message.channel.send("filter has been set to " + currentServer.filter.level); + } else if (args[1] == 'safe') { + currentServer.filter.level = 'safe'; + currentServer.save(); + message.channel.send("filter has been set to " + currentServer.filter.level); + } else { + message.channel.send("that is not a valid filter setting you can chose from: 'normal' 'safe' and 'off'."); + }; + + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/gameroles.js b/src/bot/commands/moderation/gameroles.js new file mode 100644 index 0000000..1661ef0 --- /dev/null +++ b/src/bot/commands/moderation/gameroles.js @@ -0,0 +1,28 @@ +const conf = require('../../../conf/conf.json'); +module.exports = { + name: 'rulesrolesljoughuihoutfd8es5tryj/i.uliutygrjyhgjlkukbjhcfjklhgfhjouhbgrvycghujyiljknhbgvfhtgfhiuoihkjbnhbvgfgyuo', + description: "say command for mods and admins", + async execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + + const exampleEmbed = new Discord.MessageEmbed() + .setColor(conf.colour.ok) + .setAuthor("Game Reaction Roles") + .setTitle("react to get your roles") + .setThumbnail('https://cdn.discordapp.com/icons/584484766997282836/94b16e813edb9a2f1df4a5bd16f98ad1.png') + .setURL("http://knightRider.rf.gd/reaction-role-error.php") + .setDescription("🚚 - <@&595087305212035084>\n🚜 - <@&595086913430355973>\n⛏️ - <@&595087098604683277>\n🗺️ - <@&604424840807710721>\n🚓 - <@&691635977889906849>\n🚗 - <@&752217267600621578>\n🏎️ - <@&752217137728192543>\n🔧 - <@&595767995998011392>\n⚙️ - <@&860942666195927050>") + .setFooter('something wrong? go to http://knightRider.rf.gd/er.html'); + let msg = await message.channel.send(exampleEmbed); + msg.react("🚚") + msg.react("🚜") + msg.react("⛏") + msg.react("🗺") + msg.react("🚓") + msg.react("🚗") + msg.react("🏎") + msg.react("🔧") + msg.react("⚙") + } + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/mute.js b/src/bot/commands/moderation/mute.js new file mode 100644 index 0000000..e69de29 diff --git a/src/bot/commands/moderation/note.js b/src/bot/commands/moderation/note.js new file mode 100644 index 0000000..8ce4b3a --- /dev/null +++ b/src/bot/commands/moderation/note.js @@ -0,0 +1,7 @@ +module.exports = { + name: 'note', + description: "shows a users note", + async execute(message, args, Discord, currentServer, messageUser, client) { + message.reply("* depricated *: do " + currentServer.prefix + "userinfo @someone") + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/say.js b/src/bot/commands/moderation/say.js new file mode 100644 index 0000000..10b4432 --- /dev/null +++ b/src/bot/commands/moderation/say.js @@ -0,0 +1,16 @@ +module.exports = { + name: 'say', + description: "say command for mods and admins", + execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + + message.delete(); + let sayArgs = message.content.substring(prefix.length).split(" "); + if (message.content.toLowerCase().includes('@everyone')) return message.reply(`Holup you can't @ every one`); + if (message.content.toLowerCase().includes('@here')) return message.reply(`Holup you can't @ here`); + message.channel.send(`${sayArgs.slice(2).join(" ")}`); + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/setnote.js b/src/bot/commands/moderation/setnote.js new file mode 100644 index 0000000..e69de29 diff --git a/src/bot/commands/moderation/townhall.js b/src/bot/commands/moderation/townhall.js new file mode 100644 index 0000000..171f27c --- /dev/null +++ b/src/bot/commands/moderation/townhall.js @@ -0,0 +1,45 @@ +const conf = require('../../../conf/conf.json') +module.exports = { + name: 'townhall', + description: "say command for mods and admins", + async execute(message, args, Discord, currentServer, messageUser, client) { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + + if (args[1] == 'end') { + if (args[2] == 'confirm') { + require('../../events/voicestateupdate').members[message.guild.id] = []; + message.channel.send("townHall meeting members have been removed.") + } else { + message.channel.send("are you sure you want to end the townhall meeting? this will remove all members even ones that may still be currently in the voice channel.\nto confirm please do `" + currentServer.prefix + "townhall end confirm`.") + } + } else { + let members = require('../../events/voicestateupdate').members[message.guild.id]; + let mpos = 0; + let mEmbed = new Discord.MessageEmbed() + .setColor(conf.colour.ok) + .setTitle('Members that have Joined Townhall Vc') + .setURL(conf.domain + '/server/' + message.guild.id + '/townhall') + .setAuthor(conf.bot.name, conf.bot.logo, conf.bot.url) + .setDescription('when the townhall meeting ends remember to do `' + currentServer.prefix + 'townhall end` otherwise users from the previous meeting will show up.') + .setThumbnail(message.guild.iconURL() || conf.domain + '/logo.png') + .setTimestamp() + .setFooter('TownHall Meeting'); + + await members.forEach(async(member) => { + let isStaff; + if (client.guilds.cache.get(currentServer.id).members.cache.get(member).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) { + isStaff = 'yes'; + } else { + isStaff = 'no'; + }; + mpos++; + await mEmbed.addField(`__${client.users.cache.get(member).tag}:__`, `__**id:**__ ${member}\n__**@:**__ <@!${member}>\n__**isStaff:**__ ${isStaff}\n__**Join Position:**__ ${mpos}`); + }) + message.channel.send({ embed: mEmbed }); + }; + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + + } +} \ No newline at end of file diff --git a/src/bot/commands/moderation/userinfo.js b/src/bot/commands/moderation/userinfo.js new file mode 100644 index 0000000..1df7cf8 --- /dev/null +++ b/src/bot/commands/moderation/userinfo.js @@ -0,0 +1,48 @@ +const conf = require('../../../conf/conf.json'); +const User = require('../../../models/user'); +module.exports = { + name: 'userinfo', + description: "get information about someone on the server", + async execute(message, args, Discord, currentServer, messageUser, client) { + try { + if (currentServer.staff.includes(message.author.id) || message.member.roles.cache.find(r => server.staffRoles.includes(r.name))) { + let theUser; + if (message.mentions.users.first()) { + theUser = message.mentions.users.first(); + } else { + theUser = message.author; + }; + let currentUser = await User.findOne({ userid: theUser, guildid: message.guild.id }); + if (currentUser == null) return message.channel.send("that user inst in the database"); + + const userInfoEmbed = new Discord.MessageEmbed() + .setAuthor(`${conf.bot.name}`, `${conf.bot.logo}`) + .setTitle('user info') + .setURL(conf.domain) + .setColor(conf.colour.ok) + .setThumbnail(theUser.avatarURL()) + .addField("__**user:**__", "<@!" + currentUser.id + "> (" + currentUser.id + ")") + .addField("__**strikes:**__", "`" + currentUser.strike.toString() + "`") + .addField("__**note:**__", "`" + currentUser.note + "`") + .setTimestamp() + .setFooter(`Requested by ${message.member.displayName} | react with a ❌ to delete`, `${message.author.displayAvatarURL()}`); + message.channel.send(userInfoEmbed).then(async sentMsg => { + await sentMsg.react('❌'); + sentMsg.awaitReactions(async(reaction, user) => { + if (reaction.emoji.name === '❌') await sentMsg.delete(); + }); + /* + await sentMsg.react('❌'); + const filter = (reaction, user) => ['❌'].includes(reaction.emoji.name) && user.id === message.author.id; + const [reaction] = await sentMsg.awaitReactions(filter, { maxMatches: 1 }); + if (reaction.emoji.name === '❌') await sentMsg.delete(); + */ + }); + } else { + return message.reply("you cant do that only staff can").catch(e => console.log(e)); + }; + } catch (err) { + message.channel.send("an error happened. are they in the \"database\"?") + } + } +} \ No newline at end of file diff --git a/src/bot/events/error.js b/src/bot/events/error.js new file mode 100644 index 0000000..5580851 --- /dev/null +++ b/src/bot/events/error.js @@ -0,0 +1,8 @@ +const conf = require('../../conf/conf.json') +module.exports = { + name: 'error', + async exe(client, Discord, error) { + //one day i will saves these to a file or something + console.log(error) + } +} \ No newline at end of file diff --git a/src/bot/events/guildMemberAdd.js b/src/bot/events/guildMemberAdd.js new file mode 100644 index 0000000..ec2ea9b --- /dev/null +++ b/src/bot/events/guildMemberAdd.js @@ -0,0 +1,55 @@ +const conf = require('../../conf/conf.json') +module.exports = { + name: 'guildMemberAdd', + async exe(client, Discord, member) { + try { + member.guild.fetchInvites().then(guildInvites => { + const inviteGuild = invites; + const invite = guildInvites.find(i => inviteGuild.get(i.code).uses < i.uses); + const inviter = client.users.cache.get(invite.inviter.id); + + const inviteLogEmbed = { + color: `${conf.colour.ok}`, + title: 'invite', + url: `${conf.domain}`, + author: { + name: conf.bot.name + }, + thumbnail: { + url: `${conf.server.logo}`, + }, + description: `${member.user.discriminator} (${member.user.id}) joined using invite code ${invite.code} from ${inviter.tag} (${inviter.id}). Invite was used ${invite.uses} times since its creation.`, + fields: [{ + name: 'Member joined:', + value: `${member.user.discriminator} (${member.user.id})`, + }, + { + name: 'Inviter:', + value: `${inviter.tag} (${inviter.id})`, + }, + { + name: 'Invite Code:', + value: `[https://discord.gg/${invite.code}](https://discord.gg/${invite.code})`, + }, + { + name: 'Invite Uses:', + value: `${invite.uses}`, + }, + { + name: 'Time of Invite:', + value: `${new Date()}`, + } + ], + timestamp: new Date(), + footer: { + text: 'moderation logs' + }, + }; + member.guild.channels.cache.get(conf.server.channels.modLogs).send({ embed: inviteLogEmbed }); + invites = guildInvites; + }); + } catch (error) { + require('../conf/functions.js').reportError(client, conf, "guildMemberAdd", error, { name: null, id: null }) + } + } +} \ No newline at end of file diff --git a/src/bot/events/message.js b/src/bot/events/message.js new file mode 100644 index 0000000..0ea7288 --- /dev/null +++ b/src/bot/events/message.js @@ -0,0 +1,74 @@ +const conf = require('../../conf/conf.json') + +const getGuild = require('../../funcs/getserver'); +const getUser = require('../../funcs/getuser'); + +function addCmd(message) { + +} + +module.exports = { + name: 'message', + async exe(client, Discord, message) { + if (message.author.bot || !message.guild) return; + + let currentServer = await getGuild(message); + let messageUser = await getUser(message); + if (currentServer == null) return; + + ['caps', 'swearfilter'].forEach(addon => { + require(`../addons/${addon}`)(message, server, messageUser, client); + }) + + //eval command + if (message.content.toLowerCase().startsWith("--eval")) { + const evalargs = message.content.split(" ").slice(1); + + function clean(text) { + if (typeof(text) === "string") { + return text.replace(/`/g, "`" + String.fromCharCode(8203)).replace(/@/g, "@" + String.fromCharCode(8203)); + } else { + return text; + } + } + if (message.author.id !== conf.owner) return message.channel.send("no you cant do that, only <@!522534458071449620> can."); + if (message.author.id == conf.owner) { + try { + const code = evalargs.join(" "); + let evaled = eval(code); + if (typeof evaled !== "string") { + evaled = require("util").inspect(evaled); + } + message.channel.send(clean(evaled), { code: "xl" }); + } catch (err) { + message.channel.send(`\`ERROR\` \`\`\`xl\n${clean(err)}\n\`\`\``); + } + } + } + + let args = message.content.toLowerCase().substring(currentServer.prefix.length).split(" "); + if (!message.content.startsWith(currentServer.prefix)) return; + + //otr commands + if (message.author.id == conf.cwh11) { + require('../../funcs/otr').otrCommand(message, args, Discord, currentServer, messageUser, client); + }; + + //dynamic get command name or prefix + if (client.commands.has(args[0])) { + try { + client.commands.get(args[0]).execute(message, args, Discord, currentServer, messageUser, client); + addCmd(message); + } catch (error) { + message.reply('there was an error with that command!'); + }; + } else if (client.commands.find(command => command.aliases && command.aliases.includes(args[0]))) { + try { + client.commands.find(command => command.aliases && command.aliases.includes(args[0])).execute(message, args, Discord, currentServer, messageUser, client); + addCmd(message); + } catch (error) { + message.reply('there was an error with that command!'); + }; + }; + } +} \ No newline at end of file diff --git a/src/bot/events/messageReactionAdd.js b/src/bot/events/messageReactionAdd.js new file mode 100644 index 0000000..f93730b --- /dev/null +++ b/src/bot/events/messageReactionAdd.js @@ -0,0 +1,26 @@ +const Server = require('../../models/server'); +module.exports = { + name: 'messageReactionAdd', + async exe(client, Discord, reaction, user) { + + let currentServer = await Server.findOne({ id: reaction.message.guild.id }); + if (currentServer == null) return; + + if (!reaction.message.guild || user.bot) return; + if (reaction.message.partial) await reaction.message.fetch(); + if (reaction.partial) await reaction.fetch(); + let member = await reaction.message.guild.members.fetch(user.id); + try { + currentServer.reactionRoles.forEach(role => { + if (reaction.message.channel.id == role.channelID) { + if (reaction.emoji.name == role.emoji) { + let rr = client.guilds.cache.get(reaction.message.guild.id).roles.cache.get(role.roleID); + member.roles.add(rr).catch(e => console.log(e)); + }; + }; + }); + } catch (error) { + return console.log(error) + }; + } +} \ No newline at end of file diff --git a/src/bot/events/messageReactionRemove.js b/src/bot/events/messageReactionRemove.js new file mode 100644 index 0000000..0eb23fa --- /dev/null +++ b/src/bot/events/messageReactionRemove.js @@ -0,0 +1,29 @@ +const Server = require('../../models/server'); +const conf = require('../../conf/conf.json') +module.exports = { + name: 'messageReactionRemove', + async exe(client, Discord, reaction, user) { + + let currentServer = await Server.findOne({ id: reaction.message.guild.id }); + if (currentServer == null) return; + + if (!reaction.message.guild || user.bot) return; + if (reaction.message.partial) await reaction.message.fetch(); + if (reaction.partial) await reaction.fetch(); + let member = await reaction.message.guild.members.fetch(user.id); + try { + currentServer.reactionRoles.forEach(role => { + if (reaction.message.channel.id == role.channelID) { + if (reaction.emoji.name == role.emoji) { + let rr = client.guilds.cache.get(reaction.message.guild.id).roles.cache.get(role.roleID); + + member.roles.remove(rr).catch(e => console.log(e)); + + }; + }; + }); + } catch (error) { + return console.log(error) + }; + } +} \ No newline at end of file diff --git a/src/bot/events/ready.js b/src/bot/events/ready.js new file mode 100644 index 0000000..d648626 --- /dev/null +++ b/src/bot/events/ready.js @@ -0,0 +1,9 @@ +const { green } = require('chalk'); +const conf = require('../../conf/conf.json'); +module.exports = { + name: 'ready', + async exe(client) { + console.log(green('[bot]: ') + `${client.user.tag}` + " is online"); + console.log("Ready!"); + } +} \ No newline at end of file diff --git a/src/bot/events/voicestateupdate.js b/src/bot/events/voicestateupdate.js new file mode 100644 index 0000000..c2f5922 --- /dev/null +++ b/src/bot/events/voicestateupdate.js @@ -0,0 +1,71 @@ +const Server = require("../../models/server"); +const conf = require('../../conf/conf.json') + +var members = []; +module.exports = { + members: members, + name: 'voiceStateUpdate', + async exe(client, Discord, oldMember, newMember) { + try { + let newUserChannel = newMember.channelID; + let oldUserChannel = oldMember.channelID; + const currentServer = await Server.findOne({ id: newMember.guild.id }); + if (currentServer == null) return; + if (currentServer.channels.townhall == ' ' || currentServer.channels.townhallLogs == ' ') return; + if (newUserChannel == currentServer.channels.townhall) { + let isStaff; + if (client.guilds.cache.get(currentServer.id).members.cache.get(newMember.id).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) { + isStaff = 'yes'; + } else { + isStaff = 'no'; + }; + if (!members[newMember.guild.id]) { + members[newMember.guild.id] = []; + }; + if (!members[newMember.guild.id].includes(newMember.id)) { + members[newMember.guild.id].push(newMember.id) + }; + const e6 = { + color: conf.colour.ok, + title: 'User joinded Town hall vc', + author: { + name: client.users.cache.get(newMember.id).tag, + icon_url: client.users.cache.get(newMember.id).avatarURL() + }, + description: "a new member has joined the town hall VC.\nto get all members that have joined during this session do `" + currentServer.prefix + "townhall`.", + fields: [{ + name: '**__name:**__', + value: client.users.cache.get(newMember.id).tag, + }, + { + name: '__**id:**__', + value: newMember.id, + }, + { + name: '__**@ mention**__', + value: '<@!' + newMember.id + '>' + }, + { + name: '__**is staff**__', + value: isStaff + }, + { + name: '__**join position:**__', + value: members.length + }, + ], + + timestamp: new Date(), + footer: { + text: 'TownHall Meeting Log' + }, + }; + + client.guilds.cache.get(currentServer.id).channels.cache.get(currentServer.channels.townhallLogs).send({ embed: e6 }); + + }; + } catch (error) { + console.log(error) + } + } +} \ No newline at end of file diff --git a/src/bot/handlers/addon.js b/src/bot/handlers/addon.js new file mode 100644 index 0000000..df78082 --- /dev/null +++ b/src/bot/handlers/addon.js @@ -0,0 +1,13 @@ +const { readdirSync } = require("fs"); +const chalk = require('chalk'); +module.exports = (client) => { + const addons = readdirSync(__dirname + '/../addons/').filter((file) => file.endsWith(".js")); + for (let addonFile of addons) { + try { + console.log(chalk.green('[addon handler]: ') + " found '" + addonFile + "'"); + } catch (error) { + console.log(chalk.green('[addon handler]: ') + chalk.red('(error): ') + "unhandled error: " + error); + continue; + } + } +}; \ No newline at end of file diff --git a/src/bot/handlers/command.js b/src/bot/handlers/command.js new file mode 100644 index 0000000..e283ada --- /dev/null +++ b/src/bot/handlers/command.js @@ -0,0 +1,37 @@ +const { readdirSync } = require("fs"); +const chalk = require('chalk'); +let chalkColour; +module.exports = (client) => { + readdirSync(__dirname + "/../commands/").forEach((dir) => { + const commands = readdirSync(__dirname + `/../commands/${dir}/`).filter((file) => file.endsWith(".js")); + for (let file of commands) { + let cmd = require(__dirname + `/../commands/${dir}/${file}`); + if (cmd.name && cmd.description) { + switch (dir) { + case 'fun': + chalkColour = 'green' + break; + case 'moderaton': + chalkColour = 'blue' + break; + case 'info': + chalkColour = 'cyan' + break; + default: + chalkColour = 'green' + } + try { + client.commands.set(cmd.name, cmd); + console.log(chalk.yellow('[command handler]: ') + chalk[chalkColour]('(' + dir + '): ') + "name: " + cmd.name + " path: " + `./commands/${dir}/${file}`); + } catch (error) { + console.log(chalk.yellow('[command handler]: ') + chalk.red('(command error): ') + "adding command. path: " + `./commands/${dir}/${file}`); + console.log("eeer: " + error) + continue; + } + } else { + console.log(chalk.yellow('[command handler]: ') + chalk.red('(command error): ') + "command dosnt contain a name or description. path: " + `./commands/${dir}/${file}`); + continue; + } + } + }); +}; \ No newline at end of file diff --git a/src/bot/handlers/event.js b/src/bot/handlers/event.js new file mode 100644 index 0000000..c4e03ff --- /dev/null +++ b/src/bot/handlers/event.js @@ -0,0 +1,10 @@ +const chalk = require('chalk'); +const { readdirSync } = require("fs"); +const Discord = require('discord.js'); +module.exports = (client) => { + const eventFiles = readdirSync(__dirname + '/../events/').filter(file => file.endsWith('.js')); + for (const file of eventFiles) { + const event = require(__dirname + `/../events/${file}`); + client.on(event.name, async(...args) => event.exe(client, Discord, ...args)); + }; +} \ No newline at end of file diff --git a/src/conf/conf.json b/src/conf/conf.json new file mode 100644 index 0000000..e667382 --- /dev/null +++ b/src/conf/conf.json @@ -0,0 +1,24 @@ +{ + "prefix": ".", + "owner": "522534458071449620", + "domain": "http://localhost:4758", + "port": "4758", + "cwh11": "276156203770314755", + "colour": { + "ok": "#ff0000", + "error": "#ff5733" + }, + "mainServer": { + "invite": "https://discord.gg/52AugmVzjt", + "id": "here" + }, + "bot": { + "name": "knightrider", + "logo": "https://cdn.discordapp.com/icons/584484766997282836/337d9f62b88bc8d343be2bb3bc90292f.png", + "url": "http://knightrider.invalidlag.com/me" + }, + "webServer": { + "port": 4758, + "oauthURI": "here" + } +} \ No newline at end of file diff --git a/src/conf/functions.js b/src/conf/functions.js new file mode 100644 index 0000000..18b637a --- /dev/null +++ b/src/conf/functions.js @@ -0,0 +1,105 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const { User } = require('discord.js'); + +const User = require('../models/user'); +const Server = require('../models/server'); +const getServer = require('../funcs/getserver'); +module.exports = { + reportError: function(client, conf, task, error, user) { + const errorEmbed = { + color: `${conf.colour.okError}`, + title: 'Error', + url: `${conf.domain}`, + author: { + name: conf.bot.name + }, + thumbnail: { + url: `${conf.server.logo}`, + }, + description: `there has been an error executing somthing this will be somthing from a automated script or a member using the bot\nthe infromation below can be sensative **do not share** this with anyone unless you know what to hide:`, + fields: [{ + name: '__**task:**__', + value: `\`${task}\``, + }, + { + name: '__**Error**__', + value: `\`${error}\``, + }, + { + name: '__**user who triggered it**__', + value: `__name:__ \`${currentUser.userName}\`\n__id:__ \`${user.id}\``, + } + ], + timestamp: new Date(), + footer: { + text: 'Owner Error Log' + }, + }; + client.users.cache.get(conf.owner).send({ embed: errorEmbed }); + + }, + addCmd: async function(message) { + let currentServer = await Server.findOne({ id: message.guild.id }); + currentServer.commandCount++; + currentServer.save(); + }, + addstrike: async function(message) { + let currentUser = await User.findOne({ id: message.author.id }) + if (currentUser == null) { + await User.create({ + id: message.author.id, + avatar: message.author.avatarURL() + }) + currentUser = await User.findOne({ id: message.author.id }) + } + currentUser.strike++; + currentUser.save() + }, + + otrCommand: async function(message, args, Discord, client) { + if (message.author.id == conf.cwh11) { + let server = getServer(message); + if (server == null) return message.channel.send("this server isnt in the db"); + const annoncmentsChannel = client.channels.cache.get(server.channels.annoncments); + switch (args[0]) { + case 'ito': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is in the office. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otrf': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Ford. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otrs': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Subaru. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otr11': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in his car. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otr': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'olb': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'yts': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is streaming on YouTube: https://www.youtube.com/channel/UC7uWWizg0tmQ2R1kBkuDJHg").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'ts': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is streaming on Twitch: https://www.twitch.tv/therealcwh11").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + default: + return; + }; + } + } + +}; \ No newline at end of file diff --git a/src/conf/reactionroles.json b/src/conf/reactionroles.json new file mode 100644 index 0000000..722071a --- /dev/null +++ b/src/conf/reactionroles.json @@ -0,0 +1,34 @@ +{ + "584494185453977622": { + "roles": { + "✅": "584487354194984981" + } + }, + + "790737726332600360": { + "roles": { + "📑": "783031927753801770", + "💻": "791376525475315742", + "🎧": "791376529233674310", + "🖥": "791376533057962095", + "📱": "791376535138467900", + "🎮": "791376535474536458", + "🔌": "791376537211371560" + + } + }, + + "791381305111347231": { + "roles": { + "🚚": "595087305212035084", + "🚜": "595086913430355973", + "⛏️": "595087098604683277", + "🗺️": "604424840807710721", + "🚓": "691635977889906849", + "🚗": "752217267600621578", + "🏎️": "752217137728192543", + "🔧": "595767995998011392", + "⚙️": "860942666195927050" + } + } +} \ No newline at end of file diff --git a/src/conf/tokens.js b/src/conf/tokens.js new file mode 100644 index 0000000..ec6c1fe --- /dev/null +++ b/src/conf/tokens.js @@ -0,0 +1,15 @@ +module.exports = { + bot: { + token: "here" + }, + oauth: { + clientId: "here", + clientSecret: "here", + redirectUri: "http://localhost:4758/dashboard", + scope: "identify email guilds" + }, + db: { + URI: "here" + } + +} \ No newline at end of file diff --git a/src/express/get/api/api.js b/src/express/get/api/api.js new file mode 100644 index 0000000..f3711ed --- /dev/null +++ b/src/express/get/api/api.js @@ -0,0 +1,14 @@ +const { version, repository: { url } } = require('../../../../package.json'); +const { domain, prefix, mainServer: { invite } } = require('../../../conf/conf.json'); +module.exports = { + name: '/api', + dynamic: false, + async exe(client, req, res) { + try { + res.status(200).json({ defaultPrefix: prefix, doamin: domain, version: version, mainGuild: invite, github: url.replace('.git', '') }); + } catch (error) { + console.log(error); + res.status(500).json({ error: "500 - some error", message: "report it if it happens again" }); + } + } +} \ No newline at end of file diff --git a/src/express/get/dashboard/dashboard.js b/src/express/get/dashboard/dashboard.js new file mode 100644 index 0000000..c3ddccc --- /dev/null +++ b/src/express/get/dashboard/dashboard.js @@ -0,0 +1,159 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const fetch = require('node-fetch'); +const config = require('../../../conf/conf.json') +const User = require('../../../models/userdashboard'); +const dbc = require('discord-bitfield-calculator') +const token = require('../../../conf/tokens'); +const Server = require('../../../models/server'); +const randomString = require("randomstring").generate({ + length: 33, + charset: 'alphabetic' +}); + +module.exports = { + name: '/dashboard', + dynamic: false, + async exe(client, req, res) { + // try { + if (req.query.code) { + let oath; + let userInfo; + let userGuilds = []; + let guilds = []; + let theAccessCode = randomString; + + //access discord oauth2 and get nececry data + await fetch('https://discord.com/api/oauth2/token', { + method: 'POST', + body: new URLSearchParams({ + client_id: token.oauth.clientId, + client_secret: token.oauth.clientSecret, + grant_type: 'authorization_code', + redirect_uri: token.oauth.redirectUri, + code: req.query.code, + scope: token.oauth.scope, + }), + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }).then(discordRes => discordRes.json()).then(info => oath = info); + + //fetch user info from OAuth2 token + await fetch('https://discord.com/api/users/@me', { + headers: { + authorization: `${oath.token_type} ${oath.access_token}`, + }, + }).then(async userRes => { + userInfo = await userRes.json(); + }); + + //fetch guilds from OAuth2 token + await fetch('https://discord.com/api/users/@me/guilds', { + headers: { + authorization: `${oath.token_type} ${oath.access_token}`, + }, + }) + .then(async guildRes => { + userGuilds = await guildRes.json() + }); + + //if the access code was used/expired (from browser refresh) redirect without code and try use cookeis + if (userInfo.message == '401: Unauthorized') return res.redirect('/dashboard'); + if (userGuilds.message == '401: Unauthorized') return res.redirect('/dashboard'); + + let botGuilds = await client.guilds.cache.map(guild => guild.id) + //loop though oauth2 guilds and push guild info for matching guilds to 'guilds' array + await userGuilds.forEach(async(userGuild) => { + let currentServer = await Server.findOne({ id: userGuild.id }) + //handle servers only the user is in + if (currentServer == null) { + if (userGuild.owner == true) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: false, userPermission: 'owner' }); + } else { + if (dbc.permissions(userGuild.permissions_new).includes('MANAGE_GUILD')) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: false, userPermission: 'MANAGE_GUILD' }); + }; + }; + //handle servers the bot and user are in + } else { + if (userGuild.owner == true) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'owner' }); + } else { + if (client.guilds.cache.get(currentServer.id).members.find(currentUser.userId).roles.cache.find(r => currentServer.staffRoles.includes(r.name))) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'staffrole' }); + } else { + currentServer.staff.forEach(userid => { + if (userInfo.id == userid) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'staffid' }); + } else if (dbc.permissions(userGuild.permissions_new).includes('MANAGE_GUILD')) { + guilds.push({ id: userGuild.id, name: userGuild.name, icon: `https://cdn.discordapp.com/icons/${userGuild.id}/${userGuild.icon}.webp`, mutual: true, userPermission: 'MANAGE_GUILD' }); + }; + }); + }; + }; + }; + }); + delete botGuilds; + + let currentUser = await User.findOne({ userId: userInfo.id }); + if (currentUser == null) { + await User.create({ + userId: userInfo.id, + userName: userInfo.username, + discriminator: userInfo.discriminator || '0000', + avatar: `https://cdn.discordapp.com/avatars/${userInfo.id}/${userInfo.avatar}.png`, + accessCodes: [{ browser: req.headers['user-agent'], code: randomString }], + guilds: guilds + }); + currentUser = await User.findOne({ userId: userInfo.id }); + } else { + let gotCorrectAccessCode = false; + if (res.locals.cookie.accesscode) { + await currentUser.accessCodes.forEach(async(accessCode) => { + if (res.locals.cookie.accesscode == accessCode.code) { + gotCorrectAccessCode = await true; + theAccessCode = res.locals.cookie.accesscode; + } + }); + }; + if (gotCorrectAccessCode == false) { + currentUser.accessCodes.push({ browser: req.headers['user-agent'], code: randomString }); + theAccessCode = randomString; + }; + currentUser.userName = userInfo.username; + currentUser.avatar = `https://cdn.discordapp.com/avatars/${userInfo.id}/${userInfo.avatar}.png`; + currentUser.guilds = guilds; + currentUser.save(); + }; + + res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', theAccessCode, { expires: new Date(253402300000000), httpOnly: true }).status(200).render('dashboard/index.ejs', { currentUser: currentUser, guilds: currentUser.guilds }); + + } else if (req.query.error) { + console.log("req query error: " + req.query.error) + await res.status(500).render('500.ejs'); + + } else if (res.locals.cookie.id && res.locals.cookie.accesscode) { + const currentUser = await User.findOne({ userId: res.locals.cookie.id }); + if (currentUser == null) return res.redirect('/login?nouser'); + + let hasAccess = false; + await currentUser.accessCodes.forEach(async(userCode) => { + if (res.locals.cookie.accesscode == userCode.code) { + + hasAccess = true; + return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/index.ejs', { user: { name: currentUser.userName, tag: currentUser.discriminator, avatar: currentUser.avatar }, currentUser: currentUser, guilds: currentUser.guilds }); + }; + }); + if (hasAccess == false) return res.redirect('/login?ninvalidcode'); + } else if (!res.locals.cookie.id || !res.locals.cookie.accesscode) return res.redirect('/login?nocookies'); + + /* + } catch (error) { + console.log(chalk.red('[express get]: ') + "there was an error with dashboard.js\nerror: " + error); + return res.status(500).render('500.ejs'); + }; + */ + } +} \ No newline at end of file diff --git a/src/express/get/dashboard/filter.js b/src/express/get/dashboard/filter.js new file mode 100644 index 0000000..6174b71 --- /dev/null +++ b/src/express/get/dashboard/filter.js @@ -0,0 +1,45 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Server = require('../../../models/server') +const Userdashboard = require('../../../models/userdashboard') +const conf = require('../../../conf/conf.json') +module.exports = { + name: '/server/:serverid/filter', + dynamic: true, + async exe(client, req, res) { + try { + if (!res.locals.cookie.id || !res.locals.cookie.accesscode) { + return res.redirect(conf.domain + "/login") + } + let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id }) + let currentServer = await Server.findOne({ id: req.params.serverid }) + if (currentServer == null) return res.render('404.ejs') + let hasAccess = false; + await currentUser.guilds.forEach(guild => { + if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { + hasAccess = true; + }; + }); + if (hasAccess == true) { + await currentUser.accessCodes.forEach(async(userCode) => { + if (res.locals.cookie.accesscode == userCode.code) { + + hasAccess = true; + return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/filter.ejs', { domain: conf.domain, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer }); + }; + }); + + if (hasAccess == false) return res.redirect('/login?ninvalidcode'); + + } else { + await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } }) + } + } catch (error) { + console.log(error) + // require('../../../conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid }) + res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" }) + + } + } +} \ No newline at end of file diff --git a/src/express/get/dashboard/message.js b/src/express/get/dashboard/message.js new file mode 100644 index 0000000..afa2b18 --- /dev/null +++ b/src/express/get/dashboard/message.js @@ -0,0 +1,29 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +module.exports = { + name: '/dash/message', + async exe(client, req, res) { + try { + let usersDB = JSON.parse(fs.readFileSync('./././database/users.json', 'utf8')); + if (!req.query.tmpPassWord) { + res.redirect("http://idiotlanparty.com/oauth") + } + if (usersDB[req.query.userid].admin == true) { + if (req.query.tmpPassWord == usersDB[req.query.userid].tmpPassWord) { + res.render('admin-message.ejs', { userInfo: { id: req.query.userid, username: req.query.username, avatar: req.query.userAvatar }, tmpPassWord: req.query.tmpPassWord }) + } else { + await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access please login again to regenrate your temporary local oath key", userInfo: { id: req.query.userid, username: req.query.username, avatar: req.query.userAvatar } }) + } + + } else if (usersDB[userInfo.id].admin == false) { + await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } }) + } + } catch (error) { + console.log(error) + require('../../../conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid }) + res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" }) + + } + } +} \ No newline at end of file diff --git a/src/express/get/dashboard/reactionroles.js b/src/express/get/dashboard/reactionroles.js new file mode 100644 index 0000000..7bc0c2b --- /dev/null +++ b/src/express/get/dashboard/reactionroles.js @@ -0,0 +1,52 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Server = require('../../../models/server'); +const Userdashboard = require('../../../models/userdashboard'); +const conf = require('../../../conf/conf.json'); +module.exports = { + name: '/server/:serverid/reactionroles', + dynamic: true, + async exe(client, req, res) { + try { + if (!res.locals.cookie.id || !res.locals.cookie.accesscode) { + return res.redirect(conf.domain + "/login") + } + let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id }) + if (currentUser == null) return res.render('404.ejs') + let currentServer = await Server.findOne({ id: req.params.serverid }) + if (currentServer == null) return res.render('404.ejs') + let hasAccess = false; + await currentUser.guilds.forEach(guild => { + if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { + hasAccess = true; + }; + }); + if (hasAccess == true) { + let listedRoles = []; + let listedChannels = []; + let server = await client.guilds.cache.get(currentServer.id); + let user = await server.members.fetch(currentUser.userId); + //push server roles to array + server.roles.cache.map((role) => listedRoles.push({ id: role.id, name: role.name })); + //push only channels user can see to array + server.channels.cache.filter(c => c.type == 'text').forEach(channel => { + if (server.channels.cache.get(channel.id).permissionsFor(user).has(['SEND_MESSAGES', 'VIEW_CHANNEL'])) listedChannels.push({ name: channel.name, id: channel.id }); + }); + await currentUser.accessCodes.forEach(async(userCode) => { + if (res.locals.cookie.accesscode == userCode.code) { + hasAccess = true; + return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/reactionroles.ejs', { domain: conf.domain, server: { channels: listedChannels, roles: listedRoles }, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer }); + }; + }); + if (hasAccess == false) return res.redirect('/login?ninvalidcode'); + } else { + await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } }) + } + } catch (error) { + console.log(error) + res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" }) + + } + } +} \ No newline at end of file diff --git a/src/express/get/dashboard/server.js b/src/express/get/dashboard/server.js new file mode 100644 index 0000000..c9fbf97 --- /dev/null +++ b/src/express/get/dashboard/server.js @@ -0,0 +1,44 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Server = require('../../../models/server') +const Userdashboard = require('../../../models/userdashboard') +const conf = require('../../../conf/conf.json') +module.exports = { + name: '/server/:serverid/filter', + dynamic: true, + async exe(client, req, res) { + try { + if (!res.locals.cookie.id || !res.locals.cookie.accesscode) { + return res.redirect(conf.domain + "/login") + } + let currentUser = await Userdashboard.findOne({ userId: res.locals.cookie.id }) + if (currentUser == null) return res.redirect('/login'); + let currentServer = await Server.findOne({ id: req.params.serverid }) + if (currentServer == null) return res.render('404.ejs'); + let hasAccess = false; + await currentUser.guilds.forEach(guild => { + if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { + hasAccess = true; + }; + }); + if (hasAccess == true) { + await currentUser.accessCodes.forEach(async(userCode) => { + if (res.locals.cookie.accesscode == userCode.code) { + hasAccess = true; + const memberCount = await client.guilds.cache.get(currentServer.id).memberCount; + return res.cookie('id', currentUser.userId, { expires: new Date(253402300000000), httpOnly: true }).cookie('accesscode', res.locals.cookie.accesscode, { expires: new Date(253402300000000), httpOnly: true }).render('dashboard/server.ejs', { domain: conf.domain, user: { id: currentUser.userId, accesscode: res.locals.cookie.accesscode }, currentUser: currentUser, currentServer: currentServer, memberCount: memberCount }); + }; + }); + if (hasAccess == false) return res.redirect('/login?ninvalidcode'); + } else { + await res.status(401).render('error.ejs', { errorMessage: null, error: "you do not have access to the admin dashboard if you are a member of staff fill out http://knightrider.rf.gd/er/admin.php", userInfo: { id: req.query.userid, username: req.query.userame, avatar: req.query.userAvatar } }) + }; + + } catch (error) { + console.log(error) + res.status(500).render('error.ejs', { errorMessage: error, error: "there has been an issue with your request please try again, if this continuous report it at http://knightrider.rf.gd/er/admin.php" }) + + } + } +} \ No newline at end of file diff --git a/src/express/get/er/er.js b/src/express/get/er/er.js new file mode 100644 index 0000000..d10a2ca --- /dev/null +++ b/src/express/get/er/er.js @@ -0,0 +1,6 @@ +module.exports = { + name: '/er', + exe(client, conf, req, res) { + res.render('er/er.ejs') + } +} \ No newline at end of file diff --git a/src/express/get/root/login.js b/src/express/get/root/login.js new file mode 100644 index 0000000..813807a --- /dev/null +++ b/src/express/get/root/login.js @@ -0,0 +1,8 @@ +const { webServer: { oauthURI } } = require('../../../conf/conf.json') +module.exports = { + name: '/login', + dynamic: false, + exe(client, req, res) { + res.redirect(oauthURI) + } +} \ No newline at end of file diff --git a/src/express/get/root/root.js b/src/express/get/root/root.js new file mode 100644 index 0000000..34bdd2e --- /dev/null +++ b/src/express/get/root/root.js @@ -0,0 +1,11 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const conf = require('../../../conf/conf.json') +module.exports = { + name: '/', + dynamic: false, + exe(client, req, res) { + res.render('index.ejs', { bot: { name: conf.bot.name }, servers: client.guilds.cache.size, users: client.guilds.cache.reduce((acc, guild) => acc + guild.memberCount, 0) }); + } +} \ No newline at end of file diff --git a/src/express/handlers/get.js b/src/express/handlers/get.js new file mode 100644 index 0000000..1aaa798 --- /dev/null +++ b/src/express/handlers/get.js @@ -0,0 +1,38 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const chalk = require('chalk'); +const { readdirSync } = require("fs"); +module.exports = (client, webServer) => { + + readdirSync(__dirname + '/../get/').forEach((dir) => { + const getReqFiles = readdirSync(__dirname + `/../get/${dir}/`).filter((file) => file.endsWith(".js")); + for (let file of getReqFiles) { + let getReqFile = require(__dirname + `/../get/${dir}/${file}`); + if (getReqFile.name) { + try { + if (getReqFile.dynamic == false) { + webServer.get(getReqFile.name, async(...args) => getReqFile.exe(client, ...args)); + }; + } catch (error) { + console.log(chalk.cyan('[webserver get handler]: ') + chalk.red('(error): ') + "executing. path: " + `./get/${dir}/${file}`); + continue; + }; + } else { + console.log(chalk.cyan('[webserver get handler]: ') + chalk.red('(error): ') + "get file dosnt contain a name or description. path: " + `./get/${dir}/${file}`); + continue; + }; + }; + }); + + webServer.get('/server/:serverid', async(...args) => require('../get/dashboard/server').exe(client, ...args)); + webServer.get('/server/:serverid/filter', async(...args) => require('../get/dashboard/filter').exe(client, ...args)); + webServer.get('/server/:serverid/reactionroles', async(...args) => require('../get/dashboard/reactionroles').exe(client, ...args)); + + + webServer.get('*', (req, res) => { + res.status(404).render('404.ejs'); + }); + console.log(chalk.cyan('[webserver]: ') + "loaded get request handler"); + +} \ No newline at end of file diff --git a/src/express/handlers/post.js b/src/express/handlers/post.js new file mode 100644 index 0000000..fcc5a75 --- /dev/null +++ b/src/express/handlers/post.js @@ -0,0 +1,29 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const chalk = require('chalk'); +const { readdirSync } = require("fs"); +const conf = require('../../conf/conf.json'); +module.exports = (client, webServer) => { + readdirSync(__dirname + '/../post/').forEach((dir) => { + const postReqFiles = readdirSync(__dirname + `/../post/${dir}/`).filter((file) => file.endsWith(".js")); + for (let file of postReqFiles) { + let postReqFile = require(__dirname + `/../post/${dir}/${file}`); + if (postReqFile.name) { + try { + webServer.post(postReqFile.name, async(...args) => postReqFile.exe(client, conf, ...args)); + } catch (error) { + console.log(chalk.cyan('[webserver post handler]: ') + chalk.red('(error): ') + "executing. path: " + `./get/${dir}/${file}`); + continue; + } + } else { + console.log(chalk.cyan('[webserver post handler]: ') + chalk.red('(error): ') + "post file dosnt contain a name or description. path: " + `./get/${dir}/${file}`); + continue; + }; + }; + }); + + + console.log(chalk.cyan('[webserver]: ') + "loaded post request handler"); + +} \ No newline at end of file diff --git a/src/express/post/api/api.js b/src/express/post/api/api.js new file mode 100644 index 0000000..59baed1 --- /dev/null +++ b/src/express/post/api/api.js @@ -0,0 +1,16 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const { version, repository: { url } } = require('../../../../package.json'); +const { domain, prefix, mainServer: { invite } } = require('../../../conf/conf.json'); +module.exports = { + name: '/api', + async exe(client, req, res) { + try { + res.status(200).json({ defaultPrefix: prefix, doamin: domain, version: version, mainGuild: invite, github: url.replace('.git', '') }); + } catch (error) { + console.log(error); + res.status(500).json({ error: "500 - some error", message: "report it if it happens again" }); + } + } +} \ No newline at end of file diff --git a/src/express/post/api/updatefilter.js b/src/express/post/api/updatefilter.js new file mode 100644 index 0000000..482c436 --- /dev/null +++ b/src/express/post/api/updatefilter.js @@ -0,0 +1,35 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Server = require('../../../models/server'); +const { domain } = require('../../../conf/conf.json'); +const Userdashboard = require('../../../models/userdashboard'); +module.exports = { + name: '/api/updatefilter', + async exe(client, conf, req, res) { + try { + if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.normalFilter || !req.body.safeFilter) return res.status(401).JSON({ error: "000 - missing information", info: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' }); + let currentUser = await Userdashboard.findOne({ userId: req.body.user.id }); + if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db" }); + let currentServer = await Server.findOne({ id: req.body.server.id }); + if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db" }); + + let hasAccess = false; + await currentUser.accessCodes.forEach(async(userCode) => { + if (req.body.user.accesscode == userCode.code) { + hasAccess = true; + currentServer.filter.normal = await req.body.normalFilter; + currentServer.filter.safe = await req.body.safeFilter; + currentServer.save(); + return res.status(200).json({ error: "no", message: "filters have been updates" }); + }; + }); + + + if (hasAccess == false) return res.status(401).json({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' }); + } catch (error) { + console.log(error); + res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + domain + '/er' }); + } + } +} \ No newline at end of file diff --git a/src/express/post/api/updateoverview.js b/src/express/post/api/updateoverview.js new file mode 100644 index 0000000..1c8d021 --- /dev/null +++ b/src/express/post/api/updateoverview.js @@ -0,0 +1,42 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Userdashboard = require('../../../models/userdashboard'); +const Server = require('../../../models/server'); +const { prefix, domain } = require('../../../conf/conf.json'); +module.exports = { + name: '/api/updateoverview', + async exe(client, conf, req, res) { + try { + if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.staffRoles || !req.body.staffids) return res.status(403).json({ error: "000 - missing information", message: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' }) + let currentUser = await Userdashboard.findOne({ userId: req.body.user.id }) + if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db", message: "that user id cant be found" }); + let currentServer = await Server.findOne({ id: req.body.server.id }); + if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db", message: "that server id cant be found" }); + + let hasAccess = false; + await currentUser.accessCodes.forEach(async(userCode) => { + if (req.body.user.accesscode == userCode.code) { + hasAccess = true; + //apply all data from the req to the db (probabbly a better way to do this) + currentServer.prefix = req.body.prefix || prefix; + currentServer.staff = req.body.staffids || []; + currentServer.staffRoles = req.body.staffRoles || []; + currentServer.channels.modLogs = req.body.channels.modlogs || ' '; + currentServer.channels.announcments = req.body.channels.announcments || ' '; + currentServer.channels.townhall = req.body.channels.townhall || ' '; + currentServer.channels.townhallLogs = req.body.channels.townhallLogs || ' '; + currentServer.save(); + return res.status(200); + }; + }); + + + if (hasAccess == false) return res.status(401).JSON({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' }); + } catch (error) { + console.log(error); + res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again. " + domain + '/er' }); + } + + } +} \ No newline at end of file diff --git a/src/express/post/api/updatereactionroles.js b/src/express/post/api/updatereactionroles.js new file mode 100644 index 0000000..9567e91 --- /dev/null +++ b/src/express/post/api/updatereactionroles.js @@ -0,0 +1,78 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const Server = require('../../../models/server'); +const Userdashboard = require('../../../models/userdashboard'); +module.exports = { + name: '/api/updatereactionroles', + async exe(client, conf, req, res) { + try { + if (!req.body.user || !req.body.server || !req.body.server.id || !req.body.reactionRoles) return res.status(404).json({ error: "000 - missing information", info: "please include all neccery information for this api endpoint for help on how to use this api more info in the docs " + conf.domain + '/docs' }); + let currentUser = await Userdashboard.findOne({ userId: req.body.user.id }); + if (currentUser == null) return res.status(404).json({ error: "404 - cant find you in the db" }); + let currentServer = await Server.findOne({ id: req.body.server.id }); + if (currentServer == null) return res.status(404).json({ error: "404 - cant find that server in the db" }); + + let hasAccess = false; + await currentUser.accessCodes.forEach(async(userCode) => { + if (req.body.user.accesscode == userCode.code) { + hasAccess = true; + currentServer.reactionRoles = await req.body.reactionRoles; + currentServer.save(); + let eachChannelRoles = {}; + await currentServer.reactionRoles.forEach(role => { + if (!eachChannelRoles[role.channelID]) { + eachChannelRoles[role.channelID] = [{ + roleID: role.roleID, + emoji: role.emoji + }]; + } else { + eachChannelRoles[role.channelID].push({ + roleID: role.roleID, + emoji: role.emoji + }); + }; + }); + for (let i in eachChannelRoles) { + let rolesEmbed = { + color: conf.colour.ok, + title: 'ReactionRoles', + url: conf.domain, + author: { + name: conf.bot.name, + icon_url: conf.bot.logo, + url: conf.bot.url, + }, + description: 'react with the appropriate emoji to get your role', + fields: [], + timestamp: new Date(), + footer: { + text: currentServer.name, + }, + }; + + + await eachChannelRoles[i].forEach(role => { + rolesEmbed.fields.push({ + name: '\u200B', + value: '<@&' + role.roleID + '> - ' + role.emoji, + }); + }); + const channel = client.guilds.cache.get(currentServer.id).channels.cache.get(i) + if (channel !== undefined) { + const msg = await channel.send({ embed: rolesEmbed }); + eachChannelRoles[i].forEach(role => { + msg.react(role.emoji); + }); + }; + }; + return res.status(200).json({ error: "no", message: "reactionroles have been updates" }); + }; + }); + if (hasAccess == false) return res.status(401).json({ error: "401 - unauthorised", info: "please include your accesscode and user id to use this api more info in the docs " + conf.domain + '/docs' }); + } catch (error) { + console.log(error); + res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + conf.domain + '/er' }); + } + } +} \ No newline at end of file diff --git a/src/express/post/api/userinfo-update.js b/src/express/post/api/userinfo-update.js new file mode 100644 index 0000000..5b7a29c --- /dev/null +++ b/src/express/post/api/userinfo-update.js @@ -0,0 +1,24 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +module.exports = { + name: '/api/userinfo/update', + async exe(client, conf, req, res) { + try { + if (req.body.tmpPassWord == usersDB[req.body.userInfo.id].tmpPassWord) { + + if (!usersDB[req.body.memberId]) { + res.status(404).json({ error: "user id isnt in the database", info: "user id could be wrong or that user hasnt sent a message in the discord server since the bot has been setup" }) + } else { + res.status(200).json({ userStrikes: usersDB[req.body.memberId].strike, userNote: usersDB[req.body.memberId].note, userAdmin: usersDB[req.body.memberId].admin }) + } + } else { + res.status(401).json({ error: "401 - unauthorised", info: "please include your tmp password and user id to use this api more info in the docs http://knightrider.rf.gd/docs/" }) + } + } catch (error) { + console.log(error) + res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again." }) + require('./././conf/functions.js').reportError(client, conf, "/api/reaction-error", error, { name: null, id: req.body.userid }) + } + } +} \ No newline at end of file diff --git a/src/express/post/api/userinfo.js b/src/express/post/api/userinfo.js new file mode 100644 index 0000000..26a0aa4 --- /dev/null +++ b/src/express/post/api/userinfo.js @@ -0,0 +1,14 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +module.exports = { + name: '/api/userinfo', + async exe(client, conf, req, res) { + try { + + } catch (error) { + console.log(error) + res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again." }) + } + } +} \ No newline at end of file diff --git a/src/express/www/static/404.html b/src/express/www/static/404.html new file mode 100644 index 0000000..1072b9a --- /dev/null +++ b/src/express/www/static/404.html @@ -0,0 +1,17 @@ + + + + + + + + + + 404 + + + +

404 - that page cant be found

+ + + \ No newline at end of file diff --git a/src/express/www/static/500.html b/src/express/www/static/500.html new file mode 100644 index 0000000..903d3a0 --- /dev/null +++ b/src/express/www/static/500.html @@ -0,0 +1,18 @@ + + + + + + + + + + Document + + + +

500 - web server error

+

the owner has been informed of this error.

+ + + \ No newline at end of file diff --git a/src/express/www/static/css/dashboard.css b/src/express/www/static/css/dashboard.css new file mode 100644 index 0000000..cdfe438 --- /dev/null +++ b/src/express/www/static/css/dashboard.css @@ -0,0 +1,192 @@ +@import url('https://fonts.googleapis.com/css2?family=Open+Sans&display=swap'); +html, +body { + margin: 0; + padding: 0; + min-width: 100%; + min-height: 100%; + background-color: #2C2F33; + color: rgb(255, 255, 255); + font-family: 'Open Sans', sans-serif; + background-image: url('/assets/topggbackground.png'); + background-repeat: no-repeat; + background-attachment: fixed; + background-size: cover; +} + +.user-information { + display: flex; +} + +.useravatar { + padding: auto; +} + +.username { + padding: auto; +} + +.container { + position: relative; + display: flex; + align-items: center; + justify-content: center; +} + +.servers-lists { + width: 90%; + padding: 15px 0 10px; + background: #15528f69; + border-radius: 15px; +} + + +/* if screen big big make button marging right more so dosnt look weirds 3% and maybe makde button text 2em and width/height bigger*/ + +.server-list { + position: relative; + display: flex; + flex-direction: column; + row-gap: 40px; + align-items: center; + margin-bottom: 50px; +} + +.server-container { + display: flex; + justify-content: space-between; + flex-direction: row; + min-height: 10px; + width: 90%; + margin: auto; + flex-wrap: wrap; + background-color: #000000; + border-radius: 35px; +} + +.server { + display: flex; + min-width: 50%; + flex-direction: row; + min-height: 10px; + flex-wrap: wrap; +} + +.button-container { + margin: 0 0.5% 0 0; + display: flex; + justify-content: center; + align-items: center; +} + +.server-info { + display: flex; + align-items: center; + flex-direction: row; + margin: 0.9% 0.6%; + color: rgb(255, 255, 255); +} + +.server-icon { + margin-top: 0.4%; + margin-left: 0.4%; +} + +.server-icon-img { + width: 70px; + height: 70px; + border-radius: 50%; +} + +.server-name { + font-size: 1em; + margin: 5px; +} + +.server-dash-btn { + display: flex; + align-items: center; + flex-direction: column; + flex-wrap: wrap; +} + +.button { + display: flex; + justify-content: center; + align-items: center; + border: rgb(240, 236, 236) 1px solid; + color: rgb(255, 255, 255); + width: 105px; + height: 35px; + border-radius: 100px; + cursor: pointer; + transition: all .2s ease; + font-size: 1em; + text-decoration: none !important; +} + +@media (max-width: 858px) { + .container { + width: 100% !important; + } + .servers-lists { + width: 100% !important; + margin: 0 !important; + padding: 5px !important; + } + .server-container { + flex-direction: column !important; + padding: 0 !important; + padding-bottom: 0 !important; + max-width: 40% !important; + min-height: 150px; + border-radius: 15% !important; + overflow: hidden !important; + } + .button-container { + margin: 0 !important; + width: 100%; + min-height: 33px !important; + background-color: aliceblue; + color: black !important; + } + .server-info { + margin-top: 8px !important; + margin-bottom: 9px !important; + margin-left: 4px !important; + } + .server-icon { + display: flex !important; + align-items: center !important; + align-content: center !important; + width: 100%; + height: 90%; + flex-direction: column !important; + margin: auto !important; + } + .server-icon-img { + width: 100% !important; + height: 90% !important; + border-radius: 0 !important; + } + .button { + display: flex; + justify-content: center; + align-items: center; + border: 0 !important; + color: rgb(0, 0, 0) !important; + width: 100% !important; + height: 35px; + cursor: pointer; + transition: all .2s ease; + font-size: 1em; + text-decoration: none !important; + border-radius: 0px; + } +} + +.manage {} + +.invite { + background-color: rgb(123, 255, 0); +} \ No newline at end of file diff --git a/src/express/www/static/css/main.css b/src/express/www/static/css/main.css new file mode 100644 index 0000000..6d4b523 --- /dev/null +++ b/src/express/www/static/css/main.css @@ -0,0 +1,65 @@ +* { + box-sizing: border-box; +} + +body { + font-family: Arial, Helvetica, sans-serif; + margin: 0; + font-size: 120%; +} + +.header { + padding: 90px; + padding-top: 169px; + text-align: center; + background: red; + color: white; +} + +.header h1 { + font-size: 40px; +} + +.content { + display: -ms-flexbox; + /* IE10 */ + display: flex; + -ms-flex-wrap: wrap; + /* IE10 */ + flex-wrap: wrap; +} + +.main { + -ms-flex: 70%; + /* IE10 */ + flex: 70%; + background-color: white; + padding: 20px; +} + +#connection { + vertical-align: middle; +} + +.dot { + height: 20px; + width: 20px; + background-color: red; + border-radius: 50%; + display: inline-block; + vertical-align: middle; + text-align: center; +} + +.stat { + background-color: rgb(233, 223, 223); + padding: 5px; + padding-right: 7px; + border-radius: 6px; +} + +.footer { + padding: 20px; + text-align: center; + background: #ddd; +} \ No newline at end of file diff --git a/src/express/www/static/css/navbar.css b/src/express/www/static/css/navbar.css new file mode 100644 index 0000000..3244219 --- /dev/null +++ b/src/express/www/static/css/navbar.css @@ -0,0 +1,132 @@ + /* mobile navbar navbar */ + + .mobnav { + top: 0; + right: 0; + width: 0; + z-index: 1; + height: 100%; + position: fixed; + transition: 0.5s; + padding-top: 60px; + overflow-x: hidden; + background-color: #25282a; + } + + .mobnav a { + display: block; + font-size: 25px; + color: #ffffff; + transition: 0.3s; + text-decoration: none; + padding: 7px 8px 7px 32px; + } + + .mobnav a:hover { + color: #888B8D; + } + + .mobnav .closebtn { + top: 0; + right: 25px; + font-size: 36px; + margin-left: 50px; + position: absolute; + } + /* responsive */ + + @media screen and (max-height: 450px) { + .mobnav { + padding-top: 15px; + } + .mobnav a { + font-size: 18px; + } + } + + @media screen and (min-width: 1024px) { + .mobilenavbtn { + display: none !important; + } + } + /* desktop navbar */ + + .navbar { + margin-top: 0; + padding-top: 5px; + background-color: #25282a; + display: block; + overflow: hidden; + } + + .desktop-nav { + left: 0; + margin-top: 0; + display: block; + margin-bottom: 0; + padding-top: 3px; + margin-left: 5.5%; + padding-bottom: 3px; + transition: 143.9ms; + } + + .desktop-nav li { + float: left; + margin-left: 2px; + margin-right: 2px; + transition: 0.5ms; + list-style-type: none; + } + + .desktop-nav li a { + display: block; + color: #ffffff; + cursor: pointer; + margin-top: 6px; + padding-top: 8px; + margin-bottom: 6px; + padding-left: 14px; + text-align: center; + padding-bottom: 8px; + padding-right: 14px; + border-radius: 13px; + text-decoration: none; + font-family: "Zegoe UI Semi Bold - U"; + font-size: 150%; + } + + .desktop-nav a:hover:not(.active) { + color: #888B8D; + } + + .active a { + color: #8C8B89; + } + /* responstive */ + + @media screen and (max-width: 1024px) { + .desktop-nav { + display: none !important; + } + } + + div.user { + vertical-align: top; + display: inline-block; + text-align: center; + float: left; + margin: 5px; + margin-right: 45%; + } + + .userimg { + width: 50; + height: 50; + border-radius: 45%; + background-color: grey; + } + + .usercaption { + display: block; + color: #ffffff; + } \ No newline at end of file diff --git a/src/express/www/static/css/styles.css b/src/express/www/static/css/styles.css new file mode 100644 index 0000000..2278135 --- /dev/null +++ b/src/express/www/static/css/styles.css @@ -0,0 +1,232 @@ + body { + font-family: Arial, Helvetica, sans-serif; + background-color: #2C2F33; + color: #ffffff; + margin: 0; + padding: 0; + } + + * { + box-sizing: border-box; + } + + .headding { + margin-left: 3.4%; + } + + input[type=text], + select, + textarea { + width: 30%; + padding: 12px; + border: 1px solid #2C2F33; + border-radius: 4px; + box-sizing: border-box; + margin-top: 6px; + margin-bottom: 16px; + resize: vertical; + background-color: #4c4e55; + color: #ffffff; + } + + .buttont { + display: flex; + background-color: #5865F2; + justify-content: center; + align-items: center; + border: rgb(240, 236, 236) 1px solid; + width: 105px; + height: 35px; + color: white; + padding: 12px 20px; + border: none; + border-radius: 4px; + cursor: pointer; + transition: all .2s ease; + } + + .buttonttt { + display: flex; + justify-content: center; + align-items: center; + border: rgb(240, 236, 236) 1px solid; + color: rgb(255, 255, 255); + min-width: 105px; + min-height: 35px; + max-width: 50%; + border-radius: 100px; + cursor: pointer; + transition: all .2s ease; + font-size: 1em; + text-decoration: none !important; + } + + .button:hover { + background-color: #5460e7; + } + + .button#submit:hover { + background-color: #EB459E; + } + + .container { + border-radius: 5px; + background-color: #40444B; + padding: 20px; + margin: 12px; + } + + .filterul { + margin: 0; + } + + .filterul li { + list-style-type: none; + float: left; + padding: 5px; + margin: 3px; + border-radius: 5%; + background-color: #33363a; + } + + .filters { + margin-bottom: 10px; + display: flex; + } + + .flex-containor { + display: flex; + flex-direction: row; + } + + @media (max-width: 858px) { + .flex-containor { + flex-direction: column; + } + .server-name-text { + margin-left: 1% !important; + } + .serverinfo { + max-width: 45% !important; + } + .dropdown-content { + width: 45% !important; + } + } + + .menu { + min-width: 15%; + display: flex; + flex-direction: column; + row-gap: 0px; + } + + .menu div .button { + display: flex; + justify-content: center; + align-items: center; + color: rgb(255, 255, 255); + border-radius: 25px 25px 0 0; + height: 50px; + cursor: pointer; + transition: all .2s ease; + font-size: 1em; + text-decoration: none !important; + } + + .menu div .button:hover { + background-color: #363a3f; + } + + .view { + min-width: 70%; + } + + .view-btn-active { + background-color: #404449; + border-radius: 0 !important; + } + + .serverinfo { + margin: 5px; + margin-bottom: 0; + padding: 5px; + max-width: 80%; + background-color: #575a5e; + border-radius: 8px; + } + + .server-main-items { + display: flex; + flex-direction: row; + align-items: center; + align-content: center; + font-size: 1.5em; + row-gap: 1.3%; + } + + .server-main-img, + .dropdown-server-main-img { + border-radius: 50%; + width: 50px; + vertical-align: middle + } + + .server-name-text { + margin-left: 5.6%; + } + + .server-sub-items { + margin-top: 6px; + font-size: 0.5em; + } + + .dropbtn { + border: none; + } + + .dropdown { + position: relative; + display: inline-block; + } + + .dropdown-content { + display: none; + position: absolute; + background-color: #6A6D70; + width: 80%; + margin: 5px; + margin-top: 0; + padding: 5px; + font-size: 0.5em; + box-shadow: 0px 8px 16px 0px rgb(0 0 0 / 20%); + z-index: 1; + border-radius: 0 0 8px 8px; + } + + .dropdown-content a { + color: black; + padding: 12px 16px; + text-decoration: none; + display: block; + } + + .dropdown-content a:hover { + background-color: #52565c; + } + + .dropdown:hover .dropdown-content { + display: flex; + flex-direction: column; + max-width: 80%; + } + + .dropdown:hover .serverinfo { + background-color: #6a6d70; + border-radius: 8px 8px 0 0; + } + /* buttons */ + + .buttons { + margin-top: 5px; + } \ No newline at end of file diff --git a/src/express/www/static/favicon.ico b/src/express/www/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..dd32455efd87bd56373880fcf185aa41c3a3b396 GIT binary patch literal 4286 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'; + }); + normalstr += ''; + document.getElementById("filterNormal").innerHTML = normalstr; + + + async function addTofilterNormal() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('filterNormalInput').value.toLowerCase() + + await filterNormal.push(newWord) + + var str = '
    ' + + filterNormal.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("filterNormal").innerHTML = str; + document.getElementById('filterNormalInput').value = "" + + } + + async function removeFilterNormal() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('filterNormalInput').value.toLowerCase() + const index = filterNormal.indexOf(newWord); + if (index > -1) { + filterNormal.splice(index, 1); + var str = '
    ' + + filterNormal.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("filterNormal").innerHTML = str; + document.getElementById('filterNormalInput').value = "" + } else { + document.getElementById('filterNormalInput').value = "" + } + } + + var safestr = '
    ' + + filterSafe.forEach(function(word) { + safestr += '
  • ' + word + '
  • '; + }); + + safestr += '
'; + document.getElementById("filterSafe").innerHTML = safestr; + + async function addTofilterSafe() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('filterSafeInput').value.toLowerCase() + + await filterSafe.push(newWord) + + var str = '
    ' + + filterSafe.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("filterSafe").innerHTML = str; + document.getElementById('filterSafeInput').value = "" + + } + + async function removeFilterSafe() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('filterSafeInput').value.toLowerCase() + const index = filterSafe.indexOf(newWord); + if (index > -1) { + filterSafe.splice(index, 1); + var str = '
    ' + + filterSafe.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("filterSafe").innerHTML = str; + document.getElementById('filterSafeInput').value = "" + } else { + document.getElementById('filterSafeInput').value = "" + } + } + + + + + async function updateFilters() { + var xhr = new XMLHttpRequest(); + xhr.open("POST", domain + '/api/updatefilter', true); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.setRequestHeader("access-control-allow-origin", "*"); + await xhr.send(JSON.stringify({ + user: user, + server: currentServer, + normalFilter: filterNormal, + safeFilter: filterSafe + })); + document.getElementById("info").innerHTML = "Filter has been updated" + } \ No newline at end of file diff --git a/src/express/www/static/js/overview.js b/src/express/www/static/js/overview.js new file mode 100644 index 0000000..14bd9ff --- /dev/null +++ b/src/express/www/static/js/overview.js @@ -0,0 +1,116 @@ +var normalstr = '
    ' +staffids.forEach(function(word) { + normalstr += '
  • ' + word + '
  • '; +}); +normalstr += '
'; +document.getElementById("staffids").innerHTML = normalstr; + + +async function addToStaffids() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('staffidsInput').value.toLowerCase() + + await staffids.push(newWord) + + var str = '
    ' + + staffids.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("staffids").innerHTML = str; + document.getElementById('staffidsInput').value = "" + +} + +async function removeStaffids() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('staffidsInput').value.toLowerCase() + const index = staffids.indexOf(newWord); + if (index > -1) { + staffids.splice(index, 1); + var str = '
    ' + + staffids.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("staffids").innerHTML = str; + document.getElementById('staffidsInput').value = "" + } else { + document.getElementById('staffidsInput').value = "" + } +} + +var safestr = '
    ' + +staffRoles.forEach(function(word) { + safestr += '
  • ' + word + '
  • '; +}); + +safestr += '
'; +document.getElementById("staffRoles").innerHTML = safestr; + +async function addToStaffRoles() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('staffRolesInput').value + + await staffRoles.push(newWord) + + var str = '
    ' + + staffRoles.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("staffRoles").innerHTML = str; + document.getElementById('staffRolesInput').value = "" + +} +staffRoles +async function removeStaffRoles() { + document.getElementById("info").innerHTML = '' + var newWord = document.getElementById('staffRolesInput').value + const index = staffRoles.indexOf(newWord); + if (index > -1) { + staffRoles.splice(index, 1); + var str = '
    ' + + staffRoles.forEach(function(word) { + str += '
  • ' + word + '
  • '; + }); + + str += '
'; + document.getElementById("staffRoles").innerHTML = str; + document.getElementById('staffRolesInput').value = "" + } else { + document.getElementById('staffRolesInput').value = "" + } +} + + + + +async function sendupdate() { + var xhr = new XMLHttpRequest(); + xhr.open("POST", domain + '/api/updateoverview', true); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.setRequestHeader("access-control-allow-origin", "*"); + await xhr.send(JSON.stringify({ + user: user, + server: currentServer, + prefix: document.getElementById('prefix').value.replace(' ', ''), + staffids: staffids, + staffRoles: staffRoles, + channels: { + modlogs: document.getElementById('modlogs').value.replace(' ', ''), + announcments: document.getElementById('announcments').value.replace(' ', ''), + townhall: document.getElementById('townhall').value.replace(' ', ''), + townhallLogs: document.getElementById('townhallLogs').value.replace(' ', ''), + } + })); + document.getElementById("info").innerHTML = "staff has been updated" +} \ No newline at end of file diff --git a/src/express/www/static/js/reactionroles.js b/src/express/www/static/js/reactionroles.js new file mode 100644 index 0000000..9b23864 --- /dev/null +++ b/src/express/www/static/js/reactionroles.js @@ -0,0 +1,67 @@ +function loadroles() { + //lmao js + var rrstr = '
    '; + reactionRoles.forEach(function(role) { + server.roles.forEach(r => { + if (role.roleID == r.id) { + server.channels.forEach(chan => { + if (role.channelID == chan.id) { + rrstr += '
  • Channel: ' + chan.name + ' Role id: ' + r.name + ' emoji: ' + role.emoji + '

  • '; + } + }) + } + }) + }); + rrstr += '
'; + document.getElementById("ReactionRoles").innerHTML = rrstr; +} + + +async function addReactionRole() { + document.getElementById("info").innerHTML = '' + var channel = document.getElementById('ReactionRoleChannel').value.toLowerCase().replace(' ', '') + var role = document.getElementById('ReactionRole').value.toLowerCase().replace(' ', ''); + var emoji = document.getElementById('ReactionRoleEmoji').value; + + await reactionRoles.push({ channelID: channel, roleID: role, emoji: emoji }); + + loadroles() + + document.getElementById('ReactionRoleChannel').value = ''; + document.getElementById('ReactionRole').value = ''; + document.getElementById('ReactionRoleEmoji').value = ''; +} + +async function removeReactionRole() { + document.getElementById("info").innerHTML = '' + var role = document.getElementById('ReactionRole').value.toLowerCase().replace(' ', ''); + var channel = document.getElementById('ReactionRoleChannel').value.toLowerCase().replace(' ', '') + + for (let i = 0; i < reactionRoles.length; i++) { + + if (reactionRoles[i].channelID == channel) { + if (reactionRoles[i].roleID == role) { + reactionRoles.splice(i, 1); + loadroles() + document.getElementById('ReactionRoleChannel').value = ''; + document.getElementById('ReactionRole').value = ''; + document.getElementById('ReactionRoleEmoji').value = ''; + + }; + }; + }; +} + +async function sendupdate() { + var xhr = new XMLHttpRequest(); + xhr.open("POST", domain + '/api/updatereactionroles', true); + xhr.setRequestHeader('Content-Type', 'application/json'); + xhr.setRequestHeader("access-control-allow-origin", "*"); + await xhr.send(JSON.stringify({ + user: user, + server: currentServer, + reactionRoles: reactionRoles + })); + document.getElementById("info").innerHTML = "ReactionRoles have been updated." +} +loadroles() \ No newline at end of file diff --git a/src/express/www/static/loading.gif b/src/express/www/static/loading.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e292597dbe7cb2db16781de7e4feb25e9f87494 GIT binary patch literal 20688 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 LNG@5lAf_xr{JC*-dj2eb5I zEz`c*=H`RTLn~ik6k*jKa4!KX7TwJy9vOsN+L&7;q3+&HS-bkOipN>f$xLh{ok;!3 zDrSm5>ekz9;ONTq2Y+kk&op9|z&HLwL~*(b-ymt}oeIj)1{{6jJ$@5SQ8IoFB*?c0 zrIy3lX#F{mWuzhQ?z@Q+8hYKGuc-51$i$1IjCGbvO3$cmSFVyO@(n(&IjMQLnPtJq}y(- z%Go1fNr{xT={jL72h#llg-=wWZ+c0&T)|-n0z1F2u=6dqSG9uO2pQm|u`A4Ayl+Ma zF16qbb8cyRPxgOr2Y^M@$>$-3gMj|a;GbsvKNbC@r8^bjOOfH#Rg3a}apKLG&PKOqGW6^HDSaZi_$R2|WG4C$Qf)+c9DL zh}8qxw924k+xWnrny1z|E4|X*1>)`czhivZZ_<%9mClm!ap}^bfdQROI>y2(Jn$z` z7IebBku}>-AF>C$^6VB|tPLhmf^fXuCjxvCJHI0^ z^IRXy8IFAE1EBA>nwKpof(=9H>?S5L8eKUL7ITvLwNm~(so_<`f(EEn=Gy!Yl7XXR9AxiQFbA#}W4 z7@c%i7OBbCBjt#MfM^q(J@gRqdv96zckvCo7eB% z%N6Qz^xToIJuzTt4?vyTRj+}a>e6lZ@-3+J!Untg*8;kqYPq9$j2i6Uic1HJKT4!} zlI~!@76@pIfQ$Atd}Kto=;hv**{l~10eB*TJc37HcNY|Z^Ne!(x_{6AkqSDeBddI| zdFiW7A07)F;dT$EW(u>jf!WL3dfEeTASnqc$p;d$449_8Kp-tOJ=F@Rb;$n#CD97A literal 0 HcmV?d00001 diff --git a/src/express/www/views/404.ejs b/src/express/www/views/404.ejs new file mode 100644 index 0000000..57db2e9 --- /dev/null +++ b/src/express/www/views/404.ejs @@ -0,0 +1 @@ +404 \ No newline at end of file diff --git a/src/express/www/views/admin.ejs b/src/express/www/views/admin.ejs new file mode 100644 index 0000000..7d1d20c --- /dev/null +++ b/src/express/www/views/admin.ejs @@ -0,0 +1,77 @@ + + + + + + + + + dashboard :: knightrider + + + + + + <%- include('parts/dash-navbar.ejs') %> + + +
+
+ prefix bot name other things +
+

Edit Filters

+

Member Information

+

Sent Embeds And Messages

+
+ <%- include('parts/footer.ejs') %> + + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/admin-message.ejs b/src/express/www/views/dashboard/admin-message.ejs new file mode 100644 index 0000000..0feb12b --- /dev/null +++ b/src/express/www/views/dashboard/admin-message.ejs @@ -0,0 +1,246 @@ + + + + + + + + + + message-dashboard :: knightrider + + + + + + + <%- include('parts/dash-navbar.ejs') %> + + + + +
+

Message sender

+

send Embeds and mesages using the bot in channels

+
+ + + +
+

Send Message:

+ + +
+
+
+ + +
+

Send Embed:

+ + + + +
+ + + + <%- include('parts/footer.ejs') %> + + + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/filter.ejs b/src/express/www/views/dashboard/filter.ejs new file mode 100644 index 0000000..a3dae81 --- /dev/null +++ b/src/express/www/views/dashboard/filter.ejs @@ -0,0 +1,62 @@ + + + + + + + + + + + filter-dashboard :: knightrider + + + + <%- include('../partials/dash-navbar.ejs') %> +
+ <%- include('../partials/dashboard-menu.ejs') %> +
+
+

Filter

+

add and remove words from the filters

+
+ +
+ +
+

+
+ +
+

Filter normal:

+
+ + + +
+
+
+ +
+

Filter Safe:

+
+ + + +
+ +
+
+ + <%- include('../partials/footer.ejs') %> + + + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/index.ejs b/src/express/www/views/dashboard/index.ejs new file mode 100644 index 0000000..1fe6cae --- /dev/null +++ b/src/express/www/views/dashboard/index.ejs @@ -0,0 +1,82 @@ + + + + + + + + + + + + dashboard | Proto1 + + + +
+ + +
+ user-avatart +
+
+

<%= currentUser.userName %>#<%= currentUser.discriminator %>

+
+
+

dont see your server? login again

+
+
+
+ <% guilds.forEach(guild => { %> + <% if(guild.mutual == true) { %> +
+
+
+
+ <%= guild.name %> +
+
+
+ server icon +
+
+
+ Manage + +
+
+ <% } %> + <% }) %> +
+ +
+ <% guilds.forEach(guild => { %> + <% if(guild.mutual == false) { %> +
+
+
+
+ <%= guild.name %> +
+
+
+ server icon +
+
+
+ Invite + +
+
+ <% } %> + <% }) %> + +
+
+
+ +
+
+ + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/reactionroles.ejs b/src/express/www/views/dashboard/reactionroles.ejs new file mode 100644 index 0000000..ff61d09 --- /dev/null +++ b/src/express/www/views/dashboard/reactionroles.ejs @@ -0,0 +1,81 @@ + + + + + + + + + + + filter-dashboard :: knightrider + + + + + <%- include('../partials/dash-navbar.ejs') %> +
+ <%- include('../partials/dashboard-menu.ejs') %> +
+
+

reaction roles

+

add and remove reaction roles

+
+ +
+ +
+

+
+ +
+

Reaction role:

+
+ + + + + + + + +
+
+ +
+ + <%- include('../partials/footer.ejs') %> + + + + + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/server.ejs b/src/express/www/views/dashboard/server.ejs new file mode 100644 index 0000000..2ed0df7 --- /dev/null +++ b/src/express/www/views/dashboard/server.ejs @@ -0,0 +1,111 @@ + + + + + + + + + + + dashboard :: knightrider + + + + + + + <%- include('../partials/dash-navbar.ejs') %> + + + +
+ <%- include('../partials/dashboard-menu.ejs') %> +
+
+

Server Overview

+

overview of your server and some quick settings to change

+
+
+ +

+
+
+
+

Members: + <%= memberCount %> +

+
+
+
+
+

Prefix: ?

+ + +
+
+
+
+ +

STAFF

+
+

Staff Member ids': ?

+
+ + + +
+
+
+ +
+

Staff Role Names: ?

+
+ + + +
+
+
+

CHANNELS

+
+

modlogs: ?

+ + +
+
+
+

announcments: ?

+ + +
+
+
+

townhall: ?

+ + +
+
+
+

townhallLogs: ?

+ + +
+
+ + +
+
+ + <%- include('../partials/footer.ejs') %> + + + + \ No newline at end of file diff --git a/src/express/www/views/dashboard/userinfo.ejs b/src/express/www/views/dashboard/userinfo.ejs new file mode 100644 index 0000000..0b089a8 --- /dev/null +++ b/src/express/www/views/dashboard/userinfo.ejs @@ -0,0 +1,201 @@ + + + + + + + + + + userinfo-dashboard :: knightrider + + + + + + <%- include('../partials/dash-navbar.ejs') %> + + + +
+

Member Info

+

edit and see information for a member

+
+ + + +
+

userinfo:

+ + +
+ + +
+ + +

Member is admin: null

+ +
+
+
+ + + <%- include('../partials/footer.ejs') %> + + + + \ No newline at end of file diff --git a/src/express/www/views/embed.html b/src/express/www/views/embed.html new file mode 100644 index 0000000..ceaa145 --- /dev/null +++ b/src/express/www/views/embed.html @@ -0,0 +1,108 @@ + + + + + + + + Document + + + + +
+
+ +
+
+
+ +
+

i am author

+
+
+

title

+
+
+

some description for the embed becaiue cool

+
+
+ +
+

f1 title

+

f1 description with long lots words that go things yeahhh

+
+
+

f2 title

+

f2 description with long lots words that go things yeahhh
line2

+
+
+

f3 title

+

f3 description with long lots words that go things yeahhh

+
+
+

f4 title

+

f4 description with long lots words that go things yeahhh

+
+
+

f5 title

+

f5 description with long lots words that go things yeahhh

+
+
+
+
+ + +
+
+ + +
+
+ + + \ No newline at end of file diff --git a/src/express/www/views/er/er.ejs b/src/express/www/views/er/er.ejs new file mode 100644 index 0000000..e69de29 diff --git a/src/express/www/views/error.ejs b/src/express/www/views/error.ejs new file mode 100644 index 0000000..cd072f9 --- /dev/null +++ b/src/express/www/views/error.ejs @@ -0,0 +1,68 @@ + + + + + + + + + + + dashboard :: knightrider + + + + + +
+ × + Home + Report Error + Docs +
+ + + + + + + + +
+

+ <%= error %> +

+

+ <%= errorMessage %> +

+
+ + + \ No newline at end of file diff --git a/src/express/www/views/index.ejs b/src/express/www/views/index.ejs new file mode 100644 index 0000000..a239cd1 --- /dev/null +++ b/src/express/www/views/index.ejs @@ -0,0 +1,76 @@ + + + + + + + <%= bot.name%> + + + + + + + + + + + + + + + + + + + + + + + + +
+

+ <%= bot.name %> +

+

the all-purpose open source discord bot for CWH11's Hangout Crew.

+
+
+
+ +

hi :)

+ +

knightrider is one of them all-purpose bots it's a bit like dyno but simpler and open-source.

+

if you plan on using this code for your server keep in mind the license and that while knightrider is opensource it was specifically designed for CWH11's Hangout Crew and also this bot is not optimized to have 100s of servers just 5 - 10 +

if you would like to report an error go to https://knightrider.invalidlag.com/er if you found the code helpful consider giving it a star or contribute to it.

+ +
+
+ + + + + + \ No newline at end of file diff --git a/src/express/www/views/partials/dash-navbar.ejs b/src/express/www/views/partials/dash-navbar.ejs new file mode 100644 index 0000000..bc2188a --- /dev/null +++ b/src/express/www/views/partials/dash-navbar.ejs @@ -0,0 +1,19 @@ + + + \ No newline at end of file diff --git a/src/express/www/views/partials/dashboard-menu.ejs b/src/express/www/views/partials/dashboard-menu.ejs new file mode 100644 index 0000000..9522dc2 --- /dev/null +++ b/src/express/www/views/partials/dashboard-menu.ejs @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/src/express/www/views/partials/footer.ejs b/src/express/www/views/partials/footer.ejs new file mode 100644 index 0000000..dc30e8b --- /dev/null +++ b/src/express/www/views/partials/footer.ejs @@ -0,0 +1,4 @@ + \ No newline at end of file diff --git a/src/express/www/views/partials/navbar.ejs b/src/express/www/views/partials/navbar.ejs new file mode 100644 index 0000000..817552a --- /dev/null +++ b/src/express/www/views/partials/navbar.ejs @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/src/funcs/getserver.js b/src/funcs/getserver.js new file mode 100644 index 0000000..6c3e077 --- /dev/null +++ b/src/funcs/getserver.js @@ -0,0 +1,14 @@ +const Server = require('../models/server'); +module.exports = async(message) => { + let currentServer = await Server.findOne({ id: message.guild.id }); + if (currentServer == null) { + Server.create({ + id: message.guild.id, + name: message.guild.name, + icon: message.guild.iconURL() || 'https://knightrider.invalidlag.com/logo.png' + + }); + currentServer = await Server.findOne({ id: message.guild.id }); + }; + return currentServer; +} \ No newline at end of file diff --git a/src/funcs/getuser.js b/src/funcs/getuser.js new file mode 100644 index 0000000..e891c6d --- /dev/null +++ b/src/funcs/getuser.js @@ -0,0 +1,14 @@ +const User = require('../models/user'); +module.exports = async(message) => { + let currentUser = await User.findOne({ id: message.author.id, guildID: message.guild.id }); + if (currentUser == null) { + await User.create({ + userid: message.author.id, + guildID: message.guild.id, + userName: message.author.tag, + avatar: message.author.avatarURL() + }); + currentUser = await User.findOne({ id: message.guild.id, guildID: message.guild.id }); + }; + return currentUser; +} \ No newline at end of file diff --git a/src/funcs/otr.js b/src/funcs/otr.js new file mode 100644 index 0000000..b64b5b3 --- /dev/null +++ b/src/funcs/otr.js @@ -0,0 +1,50 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const getServer = require('../funcs/getserver'); +module.exports = { + otrCommand: async function(message, args, Discord, client) { + if (message.author.id == conf.cwh11) { + let server = getServer(message); + if (server == null) return message.channel.send("this server isnt in the db"); + const annoncmentsChannel = client.channels.cache.get(server.channels.annoncments); + if (annoncmentsChannel == null || annoncmentsChannel == undefined) return; + switch (args[0]) { + case 'ito': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is in the office. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otrf': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Ford. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otrs': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in the Subaru. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otr11': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road in his car. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'otr': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'olb': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is on the road. Join him in voice if you want.").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'yts': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is streaming on YouTube: https://www.youtube.com/channel/UC7uWWizg0tmQ2R1kBkuDJHg").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + case 'ts': + await message.delete().catch(e => message.channel.send("i cant auto delete the messag you sent have i got permission to send messages in <#" + message.channel.id + ">?")); + annoncmentsChannel.send("@here Hey guys! Charlie is streaming on Twitch: https://www.twitch.tv/therealcwh11").catch(e => message.channel.send("i cant do that have i got permission to send messages in <#" + channels.annoncments + ">?")); + break; + default: + return; + }; + }; + } +} \ No newline at end of file diff --git a/src/funcs/reporterror.js b/src/funcs/reporterror.js new file mode 100644 index 0000000..417b8e9 --- /dev/null +++ b/src/funcs/reporterror.js @@ -0,0 +1,33 @@ +const conf = require('../conf/conf.json') +module.exports = (client, error, user, process) => { + const errorEmbed = { + color: `${conf.colour.okError}`, + title: 'Error', + url: `${conf.domain}/er`, + author: { + name: conf.bot.name + }, + thumbnail: { + url: `${conf.server.logo}`, + }, + description: `there has been an error executing somthing this will be somthing from a automated script or a member using the bot\nthe infromation below can be sensative **do not share** this with anyone unless you know what to hide:`, + fields: [{ + name: '__**task:**__', + value: `\`${task}\``, + }, + { + name: '__**Error**__', + value: `\`${error}\``, + }, + { + name: '__**user who triggered it**__', + value: `__name:__ \`${currentUser.userName}\`\n__id:__ \`${user.id}\``, + } + ], + timestamp: new Date(), + footer: { + text: 'Owner Error Log' + }, + }; + client.users.cache.get(conf.owner).send({ embed: errorEmbed }); +} \ No newline at end of file diff --git a/src/funcs/startuplog.js b/src/funcs/startuplog.js new file mode 100644 index 0000000..31258dc --- /dev/null +++ b/src/funcs/startuplog.js @@ -0,0 +1,30 @@ +/* + * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE + */ +const fetch = require('node-fetch'); +const { blue, red, magenta } = require('chalk'); +const { version } = require('../../package.json') +module.exports = async() => { + let latestVersion; + let updatenote = 'no note'; + await fetch('https://raw.githubusercontent.com/404invalid-user/discord-bitfield-calculator/main/package.json') + .then(res => res.json()) + .then(json => { + latestVersion = json.version; + if (json.note) { + updatenote = json.note; + }; + }); + console.log("┌──────────────────────────────────────────────────────┐\n│ Made By: " + blue('404invalid') + red('-') + magenta('user') + " (https://invalidlag.com) │\n└──────────────────────────────────────────────────────┘"); + + const tablea = "┌────────────────────────────────────────┐"; + const tableb = "│ version infromation │"; + const tablec = "├──────────────────────┬─────────────────┤"; + const tabled = `│ Current Version: │ ${version} │`; + const tablee = "├──────────────────────┼─────────────────┤"; + const tablef = `│ Lates Version: │ ${latestVersion} │`; + const tableg = "├──────────────────────┼─────────────────┤"; + const tableh = `│ update note: │ ${updatenote}│`; + const tablei = "└──────────────────────┴─────────────────┘"; + console.log(tablea + '\n' + tableb + '\n' + tablec + '\n' + tabled + '\n' + tablee + '\n' + tablef + '\n' + tableg + '\n' + tableh + '\n' + tablei) +} \ No newline at end of file diff --git a/src/knightrider.js b/src/knightrider.js new file mode 100644 index 0000000..4517d6c --- /dev/null +++ b/src/knightrider.js @@ -0,0 +1,17 @@ +const express = require('express'); +const mongoose = require('mongoose'); +const { Client } = require('discord.js'); +const { red, yellow } = require('chalk'); + +const webServer = express(); +const client = new Client({ partials: ["MESSAGE", "CHANNEL", "REACTION", "USER"] }); + +mongoose.connect(require('./conf/tokens.js').db.URI, { useNewUrlParser: true, useUnifiedTopology: true }).then((result) => { + console.log(yellow('[database info]: ') + "connected to database"); +}).catch((error) => { + console.log(red('[database info]: ') + "there was an error connecting to the database\nerror: " + error); +}); +['bot', 'webserver'].forEach(file => { + require('./applications/' + file)(client, webServer); +}); +require('./funcs/startuplog')() \ No newline at end of file diff --git a/src/models/server.js b/src/models/server.js new file mode 100644 index 0000000..14dc20a --- /dev/null +++ b/src/models/server.js @@ -0,0 +1,214 @@ +const { Schema, model } = require('mongoose'); +const { prefix } = require('../conf/conf.json') + +const serverSchema = new Schema({ + id: { + type: String, + required: true + }, + name: { + type: String, + required: true + }, + icon: { + type: String, + required: true + }, + prefix: { + type: String, + required: true, + default: prefix + }, + filter: { + level: { + type: String, + required: true, + default: 'normal' + }, + normal: { + type: Array, + required: true, + default: [ + "nigger", + "n igger", + "ni gger", + "nig ger", + "nigg er", + "nigge r", + "n i g g e r", + "niger", + "n iger", + "ni ger", + "nig er", + "nige r", + "n i g e r" + ] + }, + safe: { + type: Array, + required: true, + default: [ + "cunt", + "c u n t", + "cu n t", + "cun t", + "cu n t", + "c.u.n.t", + "c.unt", + "c.u.nt", + "cun.t", + "cu.n.t", + "cock", + "c o c k", + "c ock", + "c o ck", + "co ck", + "c.o.c.k", + "c.o.ck", + "coc.k", + "co.c.k", + "dick", + "d i c k", + "fric", + "shit", + "s hit", + "sh it", + "shi t", + "s h i t", + "s.h.i.t", + "sh.i.t", + "shi.t", + "s.hit", + "sh.it", + "shi.t", + "sh*t", + "sh!t", + "fuck", + "f u c k ", + "f u ck", + "f uck", + "fu ck", + "fuc k", + "bitch", + "b*tch", + "bi*ch", + "bit*h", + "b.i.t.c.h", + "b.itch", + "b.i.tch", + "b.i.t.ch", + "bi.t.c.h", + "bit.c.h", + "bitc.h", + "b!tch", + "b itch", + "bi tch", + "bit ch", + "bitc h", + "b i t c h", + "nigger", + "n igger", + "ni gger", + "nig ger", + "nigg er", + "nigge r", + "n i g g e r", + "niger", + "n iger", + "ni ger", + "nig er", + "nige r", + "n i g e r" + + ] + }, + + }, + reactionRoles: { + type: Array, + required: true, + default: [] + }, + staffRoles: { + type: Array, + required: true, + default: [] + + }, + staff: { + type: Array, + required: true, + default: [] + }, + channels: { + modLogs: { + type: String, + required: true, + default: ' ' + }, + announcments: { + type: String, + required: true, + default: ' ' + }, + townhall: { + type: String, + required: true, + default: ' ' + }, + townhallLogs: { + type: String, + required: true, + default: ' ' + } + }, + configs: { + fivem: { + url: { + type: String, + required: true, + default: "http://knightrider.invalidlag.com/fivempiproxy" + }, + ip: { + type: String, + required: true, + default: "search bruvland 2.0 in the server list" + }, + }, + meme: { + type: String, + required: true, + default: "r/memes" + } + }, + addons: { + caps: { + type: Boolean, + required: true, + default: true + }, + filter: { + type: Boolean, + required: true, + default: true + }, + spam: { + type: Boolean, + required: true, + default: true + }, + emojiSpam: { + type: Boolean, + required: true, + default: true + }, + + }, + commandCount: { + type: Number, + required: true, + default: 0 + } +}); + +module.exports = model('Server', serverSchema); \ No newline at end of file diff --git a/src/models/user.js b/src/models/user.js new file mode 100644 index 0000000..de597b9 --- /dev/null +++ b/src/models/user.js @@ -0,0 +1,32 @@ +const { Schema, model } = require('mongoose'); +const userSchema = new Schema({ + userid: { + type: String, + required: true + }, + guildID: { + type: String, + required: true + }, + userName: { + type: String, + required: true + }, + strike: { + type: Number, + required: true, + default: 0 + }, + note: { + type: String, + required: true, + default: 'no note for this user' + }, + blocked: { + type: Boolean, + required: true, + default: false + }, +}); + +module.exports = model('User', userSchema); \ No newline at end of file diff --git a/src/models/userdashboard.js b/src/models/userdashboard.js new file mode 100644 index 0000000..47d767f --- /dev/null +++ b/src/models/userdashboard.js @@ -0,0 +1,48 @@ +const { Schema, model } = require('mongoose'); +const userSchema = new Schema({ + userId: { + type: String, + required: true + }, + userName: { + type: String, + required: true + }, + discriminator: { + type: String, + required: true, + default: '0000' + }, + avatar: { + type: String, + required: true, + default: 'https://knightrider.invalidlag.com/logo.png' + }, + accessCodes: { + type: Array, + required: true, + default: [] + }, + about: { + type: String, + required: true, + default: 'no about for this user' + }, + blocked: { + type: Boolean, + required: true, + default: false + }, + admin: { + type: Boolean, + required: true, + default: false + }, + guilds: { + type: Array, + required: true, + default: [] + } +}); + +module.exports = model('Userdashboard', userSchema); \ No newline at end of file