From 586f68b0df9fd5b75689bcba13a48cf56df32960 Mon Sep 17 00:00:00 2001 From: Angels-dev Date: Wed, 7 Aug 2024 01:09:05 +0200 Subject: [PATCH] Version 3.0 sortie, fusion avec JujulBot --- Dockerfile | 16 +- eslint.config.mjs | 23 + package-lock.json | 2312 ++++++++++++----- package.json | 47 +- src/commands/global/amp.ts | 72 +- src/commands/global/boost.ts | 37 + src/commands/global/database.ts | 7 +- src/commands/player/panel.ts | 25 + src/commands/player/play.ts | 3 +- src/commands/player/queue.ts | 19 + src/commands/{global => salonpostam}/crack.ts | 0 .../{global => salonpostam}/freebox.ts | 15 +- src/commands/{global => salonpostam}/papa.ts | 0 src/commands/{global => salonpostam}/parle.ts | 0 src/commands/{global => salonpostam}/spam.ts | 0 .../{global => salonpostam}/update.ts | 0 src/events/client/guildCreate.ts | 6 +- src/events/client/guildMemberAdd.ts | 49 +- src/events/client/guildMemberRemove.ts | 24 +- src/events/client/guildMemberUpdate.ts | 35 + src/events/client/guildUpdate.ts | 5 +- src/events/client/interactionCreate.ts | 5 +- src/events/client/ready.ts | 72 +- src/index.ts | 26 +- src/schemas/guild.ts | 9 + src/utils/amp.ts | 9 +- src/utils/crack.ts | 2 +- src/utils/dbGuildInit.ts | 3 +- src/utils/freebox.ts | 8 +- src/utils/player.ts | 206 ++ src/utils/rss.ts | 4 +- src/utils/twitch.ts | 173 ++ src/utilsAMP/ADSModule/GetInstances.ts | 13 - src/utilsAMP/ADSModule/ManageInstance.ts | 16 - src/utilsAMP/ADSModule/RestartInstance.ts | 16 - src/utilsAMP/ADSModule/Servers.ts | 17 - src/utilsAMP/CheckSession.ts | 13 - src/utilsAMP/Core/Login.ts | 21 - src/utilsCrack/download.ts | 18 - src/utilsCrack/headers.ts | 23 - src/utilsCrack/magnet.ts | 12 - src/utilsCrack/repo.ts | 13 - src/utilsCrack/search.ts | 19 - src/utilsCrack/torrent.ts | 8 - src/utilsPlayer/bots.ts | 1 - src/utilsPlayer/buttons.ts | 1 - src/utilsPlayer/disco.ts | 55 - src/utilsPlayer/edit.ts | 13 - src/utilsPlayer/generate.ts | 76 - src/utilsPlayer/metadata.ts | 24 - src/utilsPlayer/replay.ts | 45 - 51 files changed, 2472 insertions(+), 1144 deletions(-) create mode 100644 eslint.config.mjs mode change 100755 => 100644 package-lock.json create mode 100644 src/commands/global/boost.ts create mode 100755 src/commands/player/panel.ts create mode 100755 src/commands/player/queue.ts rename src/commands/{global => salonpostam}/crack.ts (100%) rename src/commands/{global => salonpostam}/freebox.ts (98%) rename src/commands/{global => salonpostam}/papa.ts (100%) rename src/commands/{global => salonpostam}/parle.ts (100%) rename src/commands/{global => salonpostam}/spam.ts (100%) rename src/commands/{global => salonpostam}/update.ts (100%) create mode 100644 src/events/client/guildMemberUpdate.ts create mode 100644 src/utils/player.ts create mode 100644 src/utils/twitch.ts delete mode 100755 src/utilsAMP/ADSModule/GetInstances.ts delete mode 100755 src/utilsAMP/ADSModule/ManageInstance.ts delete mode 100755 src/utilsAMP/ADSModule/RestartInstance.ts delete mode 100755 src/utilsAMP/ADSModule/Servers.ts delete mode 100755 src/utilsAMP/CheckSession.ts delete mode 100755 src/utilsAMP/Core/Login.ts delete mode 100755 src/utilsCrack/download.ts delete mode 100755 src/utilsCrack/headers.ts delete mode 100755 src/utilsCrack/magnet.ts delete mode 100755 src/utilsCrack/repo.ts delete mode 100755 src/utilsCrack/search.ts delete mode 100755 src/utilsCrack/torrent.ts delete mode 100644 src/utilsPlayer/bots.ts delete mode 100755 src/utilsPlayer/buttons.ts delete mode 100755 src/utilsPlayer/disco.ts delete mode 100755 src/utilsPlayer/edit.ts delete mode 100755 src/utilsPlayer/generate.ts delete mode 100644 src/utilsPlayer/metadata.ts delete mode 100755 src/utilsPlayer/replay.ts diff --git a/Dockerfile b/Dockerfile index d0a9952..15c15de 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:lts-alpine as base +FROM node:lts-alpine ENV NODE_ENV=production WORKDIR /usr/src/app @@ -12,18 +12,4 @@ COPY . . RUN chown -R node /usr/src/app USER node - -FROM base as tamiseur -RUN mv .env1 .env -RUN rm .env2 .env3 -CMD ["npm", "start"] - -FROM base as funky -RUN mv .env2 .env -RUN rm .env1 .env3 -CMD ["npm", "start"] - -FROM base as groove -RUN mv .env3 .env -RUN rm .env1 .env2 CMD ["npm", "start"] \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..964d4ac --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,23 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin" +import tsParser from "@typescript-eslint/parser" +import { FlatCompat } from "@eslint/eslintrc" +import { fileURLToPath } from "node:url" +import path from "node:path" +import js from "@eslint/js" + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}) + +export default [ + ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), + { + plugins: { "@typescript-eslint": typescriptEslint }, + languageOptions: { parser: tsParser }, + rules: { "prefer-const": "off" } + } +] \ No newline at end of file diff --git a/package-lock.json b/package-lock.json old mode 100755 new mode 100644 index ebb8eb8..5c10847 --- a/package-lock.json +++ b/package-lock.json @@ -1,41 +1,62 @@ { "name": "bot_tamiseur", - "version": "2.3.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "bot_tamiseur", - "version": "2.3.0", + "version": "3.0.0", "dependencies": { "@discord-player/equalizer": "^0.2.3", - "@discord-player/extractor": "^4.4.7", - "@discordjs/opus": "^0.9.0", + "@discord-player/extractor": "^4.5.0", "@discordjs/voice": "^0.17.0", "@types/parse-torrent": "^5.8.7", - "axios": "^1.6.8", + "axios": "^1.7.3", "bufferutil": "^4.0.8", "chalk": "^4.1.2", - "discord-player": "^6.6.8", - "discord.js": "^14.15.2", + "discord-player": "^6.7.1", + "discord-player-youtubei": "^1.2.4", + "discord.js": "^14.15.3", "dotenv": "^16.4.5", "iconv-lite": "^0.6.3", - "jsdom": "^24.0.0", - "libsodium-wrappers": "^0.7.13", - "mariadb": "^3.3.0", - "mongoose": "^8.3.5", + "jsdom": "^24.1.1", + "libsodium-wrappers": "^0.7.14", + "mariadb": "^3.3.1", + "mediaplex": "^0.0.9", + "mongoose": "^8.5.2", "parse-torrent": "^9.1.5", - "play-dl": "^1.9.7", "require-all": "^3.0.0", "rss-parser": "^3.13.0", "sqlite3": "^5.1.7", - "utf-8-validate": "^6.0.4" + "ts-node": "^10.9.2", + "utf-8-validate": "^6.0.4", + "websocket": "^1.0.35" }, "devDependencies": { - "@swc/core": "^1.5.7", - "eslint": "^9.2.0", - "nodemon": "^3.1.0", - "prettier": "^3.2.5" + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.8.0", + "@swc/core": "^1.7.6", + "@types/node": "^22.1.0", + "@types/websocket": "^1.0.10", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", + "eslint": "^9.8.0", + "nodemon": "^3.1.4", + "prettier": "^3.3.3", + "terser": "^5.31.3" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, "node_modules/@discord-player/equalizer": { @@ -45,9 +66,9 @@ "license": "MIT" }, "node_modules/@discord-player/extractor": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.4.7.tgz", - "integrity": "sha512-XHG9Y45rQVWk3quf0IJqAj1ybTqiRgAy6vr5hnlaDZeaxXlsHRlDSzmSYl+teFVw2G9bjzR0jIvm8a4BW9hCBw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-4.5.0.tgz", + "integrity": "sha512-7yCvNNMbRIkFewli/ILcbFe9FX8DaTFTajn6ouJ/+76NzjoPsPNGRNmDT6eP69t/DJJrZFhsghyGGmxDKNBo6A==", "license": "MIT", "dependencies": { "file-type": "^16.5.4", @@ -82,9 +103,9 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.1.tgz", - "integrity": "sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.2.tgz", + "integrity": "sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==", "license": "Apache-2.0", "dependencies": { "@discordjs/formatters": "^0.4.0", @@ -126,40 +147,6 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, - "node_modules/@discordjs/node-pre-gyp": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.5.tgz", - "integrity": "sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@discordjs/opus": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.9.0.tgz", - "integrity": "sha512-NEE76A96FtQ5YuoAVlOlB3ryMPrkXbUCTQICHGKb8ShtjXyubGicjRMouHtP1RpuDdm16cDa+oI3aAMo1zQRUQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.5", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/@discordjs/rest": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.3.0.tgz", @@ -195,6 +182,15 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/@discordjs/rest/node_modules/undici": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", + "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, "node_modules/@discordjs/util": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.0.tgz", @@ -227,9 +223,9 @@ } }, "node_modules/@discordjs/ws": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.0.tgz", - "integrity": "sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", "license": "Apache-2.0", "dependencies": { "@discordjs/collection": "^2.1.0", @@ -277,33 +273,59 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, + "node_modules/@eslint/config-array": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", + "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/eslintrc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", - "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", "dev": true, "license": "MIT", "dependencies": { @@ -324,12 +346,46 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/js": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.2.0.tgz", - "integrity": "sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==", + "node_modules/@eslint/eslintrc/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, "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", + "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -350,21 +406,6 @@ "license": "MIT", "optional": true }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -379,17 +420,10 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@humanwhocodes/retry": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.2.4.tgz", - "integrity": "sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", "dev": true, "license": "Apache-2.0", "engines": { @@ -400,10 +434,93 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@mongodb-js/saslprep": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", - "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.8.tgz", + "integrity": "sha512-qKwC/M/nNNaKUBMQ0nuzm47b7ZYWQHN3pcXq4IIcoSBc2hOIrflAxJduIvvqmhoz3gR2TacTAs8vlsCVPkiEdQ==", "license": "MIT", "dependencies": { "sparse-bitfield": "^3.0.3" @@ -474,9 +591,9 @@ } }, "node_modules/@sapphire/async-queue": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.2.tgz", - "integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.3.tgz", + "integrity": "sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==", "license": "MIT", "engines": { "node": ">=v14.0.0", @@ -507,15 +624,15 @@ } }, "node_modules/@swc/core": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.7.tgz", - "integrity": "sha512-U4qJRBefIJNJDRCCiVtkfa/hpiZ7w0R6kASea+/KLp+vkus3zcLSB8Ub8SvKgTIxjWpwsKcZlPf5nrv4ls46SQ==", - "dev": true, + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.7.6.tgz", + "integrity": "sha512-FZxyao9eQks1MRmUshgsZTmlg/HB2oXK5fghkoWJm/1CU2q2kaJlVDll2as5j+rmWiwkp0Gidlq8wlXcEEAO+g==", + "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "0.1.7" + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.12" }, "engines": { "node": ">=10" @@ -525,19 +642,19 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.5.7", - "@swc/core-darwin-x64": "1.5.7", - "@swc/core-linux-arm-gnueabihf": "1.5.7", - "@swc/core-linux-arm64-gnu": "1.5.7", - "@swc/core-linux-arm64-musl": "1.5.7", - "@swc/core-linux-x64-gnu": "1.5.7", - "@swc/core-linux-x64-musl": "1.5.7", - "@swc/core-win32-arm64-msvc": "1.5.7", - "@swc/core-win32-ia32-msvc": "1.5.7", - "@swc/core-win32-x64-msvc": "1.5.7" + "@swc/core-darwin-arm64": "1.7.6", + "@swc/core-darwin-x64": "1.7.6", + "@swc/core-linux-arm-gnueabihf": "1.7.6", + "@swc/core-linux-arm64-gnu": "1.7.6", + "@swc/core-linux-arm64-musl": "1.7.6", + "@swc/core-linux-x64-gnu": "1.7.6", + "@swc/core-linux-x64-musl": "1.7.6", + "@swc/core-win32-arm64-msvc": "1.7.6", + "@swc/core-win32-ia32-msvc": "1.7.6", + "@swc/core-win32-x64-msvc": "1.7.6" }, "peerDependencies": { - "@swc/helpers": "^0.5.0" + "@swc/helpers": "*" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -546,9 +663,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.7.tgz", - "integrity": "sha512-bZLVHPTpH3h6yhwVl395k0Mtx8v6CGhq5r4KQdAoPbADU974Mauz1b6ViHAJ74O0IVE5vyy7tD3OpkQxL/vMDQ==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.7.6.tgz", + "integrity": "sha512-6lYHey84ZzsdtC7UuPheM4Rm0Inzxm6Sb8U6dmKc4eCx8JL0LfWG4LC5RsdsrTxnjTsbriWlnhZBffh8ijUHIQ==", "cpu": [ "arm64" ], @@ -563,9 +680,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.7.tgz", - "integrity": "sha512-RpUyu2GsviwTc2qVajPL0l8nf2vKj5wzO3WkLSHAHEJbiUZk83NJrZd1RVbEknIMO7+Uyjh54hEh8R26jSByaw==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.7.6.tgz", + "integrity": "sha512-Fyl+8aH9O5rpx4O7r2KnsPpoi32iWoKOYKiipeTbGjQ/E95tNPxbmsz4yqE8Ovldcga60IPJ5OKQA3HWRiuzdw==", "cpu": [ "x64" ], @@ -580,9 +697,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.7.tgz", - "integrity": "sha512-cTZWTnCXLABOuvWiv6nQQM0hP6ZWEkzdgDvztgHI/+u/MvtzJBN5lBQ2lue/9sSFYLMqzqff5EHKlFtrJCA9dQ==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.7.6.tgz", + "integrity": "sha512-2WxYTqFaOx48GKC2cbO1/IntA+w+kfCFy436Ij7qRqqtV/WAvTM9TC1OmiFbqq436rSot52qYmX8fkwdB5UcLQ==", "cpu": [ "arm" ], @@ -597,9 +714,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.7.tgz", - "integrity": "sha512-hoeTJFBiE/IJP30Be7djWF8Q5KVgkbDtjySmvYLg9P94bHg9TJPSQoC72tXx/oXOgXvElDe/GMybru0UxhKx4g==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.7.6.tgz", + "integrity": "sha512-TBEGMSe0LhvPe4S7E68c7VzgT3OMu4VTmBLS7B2aHv4v8uZO92Khpp7L0WqgYU1y5eMjk+XLDLi4kokiNHv/Hg==", "cpu": [ "arm64" ], @@ -614,9 +731,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.7.tgz", - "integrity": "sha512-+NDhK+IFTiVK1/o7EXdCeF2hEzCiaRSrb9zD7X2Z7inwWlxAntcSuzZW7Y6BRqGQH89KA91qYgwbnjgTQ22PiQ==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.7.6.tgz", + "integrity": "sha512-QI8QGL0HGT42tj7F1A+YAzhGkJjUcvvTfI1e2m704W0Enl2/UIK9v5D1zvQzYwusRyKuaQfbeBRYDh0NcLOGLg==", "cpu": [ "arm64" ], @@ -631,9 +748,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.7.tgz", - "integrity": "sha512-25GXpJmeFxKB+7pbY7YQLhWWjkYlR+kHz5I3j9WRl3Lp4v4UD67OGXwPe+DIcHqcouA1fhLhsgHJWtsaNOMBNg==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.7.6.tgz", + "integrity": "sha512-61AYVzhjuNQAVIKKWOJu3H0/pFD28RYJGxnGg3YMhvRLRyuWNyY5Nyyj2WkKcz/ON+g38Arlz00NT1LDIViRLg==", "cpu": [ "x64" ], @@ -648,9 +765,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.7.tgz", - "integrity": "sha512-0VN9Y5EAPBESmSPPsCJzplZHV26akC0sIgd3Hc/7S/1GkSMoeuVL+V9vt+F/cCuzr4VidzSkqftdP3qEIsXSpg==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.7.6.tgz", + "integrity": "sha512-hQFznpfLK8XajfAAN9Cjs0w/aVmO7iu9VZvInyrTCRcPqxV5O+rvrhRxKvC1LRMZXr5M6JRSRtepp5w+TK4kAw==", "cpu": [ "x64" ], @@ -665,9 +782,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.7.tgz", - "integrity": "sha512-RtoNnstBwy5VloNCvmvYNApkTmuCe4sNcoYWpmY7C1+bPR+6SOo8im1G6/FpNem8AR5fcZCmXHWQ+EUmRWJyuA==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.7.6.tgz", + "integrity": "sha512-Aqsd9afykVMuekzjm4X4TDqwxmG4CrzoOSFe0hZrn9SMio72l5eAPnMtYoe5LsIqtjV8MNprLfXaNbjHjTegmA==", "cpu": [ "arm64" ], @@ -682,9 +799,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.7.tgz", - "integrity": "sha512-Xm0TfvcmmspvQg1s4+USL3x8D+YPAfX2JHygvxAnCJ0EHun8cm2zvfNBcsTlnwYb0ybFWXXY129aq1wgFC9TpQ==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.7.6.tgz", + "integrity": "sha512-9h0hYnOeRVNeQgHQTvD1Im67faNSSzBZ7Adtxyu9urNLfBTJilMllFd2QuGHlKW5+uaT6ZH7ZWDb+c/enx7Lcg==", "cpu": [ "ia32" ], @@ -699,9 +816,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.7.tgz", - "integrity": "sha512-tp43WfJLCsKLQKBmjmY/0vv1slVywR5Q4qKjF5OIY8QijaEW7/8VwPyUyVoJZEnDgv9jKtUTG5PzqtIYPZGnyg==", + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.7.6.tgz", + "integrity": "sha512-izeoB8glCSe6IIDQmrVm6bvR9muk9TeKgmtY7b6l1BwL4BFnTUk4dMmpbntT90bEVQn3JPCaPtUG4HfL8VuyuA==", "cpu": [ "x64" ], @@ -719,14 +836,14 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, + "devOptional": true, "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.7.tgz", - "integrity": "sha512-scHWahbHF0eyj3JsxG9CFJgFdFNaVQCNAimBlT6PzS3n/HptxqREjsm4OH6AN3lYcffZYSPxXW8ua2BEHp0lJQ==", - "dev": true, + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.12.tgz", + "integrity": "sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==", + "devOptional": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -748,6 +865,30 @@ "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, "node_modules/@types/geojson": { "version": "7946.0.14", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", @@ -764,12 +905,12 @@ } }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.13.0" } }, "node_modules/@types/parse-torrent": { @@ -798,45 +939,254 @@ "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", "license": "MIT" }, + "node_modules/@types/websocket": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.10.tgz", + "integrity": "sha512-svjGZvPB7EzuYS94cI7a+qhwgGU1y89wUgjT6E2wVUfmAGIvRfT7obBvRtnhXCSsoMdlG4gBFGE7MfkIXZLoww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/whatwg-url": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.4.tgz", - "integrity": "sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", "license": "MIT", "dependencies": { "@types/webidl-conversions": "*" } }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.0.1.tgz", + "integrity": "sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/type-utils": "8.0.1", + "@typescript-eslint/utils": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.0.1.tgz", + "integrity": "sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", + "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.0.1.tgz", + "integrity": "sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.0.1", + "@typescript-eslint/utils": "8.0.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", + "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", + "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/visitor-keys": "8.0.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", + "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.0.1", + "@typescript-eslint/types": "8.0.1", + "@typescript-eslint/typescript-estree": "8.0.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", + "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.0.1", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vladfrangu/async_event_emitter": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz", - "integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.5.tgz", + "integrity": "sha512-J7T3gUr3Wz0l7Ni1f9upgBZ7+J22/Q1B7dl0X6fG+fTsD+H+31DIosMHj4Um1dWQwqbcQ3oQf+YS2foYkDc9cQ==", "license": "MIT", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, + "node_modules/@web-scrobbler/metadata-filter": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@web-scrobbler/metadata-filter/-/metadata-filter-3.2.0.tgz", + "integrity": "sha512-K2Wkq9AOJkgj4Hk9g0flKnNWYkJy1GTPpHTgpNLU5OXaXgqPKLyrtb62M1cIxMN3ESH6XGvPKM92VEl/Gc3Rog==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "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==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -855,16 +1205,28 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "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==", + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "license": "MIT", "dependencies": { - "debug": "4" + "acorn": "^8.11.0" }, "engines": { - "node": ">= 6.0.0" + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/agentkeepalive": { @@ -915,6 +1277,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -953,21 +1316,30 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "license": "ISC", + "optional": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "license": "MIT" + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -975,6 +1347,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -982,9 +1364,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.3.tgz", + "integrity": "sha512-Ar7ND9pU99eJ9GpoGQKhKf58GpUOgnzuaB7ueNQ5BMi0p+LZ5oaEnfF999fAArcTIBwXTCHAmGcHOZJaWPq9Nw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -996,6 +1378,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true, "license": "MIT" }, "node_modules/base64-js": { @@ -1090,32 +1473,32 @@ "license": "ISC" }, "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==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "balanced-match": "^1.0.0" + } + }, + "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, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/bson": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", - "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.8.0.tgz", + "integrity": "sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==", "license": "Apache-2.0", "engines": { "node": ">=16.20.1" @@ -1145,6 +1528,13 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, "node_modules/bufferutil": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", @@ -1227,27 +1617,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1328,6 +1697,7 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", + "optional": true, "bin": { "color-support": "bin.js" } @@ -1344,17 +1714,32 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true, "license": "MIT" }, "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": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" + "license": "ISC", + "optional": true + }, + "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==", + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -1411,6 +1796,25 @@ "node": ">=18" } }, + "node_modules/cssstyle/node_modules/rrweb-cssom": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "license": "MIT" + }, + "node_modules/d": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", + "license": "ISC", + "dependencies": { + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -1434,9 +1838,9 @@ } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { "ms": "2.1.2" @@ -1500,7 +1904,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/denque": { "version": "2.1.0", @@ -1520,6 +1925,28 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/discord-api-types": { "version": "0.37.83", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", @@ -1527,23 +1954,36 @@ "license": "MIT" }, "node_modules/discord-player": { - "version": "6.6.8", - "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.6.8.tgz", - "integrity": "sha512-aZQxtWbHaQPYs0KWU3XObxQLabWg7RWvLlytEitVsqbyfoBFKv2KMYX4swq0/I6eBbu2755z80pbvwU7ycjmsw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-6.7.1.tgz", + "integrity": "sha512-ScQmChpZebpVzs+RMsSkCXSORUIXUR3aHsEssGZSLKrbWnregt3jVc39emftTt6EfarZ2TvTK262mXeAYPzpcQ==", "license": "MIT", "dependencies": { "@discord-player/equalizer": "^0.2.3", "@discord-player/ffmpeg": "^0.1.0", "@discord-player/utils": "^0.2.2", + "@web-scrobbler/metadata-filter": "^3.1.0", "discord-voip": "^0.1.3", - "ip": "^1.1.8", "libsodium-wrappers": "^0.7.13" }, "funding": { "url": "https://github.com/Androz2091/discord-player?sponsor=1" }, "peerDependencies": { - "@discord-player/extractor": "^4.4.7" + "@discord-player/extractor": "^4.5.0" + } + }, + "node_modules/discord-player-youtubei": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/discord-player-youtubei/-/discord-player-youtubei-1.2.4.tgz", + "integrity": "sha512-kx6cXUz5tMUI+2E6ntRUCckCYYgFNWF872l6N3s4W29Jgmm+kkbefytogfsTM06ePncd1MQp6hBHoufr6b1TVQ==", + "license": "Creative Commons", + "dependencies": { + "undici": "^6.19.2", + "youtubei.js": "^10.3.0" + }, + "bin": { + "discord-player-youtubei": "bin/index.js" } }, "node_modules/discord-voip": { @@ -1565,17 +2005,17 @@ } }, "node_modules/discord.js": { - "version": "14.15.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.2.tgz", - "integrity": "sha512-wGD37YCaTUNprtpqMIRuNiswwsvSWXrHykBSm2SAosoTYut0VUDj9yo9t4iLtMKvuhI49zYkvKc2TNdzdvpJhg==", + "version": "14.15.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.3.tgz", + "integrity": "sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==", "license": "Apache-2.0", "dependencies": { - "@discordjs/builders": "^1.8.1", + "@discordjs/builders": "^1.8.2", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.4.0", "@discordjs/rest": "^2.3.0", "@discordjs/util": "^1.1.0", - "@discordjs/ws": "^1.1.0", + "@discordjs/ws": "^1.1.1", "@sapphire/snowflake": "3.5.3", "discord-api-types": "0.37.83", "fast-deep-equal": "3.1.3", @@ -1590,6 +2030,21 @@ "url": "https://github.com/discordjs/discord.js?sponsor" } }, + "node_modules/discord.js/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, + "node_modules/discord.js/node_modules/undici": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", + "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "license": "MIT", + "engines": { + "node": ">=18.0" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -1661,7 +2116,8 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/encoding": { "version": "0.1.13", @@ -1711,6 +2167,46 @@ "license": "MIT", "optional": true }, + "node_modules/es5-ext": { + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1725,29 +2221,29 @@ } }, "node_modules/eslint": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.2.0.tgz", - "integrity": "sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==", + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", + "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^3.0.2", - "@eslint/js": "9.2.0", - "@humanwhocodes/config-array": "^0.13.0", + "@eslint-community/regexpp": "^4.11.0", + "@eslint/config-array": "^0.17.1", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.8.0", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.2.3", + "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.1", + "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", - "espree": "^10.0.1", - "esquery": "^1.4.2", + "espree": "^10.1.0", + "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", @@ -1773,13 +2269,13 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" } }, "node_modules/eslint-scope": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz", - "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", + "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -1794,6 +2290,30 @@ } }, "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", @@ -1806,14 +2326,42 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" }, @@ -1824,10 +2372,23 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -1870,6 +2431,16 @@ "node": ">=0.10.0" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1879,12 +2450,51 @@ "node": ">=6" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, "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==", "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/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, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "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", @@ -1969,9 +2579,9 @@ "license": "MIT" }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -2087,7 +2697,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -2105,23 +2716,24 @@ } }, "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "license": "ISC", + "optional": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", + "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" + "wide-align": "^1.1.5" }, "engines": { - "node": ">=10" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/genius-lyrics": { @@ -2156,7 +2768,9 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "license": "ISC", + "optional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -2185,6 +2799,30 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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==", + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -2198,6 +2836,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -2205,21 +2864,28 @@ "license": "ISC", "optional": true }, - "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==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/he": { "version": "1.2.0", @@ -2268,29 +2934,17 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/humanize-ms": { @@ -2400,7 +3054,9 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "license": "ISC", + "optional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -2418,12 +3074,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC" }, - "node_modules/ip": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", - "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", - "license": "MIT" - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -2466,6 +3116,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", + "optional": true, "engines": { "node": ">=8" } @@ -2516,6 +3167,12 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "license": "MIT" }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2533,22 +3190,16 @@ "unfetch": "^5.0.0" } }, - "node_modules/isomorphic-unfetch/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "node_modules/jintr": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jintr/-/jintr-2.1.1.tgz", + "integrity": "sha512-89cwX4ouogeDGOBsEVsVYsnWWvWjchmwXBB4kiBhmjOKw19FiOKhNhMhpxhTlK2ctl7DS+d/ethfmuBpzoNNgA==", + "funding": [ + "https://github.com/sponsors/LuanRT" + ], "license": "MIT", "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "acorn": "^8.8.0" } }, "node_modules/js-yaml": { @@ -2572,9 +3223,9 @@ "optional": true }, "node_modules/jsdom": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", - "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", + "version": "24.1.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.1.tgz", + "integrity": "sha512-5O1wWV99Jhq4DV7rCLIoZ/UIhyQeDR7wHVyZAHAshbrvZsLs+Xzz7gtwnlJTJDjleiTKh54F4dXrX70vJQTyJQ==", "license": "MIT", "dependencies": { "cssstyle": "^4.0.1", @@ -2582,21 +3233,21 @@ "decimal.js": "^10.4.3", "form-data": "^4.0.0", "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.7", + "nwsapi": "^2.2.12", "parse5": "^7.1.2", - "rrweb-cssom": "^0.6.0", + "rrweb-cssom": "^0.7.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.3", + "tough-cookie": "^4.1.4", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0", - "ws": "^8.16.0", + "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "engines": { @@ -2611,31 +3262,6 @@ } } }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/jsdom/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2691,18 +3317,18 @@ } }, "node_modules/libsodium": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.13.tgz", - "integrity": "sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.14.tgz", + "integrity": "sha512-/pOd7eO6oZrfORquRTC4284OUJFcMi8F3Vnc9xtRBT0teLfOUxWIItaBFF3odYjZ7nlJNwnLdUVEUFHxVyX/Sw==", "license": "ISC" }, "node_modules/libsodium-wrappers": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz", - "integrity": "sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.14.tgz", + "integrity": "sha512-300TtsePizhJZ7HjLmWr6hLHAgJUxIGhapSw+EwfCtDuWaEmEdGXSQv6j6qFw0bs9l4vS2NH9BtOHfXAq6h5kQ==", "license": "ISC", "dependencies": { - "libsodium": "^0.7.13" + "libsodium": "^0.7.14" } }, "node_modules/locate-path": { @@ -2741,13 +3367,10 @@ "license": "MIT" }, "node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, "node_modules/magic-bytes.js": { "version": "1.10.0", @@ -2779,29 +3402,11 @@ "thirty-two": "^1.0.2" } }, - "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==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "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==", + "license": "ISC" }, "node_modules/make-fetch-happen": { "version": "9.1.0", @@ -2831,6 +3436,19 @@ "node": ">= 10" } }, + "node_modules/make-fetch-happen/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==", + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -2846,6 +3464,20 @@ "node": ">= 6" } }, + "node_modules/make-fetch-happen/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2860,9 +3492,9 @@ } }, "node_modules/mariadb": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.0.tgz", - "integrity": "sha512-sAL4bJgbfCAtXcE8bXI+NAMzVaPNkIU8hRZUXYfgNFoWB9U57G3XQiMeCx/A6IrS6y7kGwBLylrwgsZQ8kUYlw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-3.3.1.tgz", + "integrity": "sha512-L8bh4iuZU3J8H7Co7rQ6OY9FDLItAN1rGy8kPA7Dyxo8AiHADuuONoypKKp1pE09drs6e5LR7UW9luLZ/A4znA==", "license": "LGPL-2.1-or-later", "dependencies": { "@types/geojson": "^7946.0.14", @@ -2875,12 +3507,229 @@ "node": ">= 14" } }, + "node_modules/mariadb/node_modules/@types/node": { + "version": "20.14.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.14.tgz", + "integrity": "sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/mariadb/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT" + }, + "node_modules/mediaplex": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex/-/mediaplex-0.0.9.tgz", + "integrity": "sha512-D907iMYWey2RA5T0EtE82RgY3ufFYZ95/5jjty01SOSUOK8lIudjMpkaMwEewk1/tU1XpthR2/ca0U4MTGSIUw==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "mediaplex-android-arm64": "0.0.9", + "mediaplex-darwin-arm64": "0.0.9", + "mediaplex-darwin-universal": "0.0.9", + "mediaplex-darwin-x64": "0.0.9", + "mediaplex-freebsd-x64": "0.0.9", + "mediaplex-linux-arm-gnueabihf": "0.0.9", + "mediaplex-linux-x64-gnu": "0.0.9", + "mediaplex-win32-arm64-msvc": "0.0.9", + "mediaplex-win32-ia32-msvc": "0.0.9", + "mediaplex-win32-x64-msvc": "0.0.9" + } + }, + "node_modules/mediaplex-android-arm64": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-android-arm64/-/mediaplex-android-arm64-0.0.9.tgz", + "integrity": "sha512-XAQlZwMcMO2Rk91CL4dK9OgsXa97Ahchd4bu3/DkzTxOXZQUmMZX4yEAN4FjjQctxMefBY9oh5ZdewBAffk+Fg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-darwin-arm64": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-darwin-arm64/-/mediaplex-darwin-arm64-0.0.9.tgz", + "integrity": "sha512-Q79D2jxlJ8vtdj5rlV2HgzSqINSMxZC+wpcHkGHZ/lEATh0fC5OlKdjk3wZRgfEEnY851TBuVvZoRJgJYEnKag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-darwin-universal": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-darwin-universal/-/mediaplex-darwin-universal-0.0.9.tgz", + "integrity": "sha512-hyptA3BKr8SgDbdop8kTS9xQ4rwnYiiwqG3cHCdHj2qaWRjMus6JF6ep27A9GTDs4rFSsSXKivZZ2IlOHEW9OA==", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-darwin-x64": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-darwin-x64/-/mediaplex-darwin-x64-0.0.9.tgz", + "integrity": "sha512-gSznB2pTt0QikrqwvNUYcFfUVkVkZiNijw5aaIZDTZfWvyFQk3HtenSQ82zwk4UKt7IfrChgh/7RLmQqOnym2g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-freebsd-x64": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-freebsd-x64/-/mediaplex-freebsd-x64-0.0.9.tgz", + "integrity": "sha512-fcCEMLTkyPNb8dYwv+3xKIGBgLKvyw/DX4KDAw0gWy378j8aB+D7HjVupI/XWZODrzkSvIiYabCx0oy4Nyz8dg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-linux-arm-gnueabihf": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-linux-arm-gnueabihf/-/mediaplex-linux-arm-gnueabihf-0.0.9.tgz", + "integrity": "sha512-ZmXcv81pxgM11/R4d5WVu0ss2Pgi2eTKR/uW9cz5wUHI5uAVsI1Wf8Gufv/h24JsvLDv2e31BUmls742WzvHIQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-linux-x64-gnu": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-linux-x64-gnu/-/mediaplex-linux-x64-gnu-0.0.9.tgz", + "integrity": "sha512-Qfzb5BcxX1N1J5ukns5DTruze/ivJJIbK0OuKCBLMoufctPMPlZKKUUJNrro088Lp0AtDXzbQoV4cVAK5nm4UQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-win32-arm64-msvc": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-win32-arm64-msvc/-/mediaplex-win32-arm64-msvc-0.0.9.tgz", + "integrity": "sha512-c3FDtvg2DAoe0EWSh0vIhPwfpHLgEmW8uGajtyON5W5/ygAslAuK9Q9CemHfLfUbeko2r0RlGm2gpygn1PAzLQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-win32-ia32-msvc": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-win32-ia32-msvc/-/mediaplex-win32-ia32-msvc-0.0.9.tgz", + "integrity": "sha512-ScmLR3wB6norxTXrD4JRYs9EhnbhimjXieDfmgy9DJIagxDiWQ3oxfoj8aUg1bdiS62MIiW78jQxtGUb7z8xkw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/mediaplex-win32-x64-msvc": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/mediaplex-win32-x64-msvc/-/mediaplex-win32-x64-msvc-0.0.9.tgz", + "integrity": "sha512-0H6d4AdciOam1k2iBROjePNE5FA1QkQZ2PqmODAO4ElVEBylgWzGheyAKEyZcmdjNrHORJLl2+XpIssAvsKxag==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "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==", "license": "MIT" }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -2915,15 +3764,19 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -3049,13 +3902,13 @@ "license": "MIT" }, "node_modules/mongodb": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.5.0.tgz", - "integrity": "sha512-Fozq68InT+JKABGLqctgtb8P56pRrJFkbhW0ux+x1mdHeyinor8oNzJqwLjV/t5X5nJGfTlluxfyMnOXNggIUA==", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.7.0.tgz", + "integrity": "sha512-TMKyHdtMcO0fYBNORiYdmM25ijsHs+Njs963r4Tro4OQZzqYigAzYQouwWRg4OIaiLRUEGUh/1UAcH5lxdSLIA==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.5", - "bson": "^6.4.0", + "bson": "^6.7.0", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -3130,14 +3983,14 @@ } }, "node_modules/mongoose": { - "version": "8.3.5", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.3.5.tgz", - "integrity": "sha512-2zqeAjHjCqT1o5HeUCvkE9tUHsXwemnwEZ2SKnUxsaP8p1a+UcSQSNbnSuOzUVePMwLETrsvLIRdFLjsNfCgWA==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.5.2.tgz", + "integrity": "sha512-GZB4rHMdYfGatV+23IpCrqFbyCOjCNOHXgWbirr92KRwTEncBrtW3kgU9vmpKjsGf7nMmnAy06SwWUv1vhDkSg==", "license": "MIT", "dependencies": { - "bson": "^6.5.0", + "bson": "^6.7.0", "kareem": "2.6.3", - "mongodb": "6.5.0", + "mongodb": "6.7.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -3207,10 +4060,16 @@ "node": ">= 0.6" } }, + "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==", + "license": "ISC" + }, "node_modules/node-abi": { - "version": "3.62.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.62.0.tgz", - "integrity": "sha512-CPMcGa+y33xuL1E0TcNIu4YyaZCxnnvkVaEXrsosR3FxN+fV8xvb7Mzpb7IgKler10qeMkE6+Dp8qJhpzdq35g==", + "version": "3.65.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.65.0.tgz", + "integrity": "sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==", "license": "MIT", "dependencies": { "semver": "^7.3.5" @@ -3220,9 +4079,9 @@ } }, "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "license": "MIT" }, "node_modules/node-domexception": { @@ -3245,45 +4104,21 @@ } }, "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": "4.x || >=6.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/node-gyp": { @@ -3322,56 +4157,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-gyp/node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/node-html-parser": { "version": "6.1.13", "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", @@ -3383,9 +4168,9 @@ } }, "node_modules/nodemon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.0.tgz", - "integrity": "sha512-xqlktYlDMCepBJd43ZQhjWwMw2obW/JRvkrLxq5RCNcuDDX1DbcPT+qT1IlIIdf+DhnWs90JpTMe+Y5KxOchvA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3411,11 +4196,59 @@ "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/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, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/nodemon/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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nodemon/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, + "license": "MIT", + "dependencies": { + "has-flag": "^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==", "license": "ISC", + "optional": true, "dependencies": { "abbrev": "1" }, @@ -3437,15 +4270,20 @@ } }, "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "license": "ISC", + "optional": true, "dependencies": { - "are-we-there-yet": "^2.0.0", + "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", + "gauge": "^4.0.3", "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/nth-check": { @@ -3461,20 +4299,11 @@ } }, "node_modules/nwsapi": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", - "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.12.tgz", + "integrity": "sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==", "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3622,6 +4451,7 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -3636,6 +4466,16 @@ "node": ">=8" } }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/peek-readable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", @@ -3662,24 +4502,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/play-audio": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz", - "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==", - "license": "GPL-3.0" - }, - "node_modules/play-dl": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.7.tgz", - "integrity": "sha512-KpgerWxUCY4s9Mhze2qdqPhiqd8Ve6HufpH9mBH3FN+vux55qSh6WJKDabfie8IBHN7lnrAlYcT/UdGax58c2A==", - "license": "GPL-3.0", - "dependencies": { - "play-audio": "^0.5.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/prebuild-install": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.2.tgz", @@ -3717,9 +4539,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "license": "MIT", "bin": { @@ -3965,11 +4787,55 @@ "node-fetch": "^2.6.0" } }, + "node_modules/reverbnation-scraper/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/reverbnation-scraper/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/reverbnation-scraper/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/reverbnation-scraper/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "license": "ISC", + "optional": true, "dependencies": { "glob": "^7.1.3" }, @@ -3981,9 +4847,9 @@ } }, "node_modules/rrweb-cssom": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz", - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "license": "MIT" }, "node_modules/rss-parser": { @@ -4062,9 +4928,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", "license": "ISC" }, "node_modules/saxes": { @@ -4080,9 +4946,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4095,7 +4961,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/shebang-command": { "version": "2.0.0", @@ -4130,7 +4997,8 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "license": "ISC", + "optional": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -4200,6 +5068,16 @@ "node": ">=10" } }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -4241,25 +5119,47 @@ "node": ">= 10" } }, - "node_modules/soundcloud.ts": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.5.2.tgz", - "integrity": "sha512-/pc72HWYJpSpup+mJBE9pT31JsrMcxJGBlip3Vem+0Fsscg98xh1/7I2nCpAKuMAeV6MVyrisI8TfjO6T7qKJg==", + "node_modules/socks-proxy-agent/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==", "license": "MIT", + "optional": true, "dependencies": { - "undici": "^5.22.1" - } - }, - "node_modules/soundcloud.ts/node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" + "debug": "4" }, "engines": { - "node": ">=14.0" + "node": ">= 6.0.0" + } + }, + "node_modules/soundcloud.ts": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.5.3.tgz", + "integrity": "sha512-ZMH6gG5e7WqJrIYXTv14MNArPhx3WzfrL1Ij/2qBDW8mVbNJc8lxOQOc4kLvrfvDl5TkCdZa7zXOiwD6ESXq+g==", + "license": "MIT", + "dependencies": { + "undici": "^6.17.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, "node_modules/sparse-bitfield": { @@ -4272,22 +5172,22 @@ } }, "node_modules/spotify-uri": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-4.0.1.tgz", - "integrity": "sha512-dEt8UN5fSsZpcPk8HOEHkv29U71kefKjcYt2dopsShrkIZhXtDXe9Xse4xq0GW6831LnEZFry5mpzm1HV/TNLw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-4.1.0.tgz", + "integrity": "sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng==", "license": "MIT", "engines": { "node": ">= 16" } }, "node_modules/spotify-url-info": { - "version": "3.2.14", - "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.2.14.tgz", - "integrity": "sha512-sZHGTSitrTyfZOUvImojkdl8tUOccrM4KCuzm33FQKxSFYsdHx2vdiw1JZSglhk42pB3dWk8jBqP0+/JxUdHBw==", + "version": "3.2.16", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.2.16.tgz", + "integrity": "sha512-szXt1PLt8lqhaXsTNYH7zPd+EBj6Ha0xtqitqicCijGX6x/jYvn6wgGaK2F1OQfJzx8lxDNfZbtarn4DxzaZ2Q==", "license": "MIT", "dependencies": { "himalaya": "~1.1.0", - "spotify-uri": "~4.0.0" + "spotify-uri": "~4.1.0" }, "engines": { "node": ">= 12" @@ -4324,15 +5224,6 @@ } } }, - "node_modules/sqlite3/node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", - "license": "MIT", - "engines": { - "node": "^16 || ^18 || >= 20" - } - }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -4360,6 +5251,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", + "optional": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -4373,6 +5265,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -4412,16 +5305,15 @@ } }, "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, + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/symbol-tree": { @@ -4490,6 +5382,25 @@ "node": ">=8" } }, + "node_modules/terser": { + "version": "5.31.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", + "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -4572,16 +5483,72 @@ "node": ">=18" } }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "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==", "license": "MIT" }, + "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==", + "license": "MIT", + "dependencies": { + "@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" + }, + "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.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "license": "0BSD" }, "node_modules/tunnel-agent": { @@ -4596,6 +5563,12 @@ "node": "*" } }, + "node_modules/type": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", + "integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==", + "license": "ISC" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -4609,6 +5582,29 @@ "node": ">= 0.8.0" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4617,18 +5613,18 @@ "license": "MIT" }, "node_modules/undici": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", - "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", + "version": "6.19.5", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.5.tgz", + "integrity": "sha512-LryC15SWzqQsREHIOUybavaIHF5IoL0dJ9aWWxL/PgT1KfqAW5225FZpDUFlt9xiDMS2/S7DOKhFWA7RLksWdg==", "license": "MIT", "engines": { - "node": ">=18.0" + "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", "license": "MIT" }, "node_modules/unfetch": { @@ -4708,6 +5704,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "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==", + "license": "MIT" + }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", @@ -4738,6 +5740,51 @@ "node": ">=12" } }, + "node_modules/websocket": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz", + "integrity": "sha512-/REy6amwPZl44DDzvRCkaI1q1bIiQB0mEFQLUrhz3z2EK91cp3n72rAjUlrTP0zV22HJIUOVHQGPxhFRjxjt+Q==", + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.63", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/websocket/node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, "node_modules/whatwg-encoding": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", @@ -4793,6 +5840,7 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "license": "ISC", + "optional": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -4814,9 +5862,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -4871,12 +5919,30 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "license": "MIT" }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "license": "MIT", + "engines": { + "node": ">=0.10.32" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -4895,6 +5961,32 @@ "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.11.tgz", "integrity": "sha512-3oHiS2x7PpMiDRW7Cq8nz1bkAIBOJHoOwkPl/oncM/+A9/3xxMDgMLGW2dsBEP1DHFyRXYTVABgfbdwHF8sXXQ==", "license": "Apache-2.0" + }, + "node_modules/youtubei.js": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-10.3.0.tgz", + "integrity": "sha512-tLmeJCECK2xF2hZZtF2nEqirdKVNLFSDpa0LhTaXY3tngtL7doQXyy7M2CLueramDTlmCnFaW+rctHirTPFaRQ==", + "funding": [ + "https://github.com/sponsors/LuanRT" + ], + "license": "MIT", + "dependencies": { + "jintr": "^2.1.1", + "tslib": "^2.5.0", + "undici": "^5.19.1" + } + }, + "node_modules/youtubei.js/node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } } } } diff --git a/package.json b/package.json index 73fa9a1..e6f9d34 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "bot_tamiseur", "description": "Listen to music and use fun commands with your friends!", - "version": "2.3.1", + "version": "3.0.0", "author": { "name": "Zachary Guénot" }, @@ -10,36 +10,49 @@ "format": "prettier --write .", "start": "ts-node src/index.ts", "dev": "nodemon -e ts src/index.ts", - "build": "ncc build src/index.ts -o dist" + "build": "tsc && terser ./dist -o ./dist", + "lint": "eslint src/**/*.ts" }, + "//": [ + "Garder chalk à la version 4.1.2 pour éviter un bug ESM avec la version >=5.0.0" + ], "dependencies": { "@discord-player/equalizer": "^0.2.3", - "@discord-player/extractor": "^4.4.7", - "@discordjs/opus": "^0.9.0", + "@discord-player/extractor": "^4.5.0", "@discordjs/voice": "^0.17.0", "@types/parse-torrent": "^5.8.7", - "axios": "^1.6.8", + "axios": "^1.7.3", "bufferutil": "^4.0.8", "chalk": "^4.1.2", - "discord-player": "^6.6.8", - "discord.js": "^14.15.2", + "discord-player": "^6.7.1", + "discord-player-youtubei": "^1.2.4", + "discord.js": "^14.15.3", "dotenv": "^16.4.5", "iconv-lite": "^0.6.3", - "jsdom": "^24.0.0", - "libsodium-wrappers": "^0.7.13", - "mariadb": "^3.3.0", - "mongoose": "^8.3.5", + "jsdom": "^24.1.1", + "libsodium-wrappers": "^0.7.14", + "mariadb": "^3.3.1", + "mediaplex": "^0.0.9", + "mongoose": "^8.5.2", "parse-torrent": "^9.1.5", - "play-dl": "^1.9.7", "require-all": "^3.0.0", "rss-parser": "^3.13.0", "sqlite3": "^5.1.7", - "utf-8-validate": "^6.0.4" + "ts-node": "^10.9.2", + "utf-8-validate": "^6.0.4", + "websocket": "^1.0.35" }, "devDependencies": { - "@swc/core": "^1.5.7", - "eslint": "^9.2.0", - "nodemon": "^3.1.0", - "prettier": "^3.2.5" + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.8.0", + "@swc/core": "^1.7.6", + "@types/node": "^22.1.0", + "@types/websocket": "^1.0.10", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", + "eslint": "^9.8.0", + "nodemon": "^3.1.4", + "prettier": "^3.3.3", + "terser": "^5.31.3" } } diff --git a/src/commands/global/amp.ts b/src/commands/global/amp.ts index 5bc00cd..1ff9edf 100755 --- a/src/commands/global/amp.ts +++ b/src/commands/global/amp.ts @@ -1,35 +1,45 @@ -import { SlashCommandBuilder, ChatInputCommandInteraction, AutocompleteInteraction, EmbedBuilder, inlineCode } from 'discord.js' -import * as AMP from '../../utils/amp' +import { SlashCommandBuilder, ChatInputCommandInteraction, AutocompleteInteraction, ApplicationCommandOptionChoiceData, EmbedBuilder, inlineCode, PermissionFlagsBits } from 'discord.js' import dbGuild from '../../schemas/guild' +import * as AMP from '../../utils/amp' -interface ListInstancesResult { - status: string - data: [ - Host: { - AvailableInstances: any[] - FriendlyName: string - } - ] -} interface InstanceFields { name: string value: string inline: boolean } - -interface failData { - Title: string - Message: string +interface InstanceResult { + status: string + data: [ + Host + ] } -interface errorData { - error_code: string +interface Host { + AvailableInstances: Instance[] + FriendlyName: string +} +interface Instance { + InstanceID: string + FriendlyName: string + Running: boolean + Module: string + Port: number +} +interface FailMsgData { + Title: string + Message: string +} +interface ErrorMsgData { + error_code: string } -function failMsg(data: any) { return `La commande a échouée !\n${inlineCode(`${data.Title}: ${data.Message}`)}` } -function errorMsg(data: any) { return `Y'a eu une erreur !\n${inlineCode(`${data.error_code}`)}` } +function failMsg(data: FailMsgData) { return `La commande a échouée !\n${inlineCode(`${data.Title}: ${data.Message}`)}` } +function errorMsg(data: ErrorMsgData) { return `Y'a eu une erreur !\n${inlineCode(`${data.error_code}`)}` } export default { - data: new SlashCommandBuilder().setName('amp').setDescription('Accède à mon panel de jeu AMP !') + data: new SlashCommandBuilder() + .setName('amp') + .setDescription('Accède à mon panel de jeu AMP !') + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .addSubcommand(subcommand => subcommand.setName('login').setDescription("Connectez-vous avant d'effectuer une autre commande !") .addStringOption(option => option.setName('username').setDescription("Nom d'Utilisateur").setRequired(true)) .addStringOption(option => option.setName('password').setDescription('Mot de Passe').setRequired(true)) @@ -71,12 +81,12 @@ export default { } else if (session.status === 'error') return interaction.respond([]) - let choices: any = [] + let choices: ApplicationCommandOptionChoiceData[] = [] let result = await AMP.ADSModule.GetInstances(host, sessionID) if (result.status === 'success') { - let hosts = result.data.result as any[] + let hosts = result.data.result as Host[] hosts.forEach(host => { - let instances = host.AvailableInstances as any[] + let instances = host.AvailableInstances as Instance[] instances.forEach(instance => { if (instance.FriendlyName.includes(query)) choices.push({ name: `${host.FriendlyName} - ${instance.FriendlyName}`, value: instance.InstanceID }) }) @@ -105,10 +115,10 @@ export default { await interaction.deferReply({ ephemeral: true }) let details = { - username: interaction.options.getString('username'), - password: interaction.options.getString('password'), - token: interaction.options.getString('otp') || '', - rememberMe: interaction.options.getBoolean('remember') + username: interaction.options.getString('username') || '', + password: interaction.options.getString('password') || '', + rememberMe: interaction.options.getBoolean('remember') || '', + token: interaction.options.getString('otp') || '' } let result = await AMP.Core.Login(host, details) @@ -146,13 +156,13 @@ export default { if (interaction.options.getSubcommandGroup() == 'instances') { if (interaction.options.getSubcommand() == 'list') { - let result = await AMP.ADSModule.GetInstances(host, sessionID) as ListInstancesResult + let result = await AMP.ADSModule.GetInstances(host, sessionID) as InstanceResult if (result.status === 'success') { await interaction.followUp({ content: `${result.data.length} hôte(s) trouvé(s) !` }) result.data.forEach(async host => { let fields = [] as InstanceFields[] - host.AvailableInstances.forEach(instance => { + host.AvailableInstances.forEach((instance: Instance) => { fields.push({ name: instance.FriendlyName, value: `**Running:** ${instance.Running}\n**Port:** ${instance.Port}\n**Module:** ${instance.Module}`, @@ -168,8 +178,8 @@ export default { return await interaction.channel?.send({ embeds: [embed] }) }) } - else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data)) - else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data)) + else if (result.status === 'fail') return await interaction.followUp(failMsg(result.data as unknown as FailMsgData)) + else if (result.status === 'error') return await interaction.followUp(errorMsg(result.data as unknown as ErrorMsgData)) } else if (interaction.options.getSubcommand() == 'manage') { let instanceID = interaction.options.getString('instance', true) diff --git a/src/commands/global/boost.ts b/src/commands/global/boost.ts new file mode 100644 index 0000000..68896a2 --- /dev/null +++ b/src/commands/global/boost.ts @@ -0,0 +1,37 @@ +import { SlashCommandBuilder, EmbedBuilder, ChatInputCommandInteraction, TextChannel, PermissionFlagsBits } from 'discord.js' + +module.exports = { + data: new SlashCommandBuilder() + .setName('boost') + .setDescription('Tester le boost du serveur !') + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator), + async execute(interaction: ChatInputCommandInteraction) { + if (interaction.guild?.id !== '796327643783626782') return interaction.reply({ content: 'Non !' })// Jujul Community + let member = interaction.member + if (!member) return console.log(`\u001b[1;31m Aucun membre trouvé !`) + + let guild = interaction.guild + if (!guild) return console.log(`\u001b[1;31m Aucun serveur trouvé !`) + + let channel = guild.channels.cache.get('924353449930412153') as TextChannel + if (!channel) return console.log(`\u001b[1;31m Aucun channel trouvé avec l'id "924353449930412153" !`) + + let boostRole = guild.roles.premiumSubscriberRole + if (!boostRole) return console.log(`\u001b[1;31m Aucun rôle de boost trouvé !`) + + if (!guild.members.me) return console.log(`\u001b[1;31m Je ne suis pas sur le serveur !`) + + let embed = new EmbedBuilder() + .setColor(guild.members.me.displayHexColor) + .setTitle(`Nouveau boost de ${member.user.username} !`) + .setDescription(` + Merci à toi pour ce boost.\n + Grâce à toi, on a atteint ${guild.premiumSubscriptionCount} boosts ! + `) + .setThumbnail(member.user.avatar) + .setTimestamp(new Date()) + + await channel.send({ embeds: [embed] }) + await interaction.reply({ content: 'Va voir dans <#924353449930412153> !' }) + } +} \ No newline at end of file diff --git a/src/commands/global/database.ts b/src/commands/global/database.ts index b1b8296..65fc52d 100755 --- a/src/commands/global/database.ts +++ b/src/commands/global/database.ts @@ -1,4 +1,4 @@ -import { SlashCommandBuilder, ChatInputCommandInteraction, EmbedBuilder, APIEmbedField } from 'discord.js' +import { SlashCommandBuilder, ChatInputCommandInteraction, EmbedBuilder, APIEmbedField, PermissionFlagsBits } from 'discord.js' import dbGuildInit from '../../utils/dbGuildInit' import dbGuild from '../../schemas/guild' @@ -23,6 +23,7 @@ export default { data: new SlashCommandBuilder() .setName('database') .setDescription('Communicate with the database') + .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .addSubcommand(subcommand => subcommand.setName('info').setDescription('Returns information about the current guild')) .addSubcommand(subcommand => subcommand.setName('init').setDescription('Force initialize an entry for the current guild in the database')) .addSubcommand(subcommand => subcommand.setName('edit').setDescription('Modify parameters for the current guild') @@ -44,7 +45,9 @@ export default { .setDescription(`Guild **${guildProfile.guildName}** (ID: ${guildProfile.guildId})`) .setThumbnail(guildProfile.guildIcon as string) .setTimestamp() - .addFields(fields as APIEmbedField[]) + //.addFields(fields as APIEmbedField[]) + // Limit the number of fields to 25 + .addFields(fields.slice(0, 25) as APIEmbedField[]) return await interaction.reply({ embeds: [embed] }) } else if (interaction.options.getSubcommand() === 'init') { diff --git a/src/commands/player/panel.ts b/src/commands/player/panel.ts new file mode 100755 index 0000000..992d7b5 --- /dev/null +++ b/src/commands/player/panel.ts @@ -0,0 +1,25 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { playerGenerate } from '../../utils/player' +import getUptime from '../../utils/getUptime' +import { useQueue } from 'discord-player' + +export default { + data: new SlashCommandBuilder() + .setName('panel') + .setDescription('Générer les infos de la lecture en cours.'), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.followUp({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + + let guild = interaction.guild + if (!guild) return await interaction.reply({ content: 'Cette commande n\'est pas disponible en message privé.', ephemeral: true }) + + let client = guild.client + + let { embed, components } = await playerGenerate(guild) + if (components && embed.data.footer) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) + else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) + + return interaction.reply({ embeds: [embed] }) + } +} \ No newline at end of file diff --git a/src/commands/player/play.ts b/src/commands/player/play.ts index 2cebc14..c484680 100755 --- a/src/commands/player/play.ts +++ b/src/commands/player/play.ts @@ -1,9 +1,8 @@ import { SlashCommandBuilder, ChatInputCommandInteraction, AutocompleteInteraction, GuildMember } from 'discord.js' import { useMainPlayer, useQueue, QueryType } from 'discord-player' - import dbGuild from '../../schemas/guild' -export interface TrackSearchResult { name: string, value: string } +interface TrackSearchResult { name: string, value: string } export default { data: new SlashCommandBuilder() diff --git a/src/commands/player/queue.ts b/src/commands/player/queue.ts new file mode 100755 index 0000000..8890f9c --- /dev/null +++ b/src/commands/player/queue.ts @@ -0,0 +1,19 @@ +import { SlashCommandBuilder, ChatInputCommandInteraction } from 'discord.js' +import { useQueue } from 'discord-player' + +export default { + data: new SlashCommandBuilder() + .setName('queue') + .setDescription("Récupérer la file d'attente."), + async execute(interaction: ChatInputCommandInteraction) { + let queue = useQueue(interaction.guild?.id ?? '') + if (!queue) return interaction.reply({ content: 'Aucune file d\'attente en cours, recherche une musique plutôt !' }) + if (!queue.currentTrack) return interaction.reply({ content: 'Aucune musique en cours de lecture.' }) + + let track = `[${queue.currentTrack.title}](${queue.currentTrack.url})` + let tracks = queue.tracks.map((track, index) => { return `${index + 1}. [${track.title}](${track.url})` }) + if (tracks.length === 0) return interaction.reply({ content: `Lecture en cours : ${track} \nAucune musique dans la file d'attente.` }) + + return interaction.reply({ content: `Lecture en cours : ${track} \nFile d'attente actuelle : \n${tracks.join('\n')}` }) + } +} \ No newline at end of file diff --git a/src/commands/global/crack.ts b/src/commands/salonpostam/crack.ts similarity index 100% rename from src/commands/global/crack.ts rename to src/commands/salonpostam/crack.ts diff --git a/src/commands/global/freebox.ts b/src/commands/salonpostam/freebox.ts similarity index 98% rename from src/commands/global/freebox.ts rename to src/commands/salonpostam/freebox.ts index 96ea3ef..44297ba 100644 --- a/src/commands/global/freebox.ts +++ b/src/commands/salonpostam/freebox.ts @@ -1,14 +1,19 @@ import { SlashCommandBuilder, ChatInputCommandInteraction, EmbedBuilder, Message, inlineCode } from 'discord.js' -import https from 'https' +import * as Freebox from '../../utils/freebox' +import dbGuild from '../../schemas/guild' import crypto from 'crypto' +import https from 'https' //import path from 'path' //import fs from 'fs' -import * as Freebox from '../../utils/freebox' -import dbGuild from '../../schemas/guild' +interface ReturnMsgData { + status: string + error_code?: string + Title?: string + Message?: string +} - -function returnMsg(result: any) { +function returnMsg(result: ReturnMsgData) { if (result.status === 'fail') return `La commande a échouée !\n${inlineCode(`${result.Title}: ${result.Message}`)}` if (result.status === 'error') return `Y'a eu une erreur !\n${inlineCode(`${result.error_code}`)}` } diff --git a/src/commands/global/papa.ts b/src/commands/salonpostam/papa.ts similarity index 100% rename from src/commands/global/papa.ts rename to src/commands/salonpostam/papa.ts diff --git a/src/commands/global/parle.ts b/src/commands/salonpostam/parle.ts similarity index 100% rename from src/commands/global/parle.ts rename to src/commands/salonpostam/parle.ts diff --git a/src/commands/global/spam.ts b/src/commands/salonpostam/spam.ts similarity index 100% rename from src/commands/global/spam.ts rename to src/commands/salonpostam/spam.ts diff --git a/src/commands/global/update.ts b/src/commands/salonpostam/update.ts similarity index 100% rename from src/commands/global/update.ts rename to src/commands/salonpostam/update.ts diff --git a/src/events/client/guildCreate.ts b/src/events/client/guildCreate.ts index e29a4d5..19738de 100755 --- a/src/events/client/guildCreate.ts +++ b/src/events/client/guildCreate.ts @@ -4,11 +4,11 @@ import dbGuildInit from '../../utils/dbGuildInit' export default { name: Events.GuildCreate, async execute(guild: Guild) { - console.log(`Joined ${guild.name} with ${guild.memberCount} members`) + console.log(`Joined "${guild.name}" with ${guild.memberCount} members`) let guildProfile = await dbGuildInit(guild) - if (!guildProfile) return console.log(`An error occured while initializing database data for **${guild.name}** !`) + if (!guildProfile) return console.log(`An error occured while initializing database data for "${guild.name}" !`) - console.log(`Database data for new guild **${guildProfile.guildName}** successfully initialized !`) + console.log(`Database data for new guild "${guildProfile.guildName}" successfully initialized !`) } } \ No newline at end of file diff --git a/src/events/client/guildMemberAdd.ts b/src/events/client/guildMemberAdd.ts index 79abb52..7ddbebd 100755 --- a/src/events/client/guildMemberAdd.ts +++ b/src/events/client/guildMemberAdd.ts @@ -1,19 +1,44 @@ -import { Events, GuildMember } from 'discord.js' +import { Events, GuildMember, EmbedBuilder, TextChannel } from 'discord.js' export default { name: Events.GuildMemberAdd, async execute(member: GuildMember) { - if (member.guild.id !== '1086577543651524699') return - member.guild.members.fetch().then(() => { - var i = 0 - member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) - let channel = member.guild.channels.cache.get('1091140609139560508') - if (!channel) return + if (member.guild.id === '1086577543651524699') { // Salon posé tamisé + let guild = member.guild - console.log(channel.name) - console.log(`${i} Gens Posés`) - channel.setName('Changement...') - channel.setName(`${i} Gens Posés`) - }).catch(console.error) + guild.members.fetch().then(() => { + var i = 0 + guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) + + let channel = guild.channels.cache.get('1091140609139560508') + if (!channel) return + + channel.setName('Changement...') + channel.setName(`${i} Gens Posés`) + }).catch(console.error) + } else if (member.guild.id === '796327643783626782') { // Jujul Community + let guild = member.guild + + let channel = guild.channels.cache.get('837248593609097237') as TextChannel + if (!channel) return console.log(`\u001b[1;31m Aucun channel trouvé avec l'id "837248593609097237" !`) + + if (!guild.members.me) return console.log(`\u001b[1;31m Je ne suis pas sur le serveur !`) + + let embed = new EmbedBuilder() + .setColor(guild.members.me.displayHexColor) + .setTitle(`Salut ${member.user.username} !`) + .setDescription(` + Bienvenue sur le serveur de **Jujul** ! + Nous sommes actuellement ${guild.memberCount} membres !\n + N'hésite pas à aller lire le <#797471924367786004> et à aller te présenter dans <#837138238417141791> !\n + Si tu as des questions, + n'hésite pas à les poser dans le <#837110617315344444> !\n + Bon séjour parmi nous ! + `) + .setThumbnail(member.user.avatarURL()) + .setTimestamp(new Date()) + + await channel.send({ embeds: [embed] }) + } } } \ No newline at end of file diff --git a/src/events/client/guildMemberRemove.ts b/src/events/client/guildMemberRemove.ts index 50b9d4e..cb57791 100755 --- a/src/events/client/guildMemberRemove.ts +++ b/src/events/client/guildMemberRemove.ts @@ -3,17 +3,19 @@ import { Events, GuildMember } from 'discord.js' export default { name: Events.GuildMemberRemove, async execute(member: GuildMember) { - if (member.guild.id !== '1086577543651524699') return - member.guild.members.fetch().then(() => { - var i = 0 - member.guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) - let channel = member.guild.channels.cache.get('1091140609139560508') - if (!channel) return + if (member.guild.id === '1086577543651524699') { // Salon posé tamisé + let guild = member.guild - console.log(channel.name) - console.log(`${i} Gens Posés`) - channel.setName('Changement...') - channel.setName(`${i} Gens Posés`) - }).catch(console.error) + guild.members.fetch().then(() => { + var i = 0 + guild.members.cache.forEach(async member => { if (!member.user.bot) i++ }) + + let channel = guild.channels.cache.get('1091140609139560508') + if (!channel) return + + channel.setName('Changement...') + channel.setName(`${i} Gens Posés`) + }).catch(console.error) + } } } \ No newline at end of file diff --git a/src/events/client/guildMemberUpdate.ts b/src/events/client/guildMemberUpdate.ts new file mode 100644 index 0000000..f7c7452 --- /dev/null +++ b/src/events/client/guildMemberUpdate.ts @@ -0,0 +1,35 @@ +import { Events, GuildMember, EmbedBuilder, TextChannel } from 'discord.js' + +export default { + name: Events.GuildMemberUpdate, + async execute(oldMember: GuildMember, newMember: GuildMember) { + if (newMember.guild.id === '796327643783626782') { // Jujul Community + let guild = newMember.guild + + let channel = guild.channels.cache.get('924353449930412153') as TextChannel + if (!channel) return console.log(`\u001b[1;31m Aucun channel trouvé avec l'id "924353449930412153" !`) + + let boostRole = guild.roles.premiumSubscriberRole + if (!boostRole) return console.log(`\u001b[1;31m Aucun rôle de boost trouvé !`) + + const hadRole = oldMember.roles.cache.find(role => role.id === boostRole.id) + const hasRole = newMember.roles.cache.find(role => role.id === boostRole.id) + + if (!hadRole && hasRole) { + if (!guild.members.me) return console.log(`\u001b[1;31m Je ne suis pas sur le serveur !`) + + let embed = new EmbedBuilder() + .setColor(guild.members.me.displayHexColor) + .setTitle(`Nouveau boost de ${newMember.user.username} !`) + .setDescription(` + Merci à toi pour ce boost.\n + Grâce à toi, on a atteint ${guild.premiumSubscriptionCount} boosts ! + `) + .setThumbnail(newMember.user.avatarURL()) + .setTimestamp(new Date()) + + await channel.send({ embeds: [embed] }) + } + } + } +} \ No newline at end of file diff --git a/src/events/client/guildUpdate.ts b/src/events/client/guildUpdate.ts index 9dd1a53..78ce416 100755 --- a/src/events/client/guildUpdate.ts +++ b/src/events/client/guildUpdate.ts @@ -8,9 +8,8 @@ export default { console.log(`Guild ${oldGuild.name} updated`) let guildProfile = await dbGuild.findOne({ guildId: newGuild.id }) - if (!guildProfile) { - guildProfile = await dbGuildInit(newGuild) - } else { + if (!guildProfile) guildProfile = await dbGuildInit(newGuild) + else { guildProfile.guildName = newGuild.name guildProfile.guildIcon = newGuild.iconURL() ?? 'None' await guildProfile.save().catch(console.error) diff --git a/src/events/client/interactionCreate.ts b/src/events/client/interactionCreate.ts index f925f47..a62be52 100755 --- a/src/events/client/interactionCreate.ts +++ b/src/events/client/interactionCreate.ts @@ -1,6 +1,5 @@ import { Events, Interaction, ChatInputCommandInteraction, AutocompleteInteraction, ButtonInteraction } from 'discord.js' -import playerButtons from '../../utilsPlayer/buttons' -import editPlayer from '../../utilsPlayer/edit' +import { playerButtons, playerEdit } from '../../utils/player' export default { name: Events.InteractionCreate, @@ -37,7 +36,7 @@ export default { console.log(`Button '${interaction.customId}' clicked by ${interaction.user.tag}`) - if (playerButtons.includes(interaction.customId)) { await editPlayer(interaction) } + if (playerButtons.includes(interaction.customId)) { await playerEdit(interaction) } try { await button.execute(interaction) } catch (error) { console.error(`Error clicking ${interaction.customId}:`, error) } diff --git a/src/events/client/ready.ts b/src/events/client/ready.ts index 22742b8..cb76921 100755 --- a/src/events/client/ready.ts +++ b/src/events/client/ready.ts @@ -1,16 +1,17 @@ import { Events, Client, ActivityType } from 'discord.js' +import { YoutubeiExtractor } from "discord-player-youtubei" import { useMainPlayer } from 'discord-player' import { connect } from 'mongoose' +import WebSocket from 'websocket' import chalk from 'chalk' import 'dotenv/config' import dbGuildInit from '../../utils/dbGuildInit' import dbGuild from '../../schemas/guild' -import replay from '../../utilsPlayer/replay' -import disco from '../../utilsPlayer/disco' +import { playerDisco, playerReplay } from '../../utils/player' +import * as Twitch from '../../utils/twitch' import rss from '../../utils/rss' - export default { name: Events.ClientReady, once: true, @@ -18,7 +19,8 @@ export default { console.log(chalk.blue(`[DiscordJS] Connected to Discord ! Logged in as ${client.user?.tag ?? 'unknown'}`)) client.user?.setActivity('some bangers...', { type: ActivityType.Listening }) - await useMainPlayer().extractors.loadDefault(ext => ext === 'YouTubeExtractor' || ext === 'SpotifyExtractor').then(() => console.log(chalk.blue('[Discord-Player] YouTube and Spotify extractors loaded.'))).catch(console.error) + await useMainPlayer().extractors.loadDefault(ext => ext === 'SpotifyExtractor').then(() => console.log(chalk.blue('[Discord-Player] Spotify extractor loaded.'))).catch(console.error) + await useMainPlayer().extractors.register(YoutubeiExtractor, {}).then(() => console.log(chalk.blue('[Discord-Player] Youtube extractor loaded.'))).catch(console.error) let mongo_url = `mongodb://${process.env.MONGOOSE_USER}:${process.env.MONGOOSE_PASSWORD}@${process.env.MONGOOSE_HOST}/${process.env.MONGOOSE_DATABASE}` await connect(mongo_url).catch(console.error) @@ -29,14 +31,14 @@ export default { let guildProfile = await dbGuild.findOne({ guildId: guild.id }) if (!guildProfile) guildProfile = await dbGuildInit(guild) - if (guildProfile.guildPlayer?.replay?.enabled && guildProfile.guildPlayer?.replay?.textChannelId) await replay(client, guildProfile) + if (guildProfile.guildPlayer?.replay?.enabled && guildProfile.guildPlayer?.replay?.textChannelId) await playerReplay(client, guildProfile) client.disco = { interval: {} as NodeJS.Timeout } client.disco.interval = setInterval(async () => { let guildProfile = await dbGuild.findOne({ guildId: guild.id }) if (guildProfile?.guildPlayer?.disco?.enabled) { - let state = await disco(client, guildProfile) + let state = await playerDisco(client, guildProfile) if (state === 'clear') clearInterval(client.disco.interval) } }, 3000) @@ -50,6 +52,64 @@ export default { if (state === 'clear') clearInterval(client.rss.interval) } }, 30000) + + // TWITCH EVENTSUB + let dbData = guildProfile.get('guildTwitch') + if (!dbData?.enabled) return console.log(chalk.magenta(`[Twitch] Module is disabled for "${guild?.name}", please activate with \`/database edit guildTwitch.enabled True\` !`)) + + let client_id = process.env.TWITCH_APP_ID as string + if (!client_id) return console.log(chalk.magenta('[Twitch] App ID is not defined !')) + + let client_secret = process.env.TWITCH_APP_SECRET as string + if (!client_secret) return console.log(chalk.magenta('[Twitch] App Secret is not defined !')) + + let twitch = new WebSocket.client().on('connect', async connection => { + console.log(chalk.magenta('[Twitch] EventSub WebSocket Connected !')) + + connection.on('message', async message => { if (message.type === 'utf8') { try { + let data = JSON.parse(message.utf8Data) + let channel_access_token = guildProfile.get('guildTwitch')?.channelAccessToken as string + + // Check when Twitch asks to login + if (data.metadata.message_type === 'session_welcome') { + + // Check if the channel access token is still valid before connecting + channel_access_token = await Twitch.checkChannel(client_id, client_secret, channel_access_token, guild) as string + if (!channel_access_token) return console.log(chalk.magenta("[Twitch] Can't refresh channel access token !")) + + // Get broadcaster user id and reward id + let broadcaster_user_id = await Twitch.getUserInfo(client_id, channel_access_token, 'id') as string + + let topics: { [key: string]: { version: string; condition: { broadcaster_user_id: string } } } = { + 'stream.online': { version: '1', condition: { broadcaster_user_id } }, + 'stream.offline': { version: '1', condition: { broadcaster_user_id } } + } + + // Subscribe to all events required + for (let type in topics) { + console.log(chalk.magenta(`[Twitch] Creating ${type}...`)) + let { version, condition } = topics[type] + + let status = await Twitch.subscribeToEvents(client_id, channel_access_token, data.payload.session.id, type, version, condition) + if (!status) return console.error(chalk.magenta(`[Twitch] Failed to create ${type}`)) + else if (status.error) return console.log(chalk.magenta('[Twitch] Erreur de connexion EventSub, veuillez vous reconnecter !')) + else console.log(chalk.magenta(`[Twitch] Successfully created ${type}`)) + } + } + + // Handle notification messages + else if (data.metadata.message_type === 'notification') Twitch.notification(client_id, channel_access_token, data, guild) + + } catch (error) { console.error(chalk.magenta('[Twitch] ' + error)) } } }) + .on('error', error => console.error(chalk.magenta('[Twitch] ' + error))) + .on('close', () => { + console.log(chalk.magenta('[Twitch] EventSub Connection Closed !')) + twitch.connect('wss://eventsub.wss.twitch.tv/ws') + }) + }).on('connectFailed', error => console.error(chalk.magenta('[Twitch] ' + error))) + + // LAUNCH TWITCH EVENTSUB + twitch.connect('wss://eventsub.wss.twitch.tv/ws') }) } } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 86feb44..a3393c5 100755 --- a/src/index.ts +++ b/src/index.ts @@ -1,28 +1,29 @@ // PACKAGES import { Client, Collection, GatewayIntentBits, REST, Routes, ChatInputCommandInteraction, AutocompleteInteraction, ButtonInteraction } from 'discord.js' import { Player } from 'discord-player' -import { connection } from 'mongoose' +import { connection, Connection } from 'mongoose' import path from 'path' import fs from 'fs' import 'dotenv/config' -import pjson from '../package.json' -console.log('Running on version', pjson.version) - -export interface Command { +// CUSTOM TYPES +interface CConnection extends Connection { + once: (event: string, listener: (...args: any[]) => void) => void + on: (event: string, listener: (...args: any[]) => void) => void +} +interface Command { name: string description: string data: any autocompleteRun: (interaction: AutocompleteInteraction) => any execute: (interaction: ChatInputCommandInteraction) => any } -export interface Button { +interface Button { name: string description: string id: string execute: (interaction: ButtonInteraction) => any } - declare module 'discord.js' { export interface Client { commands: Collection @@ -69,6 +70,8 @@ let commandsTotal = 0 let commandFolders = fs.readdirSync(path.join(__dirname, './commands')) commandFolders.forEach(folder => { + if (folder === 'salonpostam' && process.env.DISCORD_APP_ID === '660961595006124052') return + let folderPath = path.join(__dirname, './commands', folder) let commandFiles = fs.readdirSync(folderPath).filter(file => file.endsWith('.ts')) commandsTotal += commandFiles.length @@ -83,6 +86,7 @@ commandFolders.forEach(folder => { commandsParsed++ if (commandsParsed === commandsTotal) { + console.log(`[INFO] ${commandsParsed} commands parsed.`) // COMMANDS REGISTRATION const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN as string); (async () => { @@ -107,8 +111,8 @@ let eventClientFiles = fs.readdirSync(path.join(__dirname, './events/client')).f eventClientFiles.forEach(async file => { let event = await import(path.join(__dirname, './events/client', file)) event = event.default - if (event.once) client.once(event.name, (...args) => { event.execute(...args) }) - else client.on(event.name, (...args) => { event.execute(...args) }) + if (event.once) client.once(event.name, (...args: any[]) => { event.execute(...args) }) + else client.on(event.name, (...args: any[]) => { event.execute(...args) }) }) // PLAYER EVENTS HANDLING @@ -125,8 +129,8 @@ let eventsMongo = fs.readdirSync(path.join(__dirname, './events/mongo')).filter( eventsMongo.forEach(async file => { let event = await import(path.join(__dirname, './events/mongo', file)) event = event.default - if (event.once) connection.once(event.name, (...args) => { event.execute(...args, client) }) - else connection.on(event.name, (...args) => { event.execute(...args, client) }) + if (event.once) (connection as CConnection).once(event.name, (...args: any[]) => { event.execute(...args, client) }) + else (connection as CConnection).on(event.name, (...args: any[]) => { event.execute(...args, client) }) }) diff --git a/src/schemas/guild.ts b/src/schemas/guild.ts index 4ba729f..0116cd2 100644 --- a/src/schemas/guild.ts +++ b/src/schemas/guild.ts @@ -41,6 +41,15 @@ const guildSchema = new Schema({ appToken: { type: String, required: false }, sessionToken: { type: String, required: false }, password_salt: { type: String, required: false } + }, + guildTwitch: { + enabled: { type: Boolean, required: true }, + channelName: { type: String, required: false }, + channelAccessToken: { type: String, required: false }, + channelRefreshToken: { type: String, required: false }, + liveChannelId: { type: String, required: false }, + liveMessageId: { type: String, required: false }, + liveBroadcasterId: { type: String, required: false } } }) diff --git a/src/utils/amp.ts b/src/utils/amp.ts index eeee204..a976e0c 100644 --- a/src/utils/amp.ts +++ b/src/utils/amp.ts @@ -1,5 +1,12 @@ import axios from 'axios' +export interface LoginDetails { + username: string + password: string + remember?: boolean + otp?: string +} + export const ADSModule = { async GetInstances(host: string, SESSIONID: string) { return await axios.post(host + '/API/ADSModule/GetInstances', { @@ -56,7 +63,7 @@ export const ADSModule = { } export const Core = { - async Login(host: string, details: any) { + async Login(host: string, details: LoginDetails) { return await axios.post(host + '/API/Core/Login', details ).then(response => { diff --git a/src/utils/crack.ts b/src/utils/crack.ts index 21ba53b..f44fa48 100644 --- a/src/utils/crack.ts +++ b/src/utils/crack.ts @@ -4,7 +4,7 @@ import axios from 'axios' import path from 'path' import fs from 'fs' -export declare class Game { +interface Game { name: string link: string } diff --git a/src/utils/dbGuildInit.ts b/src/utils/dbGuildInit.ts index 34cabe9..432b305 100644 --- a/src/utils/dbGuildInit.ts +++ b/src/utils/dbGuildInit.ts @@ -14,7 +14,8 @@ export default async (guild: Guild) => { }, guildRss: { enabled: false, feeds: [] }, guildAmp: { enabled: false }, - guildFbx: { enabled: false } + guildFbx: { enabled: false }, + guildTwitch: { enabled: false } }) await guildProfile.save().catch(console.error) return guildProfile diff --git a/src/utils/freebox.ts b/src/utils/freebox.ts index 3305b44..6c1aec1 100644 --- a/src/utils/freebox.ts +++ b/src/utils/freebox.ts @@ -20,7 +20,7 @@ export const Core = { return { status: 'error', data: error } }) }, - async Init(host: string, version: Number, httpsAgent: https.Agent, app: App, trackId: String) { + async Init(host: string, version: number, httpsAgent: https.Agent, app: App, trackId: string) { let request if (trackId) request = axios.get(host + `/api/v${version}/login/authorize/` + trackId, { httpsAgent }) @@ -37,7 +37,7 @@ export const Core = { } export const Login = { - async Challenge(host: string, version: Number, httpsAgent: https.Agent) { + async Challenge(host: string, version: number, httpsAgent: https.Agent) { let request = axios.get(host + `/api/v${version}/login/`, { httpsAgent }) return await request.then(response => { @@ -49,7 +49,7 @@ export const Login = { return { status: 'error', data: error } }) }, - async Session(host: string, version: Number, httpsAgent: https.Agent, app_id: string, password: string) { + async Session(host: string, version: number, httpsAgent: https.Agent, app_id: string, password: string) { let request = axios.post(host + `/api/v${version}/login/session/`, { app_id, password }, { httpsAgent }) return await request.then(response => { @@ -64,7 +64,7 @@ export const Login = { } export const Get = { - async Connection(host: string, version: Number, httpsAgent: https.Agent, sessionToken: string) { + async Connection(host: string, version: number, httpsAgent: https.Agent, sessionToken: string) { let request = axios.get(host + `/api/v${version}/connection/`, { httpsAgent, headers: { 'X-Fbx-App-Auth': sessionToken } }) return await request.then(response => { diff --git a/src/utils/player.ts b/src/utils/player.ts new file mode 100644 index 0000000..b0fd5b0 --- /dev/null +++ b/src/utils/player.ts @@ -0,0 +1,206 @@ +import { Client, TextChannel, CommandInteraction, Guild, GuildChannel, TextBasedChannel, VoiceChannel, EmbedBuilder, ButtonBuilder, ActionRowBuilder, ButtonInteraction } from 'discord.js' +import { useMainPlayer, useQueue } from 'discord-player' +import { Document } from 'mongoose' +import getUptime from './getUptime' + +type ChannelInferrable = { + channel: TextBasedChannel | VoiceChannel + guild?: Guild +} + +export class PlayerMetadata { + public constructor(public data: ChannelInferrable) { + if (data.channel.isDMBased()) { throw new Error('PlayerMetadata cannot be created from a DM') } + if (!data.channel) { throw new Error('PlayerMetadata can only be created from a channel') } + } + public get channel() { return this.data.channel! } + public get guild() { return this.data.guild || (this.data.channel as GuildChannel).guild } + + public static create(data: ChannelInferrable | CommandInteraction) { + if (data instanceof CommandInteraction) { + if (!data.inGuild()) { throw new Error('PlayerMetadata cannot be created from a DM') } + + return new PlayerMetadata({ channel: data.channel!, guild: data.guild! }) + } + return new PlayerMetadata(data); + } +} + +export const bots = ['1065047326860783636', '1119343522059927684', '1119344050412204032', '1210714000321548329', '660961595006124052'] +export const playerButtons = ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up'] + +export async function playerDisco (client: Client, guildProfile: Document) { + try { + let guild = client.guilds.cache.get(guildProfile.get('guildId')) + if (!guild) { + clearInterval(client.disco.interval) + return 'clear' + } + + let dbData = guildProfile.get('guildPlayer.disco') + let queue = useQueue(guild.id) + if (queue) if (queue.isPlaying()) { + dbData['progress'] = queue.node.playbackTime.toString() + + guildProfile.set('guildPlayer.disco', dbData) + guildProfile.markModified('guildPlayer.disco') + await guildProfile.save().catch(console.error) + } + + let channel = client.channels.cache.get(dbData.channelId) as TextChannel + if (!channel) { + console.log(`Aucun channel trouvé avec l'id \`${dbData.channelId}\`, veuillez utiliser la commande \`/database edit 'value': guildPlayer.disco.channelId\` !`) + clearInterval(client.disco.interval) + return 'clear' + } + + let { embed, components } = await playerGenerate(guild) + if (components && embed.data.footer) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) + else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) + + let messages = await channel.messages.fetch() + messages.forEach(msg => { if (!bots.includes(msg.author.id)) msg.delete() }) + + let botMessage = messages.find(msg => client.user && msg.author.id === client.user.id) + if (botMessage) { + if (!components && botMessage.components.length > 0) { + await botMessage.delete() + return channel.send({ embeds: [embed] }) + + } else if (components) return botMessage.edit({ embeds: [embed], components }) + + else return botMessage.edit({ embeds: [embed] }) + + } else return channel.send({ embeds: [embed] }) + } catch (error) { + console.error(error); + return 'clear' + } +} + +export async function playerEdit (interaction: ButtonInteraction) { + let guild = interaction.guild + if (!guild) return await interaction.reply({ content: 'Cette commande n\'est pas disponible en message privé.', ephemeral: true }) + + let { components } = await playerGenerate(guild) + if (!components) return + + components.forEach((actionRow) => actionRow.components.forEach((button) => button.setDisabled(true))) + await interaction.update({ components }) +} + +export async function playerGenerate (guild: Guild) { + let embed = new EmbedBuilder().setColor('#ffc370') + + let queue = useQueue(guild.id) + if (!queue) { + embed.setTitle('Aucune session d\'écoute en cours !') + return ({ embed, components: null }) + } + + let track = queue.currentTrack + if (!track) { + embed.setTitle('Aucune musique en cours de lecture !') + return ({ embed, components: null }) + } + + embed.setTitle(track.title) + .setAuthor({ name: track.author }) + .setURL(track.url) + .setImage(track.thumbnail) + .addFields( + { name: 'Durée', value: track.duration, inline: true }, + { name: 'Source', value: track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu', inline: true }, + { name: 'Volume', value: `${queue.node.volume}%`, inline: true }, + { name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() || 'Aucune' }, + { name: 'Loop', value: queue.repeatMode === 3 ? 'Autoplay' : queue.repeatMode === 2 ? 'File d\'Attente' : queue.repeatMode === 1 ? 'Titre' : 'Off', inline: true } + ) + .setDescription(`**Musique suivante :** ${queue.tracks.data[0] ? queue.tracks.data[0].title : 'Aucune'}`) + .setFooter({ text: `Demandé par ${track.requestedBy ? track.requestedBy.tag : 'Inconnu'}` }) + + let components = [ + new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setLabel(queue.node.isPaused() ? '▶️' : '⏸️') + .setStyle(2) + .setCustomId(queue.node.isPaused() ? 'resume' : 'pause'), + new ButtonBuilder() + .setLabel('⏹️') + .setStyle(2) + .setCustomId('stop'), + new ButtonBuilder() + .setLabel('⏭️') + .setStyle(2) + .setCustomId('skip') + .setDisabled(queue.tracks.data.length !== 0), + new ButtonBuilder() + .setLabel('🔉') + .setStyle(2) + .setCustomId('volume_down') + .setDisabled(queue.node.volume === 0), + new ButtonBuilder() + .setLabel('🔊') + .setStyle(2) + .setCustomId('volume_up') + .setDisabled(queue.node.volume === 100) + ), + new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setLabel('🔀') + .setStyle(2) + .setCustomId('shuffle'), + new ButtonBuilder() + .setLabel('🔁') + .setStyle(2) + .setCustomId('loop'), + new ButtonBuilder() + .setLabel('⏮️') + .setStyle(2) + .setCustomId('previous') + .setDisabled(queue.history.previousTrack ? false : true) + ) + ] + return ({ embed, components }) +} + +export async function playerReplay (client: Client, guildProfile: Document) { + let dbData = guildProfile.get('guildPlayer.replay') + + let textChannel = client.channels.cache.get(dbData.textChannelId) as TextChannel + if (!textChannel) return console.log(`Aucun channel trouvé avec l'id \`${dbData.textChannelId}\`, veuillez utiliser la commande \`/setchannel\` !`) + let voiceChannel = client.channels.cache.get(dbData.voiceChannelId) as VoiceChannel + if (!voiceChannel) return console.log(`Aucun channel trouvé avec l'id \`${dbData.voiceChannelId}\`, veuillez utiliser la commande \`/setchannel\` !`) + + let player = useMainPlayer() + let queue = player.nodes.create(textChannel.guild, { + metadata: { + channel: textChannel, + client: textChannel.guild.members.me, + requestedBy: client.user + }, + selfDeaf: true, + volume: 20, + leaveOnEmpty: true, + leaveOnEmptyCooldown: 30000, + leaveOnEnd: true, + leaveOnEndCooldown: 300000 + }) + + try { if (!queue.connection) await queue.connect(voiceChannel) } + catch (error) { console.error(error) } + + let result = await player.search(dbData.trackUrl as string, { requestedBy: client.user || undefined }) + if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${dbData.trackUrl}** !`) + let track = result.tracks[0] + + let entry = queue.tasksQueue.acquire() + await entry.getTask() + queue.addTrack(track) + + try { + await queue.node.play() + await queue.node.seek(Number(dbData.progress) / 1000) + await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) + } catch (error) { console.error(error) } + finally { queue.tasksQueue.release() } +} \ No newline at end of file diff --git a/src/utils/rss.ts b/src/utils/rss.ts index 5fb66ea..fadd181 100644 --- a/src/utils/rss.ts +++ b/src/utils/rss.ts @@ -88,7 +88,7 @@ export default async (client: Client, guildProfile: Document) => { ] if (!dbData.feeds) dbData.feeds = feeds - dbData.feeds.forEach((feed: Feed, i: Number) => { setTimeout(async () => { + dbData.feeds.forEach((feed: Feed, i: number) => { setTimeout(async () => { let parser = new Parser() if (feed.token) feed.url += feed.token let feedData = await parser.parseURL(feed.url) @@ -119,5 +119,5 @@ export default async (client: Client, guildProfile: Document) => { if (lastMessage.content !== `**${lastItem.title}**\n${lastItem.link}`) await thread.send({ content: `**${lastItem.title}**\n${lastItem.link}` }) //else console.log('No new item found for ' + feed.name) }, Number(i) * 1000) }) - } catch (error: any) { console.error(error); return 'clear' } + } catch (error) { console.error(error); return 'clear' } } \ No newline at end of file diff --git a/src/utils/twitch.ts b/src/utils/twitch.ts new file mode 100644 index 0000000..cb76858 --- /dev/null +++ b/src/utils/twitch.ts @@ -0,0 +1,173 @@ +import { Guild, TextChannel, EmbedBuilder } from 'discord.js' +import axios, { AxiosHeaderValue } from 'axios' +import dbGuild from '../schemas/guild' + +interface NotificationData { + metadata: { + message_type: string + } + payload: { + subscription: { + type: string + } + event: { + broadcaster_user_name: string + broadcaster_user_login: string + } + session: { + id: string + } + } +} + +interface Condition { + broadcaster_user_id: string +} + +export async function checkChannel (client_id: string, client_secret: string, channel_access_token: string, guild: Guild) { + let guildProfile = await dbGuild.findOne({ guildId: guild?.id }) + if (!guildProfile) return console.log(`Database data for ${guild?.name} does not exist, please initialize with \`/database init\` !`) + + let dbData = guildProfile.get('guildTwitch') + if (!dbData?.enabled) return console.log(`Twitch module is disabled for "${guild?.name}", please activate with \`/database edit guildTwitch.enabled True\` !`) + + if (!await validateToken(channel_access_token)) { + let channel_refresh_token = dbData.channelRefreshToken + if (!channel_refresh_token) return console.log('No refresh token found in database !') + + let GetAccessFromRefresh = await refreshToken(client_id, client_secret, channel_refresh_token) + if (!GetAccessFromRefresh) return false; + + [channel_access_token, channel_refresh_token] = [dbData.channelAccessToken, dbData.channelRefreshToken] = GetAccessFromRefresh + + guildProfile.set('guildTwitch', dbData) + guildProfile.markModified('guildTwitch') + await guildProfile.save().catch(console.error) + } + return channel_access_token +} + +export async function validateToken (access_token: string) { + return await axios.get('https://id.twitch.tv/oauth2/validate', { + headers: { + 'Authorization': `OAuth ${access_token}`, + } + }).then(() => { + return true + }).catch(error => { console.error(error.response.data) }) +} + +export async function refreshToken (client_id: string, client_secret: string, refresh_token: string) { + return await axios.post('https://id.twitch.tv/oauth2/token', { + client_id, + client_secret, + refresh_token, + grant_type: 'refresh_token' + }).then(response => { + if (response.data.token_type === 'bearer') return [response.data.access_token, response.data.refresh_token] + }).catch(error => { console.error(error.response.data) }) +} + +export async function getStreams (client_id: string, access_token: string, user_login: string) { + return await axios.get(`https://api.twitch.tv/helix/streams?user_login=${user_login}`, { + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Client-Id': client_id as AxiosHeaderValue + } + }).then(response => { + return response.data.data[0] + }).catch(error => { console.error(error.response) }) +} + +export async function getUserInfo (client_id: string, access_token: string, type: string) { + return await axios.get('https://api.twitch.tv/helix/users', { + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Client-Id': client_id as AxiosHeaderValue + } + }).then(response => { + if (type === 'login') return response.data.data[0].login + if (type === 'id') return response.data.data[0].id + if (type === 'profile_image_url') return response.data.data[0].profile_image_url + }).catch(error => { console.error(error.response.data) }) +} + +export async function notification (client_id: string, channel_access_token: string, data: NotificationData, guild: Guild) { + let { subscription, event } = data.payload + + let guildProfile = await dbGuild.findOne({ guildId: guild?.id }) + if (!guildProfile) return console.log(`Database data for ${guild?.name} does not exist, please initialize with \`/database init\` !`) + + let dbData = guildProfile.get('guildTwitch') + if (!dbData?.enabled) return console.log(`Twitch module is disabled for "${guild?.name}", please activate with \`/database edit guildTwitch.enabled True\` !`) + + let liveChannelId = dbData.liveChannelId + if (!liveChannelId) return console.log('No live channel id found in database !') + + let liveChannel = guild.channels.cache.get(liveChannelId) as TextChannel + if (!liveChannel) return console.log(`\u001b[1;35m Can't find channel with id ${liveChannelId}`) + + if (subscription.type === 'stream.online') { + console.log(`\u001b[1;35m Stream from ${event.broadcaster_user_name} is now online, sending Discord message...`) + + let stream_data = await getStreams(client_id, channel_access_token, event.broadcaster_user_login) + let user_profile_image_url = await getUserInfo(client_id, channel_access_token, 'profile_image_url') + + let embed = new EmbedBuilder() + .setColor('#6441a5') + .setTitle(stream_data.title) + .setURL(`https://twitch.tv/laytho_`) + .setAuthor({ name: `${event.broadcaster_user_login.toUpperCase()} EST ACTUELLEMENT EN LIVE !`, iconURL: user_profile_image_url }) + .setDescription(`Joue à ${stream_data.game_name} avec ${stream_data.viewer_count} viewers`) + .setImage(stream_data.thumbnail_url.replace('{width}', '1920').replace('{height}', '1080')) + .setTimestamp() + let message = await liveChannel.send({ content: `Hey @everyone ! <@${dbData.liveBroadcasterId}> démarre son live sur **Twitch** !`, embeds: [embed] }) + + dbData.liveMessageId = message.id + guildProfile.set('guildTwitch', dbData) + guildProfile.markModified('guildTwitch') + await guildProfile.save().catch(console.error) + } + else if (subscription.type === 'stream.offline') { + console.log(`\u001b[1;35m Stream from laytho_ is now offline, editing Discord message...`) + + let message = liveChannel.messages.cache.find(message => message.id === dbData.liveMessageId) + if (!message) return console.log(`\u001b[1;35m Can't find message with id ${dbData.liveMessageId}`) + if (!message.embeds[0]) return console.log(`\u001b[1;35m Can't find embed in message with id ${dbData.liveMessageId}`) + + let duration = new Date().getTime() - new Date(message.embeds[0].data.timestamp ?? 0).getTime() + let seconds = Math.floor(duration / 1000) + let minutes = Math.floor(seconds / 60) + let hours = Math.floor(minutes / 60) + let duration_string = `${hours ? hours + 'H' : ''} ${minutes % 60 ? minutes % 60 + 'M' : ''} ${seconds % 60 ? seconds % 60 + 'S' : ''}` + + let user_profile_image_url = await getUserInfo(client_id, channel_access_token, 'profile_image_url') + + let embed = new EmbedBuilder() + .setColor('#6441a5') + .setAuthor({ name: `C'EST FINI, LE LIVE A DURÉ ${duration_string} !`, iconURL: user_profile_image_url }) + .setTimestamp() + + message.edit({ content: `Re @everyone ! <@${dbData.liveBroadcasterId}> a terminé son live sur **Twitch** !`, embeds: [embed] }) + } +} + +export async function subscribeToEvents (client_id: string, access_token: string, session_id: string, type: string, version: string, condition: Condition) { + return await axios.post('https://api.twitch.tv/helix/eventsub/subscriptions', { + type, + version, + condition, + transport: { + method: 'websocket', + session_id + } + }, { + headers: { + 'Authorization': `Bearer ${access_token}`, + 'Client-Id': client_id, + 'Content-Type': 'application/json' + } + }).then(response => { + return response.data.data[0].status + }).catch(error => { return error.response.data }) +} \ No newline at end of file diff --git a/src/utilsAMP/ADSModule/GetInstances.ts b/src/utilsAMP/ADSModule/GetInstances.ts deleted file mode 100755 index 1cecc0a..0000000 --- a/src/utilsAMP/ADSModule/GetInstances.ts +++ /dev/null @@ -1,13 +0,0 @@ -const axios = require('axios') - -module.exports = (async (SESSIONID) => { - return await axios.post(`${process.env.AMP_HOST}/API/${__filename.split('utilsAMP/')[1].split('.js')[0]}`, { - SESSIONID - }).then(response => { - if (!response.data.result) return { status: 'fail', data: response.data } - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsAMP/ADSModule/ManageInstance.ts b/src/utilsAMP/ADSModule/ManageInstance.ts deleted file mode 100755 index 65bb5e0..0000000 --- a/src/utilsAMP/ADSModule/ManageInstance.ts +++ /dev/null @@ -1,16 +0,0 @@ -const axios = require('axios') - -module.exports = (async (SESSIONID, InstanceId) => { - return await axios.post(`${process.env.AMP_HOST}/API/${__filename.split('utilsAMP/')[1].split('.js')[0]}`, { - SESSIONID, - InstanceId - }).then(response => { - console.log(response.data) - - if (!response.data.result) return { status: 'fail', data: response.data } - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsAMP/ADSModule/RestartInstance.ts b/src/utilsAMP/ADSModule/RestartInstance.ts deleted file mode 100755 index 22ddd41..0000000 --- a/src/utilsAMP/ADSModule/RestartInstance.ts +++ /dev/null @@ -1,16 +0,0 @@ -const axios = require('axios') - -module.exports = (async (SESSIONID, InstanceName) => { - return await axios.post(`${process.env.AMP_HOST}/API/${__filename.split('utilsAMP/')[1].split('.js')[0]}`, { - SESSIONID, - InstanceName - }).then(response => { - console.log(response.data) - - //if (!response.data.success) return { status: 'fail', data: response.data } - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsAMP/ADSModule/Servers.ts b/src/utilsAMP/ADSModule/Servers.ts deleted file mode 100755 index a6cbd72..0000000 --- a/src/utilsAMP/ADSModule/Servers.ts +++ /dev/null @@ -1,17 +0,0 @@ -const axios = require('axios') - -module.exports = (async (SESSIONID, InstanceId) => { - return await axios.get(`${process.env.AMP_HOST}/API/${__filename.split('utilsAMP/')[1].split('.js')[0]}`, { - SESSIONID, - InstanceId - }).then(response => { - console.log(response) - console.log(response.data) - - if (!response.data.result) return { status: 'fail', data: response.data } - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsAMP/CheckSession.ts b/src/utilsAMP/CheckSession.ts deleted file mode 100755 index d735c43..0000000 --- a/src/utilsAMP/CheckSession.ts +++ /dev/null @@ -1,13 +0,0 @@ -const axios = require('axios') - -module.exports = (async (SESSIONID) => { - return await axios.post(`${process.env.AMP_HOST}/API/ADSModule/GetInstances`, { - SESSIONID - }).then(response => { - if (!response.data.result) return { status: 'fail', data: response.data } - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsAMP/Core/Login.ts b/src/utilsAMP/Core/Login.ts deleted file mode 100755 index e25e201..0000000 --- a/src/utilsAMP/Core/Login.ts +++ /dev/null @@ -1,21 +0,0 @@ -const axios = require('axios') - -const appDir = require('path').dirname(require.main.filename) -const writeEnv = require(appDir + '/utils/writeEnv') - -module.exports = (async (details) => { - return await axios.post(`${process.env.AMP_HOST}/API/${__filename.split('utilsAMP/')[1].split('.js')[0]}`, - details - ).then(response => { - if (!response.data.success) return { status: 'fail', data: response.data } - - writeEnv('AMP_USERNAME', response.data.userInfo.Username) - writeEnv('AMP_SESSIONID', response.data.sessionID) - writeEnv('AMP_REMEMBER_TOKEN', response.data.rememberMeToken) - - return { status: 'success', data: response.data } - }).catch(error => { - console.error(error) - return { status: 'error', data: error } - }) -}) \ No newline at end of file diff --git a/src/utilsCrack/download.ts b/src/utilsCrack/download.ts deleted file mode 100755 index 5830bf7..0000000 --- a/src/utilsCrack/download.ts +++ /dev/null @@ -1,18 +0,0 @@ -const axios = require('axios') -const fs = require('fs') - -module.exports = download = (async (url, file, headers) => { - let path = `./cracks/${file}` - let writer = fs.createWriteStream(path) - try { - await axios({ url: url + file, method: 'GET', responseType: 'stream', headers }).then(response => { - return new Promise((resolve, reject) => { - response.data.pipe(writer) - let error = null - writer.on('error', err => { error = err; writer.close(); reject(err) }) - writer.on('close', () => { if (!error) resolve(true) }) - }) - }).catch(console.error) - return path - } catch (error) { console.error(error) } -}) \ No newline at end of file diff --git a/src/utilsCrack/headers.ts b/src/utilsCrack/headers.ts deleted file mode 100755 index 37653b0..0000000 --- a/src/utilsCrack/headers.ts +++ /dev/null @@ -1,23 +0,0 @@ -const h1 = { - "content-type": "application/x-www-form-urlencoded; charset=UTF-8", - "x-requested-with": "XMLHttpRequest" -} -const h2 = { - "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", - "accept-language": "fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7", - "cache-control": "no-cache", - "pragma": "no-cache", - "sec-ch-ua": "\"Not=A?Brand\";v=\"8\", \"Chromium\";v=\"110\", \"Opera GX\";v=\"96\"", - "sec-ch-ua-mobile": "?0", - "sec-ch-ua-platform": "\"Windows\"", - "sec-fetch-dest": "document", - "sec-fetch-mode": "navigate", - "sec-fetch-site": "none", - "sec-fetch-user": "?1", - "upgrade-insecure-requests": "1", - "cookie": "online_fix_auth=gAAAAABkKM0s9WNLe_V6euTnJD7UQjppVty9B7OOyHBYOyVcbcejj8F6KveBcLxlf3mlx_vE7JEFPHlrpj-Aq6BFJyKPGzxds_wpcPV2MdXPyDGQLsz4mAvt3qgTgGg25MapWo_fSIOMiAAsF4Gv_uh4kUOiR_jgbHCZWJGPgpNQwU2HFFyvahYR6MzR7nYE9-fCmrev3obkRbro43vIVTTX4UyJMRHadrsY5Q-722TzinCZVmAuJfc=; dle_password=89465c26673e0199e5272e4730772c35; _ym_uid=1670534560361937997; _ym_d=1680394955; _ym_isad=2; dle_user_id=2619796; PHPSESSID=3v8sd281sr0n1n9f1p66q25sa2", - "Referer": "https://online-fix.me/", - "Referrer-Policy": "strict-origin-when-cross-origin" -} - -module.exports = headers = { h1, h2 } \ No newline at end of file diff --git a/src/utilsCrack/magnet.ts b/src/utilsCrack/magnet.ts deleted file mode 100755 index a555f04..0000000 --- a/src/utilsCrack/magnet.ts +++ /dev/null @@ -1,12 +0,0 @@ -const fs = require('fs') - -module.exports = magnet = (async path => { - const parseTorrent = await import('parse-torrent') - const parse = parseTorrent.default - const magnetURI = parseTorrent.toMagnetURI - - let data = await parse(fs.readFileSync(path)) - let uri = await magnetURI({ infoHash: data.infoHash }) - - return uri -}) \ No newline at end of file diff --git a/src/utilsCrack/repo.ts b/src/utilsCrack/repo.ts deleted file mode 100755 index 8be882d..0000000 --- a/src/utilsCrack/repo.ts +++ /dev/null @@ -1,13 +0,0 @@ -const iconv = require('iconv-lite') - -module.exports = repo = (async (game, headers) => { - let body = await fetch(game.link, { headers, body: null, method: "GET" }) - .then(response => response.arrayBuffer()) - .then(arrayBuffer => { return iconv.decode(Buffer.from(arrayBuffer), 'win1251') }) - .catch(console.error) - try { - let name = body.split('https://uploads.online-fix.me:2053/torrents/')[1].split('"')[0] - let url = `https://uploads.online-fix.me:2053/torrents/${name}` - return url - } catch (error) { console.error(error) } -}) \ No newline at end of file diff --git a/src/utilsCrack/search.ts b/src/utilsCrack/search.ts deleted file mode 100755 index 5fe9b0e..0000000 --- a/src/utilsCrack/search.ts +++ /dev/null @@ -1,19 +0,0 @@ -const iconv = require('iconv-lite') - -module.exports = search = (async (query, headers) => { - let body = await fetch("https://online-fix.me/engine/ajax/search.php", { headers, body: `query=${query}`, method: "POST" }) - .then(response => response.arrayBuffer()) - .then(arrayBuffer => { return iconv.decode(Buffer.from(arrayBuffer), 'win1251') }) - .catch(console.error) - try { - let matches = body.split('')[1].split('')[0].split('') - let games = [] - matches.pop() - matches.forEach(async match => { - let name = match.split('">')[1].split('')[0].slice(0, -8) - let link = match.split('')[0] - games.push({ name, link }) - }) - return games - } catch (error) { return error } -}) \ No newline at end of file diff --git a/src/utilsCrack/torrent.ts b/src/utilsCrack/torrent.ts deleted file mode 100755 index e6644d1..0000000 --- a/src/utilsCrack/torrent.ts +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = torrent = (async (url, headers) => { - let response = await fetch(url, { headers, body: null, method: "GET" }).catch(console.error) - try { - let body = await response.text() - let file = body.split('')[0] - return file - } catch (error) { console.error(error) } -}) \ No newline at end of file diff --git a/src/utilsPlayer/bots.ts b/src/utilsPlayer/bots.ts deleted file mode 100644 index c11bc42..0000000 --- a/src/utilsPlayer/bots.ts +++ /dev/null @@ -1 +0,0 @@ -export default ['1065047326860783636', '1119343522059927684', '1119344050412204032', '1210714000321548329'] \ No newline at end of file diff --git a/src/utilsPlayer/buttons.ts b/src/utilsPlayer/buttons.ts deleted file mode 100755 index b2fd664..0000000 --- a/src/utilsPlayer/buttons.ts +++ /dev/null @@ -1 +0,0 @@ -export default ['loop', 'pause', 'previous', 'resume', 'shuffle', 'skip', 'stop', 'volume_down', 'volume_up'] \ No newline at end of file diff --git a/src/utilsPlayer/disco.ts b/src/utilsPlayer/disco.ts deleted file mode 100755 index ca4d4a7..0000000 --- a/src/utilsPlayer/disco.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Client, TextChannel } from 'discord.js' -import { useQueue } from 'discord-player' -import { Document } from 'mongoose' -import getUptime from '../utils/getUptime' -import generate from './generate' -import bots from './bots' - -export default async (client: Client, guildProfile: Document) => { - try { - let guild = client.guilds.cache.get(guildProfile.get('guildId')) - if (!guild) { - clearInterval(client.disco.interval) - return 'clear' - } - - let dbData = guildProfile.get('guildPlayer.disco') - let queue = useQueue(guild.id) - if (queue) if (queue.isPlaying()) { - dbData['progress'] = queue.node.playbackTime.toString() - - guildProfile.set('guildPlayer.disco', dbData) - guildProfile.markModified('guildPlayer.disco') - await guildProfile.save().catch(console.error) - } - - let channel = client.channels.cache.get(dbData.channelId) as TextChannel - if (!channel) { - console.log(`Aucun channel trouvé avec l'id \`${dbData.channelId}\`, veuillez utiliser la commande \`/database edit 'value': guildPlayer.disco.channelId\` !`) - clearInterval(client.disco.interval) - return 'clear' - } - - let { embed, components } = await generate(guild) - if (components && embed.data.footer) embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)} \n ${embed.data.footer.text}` }) - else embed.setFooter({ text: `Uptime: ${getUptime(client.uptime)}` }) - - let messages = await channel.messages.fetch() - messages.forEach(msg => { if (!bots.includes(msg.author.id)) msg.delete() }) - - let botMessage = messages.find(msg => client.user && msg.author.id === client.user.id) - if (botMessage) { - if (!components && botMessage.components.length > 0) { - await botMessage.delete() - return channel.send({ embeds: [embed] }) - - } else if (components) return botMessage.edit({ embeds: [embed], components }) - - else return botMessage.edit({ embeds: [embed] }) - - } else return channel.send({ embeds: [embed] }) - } catch (error: any) { - console.error(error); - return 'clear' - } -} \ No newline at end of file diff --git a/src/utilsPlayer/edit.ts b/src/utilsPlayer/edit.ts deleted file mode 100755 index b494636..0000000 --- a/src/utilsPlayer/edit.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { ButtonInteraction } from 'discord.js' -import generatePlayer from './generate' - -export default async (interaction: ButtonInteraction) => { - let guild = interaction.guild - if (!guild) return await interaction.reply({ content: 'Cette commande n\'est pas disponible en message privé.', ephemeral: true }) - - let { components } = await generatePlayer(guild) - if (!components) return - - components.forEach((actionRow) => actionRow.components.forEach((button) => button.setDisabled(true))) - await interaction.update({ components }) -} \ No newline at end of file diff --git a/src/utilsPlayer/generate.ts b/src/utilsPlayer/generate.ts deleted file mode 100755 index 7d3a7c5..0000000 --- a/src/utilsPlayer/generate.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { EmbedBuilder, ButtonBuilder, ActionRowBuilder, Guild } from 'discord.js' -import { useQueue } from 'discord-player' - -export default async (guild: Guild) => { - let embed = new EmbedBuilder().setColor('#ffc370') - - let queue = useQueue(guild.id) - if (!queue) { - embed.setTitle('Aucune session d\'écoute en cours !') - return ({ embed, components: null }) - } - - let track = queue.currentTrack - if (!track) { - embed.setTitle('Aucune musique en cours de lecture !') - return ({ embed, components: null }) - } - - embed.setTitle(track.title) - .setAuthor({ name: track.author }) - .setURL(track.url) - .setImage(track.thumbnail) - .addFields( - { name: 'Durée', value: track.duration, inline: true }, - { name: 'Source', value: track.source === 'youtube' ? 'Youtube' : track.source === 'spotify' ? 'Spotify' : 'Inconnu', inline: true }, - { name: 'Volume', value: `${queue.node.volume}%`, inline: true }, - { name: queue.node.isPaused() ? 'Progression (en pause)' : 'Progression', value: queue.node.createProgressBar() || 'Aucune' }, - { name: 'Loop', value: queue.repeatMode === 3 ? 'Autoplay' : queue.repeatMode === 2 ? 'File d\'Attente' : queue.repeatMode === 1 ? 'Titre' : 'Off', inline: true } - ) - .setDescription(`**Musique suivante :** ${queue.tracks.data[0] ? queue.tracks.data[0].title : 'Aucune'}`) - .setFooter({ text: `Demandé par ${track.requestedBy ? track.requestedBy.tag : 'Inconnu'}` }) - - let components = [ - new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setLabel(queue.node.isPaused() ? '▶️' : '⏸️') - .setStyle(2) - .setCustomId(queue.node.isPaused() ? 'resume' : 'pause'), - new ButtonBuilder() - .setLabel('⏹️') - .setStyle(2) - .setCustomId('stop'), - new ButtonBuilder() - .setLabel('⏭️') - .setStyle(2) - .setCustomId('skip') - .setDisabled(queue.tracks.data.length !== 0), - new ButtonBuilder() - .setLabel('🔉') - .setStyle(2) - .setCustomId('volume_down') - .setDisabled(queue.node.volume === 0), - new ButtonBuilder() - .setLabel('🔊') - .setStyle(2) - .setCustomId('volume_up') - .setDisabled(queue.node.volume === 100) - ), - new ActionRowBuilder().addComponents( - new ButtonBuilder() - .setLabel('🔀') - .setStyle(2) - .setCustomId('shuffle'), - new ButtonBuilder() - .setLabel('🔁') - .setStyle(2) - .setCustomId('loop'), - new ButtonBuilder() - .setLabel('⏮️') - .setStyle(2) - .setCustomId('previous') - .setDisabled(queue.history.previousTrack ? false : true) - ) - ] - return ({ embed, components }) -} \ No newline at end of file diff --git a/src/utilsPlayer/metadata.ts b/src/utilsPlayer/metadata.ts deleted file mode 100644 index 0494b56..0000000 --- a/src/utilsPlayer/metadata.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { CommandInteraction, Guild, GuildChannel, TextBasedChannel, VoiceChannel } from 'discord.js' - -type ChannelInferrable = { - channel: TextBasedChannel | VoiceChannel - guild?: Guild -} - -export class PlayerMetadata { - public constructor(public data: ChannelInferrable) { - if (data.channel.isDMBased()) { throw new Error('PlayerMetadata cannot be created from a DM') } - if (!data.channel) { throw new Error('PlayerMetadata can only be created from a channel') } - } - public get channel() { return this.data.channel! } - public get guild() { return this.data.guild || (this.data.channel as GuildChannel).guild } - - public static create(data: ChannelInferrable | CommandInteraction) { - if (data instanceof CommandInteraction) { - if (!data.inGuild()) { throw new Error('PlayerMetadata cannot be created from a DM') } - - return new PlayerMetadata({ channel: data.channel!, guild: data.guild! }) - } - return new PlayerMetadata(data); - } -} \ No newline at end of file diff --git a/src/utilsPlayer/replay.ts b/src/utilsPlayer/replay.ts deleted file mode 100755 index 6a94517..0000000 --- a/src/utilsPlayer/replay.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Client, TextChannel, VoiceChannel } from 'discord.js' -import { useMainPlayer } from 'discord-player' -import { Document } from 'mongoose' - -export default async (client: Client, guildProfile: Document) => { - let dbData = guildProfile.get('guildPlayer.replay') - - let textChannel = client.channels.cache.get(dbData.textChannelId) as TextChannel - if (!textChannel) return console.log(`Aucun channel trouvé avec l'id \`${dbData.textChannelId}\`, veuillez utiliser la commande \`/setchannel\` !`) - let voiceChannel = client.channels.cache.get(dbData.voiceChannelId) as VoiceChannel - if (!voiceChannel) return console.log(`Aucun channel trouvé avec l'id \`${dbData.voiceChannelId}\`, veuillez utiliser la commande \`/setchannel\` !`) - - let player = useMainPlayer() - let queue = player.nodes.create(textChannel.guild, { - metadata: { - channel: textChannel, - client: textChannel.guild.members.me, - requestedBy: client.user - }, - selfDeaf: true, - volume: 20, - leaveOnEmpty: true, - leaveOnEmptyCooldown: 30000, - leaveOnEnd: true, - leaveOnEndCooldown: 300000 - }) - - try { if (!queue.connection) await queue.connect(voiceChannel) } - catch (error: any) { console.error(error) } - - let result = await player.search(dbData.trackUrl as string, { requestedBy: client.user || undefined }) - if (!result.hasTracks()) await textChannel.send(`Aucune musique trouvée pour **${dbData.trackUrl}** !`) - let track = result.tracks[0] - - let entry = queue.tasksQueue.acquire() - await entry.getTask() - queue.addTrack(track) - - try { - await queue.node.play() - await queue.node.seek(Number(dbData.progress) / 1000) - await textChannel.send(`Relancement de la musique suite à mon redémarrage...`) - } catch (error: any) { console.error(error) } - finally { queue.tasksQueue.release() } -} \ No newline at end of file