diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..30067c7 --- /dev/null +++ b/.env.example @@ -0,0 +1,9 @@ + +CLIENT_ID= +CLIENT_SECRET= +BOT_TOKEN= + +DB_URI=mariadb://knightrider:@localhost:3306/knightrider + + +WEBSITE_PORT=3000 \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..2d119c2 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "env": { + "node": true, + "es2021": true + }, + "extends": [ + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended" +], +"parser": "@typescript-eslint/parser", +"plugins": [ + "@typescript-eslint" + +], + "overrides": [], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "no-console": "warn" + } + +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3c3629e..38aaf24 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ node_modules +.env +/dist +/logs +/TODO +/OLD_src \ No newline at end of file diff --git a/README.md b/README.md index 3ce25db..14c205a 100644 --- a/README.md +++ b/README.md @@ -1,44 +1,36 @@ -# knightrider - -mfking discord bot with all that shit - -### 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"} } + - take note of the client id, client secret, snd then bot token -- make a mongo db with the schemas "servers" "users" - - put the mongo db connect uri in src/conf/tokens.js under { db: {URI: "here"} } +- make a mysql server with a db -- edit neccery information and details in src/conf/conf.json +- copy the .env.example file to .env fill in the client id, client secret bot token and database uri -- npm install -- npm start +- from the folder run `npm install --save-dev` then `npm run build` finally `npm run start` -yeah it will be more detailed with the next update. +## Features + + [ ] - reaction roles + + [ ] - message macros + + [ ] - custom reaction role embeds + + [ ] - reaction ban + + [ ] - reaction kick + + [ ] - user info/strike system + + [ ] - CAPS spam + + ~~[ ] - word filter~~ (use built in auto mod) + + [ ] - simple web dashboard + + ~~[ ] - mc server status command~~ (use McStatus https://mcstauts.net/bot) diff --git a/TODO b/TODO index ab0643a..0e884f7 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,15 @@ -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 +implement /reactionrole add /reactionrole remove commands--done +implement add remove message macro cmd + + + +implement event to listen for reactions and then role them + +add onto rr event listner and add this +add reaction remove listnere + +implement /kickrole enable and /kickrole disable +implement /banrole enable and /banrole disable + + + diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000..6daedab --- /dev/null +++ b/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["src"], + "ext": "ts", + "exec": "ts-node --files --project tsconfig.json src/index.ts" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3f93a5e..3a49023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,679 +1,606 @@ { "name": "knightrider", - "version": "4.8.420", + "version": "4.8.434", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "knightrider", - "version": "4.8.420", + "version": "4.8.434", "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": "*" + "discord.js": "^14.16.3", + "dotenv": "^16.4.5", + "express": "^4.21.1", + "mariadb": "^3.4.0", + "mcstatusbot-logger": "^1.0.5", + "mysql2": "^3.12.0", + "sequelize": "^6.37.5" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "nodemon": "^3.1.9", + "ts-node": "^10.9.2" } }, - "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==", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "@jridgewell/trace-mapping": "0.3.9" }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", + "dependencies": { + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + }, + "node_modules/@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", + "dependencies": { + "discord-api-types": "0.37.97" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/formatters/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + }, + "node_modules/@discordjs/rest": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", + "dependencies": { + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + }, + "node_modules/@discordjs/util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", + "dependencies": { + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "engines": { + "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/@discordjs/ws/node_modules/discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, "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/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, - "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==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.4.tgz", + "integrity": "sha512-id65RxAx34DCk8KAVTPWwcephJSkStiS9M15F87+zvK2gK47wf7yeRIo8WiuKeXQS6bsyo/uQ/t0QW1cLmSb+A==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" }, "engines": { - "node": ">= 6" + "node": ">=v16" } }, - "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" - }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", "engines": { - "node": ">=12.0.0" + "node": ">=v14.0.0", + "npm": ">=7.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/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "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, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "^0.2.36" - }, - "engines": { - "node": ">=6" + "@types/connect": "*", + "@types/node": "*" } }, - "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==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, "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==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dependencies": { - "@types/bson": "*", - "@types/node": "*" + "@types/ms": "*" } }, + "node_modules/@types/express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "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==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dependencies": { - "event-target-shim": "^5.0.0" - }, + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + }, + "node_modules/@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==", "engines": { - "node": ">=6.5" + "node": ">=v14.0.0", + "npm": ">=7.0.0" } }, "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "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" + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.4.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==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, "dependencies": { - "ms": "2.1.2" + "acorn": "^8.11.0" }, "engines": { - "node": ">=6.0" + "node": ">=0.4.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==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "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" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "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/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "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=", + "node_modules/aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==", "engines": { - "node": ">=0.10.0" + "node": ">= 6.0.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==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, - "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/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dependencies": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "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==", + "dev": true, "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==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, "engines": { - "node": ">=0.6.19" + "node": ">=8" } }, - "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==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "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" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "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" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.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" + "node": ">= 8.10.0" }, - "engines": { - "node": ">= 0.8" + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "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=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "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==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "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==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "engines": { "node": ">= 0.6" } @@ -681,57 +608,13 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "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/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/debug": { "version": "2.6.9", @@ -741,444 +624,231 @@ "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==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "object-keys": "^1.0.12" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "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=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "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" - }, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=0.10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/discord-api-types": { + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" + }, "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", + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", "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" + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" }, "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" + "node": ">=18" }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { - "node": ">= 4" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, - "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/dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, "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" - } + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "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==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "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" + "get-intrinsic": "^1.2.4" }, "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" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "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" - } + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "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==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", + "depd": "2.0.0", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.3.1", "fresh": "0.5.2", - "merge-descriptors": "1.0.1", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.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", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "dependencies": { - "@derhuerst/http-basic": "^8.2.0", - "env-paths": "^2.2.0", - "https-proxy-agent": "^5.0.0", - "progress": "^2.0.3" + "to-regex-range": "^5.0.1" }, "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": ">=8" } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "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", @@ -1190,257 +860,149 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "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" - }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6 <7 || >=8" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "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==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "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=", + "node_modules/generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "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" + "is-property": "^1.0.2" } }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "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" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.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" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "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" + "is-glob": "^4.0.1" }, "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==", + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { - "ms": "2.1.2" + "get-intrinsic": "^1.1.3" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } }, - "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/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/iconv-lite": { "version": "0.4.24", @@ -1453,14 +1015,19 @@ "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/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", + "engines": [ + "node >= 0.4.0" + ] }, "node_modules/inherits": { "version": "2.0.4", @@ -1475,281 +1042,129 @@ "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==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "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" + "binary-extensions": "^2.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/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/lru.min": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", + "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==", + "engines": { + "bun": ">=1.0.0", + "deno": ">=1.30.0", + "node": ">=8.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wellwelwel" + } + }, + "node_modules/magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/mariadb": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.0.tgz", + "integrity": "sha512-hdRPcAzs+MTxK5VG1thBW18gGTlw6yWBe9YnLB65GLo7q0fO5DWsgomIevV/pXSaWRmD3qi6ka4oSFRTExRiEQ==", + "dependencies": { + "@types/geojson": "^7946.0.14", + "@types/node": "^22.5.4", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.3.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/mariadb/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mcstatusbot-logger": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mcstatusbot-logger/-/mcstatusbot-logger-1.0.5.tgz", + "integrity": "sha512-wqhkS9qMKuTnEtSzMy0+7VLnWQhGYwBRa5yZ3mD+J4X4XiTSOas3XtNKxcbfRX5e2UCC7KCc4ugAzlONLeYzeg==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1758,41 +1173,18 @@ "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=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } @@ -1809,55 +1201,29 @@ } }, "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==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "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==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.48.0" + "mime-db": "1.52.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==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -1865,171 +1231,23 @@ "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/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "engines": { + "node": "*" + } }, - "node_modules/minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "node_modules/moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", "dependencies": { - "yallist": "^4.0.0" + "moment": "^2.29.4" }, "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": "*" } }, "node_modules/ms": { @@ -2037,175 +1255,138 @@ "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==", + "node_modules/mysql2": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.12.0.tgz", + "integrity": "sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==", "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" + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" }, "engines": { - "node": ">=4" + "node": ">= 8.0" } }, - "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=", + "node_modules/mysql2/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { - "ansi-regex": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 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==", + "node_modules/named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", + "dependencies": { + "lru-cache": "^7.14.1" + }, "engines": { - "node": "*" + "node": ">=12.0.0" } }, - "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=", + "node_modules/named-placeholders/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "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==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "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" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -2213,40 +1394,6 @@ "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", @@ -2255,60 +1402,26 @@ "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=" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, - "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/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" }, - "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==", + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { - "node": ">=0.4.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/proxy-addr": { @@ -2323,53 +1436,24 @@ "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/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true }, "node_modules/qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, "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": "*" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/range-parser": { @@ -2381,12 +1465,12 @@ } }, "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==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -2394,116 +1478,51 @@ "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==", + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "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" + "picomatch": "^2.2.1" }, "engines": { - "node": ">= 6" + "node": ">=8.10.0" } }, - "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/retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, "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==" + "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/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" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -2512,172 +1531,229 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "node_modules/sequelize": { + "version": "6.37.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz", + "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/sequelize/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sequelize/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } }, "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==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.19.0" }, "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, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "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" + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "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/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==", "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" - }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "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": ">= 0.8" } }, "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==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2685,110 +1761,92 @@ "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==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "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" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 10" + "node": ">=8.0" } }, - "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==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "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==", + "node_modules/toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">=0.8" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, "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==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/type-is": { "version": "1.6.18", @@ -2802,167 +1860,95 @@ "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==", + "node_modules/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=14.17" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "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=", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "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/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", + "engines": { + "node": ">= 0.10" } }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "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" - ], + "node_modules/wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "@types/node": "*" } }, - "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -2973,657 +1959,492 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "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" + "node": ">=6" } } }, "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==", + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "requires": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "@jridgewell/trace-mapping": "0.3.9" } }, - "@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==", + "@discordjs/builders": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz", + "integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==", "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" + "@discordjs/formatters": "^0.5.0", + "@discordjs/util": "^1.1.1", + "@sapphire/shapeshift": "^4.0.0", + "discord-api-types": "0.37.97", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.4", + "tslib": "^2.6.3" }, "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==" + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" } } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==" + }, + "@discordjs/formatters": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz", + "integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==", "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" + "discord-api-types": "0.37.97" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } } }, - "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==", + "@discordjs/rest": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz", + "integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==", "requires": { - "color-convert": "^1.9.0" + "@discordjs/collection": "^2.1.1", + "@discordjs/util": "^1.1.1", + "@sapphire/async-queue": "^1.5.3", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.4.6", + "discord-api-types": "0.37.97", + "magic-bytes.js": "^1.10.0", + "tslib": "^2.6.3", + "undici": "6.19.8" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.97", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz", + "integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==" + } } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "@discordjs/util": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz", + "integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==" }, - "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==", + "@discordjs/ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "tslib": "^2.6.2", + "ws": "^8.16.0" + }, + "dependencies": { + "@discordjs/collection": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz", + "integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==" + }, + "discord-api-types": { + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" + } } }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@sapphire/async-queue": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.4.tgz", + "integrity": "sha512-id65RxAx34DCk8KAVTPWwcephJSkStiS9M15F87+zvK2gK47wf7yeRIo8WiuKeXQS6bsyo/uQ/t0QW1cLmSb+A==" + }, + "@sapphire/shapeshift": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz", + "integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + } + }, + "@sapphire/snowflake": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==" + }, + "@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "requires": { + "@types/ms": "*" + } + }, + "@types/express": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz", + "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/geojson": { + "version": "7946.0.14", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + }, + "@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "requires": { + "undici-types": "~6.19.8" + } + }, + "@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "@types/validator": { + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==" + }, + "@types/ws": { + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", + "requires": { + "@types/node": "*" + } + }, + "@vladfrangu/async_event_emitter": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz", + "integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true + }, + "acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "requires": { + "acorn": "^8.11.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, - "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==" + "aws-ssl-profiles": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", + "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==" }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, - "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==" + "binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", + "bytes": "3.1.2", + "content-type": "~1.0.5", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" } }, - "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==", + "dev": true, "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==" + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } }, "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, - "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==", + "chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "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" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.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=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" } }, "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==" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "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==" + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "debug": { "version": "2.6.9", @@ -3633,43 +2454,41 @@ "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==", + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "requires": { - "object-keys": "^1.0.12" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" } }, - "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==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, - "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "discord-api-types": { + "version": "0.37.100", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz", + "integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==" }, "discord-bitfield-calculator": { "version": "1.0.0", @@ -3677,331 +2496,133 @@ "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==", + "version": "14.16.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz", + "integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==", "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" + "@discordjs/builders": "^1.9.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.5.0", + "@discordjs/rest": "^2.4.0", + "@discordjs/util": "^1.1.1", + "@discordjs/ws": "1.1.1", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.100", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "^2.6.3", + "undici": "6.19.8" } }, - "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" - } + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" }, - "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" - } + "dottie": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", + "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==" }, "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" - } + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==" }, - "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==", + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "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" + "get-intrinsic": "^1.2.4" } }, - "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" - } + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" }, "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=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "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==" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", + "depd": "2.0.0", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.3.1", "fresh": "0.5.2", - "merge-descriptors": "1.0.1", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.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", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "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==", + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "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" + "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "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", @@ -4010,221 +2631,101 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, - "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=" + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, - "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=", + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", "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" + "is-property": "^1.0.2" } }, "get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { - "assert-plus": "^1.0.0" + "is-glob": "^4.0.1" } }, - "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": { + "gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "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==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, - "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==", + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" + "function-bind": "^1.1.2" } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "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=" - } + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" } }, - "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", @@ -4233,14 +2734,16 @@ "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" - } + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflection": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", + "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==" }, "inherits": { "version": "2.0.4", @@ -4252,262 +2755,118 @@ "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==", + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "requires": { - "call-bind": "^1.0.0" + "binary-extensions": "^2.0.0" } }, - "is-bigint": { + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-property": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, - "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" - } + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "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==" + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" }, - "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=" + "long": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.4.tgz", + "integrity": "sha512-qtzLbJE8hq7VabR3mISmVGtoXP8KGc2Z/AT8OuqlYD7JTR3oqrgwdjnk07wpj1twXxYmgDXgoKVWUG/fReSzHg==" }, "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" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, - "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" - } + "lru.min": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.1.tgz", + "integrity": "sha512-FbAj6lXil6t8z4z3j0E5mfRlPzxkySotzUHwRXjlpRh10vc6AI6WN62ehZj82VG7M20rqogJ0GLwar2Xa05a8Q==" }, - "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" - } + "magic-bytes.js": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" }, - "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==", + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "mariadb": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.4.0.tgz", + "integrity": "sha512-hdRPcAzs+MTxK5VG1thBW18gGTlw6yWBe9YnLB65GLo7q0fO5DWsgomIevV/pXSaWRmD3qi6ka4oSFRTExRiEQ==", "requires": { - "semver": "^6.0.0" + "@types/geojson": "^7946.0.14", + "@types/node": "^22.5.4", + "denque": "^2.1.0", + "iconv-lite": "^0.6.3", + "lru-cache": "^10.3.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } } } }, + "mcstatusbot-logger": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mcstatusbot-logger/-/mcstatusbot-logger-1.0.5.tgz", + "integrity": "sha512-wqhkS9qMKuTnEtSzMy0+7VLnWQhGYwBRa5yZ3mD+J4X4XiTSOas3XtNKxcbfRX5e2UCC7KCc4ugAzlONLeYzeg==" + }, "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=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==" }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "mime": { "version": "1.6.0", @@ -4515,149 +2874,38 @@ "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==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "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==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.48.0" + "mime-db": "1.52.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==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "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==" + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, - "minipass": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", - "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "moment-timezone": { + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", "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" - } - } + "moment": "^2.29.4" } }, "ms": { @@ -4665,205 +2913,126 @@ "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==", + "mysql2": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.12.0.tgz", + "integrity": "sha512-C8fWhVysZoH63tJbX8d10IAoYCyXy4fdRFz2Ihrt9jtPILYynFEKUUzpp1U7qxzDc3tMbotvaBH+sl6bFnGZiw==", "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" + "aws-ssl-profiles": "^1.1.1", + "denque": "^2.1.0", + "generate-function": "^2.3.1", + "iconv-lite": "^0.6.3", + "long": "^5.2.1", + "lru.min": "^1.0.0", + "named-placeholders": "^1.1.3", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.2" }, "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==", + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "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" + "safer-buffer": ">= 2.1.2 < 3.0.0" } } } }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "named-placeholders": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "abbrev": "1" + "lru-cache": "^7.14.1" + }, + "dependencies": { + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" + } } }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "nodemon": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } } }, - "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=" + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true }, "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" - } + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" }, "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "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=" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==" }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" }, - "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==" + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true }, "proxy-addr": { "version": "2.0.7", @@ -4874,38 +3043,18 @@ "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==" + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true }, "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==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "requires": { - "array-uniq": "1.0.2", - "randombytes": "2.0.3" + "side-channel": "^1.0.6" } }, "range-parser": { @@ -4914,363 +3063,253 @@ "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==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.2", + "http-errors": "2.0.0", "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==", + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "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" + "picomatch": "^2.2.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" - } + "retry-as-promised": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", + "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==" }, "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==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "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" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, "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==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" + }, + "sequelize": { + "version": "6.37.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz", + "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==", + "requires": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, + "sequelize-pool": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", + "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==" + }, "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==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.19.0" } }, - "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=" + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "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, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "requires": { - "memory-pager": "^1.0.2" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, "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=" - } + "semver": "^7.5.3" } }, + "sqlstring": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz", + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==" + }, "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" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "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==", + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "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" + "is-number": "^7.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==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, - "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==", + "toposort-class": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", + "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==" + }, + "touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true + }, + "ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, + "ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.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==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "type-is": { "version": "1.6.18", @@ -5281,178 +3320,74 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "dev": true, + "peer": true }, - "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" - } + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "undici": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", + "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==" + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "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=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "validator": { + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==" }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "wkx": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", + "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "@types/node": "*" } }, - "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==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "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" - } + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true } } -} \ No newline at end of file +} diff --git a/package.json b/package.json index 4596a20..a64bc6e 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "knightrider", - "version": "4.8.434", + "version": "4.9.000", "description": "a bot for a private discord server", - "updatenote": "small update (untested): fixed non staff from accessing dashboard by doing to domain/server/:server-id", - "main": "./src/knightrider.js", + "main": "./dist/index.js", "scripts": { - "start": "node ./src/knightrider.js", - "help": "if you need help with this bot please look at http://knightrider.invalidlag.com/help/" + "build": "tsc", + "start": "node ./dist/index.js", + "dev": "nodemon" }, "author": "404invalid-user", "repository": { @@ -15,22 +15,19 @@ }, "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": "*" + "discord.js": "^14.16.3", + "dotenv": "^16.4.5", + "express": "^4.21.1", + "mariadb": "^3.4.0", + "mcstatusbot-logger": "^1.0.5", + "mysql2": "^3.12.0", + "sequelize": "^6.37.5" + }, + "devDependencies": { + "@types/express": "^5.0.0", + "nodemon": "^3.1.9", + "ts-node": "^10.9.2" } -} \ No newline at end of file +} diff --git a/src/applications/bot.js b/src/applications/bot.js deleted file mode 100644 index 5fffbc3..0000000 --- a/src/applications/bot.js +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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 deleted file mode 100644 index 0c9accd..0000000 --- a/src/applications/webserver.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 deleted file mode 100644 index 9208c18..0000000 --- a/src/bot/addons/caps.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 5abbfab..0000000 --- a/src/bot/addons/swearfilter.js +++ /dev/null @@ -1,42 +0,0 @@ -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/banreaction.ts b/src/bot/commands/banreaction.ts new file mode 100644 index 0000000..90c60ca --- /dev/null +++ b/src/bot/commands/banreaction.ts @@ -0,0 +1,53 @@ +import { Client, ChatInputCommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; + + +import YALAS from 'mcstatusbot-logger'; + +import * as AddBanReaction from './banreaction/add'; +import * as RemoveBanReaction from './banreaction/remove'; +import { GuildInstance } from "../../database/schemas/Guild"; +import { UserInstance } from "../../database/schemas/User"; + +const data = { + allowSuspendedUserAccess: false, + command: new SlashCommandBuilder() + .setName('banreaction') + .setDefaultMemberPermissions(PermissionFlagsBits.BanMembers) + .setDescription("setup reaction to ban members from your server") + .addSubcommand(subcommand => + subcommand + .setName('add') + .setDescription("Add a ban reaction to your channel") + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to add a reaction') + .setRequired(true) + ) + + ) + .addSubcommand(subcommand => + subcommand + .setName('remove') + .setDescription("remove a ban reaction") + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to remove a reaction') + .setRequired(true) + ) + + ) +} + +export { data }; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + switch (interaction.options.getSubcommand()) { + case 'add': + AddBanReaction.chatInputCommand(client, interaction, guild, user) + break; + case 'remove': + RemoveBanReaction.chatInputCommand(client, interaction, guild, user) + break; + } +} \ No newline at end of file diff --git a/src/bot/commands/banreaction/add.ts b/src/bot/commands/banreaction/add.ts new file mode 100644 index 0000000..d31d69c --- /dev/null +++ b/src/bot/commands/banreaction/add.ts @@ -0,0 +1,116 @@ +import { Client, ChatInputCommandInteraction, GuildChannelResolvable, PermissionsBitField, ChannelType, EmbedBuilder } from "discord.js"; + +import { schemas } from "../../../database"; + +import YALAS from 'mcstatusbot-logger'; + +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("must be done in discord server"); + + const botMember = interaction.guild.members.me; + if (!botMember) { + YALAS.error("reactionrole add: bot in guild null"); + return; + } + + + //get and validate channel + const channel = interaction.options.getChannel('channel'); + if (channel == undefined) { + return interaction.reply({ + embeds: [{ + title: "Channel Not Found", + description: "The selected channel could not be found please try again." + }] + }); + } + + if (channel.type !== ChannelType.GuildText) { + return interaction.reply({ + embeds: [{ + title: "That Will Not Work", + description: "The selected channel is not a text channel please select a text channel." + }] + }); + } + + const botPermSM = botMember.permissionsIn((channel as GuildChannelResolvable)).toArray(); + if (botPermSM && !botPermSM.includes('SendMessages')) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the send message permission in the selected channel." + }] + }); + } + + + //check bot has manage roles perm + const botPermMR = botMember.permissions.has(PermissionsBitField.Flags.BanMembers); + if (!botPermMR) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the Ban Members permission in this server." + }] + }); + } + + + await interaction.deferReply(); + //check emoji does net exist for reaction in channel + try { + const BanReaction = await schemas['BanReaction'].findOne({ + where: { + guild: guild.id, + channel: channel.id + } + }); + + if (BanReaction !== null) { + return interaction.editReply({ + embeds: [{ + title: "Ban Reaction Exists", + description: "This is already setup in selected channel." + }] + }); + } + } catch (err: any) { + YALAS.error(err) + YALAS.error(err.stack || err); + return interaction.editReply("error when checking for existing ban reaction in database."); + } + + try { + await schemas['BanReaction'].create({ + guild: guild.id, + channel: channel.id + }); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when saving ban reaction to database."); + } + + + try { + const textChannel = interaction.guild?.channels.cache.get(channel.id); + if (textChannel === undefined || textChannel.type !== 0) return; + + const embed = new EmbedBuilder() + .setDescription("React with a ❌") + .setFooter({ text: 'to get banned this is no joke' }); + + + const BanReactionMsg = await textChannel.send({ embeds: [embed] }); + await BanReactionMsg.react('❌'); + return interaction.editReply("ban reaction added to channel <#" + textChannel.id + ">."); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when making ban reaction embed."); + } + +} \ No newline at end of file diff --git a/src/bot/commands/banreaction/remove.ts b/src/bot/commands/banreaction/remove.ts new file mode 100644 index 0000000..534001e --- /dev/null +++ b/src/bot/commands/banreaction/remove.ts @@ -0,0 +1,67 @@ +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; + +import { Client, ChatInputCommandInteraction, Role, GuildChannelResolvable, TextChannel, ChannelType } from "discord.js"; + +import parseEmoji from "../../functions/parseEmoji"; +import { schemas } from "../../../database"; + +import YALAS from 'mcstatusbot-logger'; + +import SendReactionRoleEmbed from "../../functions/SendReactionRoleEmbed"; + + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("must be done in discord server"); + + //get and validate channel + const channel = interaction.options.getChannel('channel'); + if (channel == undefined) { + return interaction.reply({ + embeds: [{ + title: "Channel Not Found", + description: "The selected channel could not be found please try again." + }] + }); + } + + if (channel.type !== ChannelType.GuildText) { + return interaction.reply({ + embeds: [{ + title: "That Will Not Work", + description: "The selected channel is not a text channel please select a text channel." + }] + }); + } + + + + + await interaction.deferReply(); + try { + const BanReaction = await schemas['BanReaction'].findOne({ + where: { + guild: guild.id, + channel: channel.id, + }, + raw: true + }); + + if (BanReaction == null) { + return interaction.editReply({ + embeds: [{ + title: "Ban Role Doesn't Exists", + description: "This ban reaction could not be found in the selected channel." + }] + }); + } + await schemas['BanReaction'].destroy({ where: { id: BanReaction.id } }); + return interaction.editReply("ban reaction deleted."); + } catch (err: any) { + YALAS.error(err) + YALAS.error(err.stack || err); + return interaction.editReply("error when getting and deleting reaction role in database."); + } + +} \ No newline at end of file diff --git a/src/bot/commands/fun/fivem.js b/src/bot/commands/fun/fivem.js deleted file mode 100644 index bc7bb94..0000000 --- a/src/bot/commands/fun/fivem.js +++ /dev/null @@ -1,125 +0,0 @@ -const http = require('http'); -const conf = require('../../../conf/conf.json') -module.exports = { - name: 'fivem', - 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.configs.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', async () => { - 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++) { - let discordID = ''; - await response[i].identifiers.forEach(id => { - if (id.includes('discord:')) { - discordID = id.replace('discord:', ''); - } - }); - playersEmbed.addField(`player ${i}:`, `__**name:**__ ${response[i].name} \n __**discord:**__ <@!${discordID}> \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) - } - } - } -} diff --git a/src/bot/commands/fun/mcstat.js b/src/bot/commands/fun/mcstat.js deleted file mode 100644 index edea553..0000000 --- a/src/bot/commands/fun/mcstat.js +++ /dev/null @@ -1,35 +0,0 @@ -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 deleted file mode 100644 index 81cf046..0000000 --- a/src/bot/commands/fun/memes.js +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 17a99b5..0000000 --- a/src/bot/commands/fun/play.js +++ /dev/null @@ -1,203 +0,0 @@ -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 deleted file mode 100644 index b050d6e..0000000 --- a/src/bot/commands/info/about.js +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index fa1a89b..0000000 --- a/src/bot/commands/info/help.js +++ /dev/null @@ -1,49 +0,0 @@ -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 deleted file mode 100644 index f5cb5dc..0000000 --- a/src/bot/commands/info/ping.js +++ /dev/null @@ -1,11 +0,0 @@ -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/messagemacro.ts b/src/bot/commands/messagemacro.ts new file mode 100644 index 0000000..cf4ede4 --- /dev/null +++ b/src/bot/commands/messagemacro.ts @@ -0,0 +1,77 @@ +import { Client, ChatInputCommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; + + +import YALAS from 'mcstatusbot-logger'; + +import * as AddMessageMacro from './messagemacro/add'; +import * as ListMessageMacros from './messagemacro/list'; +import { GuildInstance } from "../../database/schemas/Guild"; +import { UserInstance } from "../../database/schemas/User"; + +const data = { + allowSuspendedUserAccess: false, + command: new SlashCommandBuilder() + .setName('messagemacro') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageMessages) + .setDescription("setup message macros for the server") + .addSubcommand(subcommand => + subcommand + .setName('add') + .setDescription("Add a message macro") + .addStringOption(option => + option.setName('macro') + .setDescription('The macro you send (without prefix)') + .setRequired(true) + .setMinLength(1) + .setMaxLength(5) + ) + .addStringOption(option => + option.setName('message') + .setDescription('The content of the message the bot will send') + .setRequired(true) + .setMinLength(3) + .setMaxLength(2000) + ) + .addMentionableOption(option => + option.setName('trigger-role') + .setDescription('The role that grants people permission to use this') + .setRequired(true) + ) + .addBooleanOption(o => + o.setName('deletecmd') + .setDescription("should your macro message be deleted after you send it?") + .setRequired(true) + ) + .addBooleanOption(o => + o.setName('impersonate') + .setDescription("setting to true will use your name and photo") + .setRequired(true) + ) + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to it to be sent in (leave blank to send in same channel as command)') + .setRequired(false) + ) + + ) + .addSubcommand(subcommand => + subcommand + .setName('list') + .setDescription("Lists all your message macros and allows you to edit/remove them") + + ) +} + +export { data }; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + switch (interaction.options.getSubcommand()) { + case 'add': + AddMessageMacro.chatInputCommand(client, interaction, guild, user) + break; + case 'list': + ListMessageMacros.chatInputCommand(client, interaction, guild, user) + break; + } +} \ No newline at end of file diff --git a/src/bot/commands/messagemacro/add.ts b/src/bot/commands/messagemacro/add.ts new file mode 100644 index 0000000..a681530 --- /dev/null +++ b/src/bot/commands/messagemacro/add.ts @@ -0,0 +1,137 @@ +import { Client, ChatInputCommandInteraction, Role, GuildChannelResolvable, PermissionsBitField, ChannelType } from "discord.js"; + +import { schemas } from "../../../database"; + +import YALAS from 'mcstatusbot-logger'; + +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("must be done in discord server"); + + const botMember = interaction.guild.members.me; + if (!botMember) { + YALAS.error("messagemacro add: bot in guild null"); + return; + } + + + //get macro + let macroContent = interaction.options.getString('macro'); + if (!macroContent) return; + macroContent = macroContent.replace(/\s+/g, ''); + + //get and validate message content + const messageContent = interaction.options.getString('message'); + if (messageContent === null) return; + if (messageContent.length < 3 || messageContent.length > 2000) { + return interaction.reply({ + embeds: [{ + title: "Invalid Message", + description: "The set message must be between 3 and 2000 in length." + }] + }); + } + + + //get and validate role + const role = interaction.options.getMentionable('trigger-role'); + if (!(role instanceof Role)) { + return interaction.reply({ + embeds: [{ + title: "Invalid Role", + description: "The selected role is not a valid role" + }] + }); + } + + const deleteMsg = interaction.options.getBoolean('deletecmd') ?? false; + + const impersonate = interaction.options.getBoolean('impersonate') ?? false; + + + + //get and validate channel + let channel = interaction.options.getChannel('channel'); + if (channel === undefined) channel = null; + if (channel !== null) { + if (channel.type !== ChannelType.GuildText && channel.type !== ChannelType.GuildAnnouncement) { + return interaction.reply({ + embeds: [{ + title: "That Will Not Work", + description: "The selected channel is not a text channel please select a text channel." + }] + }); + } + + const botPermSM = botMember.permissionsIn((channel as GuildChannelResolvable)).toArray(); + if (botPermSM && !botPermSM.includes('SendMessages')) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the send message permission in the selected channel." + }] + }); + } + } + + + + await interaction.deferReply(); + //check msgMacro does net exist for reaction in channel + try { + const msgMacro = await schemas['MessageMacro'].findOne({ + where: { + guild: guild.id, + shortCode: macroContent, + } + }); + + if (msgMacro !== null) { + return interaction.editReply({ + embeds: [{ + title: "Message Macro Exists", + description: "The message macro `" + msgMacro.dataValues.shortCode + "` already exists please edit or remove it" + }] + }); + } + } catch (err: any) { + YALAS.error(err) + YALAS.error(err.stack || err); + return interaction.editReply("error when checking for existing message macro in database."); + } + + try { + await schemas['MessageMacro'].create({ + guild: guild.id, + channel: channel ? channel.id : null, + shortCode: macroContent, + message: messageContent, + role: role.id, + impersonate: impersonate, + deleteShortCode: deleteMsg + }); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when saving reaction role to database."); + } + + + let prefixNote = ''; + if (macroContent.toLocaleLowerCase().startsWith(guild.prefix)) { + prefixNote = "\nNote: it looks like your macro contains the prefix so to activate it you will need to type `" + guild.prefix + macroContent + "`"; + } + try { + return interaction.editReply({ + embeds: [{ + title: "Success", + description: "The message Macro has been created."+macroContent + }] + }); + } catch (err: any) { + YALAS.error(err.stack || err); + } + +} \ No newline at end of file diff --git a/src/bot/commands/messagemacro/list.ts b/src/bot/commands/messagemacro/list.ts new file mode 100644 index 0000000..d330b47 --- /dev/null +++ b/src/bot/commands/messagemacro/list.ts @@ -0,0 +1,180 @@ +import { + Client, + ChatInputCommandInteraction, + EmbedBuilder, + ButtonBuilder, + ActionRowBuilder, + ButtonStyle, +} from "discord.js"; + +import { schemas } from "../../../database"; + +import YALAS from "mcstatusbot-logger"; + +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; +import { MessageMacroAttributes } from "../../../database/schemas/MessageMacro"; + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("Must be done in a Discord server."); + + const botMember = interaction.guild.members.me; + if (!botMember) { + YALAS.error("MessageMacro Add: Bot in guild is null"); + return; + } + + await interaction.deferReply(); + + let msgMacros:MessageMacroAttributes[]; + try { + const msgMacroDocs = await schemas["MessageMacro"].findAll({ + where: { + guild: guild.id, + }, + }); + msgMacros = msgMacroDocs.map((item: any) => item.dataValues); + } catch (err: any) { + YALAS.error(err); + YALAS.error(err.stack || err); + return interaction.editReply("Error when checking for message macros in the database."); + } + + if (msgMacros.length === 0) { + return interaction.editReply("No message macros found."); + } + + const updateEmbed = (index: number) => { + const currentMacro: MessageMacroAttributes = msgMacros[index]; + const embed = new EmbedBuilder() + .setAuthor({name: "Message Macro"}) + .setTitle(currentMacro.shortCode) + .setDescription(currentMacro.message + `\n\n-# --\n-# Prefix: ${guild.prefix}\n-# role: <@&${currentMacro.role}>\n-# Channel: ${currentMacro.channel == null ? '' : '<#' + currentMacro.channel + '>'}`) + + const buttons = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("prev") + .setLabel("<") + .setStyle(ButtonStyle.Primary) + .setDisabled(index === 0), + new ButtonBuilder() + .setCustomId("index") + .setLabel(`${index + 1}/${msgMacros.length}`) + .setStyle(ButtonStyle.Secondary) + .setDisabled(true), + new ButtonBuilder() + .setCustomId("next") + .setLabel(">") + .setStyle(ButtonStyle.Primary) + .setDisabled(index === msgMacros.length - 1) + ); + + const actionButtons = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("delete") + .setLabel("Delete") + .setStyle(ButtonStyle.Danger), + new ButtonBuilder() + .setCustomId("edit") + .setLabel("Edit") + .setStyle(ButtonStyle.Success) + ); + + return { embed, buttons, actionButtons }; + }; + + + // Pagination variables + let currentIndex = 0; + const { embed, buttons, actionButtons } = updateEmbed(currentIndex); + + const message = await interaction.editReply({ + embeds: [embed], + components: [buttons, actionButtons] + }); + + const collector = message.createMessageComponentCollector({ + time: 60000, // 1 minute timeout + }); + + collector.on("collect", async (i) => { + if (i.user.id !== interaction.user.id) { + return i.reply({ content: "This interaction isn't for you.", ephemeral: true }); + } + + switch (i.customId) { + case "prev": + currentIndex = Math.max(0, currentIndex - 1); + break; + case "next": + currentIndex = Math.min(msgMacros.length - 1, currentIndex + 1); + break; + case "delete": + await schemas["MessageMacro"].destroy({ + where: { id: msgMacros[currentIndex].id }, + }); + msgMacros.splice(currentIndex, 1); + currentIndex = Math.max(0, currentIndex - 1); + break; + case "edit": + // Handle edit logic here + await i.reply({ + content: "Edit functionality is not implemented yet.", + ephemeral: true, + }); + return; + } + + if (msgMacros.length === 0) { + collector.stop(); + return interaction.editReply({ + content: "All message macros have been deleted.", + embeds: [], + components: [], + }); + } + + const { embed, buttons, actionButtons } = updateEmbed(currentIndex); + await i.update({ embeds: [embed], components: [buttons, actionButtons] }); + }); + + collector.on("end", () => { + const buttons = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("prev") + .setLabel("<") + .setStyle(ButtonStyle.Primary) + .setDisabled(true), + new ButtonBuilder() + .setCustomId("index") + .setLabel(`${currentIndex + 1}/${msgMacros.length}`) + .setStyle(ButtonStyle.Secondary) + .setDisabled(true), + new ButtonBuilder() + .setCustomId("next") + .setLabel(">") + .setStyle(ButtonStyle.Primary) + .setDisabled(true) + ); + const actionButtons = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("delete") + .setLabel("Delete") + .setStyle(ButtonStyle.Danger) + .setDisabled(true), + new ButtonBuilder() + .setCustomId("edit") + .setLabel("Edit") + .setStyle(ButtonStyle.Success) + .setDisabled(true) + ); + interaction.editReply({ + components: [buttons, actionButtons], + }); + + }); +} diff --git a/src/bot/commands/moderation/addstaff.js b/src/bot/commands/moderation/addstaff.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/commands/moderation/editfilter.js b/src/bot/commands/moderation/editfilter.js deleted file mode 100644 index d1f285d..0000000 --- a/src/bot/commands/moderation/editfilter.js +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index cf99fbb..0000000 --- a/src/bot/commands/moderation/embed-img.js +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 169bc20..0000000 --- a/src/bot/commands/moderation/embed.js +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index b44952c..0000000 --- a/src/bot/commands/moderation/filter.js +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 1661ef0..0000000 --- a/src/bot/commands/moderation/gameroles.js +++ /dev/null @@ -1,28 +0,0 @@ -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 deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/commands/moderation/note.js b/src/bot/commands/moderation/note.js deleted file mode 100644 index 8ce4b3a..0000000 --- a/src/bot/commands/moderation/note.js +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100644 index 10b4432..0000000 --- a/src/bot/commands/moderation/say.js +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index e69de29..0000000 diff --git a/src/bot/commands/moderation/townhall.js b/src/bot/commands/moderation/townhall.js deleted file mode 100644 index 171f27c..0000000 --- a/src/bot/commands/moderation/townhall.js +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index 1df7cf8..0000000 --- a/src/bot/commands/moderation/userinfo.js +++ /dev/null @@ -1,48 +0,0 @@ -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/commands/reactionrole.ts b/src/bot/commands/reactionrole.ts new file mode 100644 index 0000000..7320e3f --- /dev/null +++ b/src/bot/commands/reactionrole.ts @@ -0,0 +1,84 @@ +import { Client, ChatInputCommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; + + +import YALAS from 'mcstatusbot-logger'; + +import * as AddReactionRole from './reactionrole/add'; +import * as RemoveReactionRole from './reactionrole/remove'; +import { GuildInstance } from "../../database/schemas/Guild"; +import { UserInstance } from "../../database/schemas/User"; + +const data = { + allowSuspendedUserAccess: false, + command: new SlashCommandBuilder() + .setName('reactionrole') + .setDefaultMemberPermissions(PermissionFlagsBits.ManageRoles) + .setDescription("setup reaction roles for your server") + .addSubcommand(subcommand => + subcommand + .setName('add') + .setDescription("Add a reaction role to your channel") + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to add a reaction') + .setRequired(true) + ) + .addStringOption(option => + option.setName('emoji') + .setDescription('The reaction emoji') + .setRequired(true) + ) + .addMentionableOption(option => + option.setName('role') + .setDescription('The @ mention of the role you want to add') + .setRequired(true) + ) + .addBooleanOption(o => + o.setName('reaction-remove') + .setDescription("allow users to remove the role by unreacting") + .setRequired(true) + ) + + ) + .addSubcommand(subcommand => + subcommand + .setName('remove') + .setDescription("remove a reaction role") + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to remove a reaction') + .setRequired(true) + ) + .addStringOption(o => + o + .setName('emoji') + .setDescription("the reaction emoji") + .setRequired(true) + ) + + ) + .addSubcommand(subcommand => + subcommand + .setName('edit-embed') + .setDescription("Edit the message embed sent with the list of reaction roles") + .addChannelOption(option => + option.setName('channel') + .setDescription('The channel in which you want to edit the embed for') + .setRequired(true) + ) + ) +} + +export { data }; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + switch (interaction.options.getSubcommand()) { + case 'add': + AddReactionRole.chatInputCommand(client, interaction, guild, user) + break; + case 'remove': + RemoveReactionRole.chatInputCommand(client, interaction, guild, user) + break; + } +} \ No newline at end of file diff --git a/src/bot/commands/reactionrole/add.ts b/src/bot/commands/reactionrole/add.ts new file mode 100644 index 0000000..0952599 --- /dev/null +++ b/src/bot/commands/reactionrole/add.ts @@ -0,0 +1,171 @@ +import { Client, ChatInputCommandInteraction, Role, GuildChannelResolvable, PermissionsBitField, ChannelType } from "discord.js"; + +import parseEmoji from "../../functions/parseEmoji"; +import { schemas } from "../../../database"; + +import YALAS from 'mcstatusbot-logger'; + +import SendReactionRoleEmbed from "../../functions/SendReactionRoleEmbed"; +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("must be done in discord server"); + + const botMember = interaction.guild.members.me; + if (!botMember) { + YALAS.error("reactionrole add: bot in guild null"); + return; + } + + + //get and validate channel + const channel = interaction.options.getChannel('channel'); + if (channel == undefined) { + return interaction.reply({ + embeds: [{ + title: "Channel Not Found", + description: "The selected channel could not be found please try again." + }] + }); + } + + if (channel.type !== ChannelType.GuildText) { + return interaction.reply({ + embeds: [{ + title: "That Will Not Work", + description: "The selected channel is not a text channel please select a text channel." + }] + }); + } + + const botPermSM = botMember.permissionsIn((channel as GuildChannelResolvable)).toArray(); + if (botPermSM && !botPermSM.includes('SendMessages')) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the send message permission in the selected channel." + }] + }); + } + + + //check bot has manage roles perm + const botPermMR = botMember.permissions.has(PermissionsBitField.Flags.ManageRoles); + if (!botPermMR) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the Manage Roles permission in this server." + }] + }); + } + + + //get and validate emoji + const emoji = interaction.options.getString('emoji'); + let cleanEmoji = parseEmoji(emoji); + if (cleanEmoji == null) { + return interaction.reply({ + embeds: [{ + title: "Invalid Emoji", + description: "The selected emoji is invalid please doublecheck it." + }] + }); + } + + if (cleanEmoji == '❌') { + return interaction.reply({ + embeds: [{ + title: "Invalid Emoji", + description: "The selected emoji is used for the ban reaction to avoid confusion you can not use it." + }] + }); + } + + + //get and validate role + const role = interaction.options.getMentionable('role'); + if (!(role instanceof Role)) { + return interaction.reply({ + embeds: [{ + title: "Invalid Role", + description: "The selected role is not a valid role" + }] + }); + } + + //check bot can assign role + const botHighestRole = botMember.roles.highest; + if (role.position >= botHighestRole.position) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: `The role <@&${role.id}> is higher than my role so I can't assign it to users.` + }] + }); + } + + + + await interaction.deferReply(); + //check emoji does net exist for reaction in channel + try { + const reactionRole = await schemas['ReactionRole'].findOne({ + where: { + guild: guild.id, + channel: channel.id, + role: role.id, + reaction: cleanEmoji, + } + }); + + if (reactionRole !== null) { + return interaction.editReply({ + embeds: [{ + title: "Reaction Role Exists", + description: "This emoji is already setup to give selected role in selected channel." + }] + }); + } + } catch (err: any) { + YALAS.error(err) + YALAS.error(err.stack || err); + return interaction.editReply("error when checking for existing reaction role in database."); + } + + const allowReactionRemove: boolean = interaction.options.getBoolean('reaction-remove') || false; + + try { + await schemas['ReactionRole'].create({ + guild: guild.id, + channel: channel.id, + role: role.id, + reaction: cleanEmoji, + reactionRemove: allowReactionRemove + }); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when saving reaction role to database."); + } + + + try { + const textChannel = interaction.guild?.channels.cache.get(channel.id); + if (textChannel === undefined || textChannel.type !== 0) return; + const embed = await SendReactionRoleEmbed(textChannel, guild.id, channel.id); + + + return interaction.editReply({ + embeds: [{ + title: "Success", + description: "The reaction role has been created and a new embed sent.\n-# Note you will need to delete the old embed" + }] + }); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when making reaction role embed."); + } + +} \ No newline at end of file diff --git a/src/bot/commands/reactionrole/remove.ts b/src/bot/commands/reactionrole/remove.ts new file mode 100644 index 0000000..550f018 --- /dev/null +++ b/src/bot/commands/reactionrole/remove.ts @@ -0,0 +1,113 @@ +import { GuildInstance } from "../../../database/schemas/Guild"; +import { UserInstance } from "../../../database/schemas/User"; + +import { Client, ChatInputCommandInteraction, Role, GuildChannelResolvable, TextChannel } from "discord.js"; + +import parseEmoji from "../../functions/parseEmoji"; +import { schemas } from "../../../database"; + +import YALAS from 'mcstatusbot-logger'; + +import SendReactionRoleEmbed from "../../functions/SendReactionRoleEmbed"; + + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + if (!interaction.guild) return interaction.reply("must be done in discord server"); + + //get and validate channel + const channel = interaction.options.getChannel('channel'); + if (channel == undefined) { + return interaction.reply({ + embeds: [{ + title: "Channel Not Found", + description: "The selected channel could not be found please try again." + }] + }); + } + + if (channel.type !== 0) { + return interaction.reply({ + embeds: [{ + title: "That Will Not Work", + description: "The selected channel is not a text channel please select a text channel." + }] + }); + } + + const botPermissionsIn = interaction.guild.members.me?.permissionsIn((channel as GuildChannelResolvable)).toArray(); + if (botPermissionsIn && !botPermissionsIn.includes('SendMessages')) { + return interaction.reply({ + embeds: [{ + title: "Missing permission", + description: "you need to give me the send message permission in the selected channel." + }] + }); + } + + //get and validate emoji + const emoji = interaction.options.getString('emoji'); + + let cleanEmoji = parseEmoji(emoji); + if (cleanEmoji == null) { + return interaction.reply({ + embeds: [{ + title: "Invalid Emoji", + description: "The selected emoji is invalid please doublecheck it." + }] + }); + } + + + await interaction.deferReply(); + try { + const reactionRoles = await schemas['ReactionRole'].findAll({ + where: { + guild: guild.id, + channel: channel.id, + reaction: cleanEmoji, + }, + raw: true + }); + + if (reactionRoles.length <= 0) { + return interaction.editReply({ + embeds: [{ + title: "Reaction Role(s) Doesn't Exists", + description: "This reaction could not be found in the selected channel." + }] + }); + } + + for (const rr of reactionRoles) { + try { + await schemas['ReactionRole'].destroy({ where: { id: rr.id } }); + } catch (err: any) { + YALAS.error(err.stack || err); + continue; + } + } + } catch (err: any) { + YALAS.error(err) + YALAS.error(err.stack || err); + return interaction.editReply("error when getting and deleting reaction role in database."); + } + + + try { + const textChannel = interaction.guild?.channels.cache.get(channel.id); + if (textChannel === undefined || textChannel.type !== 0) return; + const embed = await SendReactionRoleEmbed(textChannel, guild.id, channel.id); + + return interaction.editReply({ + embeds: [{ + title: "Success", + description: "The reaction role(s) have been removed and a new embed sent.\n-# Note you will need to delete the old embed" + }] + }); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.editReply("error when making reaction role embed."); + } + +} \ No newline at end of file diff --git a/src/bot/commands/setprefix.ts b/src/bot/commands/setprefix.ts new file mode 100644 index 0000000..ccd5dc6 --- /dev/null +++ b/src/bot/commands/setprefix.ts @@ -0,0 +1,46 @@ +import { Client, ChatInputCommandInteraction, PermissionFlagsBits, SlashCommandBuilder } from "discord.js"; + +import { schemas } from "../../database/index"; + +import YALAS from 'mcstatusbot-logger'; +import { GuildInstance } from "../../database/schemas/Guild"; +import { UserInstance } from "../../database/schemas/User"; + + +const data = { + allowSuspendedUserAccess: false, + command: new SlashCommandBuilder() + .setName('setprefix') + .setDescription("sets the message prefix for your server") + .setDefaultMemberPermissions(PermissionFlagsBits.ManageGuild) + .addStringOption(o => + o.setName('prefix') + .setDescription("the prefix eg . or !") + .setRequired(true) + ) +} + +export { data }; + + +export async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction, guild: GuildInstance, user: UserInstance) { + const prefix = interaction.options.getString('prefix'); + if (prefix == undefined) return; + const prefixLower = prefix.toLowerCase(); + + if (prefix.length > 3) return interaction.reply("the is to long, limit is 3"); + if (guild.prefix === prefixLower) return interaction.reply("the prefix `" + guild.prefix + "` has been set"); + + + try { + await schemas['Guild'].update({ + prefix: prefixLower + }, { + where: { id: guild.id } + }); + return interaction.reply("the prefix `" + prefixLower + "` has been set"); + } catch (err: any) { + YALAS.error(err.stack || err); + return interaction.reply("failed to update prefix."); + } +} \ No newline at end of file diff --git a/src/bot/events/error.js b/src/bot/events/error.js deleted file mode 100644 index 5580851..0000000 --- a/src/bot/events/error.js +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index ec2ea9b..0000000 --- a/src/bot/events/guildMemberAdd.js +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index d4eb5a0..0000000 --- a/src/bot/events/message.js +++ /dev/null @@ -1,74 +0,0 @@ -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, currentServer, 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 deleted file mode 100644 index f93730b..0000000 --- a/src/bot/events/messageReactionAdd.js +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index 0eb23fa..0000000 --- a/src/bot/events/messageReactionRemove.js +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index d648626..0000000 --- a/src/bot/events/ready.js +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index c2f5922..0000000 --- a/src/bot/events/voicestateupdate.js +++ /dev/null @@ -1,71 +0,0 @@ -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/functions/BanReactionHandler.ts b/src/bot/functions/BanReactionHandler.ts new file mode 100644 index 0000000..10ce1ba --- /dev/null +++ b/src/bot/functions/BanReactionHandler.ts @@ -0,0 +1,41 @@ +import { Client, MessageReaction, PartialMessageReaction, User, PartialUser, Guild, Role, GuildMember } from "discord.js"; +import { schemas } from "../../database"; + +import * as YALAS from 'mcstatusbot-logger'; +export default async function ReactionRoleAddHandler(reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) { + + const emoji: string | null = reaction.emoji.id ?? reaction.emoji.name; + const guild: Guild | null = reaction.message.guild; + const channelId: string = reaction.message.channelId; + + + if (guild === null || emoji === null) { + YALAS.error("failed to find guild"); + return false; + } + if (emoji!=='❌') return false; + + + //TODO: implement redis cache or better table lookup + const banReaction = await schemas['BanReaction'].findOne({ + where: { + guild: guild.id, + channel: channelId + }, + raw: true + }); + if (banReaction===null) return false; + + + try { + const member: GuildMember | null = guild.members.cache.get(user.id) || (await guild.members.fetch(user.id).catch(() => null)); + if (!member) return YALAS.error("Ban Reaction Handler: Member not found in the guild '" + guild.id + "'"); + + await member.ban({reason: "ban reaction"}); + return true; + } catch (error){ + YALAS.error("Ban Reaction Handler: Error banning user '" + user.id + "' for guild '" + guild.id + "'"); + YALAS.error(error); + return true; + } +} \ No newline at end of file diff --git a/src/bot/functions/LookupGuild.ts b/src/bot/functions/LookupGuild.ts new file mode 100644 index 0000000..dcdf1ad --- /dev/null +++ b/src/bot/functions/LookupGuild.ts @@ -0,0 +1,29 @@ +import { schemas } from "../../database"; + +import * as YALAS from 'mcstatusbot-logger'; +import { GuildAttributes } from "../../database/schemas/Guild"; +import { Guild } from "discord.js"; + +export default async function LookupGuild(guild: Guild | null): Promise { + if (guild == null) return null; + try { + let guildDoc = await schemas['Guild'].findOne({ where: { id: guild.id } }); + if (guildDoc !== null && guildDoc !== undefined) return guildDoc.dataValues; + //TODO: implement a check to update guild name owner etc + //TODO: make a webhook for defualt guild channel so can then be used and changed when needed for macro cmds + + guildDoc = await schemas['Guild'].create({ + id: guild.id, + name: guild.name, + icon: guild.iconURL(), + owner: guild.ownerId + }); + + return guildDoc.dataValues; + } catch (err: any) { + + YALAS.error(err); + YALAS.error(err.stack || err); + return null; + } +} \ No newline at end of file diff --git a/src/bot/functions/LookupUser.ts b/src/bot/functions/LookupUser.ts new file mode 100644 index 0000000..d8ca54a --- /dev/null +++ b/src/bot/functions/LookupUser.ts @@ -0,0 +1,25 @@ +import { User } from "discord.js"; +import { schemas } from "../../database"; + +import * as YALAS from 'mcstatusbot-logger'; +import { UserAttributes } from '../../database/schemas/User'; +export default async function LookupUser(user: User | null): Promise { + if (user === null) return null + let userDoc; + try { + userDoc = await schemas['User'].findOne({ where: { id: user.id } }); + if (userDoc !== null) return userDoc.dataValues; + //TODO: implement check to update username avatar etc + userDoc = await schemas['User'].create({ + id: user.id, + username: user.username, + avatar: user.avatar, + admin: false, + }); + return userDoc.dataValues; + } catch (err: any) { + YALAS.error(err); + YALAS.error(err.stack || err); + return null; + } +} \ No newline at end of file diff --git a/src/bot/functions/PrefixCache.ts b/src/bot/functions/PrefixCache.ts new file mode 100644 index 0000000..ffe4e93 --- /dev/null +++ b/src/bot/functions/PrefixCache.ts @@ -0,0 +1,34 @@ +//TODO: move to redis cache? +export default class PrefixCache { + private cache = new Map(); + + // Add a value to the cache + set(key: string, value: string): void { + this.cache.set(key, value); + } + + // Retrieve a value from the cache + get(key: string): string | null { + return this.cache.get(key)??null; + } + + // Check if a key exists in the cache + has(key: string): boolean { + return this.cache.has(key); + } + + // Remove a key from the cache + delete(key: string): void { + this.cache.delete(key); + } + + // Clear the entire cache + clear(): void { + this.cache.clear(); + } + + // Get the current size of the cache + size(): number { + return this.cache.size; + } +} diff --git a/src/bot/functions/ReactionRoleAddHandler.ts b/src/bot/functions/ReactionRoleAddHandler.ts new file mode 100644 index 0000000..07a3f66 --- /dev/null +++ b/src/bot/functions/ReactionRoleAddHandler.ts @@ -0,0 +1,66 @@ +import { Client, MessageReaction, PartialMessageReaction, User, PartialUser, Guild, Role, GuildMember, TextChannel } from "discord.js"; +import { schemas } from "../../database"; + +import * as YALAS from 'mcstatusbot-logger'; +export default async function ReactionRoleAddHandler(reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) { + if (reaction.message.guild === undefined) return; + const emoji: string | null = reaction.emoji.id ?? reaction.emoji.name; + const guild: Guild | null = reaction.message.guild; + const channel = reaction.message.channel; + + if (guild === null || emoji === null) return YALAS.error("failed to find guild"); + + + async function getRole(roleId: string) { + if (!guild) return null; + let role: Role | null | undefined = guild.roles.cache.get(roleId); + if (role) return role + try { + role = await guild.roles.fetch(roleId); + } catch (error) { + YALAS.error('Error fetching role:'); + YALAS.error(error); + return null; + } + if (role) return role + return null; + } + + // Get the member from the user + const member: GuildMember | null = guild.members.cache.get(user.id) || (await guild.members.fetch(user.id).catch(() => null)); + if (!member) return YALAS.error("Member not found in the guild '" + guild.id + "'"); + + + const reactionRoles = await schemas['ReactionRole'].findAll({ + where: { + guild: guild.id, + channel: channel.id, + reaction: emoji, + }, + raw: true + }); + + for (const rRole of reactionRoles) { + let role = await getRole(rRole.role); + if (role == null) return YALAS.error("failed to find role '" + rRole.role + "' in guild '" + guild.id + "' ") + + //TODO: implement audit log + // Add the role to the member + try { + await member.roles.add(role); + if (process.env.DEBUG === 'true') YALAS.info(`Added role "${role.name}" to user "${user.tag}".`); + } catch (error) { + + //TODO: implement ignoring this reaction remove to avoid errors with msg reaction remove handler + //reaction.users.remove(user.id); + + const errUsrMsg = await (channel as TextChannel).send(`Sorry <@!${user.id}>, that did not work please try again later or ask a moderator.`); + + setTimeout(() => { + errUsrMsg.delete().catch((e: any) => null); + }, 3500); + YALAS.error("Error adding role '" + role.id + "' to user '" + user.id + "' for guild '" + guild.id + "'"); + YALAS.error(error); + } + } +} \ No newline at end of file diff --git a/src/bot/functions/ReactionRoleRemoveHandler.ts b/src/bot/functions/ReactionRoleRemoveHandler.ts new file mode 100644 index 0000000..ecfd35b --- /dev/null +++ b/src/bot/functions/ReactionRoleRemoveHandler.ts @@ -0,0 +1,68 @@ +import { Client, MessageReaction, PartialMessageReaction, User, PartialUser, Guild, Role, GuildMember, TextChannel, flatten } from "discord.js"; +import { schemas } from "../../database"; + +import * as YALAS from 'mcstatusbot-logger'; +export default async function ReactionRoleRemoveHandler(reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) { + if (reaction.message.guild === undefined) return; + const emoji: string | null = reaction.emoji.id ?? reaction.emoji.name; + const guild: Guild | null = reaction.message.guild; + const channel = reaction.message.channel; + + if (guild === null || emoji === null) return YALAS.error("failed to find guild"); + if (emoji=='❌') return; + + + async function getRole(roleId: string) { + if (!guild) return null; + let role: Role | null | undefined = guild.roles.cache.get(roleId); + if (role) return role + try { + role = await guild.roles.fetch(roleId); + } catch (error) { + YALAS.error('Error fetching role:'); + YALAS.error(error); + return null; + } + if (role) return role + return null; + } + + // Get the member from the user + const member: GuildMember | null = guild.members.cache.get(user.id) || (await guild.members.fetch(user.id).catch(() => null)); + if (!member) return YALAS.error("Member not found in the guild '" + guild.id + "'"); + + + const reactionRoles = await schemas['ReactionRole'].findAll({ + where: { + guild: guild.id, + channel: channel.id, + reaction: emoji, + }, + + }); + + for (let rRole of reactionRoles) { + let role = await getRole(rRole.dataValues.role); + if (role == null) return YALAS.error("failed to find role '" + rRole.role + "' in guild '" + guild.id + "' ") + + if (rRole.dataValues.reactionRemove === false) continue; + + //TODO: implement audit log + // Add the role to the member + try { + await member.roles.remove(role); + if (process.env.DEBUG === 'true') YALAS.info(`Added role "${role.name}" to user "${user.tag}".`); + } catch (error) { + reaction.users.remove(user.id); + + const errUsrMsg = await (channel as TextChannel).send(`Sorry <@!${user.id}>, that did not work please try again later or ask a moderator.`); + + setTimeout(() => { + errUsrMsg.delete().catch((e: any) => null); + }, 3500); + YALAS.error("Error removingW role '" + role.id + "' to user '" + user.id + "' for guild '" + guild.id + "'"); + YALAS.error(error); + } + } + //TODO: log roles added to user/errors +} \ No newline at end of file diff --git a/src/bot/functions/SendReactionRoleEmbed.ts b/src/bot/functions/SendReactionRoleEmbed.ts new file mode 100644 index 0000000..50961da --- /dev/null +++ b/src/bot/functions/SendReactionRoleEmbed.ts @@ -0,0 +1,71 @@ +import { EmbedBuilder, ColorResolvable, TextChannel } from 'discord.js'; +import { schemas } from '../../database'; +import { ReactionRoleInstance } from '../../database/schemas/ReactionRole'; + + + +function isOnlyNumbers(str: string): boolean { + return /^\d+$/.test(str); +} +interface GroupedReactionRole { + reaction: string; + roles: string[] +} +function groupReactionRoles(reactionRoles: ReactionRoleInstance[]): GroupedReactionRole[] { + return reactionRoles.reduce((acc, item) => { + const { reaction, role } = item; + + // Find if the reaction already exists in the accumulator + let existing = acc.find(group => group.reaction === reaction); + + if (existing) { + existing.roles.push(role); + } else { + // Otherwise, create a new group for this reaction + acc.push({ + reaction, + roles: [role], + }); + } + return acc; + }, [] as GroupedReactionRole[]); +} + + + +export default async function SendReactionRoleEmbed(roleChannel: TextChannel, guildId: string, channelId: string) { + + let config = { where: { guild: guildId, channel: channelId }, raw: true }; + let reactionRoleEmbedConfig = await schemas['ReactionRoleEmbed'].findOne(config); + if (reactionRoleEmbedConfig == null) { + reactionRoleEmbedConfig = await schemas['ReactionRoleEmbed'].create({ guild: guildId, channel: channelId }, { raw: true }); + } + + if (reactionRoleEmbedConfig === null) return { title: "error" }; + let reactionRoles = await schemas['ReactionRole'].findAll(config); + let groupedReactionRoles = groupReactionRoles(reactionRoles); + //[[icon]] [[role]] + + let description: string = ""; + + for (const rr of groupedReactionRoles) { + let roleRow = reactionRoleEmbedConfig.listItemTemplate.replace('[[icon]]', isOnlyNumbers(rr.reaction) ? `<:emoji:${rr.reaction}>` : rr.reaction).replace('[[roles]]', rr.roles.map(r => `<@&${r}>`).join(reactionRoleEmbedConfig.roleSeparator)); + description += roleRow + '\n'; + } + + // inside a command, event listener, etc. + const embed = new EmbedBuilder() + .setColor((reactionRoleEmbedConfig.color as ColorResolvable)) + .setTitle(reactionRoleEmbedConfig.title) + .setURL(reactionRoleEmbedConfig.icon) + //.setAuthor({ name: 'Some name', iconURL: 'https://i.imgur.com/AfFp7pu.png', url: 'https://discord.js.org' }) + .setDescription(description.substring(0, 4096)) + //.setFooter({ text: 'Some footer text here', iconURL: 'https://i.imgur.com/AfFp7pu.png' }); + + + const reactionRoleEmbedMsg = await roleChannel.send({ embeds: [embed] }); + for (const reactionRole of reactionRoles) { + await reactionRoleEmbedMsg.react(reactionRole.reaction); + } + return reactionRoleEmbedMsg; +} \ No newline at end of file diff --git a/src/bot/functions/parseEmoji.ts b/src/bot/functions/parseEmoji.ts new file mode 100644 index 0000000..d54ab35 --- /dev/null +++ b/src/bot/functions/parseEmoji.ts @@ -0,0 +1,11 @@ +export default function parseEmoji(input: string | null): string | null { + + if (input === null || input == ' ' || input === ' ') return null; + const customEmojiMatch = input.match(/^<:.*:(\d+)>$/); + if (customEmojiMatch) return customEmojiMatch[1]; + + const unicodeEmojiRegex = /^[\p{Emoji_Presentation}\p{Emoji}\uFE0F]+$/u; + if (unicodeEmojiRegex.test(input)) return input; + + return null; +} \ No newline at end of file diff --git a/src/bot/handlers/InteractionCreate.ts b/src/bot/handlers/InteractionCreate.ts new file mode 100644 index 0000000..a5318d4 --- /dev/null +++ b/src/bot/handlers/InteractionCreate.ts @@ -0,0 +1,60 @@ +import { Client, Interaction, ChatInputCommandInteraction, User } from "discord.js"; +import { schemas } from '../../database/index'; + +import YALAS from 'mcstatusbot-logger'; +import LookupUser from "../functions/LookupUser"; +import LookupGuild from "../functions/LookupGuild"; + + + +async function chatInputCommand(client: Client, interaction: ChatInputCommandInteraction) { + if (!client.commands.has(interaction.commandName)) return YALAS.warn("no command found for interaction: " + interaction.commandName); + + if (interaction.guild===null) return interaction.reply("only works in discord servers sorry."); + + //get user from db + const user = await LookupUser(interaction.user) + if (user == null) return interaction.reply({ + embeds: [{ title: "could not get your user info", description: "we could not get or create your user info to the bots database." }] + }); + + + //get discord guild from db + const guild = await LookupGuild(interaction.guild); + if (guild == null) return interaction.reply({ + embeds: [{ title: "could not get discord server", description: "we could not get or create your discord server to the bots database." }] + }) + + + const command = client.commands.get(interaction.commandName); + + if (command.data.allowSuspendedUserAccess == false && user.suspended == true) { + return interaction.reply({ + embeds: [{ + title: "You Are Suspended", + description: "Your account has been suspended/blocked from using this bot." + }] + }); + } + + try { + await command.chatInputCommand(client, interaction, guild, user); + } catch (err: any) { + YALAS.error("could not run command"); + YALAS.error(err.stack || err) + } +} + + + + + +export default async function InteractionCreate(client: Client, interaction: Interaction) { + if (interaction.member && interaction.member.user.bot) return; + + //slash command + if (interaction.isChatInputCommand()) return chatInputCommand(client, interaction); + //modal/form + //if (interaction.isModalSubmit()) return modalSubmit(client, interaction, guild, user); + +} \ No newline at end of file diff --git a/src/bot/handlers/MessageCreate.ts b/src/bot/handlers/MessageCreate.ts new file mode 100644 index 0000000..f1eddfe --- /dev/null +++ b/src/bot/handlers/MessageCreate.ts @@ -0,0 +1,73 @@ +import { Client, Guild, Message } from "discord.js"; +import MessageMacro from "../messageHandler/plugins/MesageMacro"; +import { schemas } from "../../database"; +import LookupUser from "../functions/LookupUser"; + +import * as YALAS from 'mcstatusbot-logger'; +import { UserAttributes } from "../../database/schemas/User"; +import { GuildAttributes } from "../../database/schemas/Guild"; +import LookupGuild from "../functions/LookupGuild"; +import { MessageCreateOptions } from "../../../types/MessageCreate"; + + +import PrefixCache from "../functions/PrefixCache"; + + +function splitAndRemovePrefix(prefix: string, content: string): string[] { + if (content.startsWith(prefix)) { + content = content.slice(prefix.length).trim(); + } + return content.split(/\s+/); +} + + +const guildPrefixs = new PrefixCache(); + + +async function getGuildPrefix(guild: Guild) { + + let p = guildPrefixs.get(guild.id); + if (p !== null) return p; + + let guildDoc: GuildAttributes | null = await schemas['Guild'].findOne({ + where: { id: guild.id }, + attributes: ['prefix'], + raw: true, + }); + + if (guildDoc === null) { + guildDoc = await LookupGuild(guild); + if (guildDoc === null) { + YALAS.error("MessageCreate: guild '" + guild.id + "' will not add to db"); + return null; + } + } + guildPrefixs.set(guild.id, guildDoc.prefix); + p = guildDoc.prefix; + return p; +} + + +async function GuildMsg(client: Client, msg: Message) { + if (msg.guild === null) return; + + const prefix: string | null = await getGuildPrefix(msg.guild); + + //r + if (prefix===null) return; + if (!msg.content.toLowerCase().startsWith(prefix)) return; + + const msgCmds: string[] = splitAndRemovePrefix(prefix, msg.content); + try { + await MessageMacro(client, msg, msgCmds); + } catch (err: any) { + YALAS.error("MessageCreate: failed to run message macro plugin"); + YALAS.error(err.stack || err); + } + return; +} + +export default async function MessageCreate(client: Client, msg: Message) { + await GuildMsg(client, msg); + return; +} \ No newline at end of file diff --git a/src/bot/handlers/MessageReactionAdd.ts b/src/bot/handlers/MessageReactionAdd.ts new file mode 100644 index 0000000..14039ed --- /dev/null +++ b/src/bot/handlers/MessageReactionAdd.ts @@ -0,0 +1,35 @@ +import { Client, MessageReaction, PartialMessageReaction, User, PartialUser } from "discord.js"; +import ReactionRoleAddHandler from "../functions/ReactionRoleAddHandler"; +import BanReactionHandler from "../functions/BanReactionHandler"; + +import * as YALAS from 'mcstatusbot-logger'; +export default async function MessageReactionAdd(client: Client, reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) { + + if (reaction.partial) { + try { + await reaction.fetch(); + } catch (error) { + YALAS.error('Something went wrong when fetching the message:', error); + return; + } + } + if (!reaction.message.guild) return; + + + if (user.partial) { + try { + await user.fetch(); + } catch (error) { + YALAS.error('Something went wrong when fetching the user:', error); + return; + } + } + if (user.id === client.user?.id) return; + + const memberBanned = await BanReactionHandler(reaction, user); + //non need to try and run reactions roles if member banned + if (memberBanned === true) return; + + await ReactionRoleAddHandler(reaction, user); + return; +} diff --git a/src/bot/handlers/MessageReactionRemove.ts b/src/bot/handlers/MessageReactionRemove.ts new file mode 100644 index 0000000..c8e2b2f --- /dev/null +++ b/src/bot/handlers/MessageReactionRemove.ts @@ -0,0 +1,29 @@ +import { Client, MessageReaction, PartialMessageReaction, User, PartialUser } from "discord.js"; +import ReactionRoleRemoveHandler from "../functions/ReactionRoleRemoveHandler"; + +import * as YALAS from 'mcstatusbot-logger'; +export default async function MessageReactionRemove(client: Client, reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser) { + if (!reaction.message.guild) return; + // When a reaction is received, check if the structure is partial + if (reaction.partial) { + try { + await reaction.fetch(); + } catch (error) { + YALAS.error('Something went wrong when fetching the message:', error); + // Return as `reaction.message.author` may be undefined/null + return; + } + } + + if (user.partial) { + try { + await user.fetch(); + } catch (error) { + YALAS.error('Something went wrong when fetching the user:', error); + return; + } + } + if (user.id === client.user?.id) return; + await ReactionRoleRemoveHandler(reaction, user); + return; +} diff --git a/src/bot/handlers/Ready.ts b/src/bot/handlers/Ready.ts new file mode 100644 index 0000000..3d820fd --- /dev/null +++ b/src/bot/handlers/Ready.ts @@ -0,0 +1,19 @@ +import { Client, ActivityType } from 'discord.js'; + +import YALAS from 'mcstatusbot-logger'; + +export default function Ready(client: Client) { + console.log("Ready!"); + YALAS.success("The bot is up and running!"); + YALAS.info(`logged in as ${client.user?.username}#${client.user?.tag}`); + + //TODO: have list of messages in const folder and cycle them allow super admins (ids list in env file) to add from web ui + // Update activity every hour so that it doesn't expire + + if (client.user) client.user.setActivity("you", { type: ActivityType.Watching }); + setInterval(() => { + if (client.user) client.user.setActivity("you", { type: ActivityType.Watching }); + }, 3600000); + + +} \ No newline at end of file diff --git a/src/bot/handlers/addon.js b/src/bot/handlers/addon.js deleted file mode 100644 index df78082..0000000 --- a/src/bot/handlers/addon.js +++ /dev/null @@ -1,13 +0,0 @@ -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 deleted file mode 100644 index e283ada..0000000 --- a/src/bot/handlers/command.js +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index c4e03ff..0000000 --- a/src/bot/handlers/event.js +++ /dev/null @@ -1,10 +0,0 @@ -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/bot/index.ts b/src/bot/index.ts new file mode 100644 index 0000000..45bf251 --- /dev/null +++ b/src/bot/index.ts @@ -0,0 +1,44 @@ +import { readdirSync } from 'fs'; +import { Client, Collection, GatewayIntentBits, Interaction, Events, Partials } from 'discord.js'; +import Ready from './handlers/Ready'; +import InteractionCreate from './handlers/InteractionCreate'; +import MessageCreate from './handlers/MessageCreate'; +import MessageReactionAdd from './handlers/MessageReactionAdd'; +import MessageReactionRemove from './handlers/MessageReactionRemove'; + +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessageReactions, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + GatewayIntentBits.GuildPresences + ], + partials: [Partials.Message, Partials.Channel, Partials.Reaction], +}); + + +//load in slash commands +client.commands = new Collection(); +const commands: string[] = readdirSync(__dirname + '/commands').filter((file: string) => file.endsWith('.js') || file.endsWith('.ts')); + +for (const c of commands) { + const command = require(__dirname + '/commands/' + c); + if (!command.data.command) continue; + if (!command.data.command.name) continue; + client.commands.set(command.data.command.name, command); +} + + +client.once(Events.ClientReady, () => Ready(client)); +client.on(Events.InteractionCreate, (interaction: Interaction) => InteractionCreate(client, interaction)); +client.on(Events.MessageCreate, (msg) => MessageCreate(client, msg)) + +client.on(Events.MessageReactionAdd, (reaction, user) => MessageReactionAdd(client, reaction, user)) +client.on(Events.MessageReactionRemove, (reaction, user) => MessageReactionRemove(client, reaction, user)) + +export async function login(): Promise { + await client.login(process.env.BOT_TOKEN); + return true; +} \ No newline at end of file diff --git a/src/bot/messageHandler/plugins/MesageMacro.ts b/src/bot/messageHandler/plugins/MesageMacro.ts new file mode 100644 index 0000000..146328c --- /dev/null +++ b/src/bot/messageHandler/plugins/MesageMacro.ts @@ -0,0 +1,37 @@ +import { CategoryChannel, Client, DMChannel, GuildBasedChannel, Message, NewsChannel, TextChannel, ThreadChannel } from "discord.js"; +import { UserAttributes } from "../../../database/schemas/User"; +import { GuildAttributes, GuildInstance } from "../../../database/schemas/Guild"; +import { MessageCreateOptions } from "../../../../types/MessageCreate"; +import { schemas } from "../../../database"; +import LookupGuild from "../../functions/LookupGuild"; + +import * as YALAS from 'mcstatusbot-logger'; + +export default async function MessageMacro(client: Client, msg: Message, msgCmds: string[]) { + if (msg.guild === null) return; + if (msg.member === null) return; + + const guild: GuildAttributes | null = await LookupGuild(msg.guild); + if (guild == null) return YALAS.error("MessageCreate guild null") + + + + const msgMacroDoc = await schemas['MessageMacro'].findOne({ + where: { + guild: guild.id, + shortCode: msgCmds[0] + } + }); + if (msgMacroDoc === null) return; + const msgMacro = msgMacroDoc.dataValues; + + if (!msg.member.roles.cache.has(msgMacro.role)) return; + if (msgMacro.deleteShortCode === true) msg.deletable ?? msg.delete().catch((err: any) => null); + + let channel = msgMacro.channel === null ? msg.channel : await msg.guild.channels.fetch(msgMacro.channel); + if (channel === null || channel === undefined) return; + if (!(channel instanceof TextChannel || channel instanceof DMChannel || channel instanceof NewsChannel || channel instanceof ThreadChannel)) return; + + await channel.send(msgMacro.message); + return; +} \ No newline at end of file diff --git a/src/conf/conf.json b/src/conf/conf.json deleted file mode 100644 index e667382..0000000 --- a/src/conf/conf.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "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 deleted file mode 100644 index 18b637a..0000000 --- a/src/conf/functions.js +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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 deleted file mode 100644 index 722071a..0000000 --- a/src/conf/reactionroles.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "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 deleted file mode 100644 index ec6c1fe..0000000 --- a/src/conf/tokens.js +++ /dev/null @@ -1,15 +0,0 @@ -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/database/index.ts b/src/database/index.ts new file mode 100644 index 0000000..64eb17a --- /dev/null +++ b/src/database/index.ts @@ -0,0 +1,51 @@ +import { Sequelize, DataTypes } from 'sequelize'; +//@ts-ignore +import YALAS from 'mcstatusbot-logger'; + +import BanReaction from './schemas/BanReaction'; +import Guild from './schemas/Guild'; +import KickReaction from './schemas/KickReaction'; +import MessageMacro from './schemas/MessageMacro'; +import ReactionRole from './schemas/ReactionRole'; +import ReactionRoleEmbed from './schemas/ReactionRoleEmbed'; +import User from './schemas/User'; + + +if (!process.env.DB_URI) { + YALAS.crash("A database uri must be provided."); + process.exit(1); +} + +const sequelize = new Sequelize(process.env.DB_URI, { + logging: (msg) => { + if (process.env.DEBUG === 'true') console.log(msg) + } +}); + +const schemas = { + BanReaction: BanReaction(sequelize), + Guild: Guild(sequelize), + KickRole: KickReaction(sequelize), + MessageMacro: MessageMacro(sequelize), + ReactionRole: ReactionRole(sequelize), + ReactionRoleEmbed: ReactionRoleEmbed(sequelize), + User: User(sequelize) +}; + + +export async function connect() { + YALAS.info("attempting to connect to db"); + try { + await sequelize.authenticate(); + YALAS.success("Connection has been established successfully."); + } catch (error: any) { + YALAS.crash(error.stack || error); + YALAS.crash("Unable to connect to the database"); + process.exit(1); + } + + return true; +} + + +export { schemas }; \ No newline at end of file diff --git a/src/database/schemas/BanReaction.ts b/src/database/schemas/BanReaction.ts new file mode 100644 index 0000000..391dd83 --- /dev/null +++ b/src/database/schemas/BanReaction.ts @@ -0,0 +1,37 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface BanReactionAttributes { + id: number; + guild: string; + channel: string; +} + +export interface BanReactionCreationAttributes extends Optional { } + +export interface BanReactionInstance + extends Model, + BanReactionAttributes { } + + +export default function BanRole(sequelize: Sequelize) { + const BanReaction = sequelize.define('BanReaction', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + }, + channel: { + type: DataTypes.STRING, + allowNull: false, + } + }); + + // Sync the model with the database + BanReaction.sync({ alter: true }); + + return BanReaction; +} diff --git a/src/database/schemas/Guild.ts b/src/database/schemas/Guild.ts new file mode 100644 index 0000000..d262e9b --- /dev/null +++ b/src/database/schemas/Guild.ts @@ -0,0 +1,74 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface GuildAttributes { + id: string; + name: string; + icon: string | null; + owner: string; + prefix: string; + modAddOnEnableCaps: boolean; + modAddOnEnableFilter: boolean; + modAddOnEnableEmojiSpam: boolean; + logChannel: boolean | null; + webhookURI: string +} + +export interface GuildCreationAttributes extends Optional { } + +export interface GuildInstance + extends Model, + GuildAttributes { } + +export default function Guild(sequelize: Sequelize) { + const Guild = sequelize.define('Guild', { + id: { + type: DataTypes.STRING, + primaryKey: true, + }, + name: { + type: DataTypes.STRING, + allowNull: false, + }, + icon: { + type: DataTypes.STRING, + allowNull: true, + }, + owner: { + type: DataTypes.STRING, + allowNull: false, + }, + prefix: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: '.', + }, + modAddOnEnableCaps: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + modAddOnEnableFilter: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + modAddOnEnableEmojiSpam: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + logChannel: { + type: DataTypes.STRING, + allowNull: true, + }, + webhookURI: { + type: DataTypes.STRING, + allowNull: true, + } + }); + + // Sync the model with the database + Guild.sync({ alter: true }); + + return Guild; +} diff --git a/src/database/schemas/KickReaction.ts b/src/database/schemas/KickReaction.ts new file mode 100644 index 0000000..5344778 --- /dev/null +++ b/src/database/schemas/KickReaction.ts @@ -0,0 +1,41 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface KickReactionAttributes { + id: number; + guild: string; + channel: string; + reaction: string; +} + +export interface KickReactionCreationAttributes extends Optional { } + +export interface KickReactionInstance + extends Model, + KickReactionAttributes { } + +export default function KickRole(sequelize: Sequelize) { + const KickReaction = sequelize.define('KickReaction', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + }, + channel: { + type: DataTypes.STRING, + allowNull: false, + }, + reaction: { + type: DataTypes.STRING, + allowNull: false, + }, + }); + + // Sync the model with the database + KickReaction.sync({ alter: true }); + + return KickReaction; +} diff --git a/src/database/schemas/MessageMacro.ts b/src/database/schemas/MessageMacro.ts new file mode 100644 index 0000000..1ad8145 --- /dev/null +++ b/src/database/schemas/MessageMacro.ts @@ -0,0 +1,63 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface MessageMacroAttributes { + id: number; + guild: string; + channel: string | null; + shortCode: string; + message: string; + role: string; + impersonate: boolean; + deleteShortCode: boolean; +} + +export interface MessageMacroCreationAttributes extends Optional { } + +export interface MessageMacroInstance + extends Model, + MessageMacroAttributes { } + +export default function MessageMacro(sequelize: Sequelize) { + const MessageMacro = sequelize.define('MessageMacro', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + }, + channel: { + type: DataTypes.STRING, + allowNull: true, + }, + shortCode: { + type: DataTypes.STRING(5), + allowNull: false, + }, + message: { + type: DataTypes.STRING(2000), + allowNull: false, + }, + role: { + type: DataTypes.STRING, + allowNull: true, + }, + impersonate: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + deleteShortCode: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + } + }); + + // Sync the model with the database + MessageMacro.sync({ alter: true }); + + return MessageMacro; +} diff --git a/src/database/schemas/ReactionRole.ts b/src/database/schemas/ReactionRole.ts new file mode 100644 index 0000000..05abe2e --- /dev/null +++ b/src/database/schemas/ReactionRole.ts @@ -0,0 +1,52 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface ReactionRoleAttributes { + id: number; + guild: string; + channel: string; + role: string; + reaction: string; + reactionRemove: boolean; +} + +export interface ReactionRoleCreationAttributes extends Optional { } + +export interface ReactionRoleInstance + extends Model, + ReactionRoleAttributes { } + +export default function ReactionRole(sequelize: Sequelize) { + const ReactionRole = sequelize.define('ReactionRole', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + }, + channel: { + type: DataTypes.STRING, + allowNull: false, + }, + role: { + type: DataTypes.STRING, + allowNull: false, + }, + reaction: { + type: DataTypes.STRING, + allowNull: false, + }, + reactionRemove: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: true, + }, + }); + + // Sync the model with the database + ReactionRole.sync({ alter: true }); + + return ReactionRole; +} diff --git a/src/database/schemas/ReactionRoleEmbed.ts b/src/database/schemas/ReactionRoleEmbed.ts new file mode 100644 index 0000000..aa32b6e --- /dev/null +++ b/src/database/schemas/ReactionRoleEmbed.ts @@ -0,0 +1,66 @@ +import { flatten } from 'discord.js'; +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface ReactionRoleEmbedAttributes { + id: number; + guild: string; + channel: string; + title: string; + icon: string | null; + color: string; + roleSeparator: string; + listItemTemplate: string; +} + +export interface ReactionRoleEmbedCreationAttributes extends Optional { } + +export interface ReactionRoleEmbedInstance + extends Model, + ReactionRoleEmbedAttributes { } + +export default function ReactionRoleEmbed(sequelize: Sequelize) { + const ReactionRoleEmbed = sequelize.define('ReactionRoleEmbed', { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + guild: { + type: DataTypes.STRING, + allowNull: false, + }, + channel: { + type: DataTypes.STRING, + allowNull: false, + }, + title: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "Reaction Roles", + }, + icon: { + type: DataTypes.STRING, + allowNull: true, + }, + color: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "#ff0000", + }, + roleSeparator: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: ', ' + }, + listItemTemplate: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "[[icon]] - [[roles]]", + }, + }); + + // Synchronize the model with the database + ReactionRoleEmbed.sync({ alter: true }); + + return ReactionRoleEmbed; +} diff --git a/src/database/schemas/User.ts b/src/database/schemas/User.ts new file mode 100644 index 0000000..b3994df --- /dev/null +++ b/src/database/schemas/User.ts @@ -0,0 +1,45 @@ +import { DataTypes, Sequelize, Model, Optional } from 'sequelize'; + +export interface UserAttributes { + id: string; + username: string; + avatar: string | null; + admin: boolean; + suspended: boolean; +} + +export interface UserCreationAttributes extends Optional { } + +export interface UserInstance extends Model, UserAttributes { } + +export default function defineUser(sequelize: Sequelize) { + const User = sequelize.define('User', { + id: { + type: DataTypes.STRING, + primaryKey: true, + }, + username: { + type: DataTypes.STRING, + allowNull: false, + }, + avatar: { + type: DataTypes.STRING, + allowNull: true, + }, + admin: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + suspended: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + }); + + // Sync the model with the database (optional in production) + User.sync({ alter: true }); + + return User; +} diff --git a/src/express/get/api/api.js b/src/express/get/api/api.js deleted file mode 100644 index f3711ed..0000000 --- a/src/express/get/api/api.js +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index fe5e8e9..0000000 --- a/src/express/get/dashboard/dashboard.js +++ /dev/null @@ -1,159 +0,0 @@ -/* - * 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.cache.get(userInfo.id).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 deleted file mode 100644 index 53521b7..0000000 --- a/src/express/get/dashboard/filter.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 gAccess = false; - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - 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/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'); - }; - }; - }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - } 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" }) - - } - } -} diff --git a/src/express/get/dashboard/message.js b/src/express/get/dashboard/message.js deleted file mode 100644 index afa2b18..0000000 --- a/src/express/get/dashboard/message.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 deleted file mode 100644 index 86dc114..0000000 --- a/src/express/get/dashboard/reactionroles.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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 gAccess = false; - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - let hasAccess = false; - 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'); - }; - }; - }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - } 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" }) - - } - } -} diff --git a/src/express/get/dashboard/server.js b/src/express/get/dashboard/server.js deleted file mode 100644 index 9a903e8..0000000 --- a/src/express/get/dashboard/server.js +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 gAccess = false; - let hasAccess = false; - - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - 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'); - } - }; - }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - - - } 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" }) - - } - } -} diff --git a/src/express/get/er/er.js b/src/express/get/er/er.js deleted file mode 100644 index d10a2ca..0000000 --- a/src/express/get/er/er.js +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index 813807a..0000000 --- a/src/express/get/root/login.js +++ /dev/null @@ -1,8 +0,0 @@ -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 deleted file mode 100644 index 34bdd2e..0000000 --- a/src/express/get/root/root.js +++ /dev/null @@ -1,11 +0,0 @@ -/* - * 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 deleted file mode 100644 index 1aaa798..0000000 --- a/src/express/handlers/get.js +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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 deleted file mode 100644 index fcc5a75..0000000 --- a/src/express/handlers/post.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * 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 deleted file mode 100644 index 59baed1..0000000 --- a/src/express/post/api/api.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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 deleted file mode 100644 index 171061f..0000000 --- a/src/express/post/api/updatefilter.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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 gAccess = false; - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - - 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' }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - } catch (error) { - console.log(error); - res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + domain + '/er' }); - } - } -} diff --git a/src/express/post/api/updateoverview.js b/src/express/post/api/updateoverview.js deleted file mode 100644 index 326e59a..0000000 --- a/src/express/post/api/updateoverview.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 gAccess = false; - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - - 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' }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - } catch (error) { - console.log(error); - res.status(500).JSON({ error: "some error happened", info: "report this if it happenes again. " + domain + '/er' }); - } - - } -} diff --git a/src/express/post/api/updatereactionroles.js b/src/express/post/api/updatereactionroles.js deleted file mode 100644 index 2453821..0000000 --- a/src/express/post/api/updatereactionroles.js +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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 gAccess = false; - await currentUser.guilds.forEach(async (guild) => { - if (guild.id == currentServer.id) { - gAccess = true; - if (guild.userPermission == 'owner' || guild.userPermission == 'MANAGE_GUILD' || currentServer.staff.includes(currentUser.userId)) { - 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' }); - if (gAccess == false) { - return 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 tell the bot owner" }) - } - } catch (error) { - console.log(error); - res.status(500).json({ error: "some error happened", info: "report this if it happenes again." + conf.domain + '/er' }); - } - } -} diff --git a/src/express/post/api/userinfo-update.js b/src/express/post/api/userinfo-update.js deleted file mode 100644 index 5b7a29c..0000000 --- a/src/express/post/api/userinfo-update.js +++ /dev/null @@ -1,24 +0,0 @@ -/* - * 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 deleted file mode 100644 index 26a0aa4..0000000 --- a/src/express/post/api/userinfo.js +++ /dev/null @@ -1,14 +0,0 @@ -/* - * 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 deleted file mode 100644 index 1072b9a..0000000 --- a/src/express/www/static/404.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index 903d3a0..0000000 --- a/src/express/www/static/500.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index cdfe438..0000000 --- a/src/express/www/static/css/dashboard.css +++ /dev/null @@ -1,192 +0,0 @@ -@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 deleted file mode 100644 index 6d4b523..0000000 --- a/src/express/www/static/css/main.css +++ /dev/null @@ -1,65 +0,0 @@ -* { - 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 deleted file mode 100644 index 3244219..0000000 --- a/src/express/www/static/css/navbar.css +++ /dev/null @@ -1,132 +0,0 @@ - /* 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 deleted file mode 100644 index 2278135..0000000 --- a/src/express/www/static/css/styles.css +++ /dev/null @@ -1,232 +0,0 @@ - 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 deleted file mode 100644 index dd32455..0000000 Binary files a/src/express/www/static/favicon.ico and /dev/null differ diff --git a/src/express/www/static/js/client.js b/src/express/www/static/js/client.js deleted file mode 100644 index 24747f2..0000000 --- a/src/express/www/static/js/client.js +++ /dev/null @@ -1,11 +0,0 @@ -//for mobile navbar -function openNav() { - document.getElementById("mobilenavbar").style.width = "250px"; -} - -function closeNav() { - document.getElementById("mobilenavbar").style.width = "0"; -} -if (window.innerWidth <= 280) { - alert("please open your fold phone to use this page") -} \ No newline at end of file diff --git a/src/express/www/static/js/filter.js b/src/express/www/static/js/filter.js deleted file mode 100644 index 0a244cf..0000000 --- a/src/express/www/static/js/filter.js +++ /dev/null @@ -1,109 +0,0 @@ - var normalstr = '
    '; - filterNormal.forEach(function(word) { - normalstr += '
  • ' + word + '
  • '; - }); - 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 deleted file mode 100644 index 14bd9ff..0000000 --- a/src/express/www/static/js/overview.js +++ /dev/null @@ -1,116 +0,0 @@ -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 deleted file mode 100644 index c8cfcda..0000000 --- a/src/express/www/static/js/reactionroles.js +++ /dev/null @@ -1,61 +0,0 @@ -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('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(' ', ''); - var emoji = document.getElementById('ReactionRoleEmoji').value; - for (let i = 0; i < reactionRoles.length; i++) { - if (reactionRoles[i].channelID == channel) { - if (reactionRoles[i].roleID == role) { - if (reactionRoles[i].emoji == emoji) { - reactionRoles.splice(i, 1); - loadroles() - 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 deleted file mode 100644 index 6e29259..0000000 Binary files a/src/express/www/static/loading.gif and /dev/null differ diff --git a/src/express/www/static/logo.png b/src/express/www/static/logo.png deleted file mode 100644 index 1627fbe..0000000 Binary files a/src/express/www/static/logo.png and /dev/null differ diff --git a/src/express/www/views/404.ejs b/src/express/www/views/404.ejs deleted file mode 100644 index 57db2e9..0000000 --- a/src/express/www/views/404.ejs +++ /dev/null @@ -1 +0,0 @@ -404 \ No newline at end of file diff --git a/src/express/www/views/admin.ejs b/src/express/www/views/admin.ejs deleted file mode 100644 index 7d1d20c..0000000 --- a/src/express/www/views/admin.ejs +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - 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 deleted file mode 100644 index 0feb12b..0000000 --- a/src/express/www/views/dashboard/admin-message.ejs +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index a3dae81..0000000 --- a/src/express/www/views/dashboard/filter.ejs +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - 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 deleted file mode 100644 index 1fe6cae..0000000 --- a/src/express/www/views/dashboard/index.ejs +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - - - - - - 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 deleted file mode 100644 index ff61d09..0000000 --- a/src/express/www/views/dashboard/reactionroles.ejs +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - 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 deleted file mode 100644 index 2ed0df7..0000000 --- a/src/express/www/views/dashboard/server.ejs +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - 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 deleted file mode 100644 index 0b089a8..0000000 --- a/src/express/www/views/dashboard/userinfo.ejs +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - - - - 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 deleted file mode 100644 index ceaa145..0000000 --- a/src/express/www/views/embed.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - 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 deleted file mode 100644 index e69de29..0000000 diff --git a/src/express/www/views/error.ejs b/src/express/www/views/error.ejs deleted file mode 100644 index cd072f9..0000000 --- a/src/express/www/views/error.ejs +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - 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 deleted file mode 100644 index a239cd1..0000000 --- a/src/express/www/views/index.ejs +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - <%= 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 deleted file mode 100644 index bc2188a..0000000 --- a/src/express/www/views/partials/dash-navbar.ejs +++ /dev/null @@ -1,19 +0,0 @@ - - - \ 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 deleted file mode 100644 index 9522dc2..0000000 --- a/src/express/www/views/partials/dashboard-menu.ejs +++ /dev/null @@ -1,39 +0,0 @@ - \ No newline at end of file diff --git a/src/express/www/views/partials/footer.ejs b/src/express/www/views/partials/footer.ejs deleted file mode 100644 index dc30e8b..0000000 --- a/src/express/www/views/partials/footer.ejs +++ /dev/null @@ -1,4 +0,0 @@ - \ No newline at end of file diff --git a/src/express/www/views/partials/navbar.ejs b/src/express/www/views/partials/navbar.ejs deleted file mode 100644 index 817552a..0000000 --- a/src/express/www/views/partials/navbar.ejs +++ /dev/null @@ -1,15 +0,0 @@ - - - \ No newline at end of file diff --git a/src/funcs/getserver.js b/src/funcs/getserver.js deleted file mode 100644 index 6c3e077..0000000 --- a/src/funcs/getserver.js +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index eebc01f..0000000 --- a/src/funcs/getuser.js +++ /dev/null @@ -1,14 +0,0 @@ -const User = require('../models/user'); -module.exports = async(message) => { - let currentUser = await User.findOne({ userid: 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; -} diff --git a/src/funcs/otr.js b/src/funcs/otr.js deleted file mode 100644 index bff58e5..0000000 --- a/src/funcs/otr.js +++ /dev/null @@ -1,51 +0,0 @@ -/* - * licence https://github.com/404invalid-user/knightrider/blob/main/LICENCE - */ -const getServer = require('../funcs/getserver'); -const conf = require('../conf/conf.json') -module.exports = { - otrCommand: async function(message, args, Discord, server, messageUser, 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 deleted file mode 100644 index 417b8e9..0000000 --- a/src/funcs/reporterror.js +++ /dev/null @@ -1,33 +0,0 @@ -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 deleted file mode 100644 index 5b1445f..0000000 --- a/src/funcs/startuplog.js +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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/knightrider/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/index.ts b/src/index.ts new file mode 100644 index 0000000..04591c2 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,15 @@ +require('dotenv').config({ path: __dirname + '/../.env' }); + +import { connect } from './database/index'; +import { login } from './bot/index'; +import updateSlashCommands from './updateSlashCommands'; +import { start } from './site/index' + +async function main(): Promise { + await connect(); + await login(); + if (process.env.RELOADCMDS !== 'false') await updateSlashCommands(); + await start(); +} + +main(); \ No newline at end of file diff --git a/src/knightrider.js b/src/knightrider.js deleted file mode 100644 index 4517d6c..0000000 --- a/src/knightrider.js +++ /dev/null @@ -1,17 +0,0 @@ -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 deleted file mode 100644 index 14dc20a..0000000 --- a/src/models/server.js +++ /dev/null @@ -1,214 +0,0 @@ -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 deleted file mode 100644 index de597b9..0000000 --- a/src/models/user.js +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 47d767f..0000000 --- a/src/models/userdashboard.js +++ /dev/null @@ -1,48 +0,0 @@ -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 diff --git a/src/site/index.ts b/src/site/index.ts new file mode 100644 index 0000000..0263d78 --- /dev/null +++ b/src/site/index.ts @@ -0,0 +1,19 @@ +import express, { Express, Request, RequestHandler, Response } from "express"; + + +const website: Express = express(); + + +website.get('/', (req, res) => { + + res.send("h") +}) + + +export async function start() { + + website.listen(process.env.WEBSITE_PORT || 8080, () => { + + }) + +} \ No newline at end of file diff --git a/src/updateSlashCommands.ts b/src/updateSlashCommands.ts new file mode 100644 index 0000000..736bc9a --- /dev/null +++ b/src/updateSlashCommands.ts @@ -0,0 +1,40 @@ +import * as fs from 'fs'; +import { REST } from '@discordjs/rest'; +import { Routes } from 'discord-api-types/v9'; + + +import YALAS from 'mcstatusbot-logger'; + +//makes slash command + + +export default async function updateSlashCommands() { + + if (!process.env.CLIENT_ID) throw new Error("a CLIENT_ID must be included in the env "); + if (!process.env.BOT_TOKEN) throw new Error("a BOT_TOKEN must be included in the env "); + + //add slash commands + + let commands: any[] = []; + const commandFiles = fs.readdirSync(__dirname + '/bot/commands').filter((file) => file.endsWith('.js') || file.endsWith('.ts')); + + for (const file of commandFiles) { + const command = require(`${__dirname}/bot/commands/${file}`); + try { + commands.push(command.data.command.toJSON()); + } catch (err) { + YALAS.error("command " + file + " cant be added because it has no data"); + } + } + + const rest = new REST({ version: '9' }).setToken(process.env.BOT_TOKEN); + try { + YALAS.info("Started refreshing application (/) commands."); + + await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), { body: commands }); + YALAS.success("Successfully reloaded application (/) commands."); + //process.exit(); + } catch (error: any) { + YALAS.error(error.stack || error); + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..9c79a3e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", // Use the latest syntax supported by Node.js 23 + "module": "NodeNext", // Enables ES Modules with support for .js extensions + "moduleResolution": "NodeNext", // Required for NodeNext modules + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "outDir": "./dist", + "rootDir": "./src", + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + "noImplicitAny": false, + "typeRoots": ["./node_modules/@types", "./types"] + }, + "include": ["src/**/*.ts", "types/**/*.d.ts", "types/Client.d.ts"], + "exclude": ["node_modules"] +} \ No newline at end of file diff --git a/types/Client.d.ts b/types/Client.d.ts new file mode 100644 index 0000000..5aa86a4 --- /dev/null +++ b/types/Client.d.ts @@ -0,0 +1,6 @@ +import { Client, Collection } from 'discord.js'; +declare module 'discord.js' { + export interface Client { + commands: Collection; + } +} \ No newline at end of file diff --git a/types/MessageCreate.d.ts b/types/MessageCreate.d.ts new file mode 100644 index 0000000..e347b53 --- /dev/null +++ b/types/MessageCreate.d.ts @@ -0,0 +1,9 @@ +import {GuildAttributes} from '../src/database/schemas/Guild'; +import {UserAttributes} from '../src/database/schemas/User'; + +export interface MessageCreateOptions { + hasPrefix: boolean, + msgCmds: string[], + guild: GuildAttributes, + user: UserAttributes +} \ No newline at end of file