From d38469c37850aba3392c83577072ae5ad67b4375 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Tue, 25 Jun 2024 23:02:21 +0300 Subject: [PATCH 01/13] 3.0.0-dev-0 Migrate to Distube v5.0.2 and Discord.js 14.15.3 Little refactoring of audioplayer code. Added Apple Music support. Bugs fixes in plugin loading. Docker bot container now is rootless. Fixed prettier configuration to prevent errors "end of line." Added binding.gyp to allow compiling Opus package with Visual Studio 2022. --- .env | 1 + .eslintrc.json | 7 +- .prettierrc | 3 +- Dockerfile | 9 + README.md | 31 +- binding.gyp | 17 + docker-compose.yml | 2 +- package.json | 31 +- pnpm-lock.yaml | 2436 ----------------- src/EnvironmentVariables.ts | 5 +- src/Types.ts | 6 +- src/commands/audio/download.command.ts | 2 +- src/commands/audio/jump.command.ts | 2 +- src/commands/audio/play.command.ts | 41 +- src/commands/audio/playfile.command.ts | 2 +- src/commands/audio/playing.command.ts | 4 +- src/commands/audio/previous.command.ts | 2 +- src/commands/audio/rewind.command.ts | 2 +- src/commands/audio/shuffle.command.ts | 2 +- src/commands/audio/skip.command.ts | 2 +- src/commands/audio/stop.command.ts | 2 +- .../audioPlayer/AudioPlayerCore.ts | 235 +- .../audioPlayer/AudioPlayerTypes.ts | 0 .../audioPlayer/AudioPlayersManager.ts | 6 +- src/commands/audioPlayer/LoadPlugins.ts | 93 + .../{audio => }/audioPlayer/MessagePlayer.ts | 26 +- .../MessagePlayerButtonsHandler.ts | 20 +- .../audioPlayer/MessagePlayerEmbedBuilder.ts | 4 +- .../util/AudioCommandWrappers.ts | 0 .../util/downloadSong.ts | 44 +- .../util/generateAddedPlaylistMessage.ts | 28 + .../util/generateAddedSongMessage.ts | 28 + .../util/isAudioFile.ts | 0 src/commands/info/status.command.ts | 2 - .../slashCommandHandler.ts | 5 +- .../messageHandlers/textCommandsHandler.ts | 5 +- src/events/onReady.event.ts | 4 +- src/events/voiceChannelUpdate.ts | 20 + src/locales/ru/commandshandlers.json | 2 - src/main.ts | 8 +- tsconfig.json | 9 +- 41 files changed, 403 insertions(+), 2745 deletions(-) create mode 100644 binding.gyp delete mode 100644 pnpm-lock.yaml rename src/commands/{audio => }/audioPlayer/AudioPlayerCore.ts (57%) rename src/commands/{audio => }/audioPlayer/AudioPlayerTypes.ts (100%) rename src/commands/{audio => }/audioPlayer/AudioPlayersManager.ts (86%) create mode 100644 src/commands/audioPlayer/LoadPlugins.ts rename src/commands/{audio => }/audioPlayer/MessagePlayer.ts (92%) rename src/commands/{audio => }/audioPlayer/MessagePlayerButtonsHandler.ts (92%) rename src/commands/{audio => }/audioPlayer/MessagePlayerEmbedBuilder.ts (97%) rename src/commands/{audio => audioPlayer}/util/AudioCommandWrappers.ts (100%) rename src/commands/{audio => audioPlayer}/util/downloadSong.ts (67%) create mode 100644 src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts create mode 100644 src/commands/audioPlayer/util/generateAddedSongMessage.ts rename src/commands/{audio => audioPlayer}/util/isAudioFile.ts (100%) create mode 100644 src/events/voiceChannelUpdate.ts diff --git a/.env b/.env index 6bc8826..6806c45 100644 --- a/.env +++ b/.env @@ -16,6 +16,7 @@ BOT_SOUNDCLOUD_CLIENT_ID=undefined BOT_SOUNDCLOUD_TOKEN=undefined BOT_YANDEXMUSIC_TOKEN=undefined +BOT_YANDEXMUSIC_UID=undefined MONGO_URI=undefined MONGO_DATABASE_NAME=undefined diff --git a/.eslintrc.json b/.eslintrc.json index a64efde..52940fa 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,10 +1,7 @@ { "root": true, "parser": "@typescript-eslint/parser", - "plugins": [ - "@typescript-eslint", - "prettier" - ], + "plugins": ["@typescript-eslint", "prettier"], "env": { "commonjs": true, "es2021": true, @@ -22,6 +19,6 @@ "rules": { "@typescript-eslint/no-var-requires": 0, "@typescript-eslint/no-non-null-assertion": 0, - "prettier/prettier": 2 + "prettier/prettier": ["error", { "endOfLine": "auto" }] } } diff --git a/.prettierrc b/.prettierrc index 83289e0..262579f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -2,5 +2,6 @@ "semi": true, "trailingComma": "none", "singleQuote": true, - "printWidth": 100 + "printWidth": 100, + "endOfLine": "auto" } diff --git a/Dockerfile b/Dockerfile index da0fa68..0fc98ea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,8 +12,17 @@ RUN pnpm run build RUN pnpm prune --prod FROM base as prod + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 aicbot + WORKDIR /bot COPY --from=build /botbuild/build ./build COPY --from=build /botbuild/node_modules ./node_modules COPY --from=build /botbuild/package.json . + +RUN chown -R aicbot:nodejs /bot + +USER aicbot + CMD ["npm", "run", "production"] diff --git a/README.md b/README.md index 9a349e5..4c15a1b 100644 --- a/README.md +++ b/README.md @@ -27,24 +27,23 @@ But in both cases, you need to configure .env file. - (Required) To get Discord Token, follow this [guide](https://discordjs.guide/preparations/setting-up-a-bot-application.html#creating-your-bot). After following the guide, you need to enable privileged intents in [Discord Developer Portal.](https://github.com/AlexInCube/AlCoTest/assets/25522245/fdbcdcf1-9501-47f0-93bf-7e76806f623f) - (Optional) To get Spotify Secret and ID, follow this [guide](https://stevesie.com/docs/pages/spotify-client-id-secret-developer-api) - (Optional) To get Yandex Music token, follow this [guide](https://github.com/MarshalX/yandex-music-api/discussions/513) -``` -BOT_VERBOSE_LOGGING= (Optional) The bot will give more information about what it is doing to the console, useful for debugging. By default is: false - -BOT_COMMAND_PREFIX= (Required) Used only for text commands, for example: // -BOT_LANGUAGE= (Optional) Supported values: en ru. By default is: en - -MONGO_URI= (Required) If you run bot locally, use mongodb://localhost:27017. If you run in Docker, use mongodb://mongo:27017 -MONGO_DATABASE_NAME= (Required) Database name in MongoDB, for example: aicbot -BOT_DISCORD_TOKEN= (Required) -BOT_DISCORD_CLIENT_ID= (Required) -BOT_DISCORD_OVERPOWERED_ID= (Required) This need to retrieve reports in direct message +| Name | Example | Description | Required? | +|------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| +| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | +| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | +| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | +| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | +| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | +| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Client ID from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | This need to retrieve reports in direct message | ✔️ | +| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | +| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | +| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | +| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | +| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | -BOT_SPOTIFY_CLIENT_SECRET= (Optional) -BOT_SPOTIFY_CLIENT_ID= (Optional) - -BOT_YANDEXMUSIC_TOKEN= (Optional) -``` ### 🍪 Youtube Cookie Also, it is preferable to provide cookies for YouTube. diff --git a/binding.gyp b/binding.gyp new file mode 100644 index 0000000..9ed99b8 --- /dev/null +++ b/binding.gyp @@ -0,0 +1,17 @@ +{ + 'targets': [ + { + 'target_name': 'bindings', + 'sources': [ 'bindings.node' ], + 'cflags!': [ '-fno-exceptions' ], + 'cflags_cc!': [ '-fno-exceptions' ], + 'conditions': [ + ['OS=="mac"', { + 'xcode_settings': { + 'GCC_ENABLE_CPP_EXCEPTIONS': 'YES' + } + }] + ] + } + ] +} diff --git a/docker-compose.yml b/docker-compose.yml index fb02ffe..a2c8839 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: volumes: - ./data:/data/db ports: - - '27018:27017' + - '27017:27017' aicbot: container_name: aicbot image: alexincube/aicotest:latest diff --git a/package.json b/package.json index 014826d..0917b5b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "2.5.0", + "version": "3.0.0-dev-0", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { @@ -13,29 +13,34 @@ "author": "AlexInCube", "license": "ISC", "dependencies": { - "@discordjs/opus": "^0.9.0", "@discordjs/rest": "^1.7.1", "@discordjs/voice": "^0.16.1", - "@distube/soundcloud": "^1.3.5", - "@distube/spotify": "^1.6.1", - "@distube/yt-dlp": "^1.1.3", - "@distube/ytdl-core": "^4.13.3", + "@distube/direct-link": "^1.0.1", + "@distube/file": "^1.0.1", + "@distube/soundcloud": "^2.0.1", + "@distube/spotify": "^2.0.2", + "@distube/youtube": "^1.0.2", + "@distube/yt-dlp": "^2.0.1", + "@distube/ytdl-core": "^4.13.4", + "@distube/ytsr": "^2.0.4", "cross-env": "7.0.3", - "discord.js": "14.14.1", - "distube": "^4.2.2", - "distube-yandex-music-plugin": "^0.2.1", + "discord.js": "^14.15.3", + "distube": "^5.0.2", + "distube-apple-music": "^0.1.0", + "distube-yandex-music-plugin": "^1.0.4", "dotenv": "^16.4.5", "i18next": "^22.5.1", "i18next-fs-backend": "^2.3.1", - "mongoose": "^7.6.12", + "mongoose": "^7.7.0", "node-os-utils": "^1.3.7", + "opusscript": "^0.1.1", "prism-media": "^1.3.5", "sodium-native": "^4.1.1", "uuid": "^9.0.1", "zod": "^3.23.8" }, "devDependencies": { - "@types/node": "^20.12.12", + "@types/node": "^20.14.8", "@types/node-os-utils": "^1.3.4", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", @@ -43,7 +48,7 @@ "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", - "prettier": "^3.2.5", - "typescript": "^5.4.5" + "prettier": "^3.3.2", + "typescript": "^5.5.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index d300e86..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,2436 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@discordjs/opus': - specifier: ^0.9.0 - version: 0.9.0 - '@discordjs/rest': - specifier: ^1.7.1 - version: 1.7.1 - '@discordjs/voice': - specifier: ^0.16.1 - version: 0.16.1(@discordjs/opus@0.9.0) - '@distube/soundcloud': - specifier: ^1.3.5 - version: 1.3.5(distube@4.2.2) - '@distube/spotify': - specifier: ^1.6.1 - version: 1.6.1(distube@4.2.2) - '@distube/yt-dlp': - specifier: ^1.1.3 - version: 1.1.3(distube@4.2.2) - '@distube/ytdl-core': - specifier: ^4.13.3 - version: 4.13.3 - cross-env: - specifier: 7.0.3 - version: 7.0.3 - discord.js: - specifier: 14.14.1 - version: 14.14.1 - distube: - specifier: ^4.2.2 - version: 4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1) - distube-yandex-music-plugin: - specifier: ^0.2.1 - version: 0.2.1(distube@4.2.2) - dotenv: - specifier: ^16.4.5 - version: 16.4.5 - i18next: - specifier: ^22.5.1 - version: 22.5.1 - i18next-fs-backend: - specifier: ^2.3.1 - version: 2.3.1 - mongoose: - specifier: ^7.6.12 - version: 7.6.12 - node-os-utils: - specifier: ^1.3.7 - version: 1.3.7 - prism-media: - specifier: ^1.3.5 - version: 1.3.5(@discordjs/opus@0.9.0) - sodium-native: - specifier: ^4.1.1 - version: 4.1.1 - uuid: - specifier: ^9.0.1 - version: 9.0.1 - zod: - specifier: ^3.23.8 - version: 3.23.8 - -devDependencies: - '@types/node': - specifier: ^20.12.12 - version: 20.12.12 - '@types/node-os-utils': - specifier: ^1.3.4 - version: 1.3.4 - '@types/uuid': - specifier: ^9.0.8 - version: 9.0.8 - '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.57.0 - version: 8.57.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) - eslint-plugin-prettier: - specifier: ^5.1.3 - version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5) - prettier: - specifier: ^3.2.5 - version: 3.2.5 - typescript: - specifier: ^5.4.5 - version: 5.4.5 - -packages: - - /@babel/runtime@7.24.6: - resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@discordjs/builders@1.8.1: - resolution: {integrity: sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==} - engines: {node: '>=16.11.0'} - dependencies: - '@discordjs/formatters': 0.4.0 - '@discordjs/util': 1.1.0 - '@sapphire/shapeshift': 3.9.7 - discord-api-types: 0.37.83 - fast-deep-equal: 3.1.3 - ts-mixer: 6.0.4 - tslib: 2.6.2 - dev: false - - /@discordjs/collection@1.5.3: - resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} - engines: {node: '>=16.11.0'} - dev: false - - /@discordjs/collection@2.1.0: - resolution: {integrity: sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==} - engines: {node: '>=18'} - dev: false - - /@discordjs/formatters@0.3.3: - resolution: {integrity: sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==} - engines: {node: '>=16.11.0'} - dependencies: - discord-api-types: 0.37.61 - dev: false - - /@discordjs/formatters@0.4.0: - resolution: {integrity: sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==} - engines: {node: '>=16.11.0'} - dependencies: - discord-api-types: 0.37.83 - dev: false - - /@discordjs/node-pre-gyp@0.4.5: - resolution: {integrity: sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==} - hasBin: true - dependencies: - detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.6.2 - tar: 6.2.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@discordjs/opus@0.9.0: - resolution: {integrity: sha512-NEE76A96FtQ5YuoAVlOlB3ryMPrkXbUCTQICHGKb8ShtjXyubGicjRMouHtP1RpuDdm16cDa+oI3aAMo1zQRUQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@discordjs/node-pre-gyp': 0.4.5 - node-addon-api: 5.1.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@discordjs/rest@1.7.1: - resolution: {integrity: sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==} - engines: {node: '>=16.9.0'} - dependencies: - '@discordjs/collection': 1.5.3 - '@discordjs/util': 0.3.1 - '@sapphire/async-queue': 1.5.2 - '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.37.85 - file-type: 18.7.0 - tslib: 2.6.2 - undici: 5.28.4 - dev: false - - /@discordjs/rest@2.3.0: - resolution: {integrity: sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==} - engines: {node: '>=16.11.0'} - dependencies: - '@discordjs/collection': 2.1.0 - '@discordjs/util': 1.1.0 - '@sapphire/async-queue': 1.5.2 - '@sapphire/snowflake': 3.5.3 - '@vladfrangu/async_event_emitter': 2.2.4 - discord-api-types: 0.37.83 - magic-bytes.js: 1.10.0 - tslib: 2.6.2 - undici: 6.13.0 - dev: false - - /@discordjs/util@0.3.1: - resolution: {integrity: sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==} - engines: {node: '>=16.9.0'} - dev: false - - /@discordjs/util@1.1.0: - resolution: {integrity: sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==} - engines: {node: '>=16.11.0'} - dev: false - - /@discordjs/voice@0.16.1(@discordjs/opus@0.9.0): - resolution: {integrity: sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==} - engines: {node: '>=16.11.0'} - dependencies: - '@types/ws': 8.5.10 - discord-api-types: 0.37.61 - prism-media: 1.3.5(@discordjs/opus@0.9.0) - tslib: 2.6.2 - ws: 8.17.0 - transitivePeerDependencies: - - '@discordjs/opus' - - bufferutil - - ffmpeg-static - - node-opus - - opusscript - - utf-8-validate - dev: false - - /@discordjs/ws@1.1.0: - resolution: {integrity: sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==} - engines: {node: '>=16.11.0'} - dependencies: - '@discordjs/collection': 2.1.0 - '@discordjs/rest': 2.3.0 - '@discordjs/util': 1.1.0 - '@sapphire/async-queue': 1.5.2 - '@types/ws': 8.5.10 - '@vladfrangu/async_event_emitter': 2.2.4 - discord-api-types: 0.37.83 - tslib: 2.6.2 - ws: 8.17.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /@distube/soundcloud@1.3.5(distube@4.2.2): - resolution: {integrity: sha512-d/Va+DrBCpwFB7aAEwofAbQ8OWmJViHJtl/OsIfHsNBhh/A5Agp1I0P2Go8dJTQtOhNhKUxgR7Pa1jOxP7m9Xw==} - peerDependencies: - distube: 3||4 - dependencies: - distube: 4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1) - soundcloud.ts: 0.5.3 - dev: false - - /@distube/spotify@1.6.1(distube@4.2.2): - resolution: {integrity: sha512-nuBftbp05y+pMFcJBlaewauz1LXqrjv5PluIFtlaq50cNx4smton1l3rZxFoqbYQJaFx1cfnbVxwqCUBNEkpIQ==} - peerDependencies: - distube: ^3.3.1||4 - dependencies: - distube: 4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1) - spotify-uri: 4.1.0 - spotify-url-info: 3.2.15 - spotify-web-api-node: 5.0.2 - undici: 6.18.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@distube/yt-dlp@1.1.3(distube@4.2.2): - resolution: {integrity: sha512-kInFaIgNK7bhUJwY5o/ejBpwHdtLEH9l/GPBl9G7ddMKFYx7/MA5vKZ2F3oZQVMq9pzphPMRpSGi4UBT9L6O2g==} - engines: {node: '>=12.0.0'} - requiresBuild: true - peerDependencies: - distube: 3.x||4.x - dependencies: - dargs: 7.0.0 - distube: 4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1) - execa: 5.1.1 - mkdirp: 1.0.4 - undici: 5.28.4 - dev: false - - /@distube/ytdl-core@4.13.3: - resolution: {integrity: sha512-WHVzp0NyUkmdxRkfU8tN7eRquL7bnia2U/EDNWVupCptRo7EToTdBKHwJrDFqvavbXsdqLG/kR1r+1LaPglrFQ==} - engines: {node: '>=12'} - dependencies: - http-cookie-agent: 5.0.4(tough-cookie@4.1.4)(undici@5.28.4) - m3u8stream: 0.8.6 - miniget: 4.2.3 - sax: 1.3.0 - tough-cookie: 4.1.4 - undici: 5.28.4 - transitivePeerDependencies: - - deasync - - supports-color - dev: false - - /@distube/ytpl@1.2.1: - resolution: {integrity: sha512-cp9nDYyGTZ2DNHURQXS76ptKWijLMspoxJEj03i++9tJf0LFGTWkskL3sLwcY4qQPLXjlH9FAXwwpjVttdXvZQ==} - engines: {node: '>=8'} - dependencies: - undici: 5.28.4 - dev: false - - /@distube/ytsr@2.0.0: - resolution: {integrity: sha512-N9z8IMbBCQ/gNnJmBgc0TBOU7tdl2nYDOnT6adN1utzIlrKWa2Ux+3UdAPV38f/qRrWohcmyMHPbSbex80ap3A==} - engines: {node: '>=18.0'} - dependencies: - undici: 6.0.1 - dev: false - - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: false - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true - - /@mongodb-js/saslprep@1.1.7: - resolution: {integrity: sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==} - requiresBuild: true - dependencies: - sparse-bitfield: 3.0.3 - dev: false - optional: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - - /@sapphire/async-queue@1.5.2: - resolution: {integrity: sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - dev: false - - /@sapphire/shapeshift@3.9.7: - resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} - engines: {node: '>=v16'} - dependencies: - fast-deep-equal: 3.1.3 - lodash: 4.17.21 - dev: false - - /@sapphire/snowflake@3.5.1: - resolution: {integrity: sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - dev: false - - /@sapphire/snowflake@3.5.3: - resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - dev: false - - /@tokenizer/token@0.3.0: - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/node-os-utils@1.3.4: - resolution: {integrity: sha512-BCUYrbdoO4FUbx6MB9atLNFnkxdliFaxdiTJMIPPiecXIApc5zf4NIqV5G1jWv/ReZvtYyHLs40RkBjHX+vykA==} - dev: true - - /@types/node@20.12.12: - resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} - dependencies: - undici-types: 5.26.5 - - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - - /@types/uuid@9.0.8: - resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} - dev: true - - /@types/webidl-conversions@7.0.3: - resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} - dev: false - - /@types/whatwg-url@8.2.2: - resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} - dependencies: - '@types/node': 20.12.12 - '@types/webidl-conversions': 7.0.3 - dev: false - - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - dependencies: - '@types/node': 20.12.12 - dev: false - - /@types/ws@8.5.9: - resolution: {integrity: sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==} - dependencies: - '@types/node': 20.12.12 - dev: false - - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.0 - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4 - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vladfrangu/async_event_emitter@2.2.4: - resolution: {integrity: sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==} - engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - dev: false - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - dev: true - - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /agent-base@7.1.1: - resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} - dependencies: - follow-redirects: 1.15.6 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - dev: true - - /bson@5.5.1: - resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} - engines: {node: '>=14.20.1'} - dev: false - - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false - - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: false - - /cross-env@7.0.3: - resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} - engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} - hasBin: true - dependencies: - cross-spawn: 7.0.3 - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /crypto@1.0.1: - resolution: {integrity: sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==} - deprecated: This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in. - dev: false - - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: false - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false - - /detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /discord-api-types@0.37.61: - resolution: {integrity: sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==} - dev: false - - /discord-api-types@0.37.83: - resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} - dev: false - - /discord-api-types@0.37.85: - resolution: {integrity: sha512-T75aB9JEw9X0rlMChEMHbr9JlXMqdmdKiZVjBeKs91cJo28IuAIldj+VZoC+I+Q9gCaRjHlwRkcksy2XZY6c3A==} - dev: false - - /discord.js@14.14.1: - resolution: {integrity: sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==} - engines: {node: '>=16.11.0'} - dependencies: - '@discordjs/builders': 1.8.1 - '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.3.3 - '@discordjs/rest': 2.3.0 - '@discordjs/util': 1.1.0 - '@discordjs/ws': 1.1.0 - '@sapphire/snowflake': 3.5.1 - '@types/ws': 8.5.9 - discord-api-types: 0.37.61 - fast-deep-equal: 3.1.3 - lodash.snakecase: 4.1.1 - tslib: 2.6.2 - undici: 5.27.2 - ws: 8.14.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: false - - /distube-yandex-music-plugin@0.2.1(distube@4.2.2): - resolution: {integrity: sha512-irCjn3t3JctfxLR86Mi9twcvDs8hTouYArpFR2nV/SkW59z1SA/0XUfqAJ0pBBW/aSADR06RqJi/WMH4MIWVPw==} - peerDependencies: - distube: ^3.3.1||4 - dependencies: - axios: 1.7.2 - distube: 4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1) - yandex-music-client: 0.4.3 - transitivePeerDependencies: - - debug - dev: false - - /distube@4.2.2(@discordjs/voice@0.16.1)(discord.js@14.14.1): - resolution: {integrity: sha512-DBfyScFM66RFGWzPlf+mXy4uU4wfF33qyCr+ojDjHsVYy7m7CJo3e9tkpz/PhIo8OdU/gb4TDiUHc8Pj0r5B/Q==} - engines: {node: '>=18.17'} - peerDependencies: - '@discordjs/voice': '*' - discord.js: '14' - dependencies: - '@discordjs/voice': 0.16.1(@discordjs/opus@0.9.0) - '@distube/ytdl-core': 4.13.3 - '@distube/ytpl': 1.2.1 - '@distube/ytsr': 2.0.0 - discord.js: 14.14.1 - tiny-typed-emitter: 2.1.0 - tough-cookie: 4.1.4 - tslib: 2.6.2 - undici: 6.18.1 - transitivePeerDependencies: - - deasync - - supports-color - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: false - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: false - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@9.1.0(eslint@8.57.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - dev: true - - /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5): - resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - dependencies: - eslint: 8.57.0 - eslint-config-prettier: 9.1.0(eslint@8.57.0) - prettier: 3.2.5 - prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false - - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - dependencies: - reusify: 1.0.4 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} - dependencies: - readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 - token-types: 5.0.1 - dev: false - - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true - - /follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /formidable@1.2.6: - resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} - deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' - dev: false - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false - - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - dependencies: - aproba: 2.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.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: false - - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - dev: false - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: false - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.0 - dev: false - - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: false - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: false - - /himalaya@1.1.0: - resolution: {integrity: sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==} - dev: false - - /http-cookie-agent@5.0.4(tough-cookie@4.1.4)(undici@5.28.4): - resolution: {integrity: sha512-OtvikW69RvfyP6Lsequ0fN5R49S+8QcS9zwd58k6VSr6r57T8G29BkPdyrBcSwLq6ExLs9V+rBlfxu7gDstJag==} - engines: {node: '>=14.18.0 <15.0.0 || >=16.0.0'} - peerDependencies: - deasync: ^0.1.26 - tough-cookie: ^4.0.0 - undici: ^5.11.0 - peerDependenciesMeta: - deasync: - optional: true - undici: - optional: true - dependencies: - agent-base: 7.1.1 - tough-cookie: 4.1.4 - undici: 5.28.4 - transitivePeerDependencies: - - supports-color - dev: false - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false - - /i18next-fs-backend@2.3.1: - resolution: {integrity: sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg==} - dev: false - - /i18next@22.5.1: - resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} - dependencies: - '@babel/runtime': 7.24.6 - dev: false - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {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. - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: false - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /kareem@2.5.1: - resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} - engines: {node: '>=12.0.0'} - dev: false - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false - - /m3u8stream@0.8.6: - resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==} - engines: {node: '>=12'} - dependencies: - miniget: 4.2.3 - sax: 1.3.0 - dev: false - - /magic-bytes.js@1.10.0: - resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} - dev: false - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - dev: false - - /memory-pager@1.5.0: - resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - requiresBuild: true - dev: false - optional: true - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: false - - /micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false - - /miniget@4.2.3: - resolution: {integrity: sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==} - engines: {node: '>=12'} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: false - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: false - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: false - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mongodb-connection-string-url@2.6.0: - resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} - dependencies: - '@types/whatwg-url': 8.2.2 - whatwg-url: 11.0.0 - dev: false - - /mongodb@5.9.2: - resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} - engines: {node: '>=14.20.1'} - peerDependencies: - '@aws-sdk/credential-providers': ^3.188.0 - '@mongodb-js/zstd': ^1.0.0 - kerberos: ^1.0.0 || ^2.0.0 - mongodb-client-encryption: '>=2.3.0 <3' - snappy: ^7.2.2 - peerDependenciesMeta: - '@aws-sdk/credential-providers': - optional: true - '@mongodb-js/zstd': - optional: true - kerberos: - optional: true - mongodb-client-encryption: - optional: true - snappy: - optional: true - dependencies: - bson: 5.5.1 - mongodb-connection-string-url: 2.6.0 - socks: 2.8.3 - optionalDependencies: - '@mongodb-js/saslprep': 1.1.7 - dev: false - - /mongoose@7.6.12: - resolution: {integrity: sha512-bjnOELGT2wWV3qjPZC4hol+O/QP4i7LrWenrtaN76A0X69T+Y19lmAhp74kLTNY13Djp1Agz1hoOq3bthmGLTg==} - engines: {node: '>=14.20.1'} - dependencies: - bson: 5.5.1 - kareem: 2.5.1 - mongodb: 5.9.2 - mpath: 0.9.0 - mquery: 5.0.0 - ms: 2.1.3 - sift: 16.0.1 - transitivePeerDependencies: - - '@aws-sdk/credential-providers' - - '@mongodb-js/zstd' - - kerberos - - mongodb-client-encryption - - snappy - - supports-color - dev: false - - /mpath@0.9.0: - resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} - engines: {node: '>=4.0.0'} - dev: false - - /mquery@5.0.0: - resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} - engines: {node: '>=14.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - dev: false - - /node-os-utils@1.3.7: - resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==} - dev: false - - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: false - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /peek-readable@5.0.0: - resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} - engines: {node: '>=14.16'} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - dependencies: - fast-diff: 1.3.0 - dev: true - - /prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /prism-media@1.3.5(@discordjs/opus@0.9.0): - resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} - peerDependencies: - '@discordjs/opus': '>=0.8.0 <1.0.0' - ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 - node-opus: ^0.3.3 - opusscript: ^0.0.8 - peerDependenciesMeta: - '@discordjs/opus': - optional: true - ffmpeg-static: - optional: true - node-opus: - optional: true - opusscript: - optional: true - dependencies: - '@discordjs/opus': 0.9.0 - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - /qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.6 - dev: false - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} - dependencies: - readable-stream: 3.6.2 - dev: false - - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - dependencies: - glob: 7.2.3 - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false - - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false - - /semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: false - - /sift@16.0.1: - resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} - dev: false - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false - - /socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - dev: false - - /sodium-native@4.1.1: - resolution: {integrity: sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==} - requiresBuild: true - dependencies: - node-gyp-build: 4.8.1 - dev: false - - /soundcloud.ts@0.5.3: - resolution: {integrity: sha512-ZMH6gG5e7WqJrIYXTv14MNArPhx3WzfrL1Ij/2qBDW8mVbNJc8lxOQOc4kLvrfvDl5TkCdZa7zXOiwD6ESXq+g==} - dependencies: - undici: 6.18.1 - dev: false - - /sparse-bitfield@3.0.3: - resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} - requiresBuild: true - dependencies: - memory-pager: 1.5.0 - dev: false - optional: true - - /spotify-uri@4.1.0: - resolution: {integrity: sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng==} - engines: {node: '>= 16'} - dev: false - - /spotify-url-info@3.2.15: - resolution: {integrity: sha512-NlolD2mqZjvt91hq0XVy3db55FCL2li1XBivkf/i+zUW1K9RP9nIOK5Bpg82DmBf96sjl4TYRI3zPOS94LPulQ==} - engines: {node: '>= 12'} - dependencies: - himalaya: 1.1.0 - spotify-uri: 4.1.0 - dev: false - - /spotify-web-api-node@5.0.2: - resolution: {integrity: sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==} - dependencies: - superagent: 6.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: false - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: false - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /strtok3@7.0.0: - resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} - engines: {node: '>=14.16'} - dependencies: - '@tokenizer/token': 0.3.0 - peek-readable: 5.0.0 - dev: false - - /superagent@6.1.0: - resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} - engines: {node: '>= 7.0.0'} - deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.3.4 - fast-safe-stringify: 2.1.1 - form-data: 3.0.1 - formidable: 1.2.6 - methods: 1.1.2 - mime: 2.6.0 - qs: 6.12.1 - readable-stream: 3.6.2 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 - dev: true - - /tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: false - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /tiny-typed-emitter@2.1.0: - resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} - dependencies: - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - dev: false - - /tough-cookie@4.1.4: - resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /tr46@3.0.0: - resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} - engines: {node: '>=12'} - dependencies: - punycode: 2.3.1 - dev: false - - /ts-mixer@6.0.4: - resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} - dev: false - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /tsutils@3.21.0(typescript@5.4.5): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.4.5 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /undici@5.27.2: - resolution: {integrity: sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: false - - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: false - - /undici@6.0.1: - resolution: {integrity: sha512-eZFYQLeS9BiXpsU0cuFhCwfeda2MnC48EVmmOz/eCjsTgmyTdaHdVsPSC/kwC2GtW2e0uH0HIPbadf3/bRWSxw==} - engines: {node: '>=18.0'} - dependencies: - '@fastify/busboy': 2.1.1 - dev: false - - /undici@6.13.0: - resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} - engines: {node: '>=18.0'} - dev: false - - /undici@6.18.1: - resolution: {integrity: sha512-/0BWqR8rJNRysS5lqVmfc7eeOErcOP4tZpATVjJOojjHZ71gSYVAtFhEmadcIjwMIUehh5NFyKGsXCnXIajtbA==} - engines: {node: '>=18.17'} - dev: false - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - dev: false - - /whatwg-url@11.0.0: - resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} - engines: {node: '>=12'} - dependencies: - tr46: 3.0.0 - webidl-conversions: 7.0.0 - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - dev: false - - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /ws@8.14.2: - resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yandex-music-client@0.4.3: - resolution: {integrity: sha512-bsWMXxTozWEgtRtEja/qkeVPmF5rTU5HPsXgNrg9uoTOkjU6SfmoaaKL9kwBBtU/55wxnKvpHlKozPLsfGIMvQ==} - dependencies: - crypto: 1.0.1 - form-data: 4.0.0 - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - dev: false diff --git a/src/EnvironmentVariables.ts b/src/EnvironmentVariables.ts index 8b08893..3ebdc9f 100644 --- a/src/EnvironmentVariables.ts +++ b/src/EnvironmentVariables.ts @@ -40,7 +40,8 @@ const envVariables = z.object({ BOT_SPOTIFY_CLIENT_SECRET: z.string().optional(), BOT_SPOTIFY_CLIENT_ID: z.string().optional(), - BOT_YANDEXMUSIC_TOKEN: z.string().optional() + BOT_YANDEXMUSIC_TOKEN: z.string().optional(), + BOT_YANDEXMUSIC_UID: z.coerce.number().optional() }); export const ENV = envVariables.parse(process.env); @@ -54,7 +55,7 @@ try { loggerSend('Cookie file is loaded', loggerPrefixEnv); } catch (e) { loggerError( - 'Cookie file is not provided or cookie is wrong. Please, follow this instructions https://distube.js.org/#/docs/DisTube/main/general/cookie', + 'Cookie file is not provided or cookie is wrong. Please, follow instructions in README.md', loggerPrefixEnv ); } diff --git a/src/Types.ts b/src/Types.ts index 090c23b..2752ea5 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -1,6 +1,6 @@ -import { Client, Collection } from 'discord.js'; +import { Client, ClientEvents, Collection } from 'discord.js'; import { ICommand, ICommandGroup } from './CommandTypes.js'; -import { AudioPlayerCore } from './commands/audio/audioPlayer/AudioPlayerCore.js'; +import { AudioPlayerCore } from './commands/audioPlayer/AudioPlayerCore.js'; import { DisTube } from 'distube'; declare module 'discord.js' { @@ -13,7 +13,7 @@ declare module 'discord.js' { } export interface BotEvent { - name: string; + name: keyof ClientEvents; once?: boolean | false; execute: (client: Client, ...args: any) => void; } diff --git a/src/commands/audio/download.command.ts b/src/commands/audio/download.command.ts index 79da861..68d87e9 100644 --- a/src/commands/audio/download.command.ts +++ b/src/commands/audio/download.command.ts @@ -6,7 +6,7 @@ import { deleteMP3file, DownloadSongErrorGetLocale, getSongFileAttachment -} from './util/downloadSong.js'; +} from '../audioPlayer/util/downloadSong.js'; import i18next from 'i18next'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { ReadStream } from 'fs'; diff --git a/src/commands/audio/jump.command.ts b/src/commands/audio/jump.command.ts index d3db5d9..0d82c53 100644 --- a/src/commands/audio/jump.command.ts +++ b/src/commands/audio/jump.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/play.command.ts b/src/commands/audio/play.command.ts index a143911..14c7397 100644 --- a/src/commands/audio/play.command.ts +++ b/src/commands/audio/play.command.ts @@ -1,18 +1,20 @@ import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { - AutocompleteInteraction, + ApplicationCommandOptionChoiceData, + AutocompleteInteraction, GuildChannel, GuildMember, Message, PermissionsBitField, SlashCommandBuilder, - TextChannel, + TextChannel, VoiceBasedChannel, VoiceChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { isValidURL } from '../../utilities/isValidURL.js'; -import { SearchResultType, SearchResultVideo } from 'distube'; import { truncateString } from '../../utilities/truncateString.js'; import i18next from 'i18next'; +import { SearchResultType, YouTubePlugin, YouTubeSearchResultSong } from '@distube/youtube'; +import { ExtractorPlugin } from 'distube'; export const services = 'Youtube, Spotify, Soundcloud, Yandex Music, HTTP-stream'; export default function (): ICommand { @@ -27,13 +29,15 @@ export default function (): ICommand { const songQuery = args.join(' '); const member = message.member as GuildMember; + const channel = message.channel as TextChannel; + await message.client.audioPlayer.play( - member.voice.channel as VoiceChannel, - message.channel as TextChannel, + member.voice.channel as VoiceBasedChannel, + channel, songQuery, { - member: message.member as GuildMember, - textChannel: message.channel as TextChannel + member: member, + textChannel: channel } ); @@ -62,15 +66,10 @@ export default function (): ICommand { const member = interaction.member as GuildMember; if (songQuery) { - await interaction.client.audioPlayer.play( - member.voice.channel as VoiceChannel, - interaction.channel as TextChannel, - songQuery, - { - member: interaction.member as GuildMember, - textChannel: interaction.channel as TextChannel - } - ); + await interaction.client.audioPlayer.play(member.voice.channel as VoiceChannel, interaction.channel as TextChannel, songQuery, { + member: interaction.member as GuildMember, + textChannel: interaction.channel as TextChannel + }); } } }, @@ -94,23 +93,25 @@ export async function songSearchAutocomplete(interaction: AutocompleteInteractio const focusedValue = interaction.options.getFocused(false); if (focusedValue && !isValidURL(focusedValue)) { - const choices = await interaction.client.audioPlayer.distube.search(focusedValue, { + const ytPlugin = interaction.client.audioPlayer.distube.plugins[0] as YouTubePlugin; + + const choices = await ytPlugin.search(focusedValue, { limit: 10, type: SearchResultType.VIDEO, safeSearch: false }); - const finalResult = choices.map((choice: SearchResultVideo) => { + const finalResult = choices.map((choice: YouTubeSearchResultSong) => { const duration = choice.isLive ? i18next.t('commands:play_stream') : choice.formattedDuration; let choiceString = `${duration} | ${truncateString(choice.uploader.name ?? '', 20)} | `; - choiceString += truncateString(choice.name, 100 - choiceString.length); + choiceString += truncateString(choice.name!, 100 - choiceString.length); return { name: choiceString, value: choice.url }; }); - await interaction.respond(finalResult); + await interaction.respond(finalResult as Array); return; } diff --git a/src/commands/audio/playfile.command.ts b/src/commands/audio/playfile.command.ts index d15bf51..c2e391b 100644 --- a/src/commands/audio/playfile.command.ts +++ b/src/commands/audio/playfile.command.ts @@ -8,7 +8,7 @@ import { VoiceChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; -import { isAudioFile } from './util/isAudioFile.js'; +import { isAudioFile } from '../audioPlayer/util/isAudioFile.js'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import i18next from 'i18next'; diff --git a/src/commands/audio/playing.command.ts b/src/commands/audio/playing.command.ts index 49d3441..b16a14d 100644 --- a/src/commands/audio/playing.command.ts +++ b/src/commands/audio/playing.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import { splitBar } from '../../utilities/splitBar.js'; import { Queue } from 'distube'; import i18next from 'i18next'; @@ -50,7 +50,7 @@ export function generatePlayingMessage(guild: Guild): EmbedBuilder { if (queue) { const song = queue.songs[0]; embed.setTitle(song.name!); - embed.setURL(song.url); + embed.setURL(song.url!); embed.setAuthor({ name: `${i18next.t('commands:playing_now_playing')}:` }); embed.addFields({ name: i18next.t('commands:playing_song_length'), diff --git a/src/commands/audio/previous.command.ts b/src/commands/audio/previous.command.ts index 354624b..b551e3a 100644 --- a/src/commands/audio/previous.command.ts +++ b/src/commands/audio/previous.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/rewind.command.ts b/src/commands/audio/rewind.command.ts index f0f76e5..00db881 100644 --- a/src/commands/audio/rewind.command.ts +++ b/src/commands/audio/rewind.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import { formatSecondsToTime } from '../../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; diff --git a/src/commands/audio/shuffle.command.ts b/src/commands/audio/shuffle.command.ts index f70f3da..e9cb269 100644 --- a/src/commands/audio/shuffle.command.ts +++ b/src/commands/audio/shuffle.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; export default function (): ICommand { return { diff --git a/src/commands/audio/skip.command.ts b/src/commands/audio/skip.command.ts index e8181f6..f93dbc6 100644 --- a/src/commands/audio/skip.command.ts +++ b/src/commands/audio/skip.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/stop.command.ts b/src/commands/audio/stop.command.ts index 6ad3a12..2b5f8f2 100644 --- a/src/commands/audio/stop.command.ts +++ b/src/commands/audio/stop.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from './util/AudioCommandWrappers.js'; +} from '../audioPlayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; export default function (): ICommand { diff --git a/src/commands/audio/audioPlayer/AudioPlayerCore.ts b/src/commands/audioPlayer/AudioPlayerCore.ts similarity index 57% rename from src/commands/audio/audioPlayer/AudioPlayerCore.ts rename to src/commands/audioPlayer/AudioPlayerCore.ts index 3a86acd..c35a5c6 100644 --- a/src/commands/audio/audioPlayer/AudioPlayerCore.ts +++ b/src/commands/audioPlayer/AudioPlayerCore.ts @@ -1,3 +1,15 @@ +import { DisTube, PlayOptions, Queue, RepeatMode, Song, Events as DistubeEvents } from 'distube'; +import { AudioPlayersManager } from './AudioPlayersManager.js'; +import { pagination } from '../../utilities/pagination/pagination.js'; +import { ButtonStyles, ButtonTypes } from '../../utilities/pagination/paginationTypes.js'; +import { clamp } from '../../utilities/clamp.js'; +import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; +import i18next from 'i18next'; +import { loggerError, loggerSend } from '../../utilities/logger.js'; +import { ENV } from '../../EnvironmentVariables.js'; +import { LoadPlugins } from './LoadPlugins.js'; +import { generateAddedPlaylistMessage } from './util/generateAddedPlaylistMessage.js'; +import { generateAddedSongMessage } from './util/generateAddedSongMessage.js'; import { Client, CommandInteraction, @@ -8,91 +20,9 @@ import { TextChannel, VoiceBasedChannel } from 'discord.js'; -import { - CustomPlugin, - DisTube, - ExtractorPlugin, - Playlist, - PlayOptions, - Queue, - RepeatMode, - SearchResult, - Song -} from 'distube'; -import { AudioPlayersManager } from './AudioPlayersManager.js'; -import { SpotifyPlugin } from '@distube/spotify'; -import { YtDlpPlugin } from '@distube/yt-dlp'; -import { SoundCloudPlugin } from '@distube/soundcloud'; -import { pagination } from '../../../utilities/pagination/pagination.js'; -import { ButtonStyles, ButtonTypes } from '../../../utilities/pagination/paginationTypes.js'; -import { clamp } from '../../../utilities/clamp.js'; -import { generateErrorEmbed } from '../../../utilities/generateErrorEmbed.js'; import { joinVoiceChannel } from '@discordjs/voice'; -import i18next from 'i18next'; - -import { YandexMusicPlugin } from 'distube-yandex-music-plugin'; -import { loggerError, loggerWarn } from '../../../utilities/logger.js'; -import { BOT_YOUTUBE_COOKIE, ENV } from '../../../EnvironmentVariables.js'; -const loggerPrefixAudioplayer = `Audioplayer`; - -function LoadPlugins(): Array { - const plugins: Array = []; - - if (!BOT_YOUTUBE_COOKIE) { - loggerWarn( - 'BOT_YOUTUBE_COOKIE is not provided, 18+ videos from Youtube is not available', - loggerPrefixAudioplayer - ); - } - - if (ENV.BOT_SPOTIFY_CLIENT_ID && ENV.BOT_SPOTIFY_CLIENT_SECRET) { - plugins.push( - new SpotifyPlugin({ - parallel: true, - emitEventsAfterFetching: true, - api: { - clientId: ENV.BOT_SPOTIFY_CLIENT_ID, - clientSecret: ENV.BOT_SPOTIFY_CLIENT_SECRET - } - }) - ); - } else { - loggerWarn( - 'Spotify plugin is disabled, because BOT_SPOTIFY_CLIENT_ID and BOT_SPOTIFY_CLIENT_SECRET are wrong or not provided', - loggerPrefixAudioplayer - ); - } - - if (ENV.BOT_YANDEXMUSIC_TOKEN) { - plugins.push( - new YandexMusicPlugin({ - oauthToken: ENV.BOT_YANDEXMUSIC_TOKEN - }) - ); - } else { - loggerWarn( - 'Yandex Music plugin is disabled, because BOT_YANDEXMUSIC_TOKEN are wrong or not provided', - loggerPrefixAudioplayer - ); - } - - plugins.push(new SoundCloudPlugin()); - if (!ENV.BOT_SOUNDCLOUD_CLIENT_ID || !ENV.BOT_SOUNDCLOUD_TOKEN) { - loggerWarn( - 'Some Soundcloud features is disabled, because BOT_SOUNDCLOUD_CLIENT_ID or BOT_SOUNDCLOUD_TOKEN are wrong or not provided', - loggerPrefixAudioplayer - ); - } - - plugins.push( - new YtDlpPlugin({ - update: true - }) - ); - - return plugins; -} +export const loggerPrefixAudioplayer = `Audioplayer`; export class AudioPlayerCore { client: Client; @@ -103,11 +33,6 @@ export class AudioPlayerCore { this.client.audioPlayer = this; this.playersManager = new AudioPlayersManager(this.client); this.distube = new DisTube(this.client, { - leaveOnEmpty: true, - emptyCooldown: ENV.NODE_ENV === 'production' ? 120 : 5, - leaveOnFinish: false, - leaveOnStop: true, - youtubeCookie: BOT_YOUTUBE_COOKIE ?? undefined, nsfw: true, emitAddListWhenCreatingQueue: true, emitAddSongWhenCreatingQueue: true, @@ -123,18 +48,20 @@ export class AudioPlayerCore { async play( voiceChannel: VoiceBasedChannel, textChannel: TextChannel, - song: string | Song | SearchResult, + song: string | Song, options?: PlayOptions ) { - await this.distube.voices.join(voiceChannel); - - joinVoiceChannel({ - channelId: voiceChannel.id, - guildId: voiceChannel.guildId, - adapterCreator: voiceChannel.guild.voiceAdapterCreator - }); - try { + // I am need manual connect user to a voice channel, because when I am using only Distube "play" + // method, getVoiceConnection in @discordjs/voice is not working + await this.distube.voices.join(voiceChannel); + + joinVoiceChannel({ + channelId: voiceChannel.id, + guildId: voiceChannel.guildId, + adapterCreator: voiceChannel.guild.voiceAdapterCreator + }); + await this.distube.play(voiceChannel, song, options); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); @@ -146,7 +73,7 @@ export class AudioPlayerCore { if (this.distube.getQueue(guild)) { await this.distube.stop(guild); } else { - await this.distube.voices.leave(guild); + this.distube.voices.leave(guild); } await this.playersManager.remove(guild.id); } @@ -157,10 +84,10 @@ export class AudioPlayerCore { const player = this.playersManager.get(queue.id); if (!player) return; if (queue.paused) { - await this.distube.resume(guild); + this.distube.resume(guild); await player.setState('playing'); } else { - await this.distube.pause(guild); + this.distube.pause(guild); await player.setState('pause'); } @@ -175,15 +102,15 @@ export class AudioPlayerCore { switch (queue.repeatMode) { case RepeatMode.DISABLED: - await queue.setRepeatMode(RepeatMode.SONG); + queue.setRepeatMode(RepeatMode.SONG); player.embedBuilder.setLoopMode('song'); break; case RepeatMode.SONG: - await queue.setRepeatMode(RepeatMode.QUEUE); + queue.setRepeatMode(RepeatMode.QUEUE); player.embedBuilder.setLoopMode('queue'); break; case RepeatMode.QUEUE: - await queue.setRepeatMode(RepeatMode.DISABLED); + queue.setRepeatMode(RepeatMode.DISABLED); player.embedBuilder.setLoopMode('disabled'); break; } @@ -195,7 +122,7 @@ export class AudioPlayerCore { try { const queue = this.distube.getQueue(guild); if (queue) { - await this.distube.skip(guild); + await this.distube.skip(guild.id); return queue.songs[0]; } } catch (e) { @@ -251,13 +178,14 @@ export class AudioPlayerCore { const player = this.playersManager.get(queue.id); if (!player) return false; if (time < 0) time = 0; - await this.distube.seek(guild, time); + this.distube.seek(guild, time); await player.setState('playing'); return true; } catch (e) { return false; } } + async showQueue(interaction: Interaction) { if (!interaction.guild) return; const queue = this.distube.getQueue(interaction.guild); @@ -280,13 +208,18 @@ export class AudioPlayerCore { `${i + 1}. ` + `[${song.name}](${song.url})` + ` - \`${song.formattedDuration}\`\n`; } - return new EmbedBuilder() + const page = new EmbedBuilder() .setAuthor({ name: `${i18next.t('audioplayer:show_queue_songs_in_queue')}: ` }) .setTitle(queue.songs[0].name!) - .setURL(queue.songs[0].url) .setDescription( `**${i18next.t('audioplayer:show_queue_title')}: **\n${queueList}`.slice(0, 4096) ); + + if (queue.songs[0].url) { + page.setURL(queue.songs[0].url); + } + + return page; } const arrayEmbeds: Array = []; @@ -330,12 +263,23 @@ export class AudioPlayerCore { } private setupEvents() { + if (ENV.BOT_VERBOSE_LOGGING) { + this.distube + .on(DistubeEvents.DEBUG, (message) => { + loggerSend(message, loggerPrefixAudioplayer); + }) + .on(DistubeEvents.FFMPEG_DEBUG, (message) => { + loggerSend(message, loggerPrefixAudioplayer); + }); + } + this.distube - .on('empty', async (queue) => { - await queue.textChannel?.send(i18next.t('audioplayer:event_empty') as string); - await this.playersManager.remove(queue.id); - }) - .on('initQueue', async (queue) => { + // TODO: Write custom code for handling user disconnects + // .on(DistubeEvents.EMPTY, async (queue) => { + // await queue.textChannel?.send(i18next.t('audioplayer:event_empty') as string); + // await this.playersManager.remove(queue.id); + // }) + .on(DistubeEvents.INIT_QUEUE, async (queue) => { await this.playersManager.add(queue.id, queue.textChannel as TextChannel, queue); const player = this.playersManager.get(queue.id); @@ -343,16 +287,16 @@ export class AudioPlayerCore { await player.init(); } }) - .on('playSong', async (queue) => { + .on(DistubeEvents.PLAY_SONG, async (queue) => { const player = this.playersManager.get(queue.id); if (player) { await player.setState('playing'); } }) - .on('disconnect', async (queue) => { + .on(DistubeEvents.DISCONNECT, async (queue) => { await this.playersManager.remove(queue.id); }) - .on('addSong', async (queue, song) => { + .on(DistubeEvents.ADD_SONG, async (queue, song) => { if (queue.textChannel) { await queue.textChannel.send({ embeds: [generateAddedSongMessage(song)] }); } @@ -362,7 +306,7 @@ export class AudioPlayerCore { await player.update(); } }) - .on('addList', async (queue, playlist) => { + .on(DistubeEvents.ADD_LIST, async (queue, playlist) => { if (queue.textChannel) { await queue.textChannel.send({ embeds: [generateAddedPlaylistMessage(playlist)] }); } @@ -372,13 +316,16 @@ export class AudioPlayerCore { await player.update(); } }) - .on('finishSong', async (queue) => { + .on(DistubeEvents.FINISH_SONG, async (queue) => { if (!this.playersManager.has(queue.id)) return; if (queue._next || queue._prev || queue.stopped || queue.songs.length > 1) return; this.playersManager.get(queue.id)?.setState('waiting'); }) - .on('error', async (channel, error) => { - channel?.send({ + .on(DistubeEvents.FINISH, async (queue) => { + queue.voice.leave(); + }) + .on(DistubeEvents.ERROR, async (error, queue) => { + queue.textChannel?.send({ embeds: [ generateErrorEmbed(`${error.name} + \n\n + ${error.message} \n\n + ${error.stack}`) ] @@ -386,53 +333,3 @@ export class AudioPlayerCore { }); } } - -function generateAddedSongMessage(song: Song) { - return new EmbedBuilder() - .setTitle(song.name ?? i18next.t('audioplayer:player_embed_unknown')) - .setURL(song.url ?? null) - .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_song')}🎵` }) - .setThumbnail(song.thumbnail ?? null) - .addFields( - { - name: `${i18next.t('audioplayer:player_embed_requester')}`, - value: `${song.member!.user.toString()}`, - inline: true - }, - { - name: `${i18next.t('audioplayer:event_add_song_length')}`, - value: `\`${song.formattedDuration}\``, - inline: true - }, - { - name: `${i18next.t('audioplayer:event_add_song_author')}`, - value: `\`${song.uploader.name ?? i18next.t('audioplayer:player_embed_unknown')}\``, - inline: true - } - ); -} - -function generateAddedPlaylistMessage(playlist: Playlist) { - return new EmbedBuilder() - .setTitle(playlist.name ?? i18next.t('audioplayer:player_embed_unknown')) - .setURL(playlist.url ?? null) - .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_list')}🎵` }) - .setThumbnail(playlist.thumbnail ?? null) - .addFields( - { - name: `${i18next.t('audioplayer:player_embed_requester')}`, - value: `${playlist.member!.user.toString()}`, - inline: true - }, - { - name: `${i18next.t('audioplayer:event_add_list_songs_count')}`, - value: `\`${playlist.songs.length}\``, - inline: true - }, - { - name: `${i18next.t('audioplayer:event_add_song_length')}`, - value: `\`${playlist.formattedDuration}\``, - inline: true - } - ); -} diff --git a/src/commands/audio/audioPlayer/AudioPlayerTypes.ts b/src/commands/audioPlayer/AudioPlayerTypes.ts similarity index 100% rename from src/commands/audio/audioPlayer/AudioPlayerTypes.ts rename to src/commands/audioPlayer/AudioPlayerTypes.ts diff --git a/src/commands/audio/audioPlayer/AudioPlayersManager.ts b/src/commands/audioPlayer/AudioPlayersManager.ts similarity index 86% rename from src/commands/audio/audioPlayer/AudioPlayersManager.ts rename to src/commands/audioPlayer/AudioPlayersManager.ts index eea762c..c1fa079 100644 --- a/src/commands/audio/audioPlayer/AudioPlayersManager.ts +++ b/src/commands/audioPlayer/AudioPlayersManager.ts @@ -1,4 +1,4 @@ -import { Client, Collection, TextChannel } from 'discord.js'; +import { Client, Collection, GuildTextBasedChannel, TextChannel } from 'discord.js'; import { Queue } from 'distube'; import { MessagePlayer } from './MessagePlayer.js'; @@ -10,10 +10,10 @@ export class AudioPlayersManager { } async add( guildId: string, - textChannel: TextChannel, + textChannel: GuildTextBasedChannel, queue: Queue ): Promise { - if (await this.client.guilds.cache.get(guildId)) { + if (this.client.guilds.cache.get(guildId)) { if (!this.collection.has(guildId)) { this.collection.set(guildId, new MessagePlayer(this.client, textChannel, queue)); } diff --git a/src/commands/audioPlayer/LoadPlugins.ts b/src/commands/audioPlayer/LoadPlugins.ts new file mode 100644 index 0000000..e35f0c8 --- /dev/null +++ b/src/commands/audioPlayer/LoadPlugins.ts @@ -0,0 +1,93 @@ +import { ExtractorPlugin, InfoExtractorPlugin, PlayableExtractorPlugin } from 'distube'; +import { BOT_YOUTUBE_COOKIE, ENV } from '../../EnvironmentVariables.js'; +import { loggerSend, loggerWarn } from '../../utilities/logger.js'; +import { SpotifyPlugin } from '@distube/spotify'; +import { SoundCloudPlugin } from '@distube/soundcloud'; +import { YtDlpPlugin } from '@distube/yt-dlp'; +import { loggerPrefixAudioplayer } from './AudioPlayerCore.js'; +import { YouTubePlugin } from '@distube/youtube'; +import { DirectLinkPlugin } from '@distube/direct-link'; +import { FilePlugin } from '@distube/file'; +import { AppleMusicPlugin } from 'distube-apple-music'; +import { YandexMusicPlugin } from 'distube-yandex-music-plugin'; + +export type DistubePlugin = ExtractorPlugin | InfoExtractorPlugin | PlayableExtractorPlugin; + +export function LoadPlugins(): Array { + const plugins: Array = []; + + if (!BOT_YOUTUBE_COOKIE) { + loggerWarn( + 'BOT_YOUTUBE_COOKIE is not provided, 18+ videos from Youtube is not available', + loggerPrefixAudioplayer + ); + } + + plugins.push( + new YouTubePlugin({ + cookies: BOT_YOUTUBE_COOKIE + }) + ); + + if (!ENV.BOT_SPOTIFY_CLIENT_ID || !ENV.BOT_SPOTIFY_CLIENT_SECRET) { + loggerWarn( + 'Spotify plugin can work worse, because BOT_SPOTIFY_CLIENT_ID and BOT_SPOTIFY_CLIENT_SECRET are wrong or not provided', + loggerPrefixAudioplayer + ); + } + + plugins.push( + new SpotifyPlugin({ + api: { + clientId: ENV.BOT_SPOTIFY_CLIENT_ID, + clientSecret: ENV.BOT_SPOTIFY_CLIENT_SECRET + } + }) + ); + + if (ENV.BOT_YANDEXMUSIC_TOKEN && ENV.BOT_YANDEXMUSIC_UID) { + plugins.push( + new YandexMusicPlugin({ + oauthToken: ENV.BOT_YANDEXMUSIC_TOKEN, + uid: ENV.BOT_YANDEXMUSIC_UID + }) + ); + } else { + loggerWarn( + 'Yandex Music plugin is disabled, because BOT_YANDEXMUSIC_TOKEN and BOT_YANDEXMUSIC_UID are wrong or not provided', + loggerPrefixAudioplayer + ); + } + + if (!ENV.BOT_SOUNDCLOUD_CLIENT_ID || !ENV.BOT_SOUNDCLOUD_TOKEN) { + loggerWarn( + 'Some Soundcloud features is disabled, because BOT_SOUNDCLOUD_CLIENT_ID or BOT_SOUNDCLOUD_TOKEN are wrong or not provided', + loggerPrefixAudioplayer + ); + } + + plugins.push( + new SoundCloudPlugin({ + clientId: ENV.BOT_SOUNDCLOUD_CLIENT_ID, + oauthToken: ENV.BOT_SOUNDCLOUD_TOKEN + }) + ); + + plugins.push(new AppleMusicPlugin()); + plugins.push(new DirectLinkPlugin()); + plugins.push(new FilePlugin()); + plugins.push( + new YtDlpPlugin({ + update: true + }) + ); + + loggerSend( + `Loaded plugins: ${plugins.map((plugin: DistubePlugin) => { + return ' ' + plugin.constructor.name; + })}`, + loggerPrefixAudioplayer + ); + + return plugins; +} diff --git a/src/commands/audio/audioPlayer/MessagePlayer.ts b/src/commands/audioPlayer/MessagePlayer.ts similarity index 92% rename from src/commands/audio/audioPlayer/MessagePlayer.ts rename to src/commands/audioPlayer/MessagePlayer.ts index 89480af..8971c87 100644 --- a/src/commands/audio/audioPlayer/MessagePlayer.ts +++ b/src/commands/audioPlayer/MessagePlayer.ts @@ -1,17 +1,17 @@ -import { Client, Message, TextChannel } from 'discord.js'; +import { Client, GuildTextBasedChannel, Message, TextChannel } from 'discord.js'; import { MessagePlayerEmbedBuilder } from './MessagePlayerEmbedBuilder.js'; import { Queue, Song } from 'distube'; import { MessagePlayerButtonsHandler } from './MessagePlayerButtonsHandler.js'; import { AudioPlayerState } from './AudioPlayerTypes.js'; -import { checkBotInVoice } from '../../../utilities/checkBotInVoice.js'; +import { checkBotInVoice } from '../../utilities/checkBotInVoice.js'; import i18next from 'i18next'; -import { ENV } from '../../../EnvironmentVariables.js'; -import { loggerError } from '../../../utilities/logger.js'; +import { ENV } from '../../EnvironmentVariables.js'; +import { loggerError } from '../../utilities/logger.js'; export class MessagePlayer { private readonly client: Client; // TextChannel where player was created - readonly textChannel: TextChannel; + readonly textChannel: GuildTextBasedChannel; // Player state private state: AudioPlayerState = 'loading'; // Player embed interface @@ -31,7 +31,7 @@ export class MessagePlayer { private finishTime = 20000; // Timer object for "waiting" state private finishTimer: NodeJS.Timeout | undefined; - constructor(client: Client, txtChannel: TextChannel, queue: Queue) { + constructor(client: Client, txtChannel: GuildTextBasedChannel, queue: Queue) { this.client = client; this.textChannel = txtChannel; this.queue = queue; @@ -42,13 +42,13 @@ export class MessagePlayer { // It can be canceled by switching state to any other state async startFinishTimer() { try { - if (await checkBotInVoice(this.textChannel.guild)) { + if (checkBotInVoice(this.textChannel.guild)) { await this.stopFinishTimer(); this.finishTimer = setTimeout(async () => { - const queue = this.client.audioPlayer.distube.getQueue(this.textChannel.guild); + const queue = this.client.audioPlayer.distube.getQueue(this.textChannel.guild.id); // loggerSend('try to stop player on cooldown') if (queue) return; - if (await checkBotInVoice(this.textChannel.guild)) { + if (checkBotInVoice(this.textChannel.guild)) { await this.client.audioPlayer.stop(this.textChannel.guild); await this.textChannel.send(i18next.t('audioplayer:event_finish_time') as string); await this.stopFinishTimer(); @@ -68,7 +68,7 @@ export class MessagePlayer { // Update embed interface to represent the current state of player, BUT THIS NOT PUSHES UPDATED EMBED TO MESSAGE private updateEmbedState() { const queue: Queue | undefined = this.client.audioPlayer.distube.getQueue( - this.textChannel.guild + this.textChannel.guild.id ); if (queue) { this.queue = queue; @@ -80,13 +80,13 @@ export class MessagePlayer { this.embedBuilder.setSongDuration(currentSong.duration, currentSong.isLive); this.embedBuilder.setSongTitle( currentSong.name ?? i18next.t('audioplayer:player_embed_unknown'), - currentSong.url + currentSong.url! ); this.embedBuilder.setThumbnailURL(currentSong.thumbnail ?? null); this.embedBuilder.setUploader(currentSong.uploader.name); if (currentSong.user) { - this.embedBuilder.setRequester(currentSong.user); + this.embedBuilder.setRequester(currentSong.user!); } } this.embedBuilder.setNextSong(this.queue.songs[1]?.name); @@ -212,7 +212,7 @@ export class MessagePlayer { this.state = state; // When Distube is waiting the song, they remove their Queue object. // So when we try to play a new song, we need to receive a new Queue - const queue = this.client.audioPlayer.distube.getQueue(this.textChannel.guild); + const queue = this.client.audioPlayer.distube.getQueue(this.textChannel.guild.id); if (queue) { this.queue = queue; } diff --git a/src/commands/audio/audioPlayer/MessagePlayerButtonsHandler.ts b/src/commands/audioPlayer/MessagePlayerButtonsHandler.ts similarity index 92% rename from src/commands/audio/audioPlayer/MessagePlayerButtonsHandler.ts rename to src/commands/audioPlayer/MessagePlayerButtonsHandler.ts index 8a8c515..bd73b1d 100644 --- a/src/commands/audio/audioPlayer/MessagePlayerButtonsHandler.ts +++ b/src/commands/audioPlayer/MessagePlayerButtonsHandler.ts @@ -8,21 +8,21 @@ import { Client, GuildMember, ButtonInteraction, - Guild + Guild, GuildTextBasedChannel } from 'discord.js'; -import { checkMemberInVoiceWithBot } from '../../../utilities/checkMemberInVoiceWithBot.js'; -import { generateErrorEmbed } from '../../../utilities/generateErrorEmbed.js'; -import { loggerError } from '../../../utilities/logger.js'; -import { generateSkipMessage, generateSkipMessageFailure } from '../skip.command.js'; -import { generateMessageAudioPlayerStop } from '../stop.command.js'; +import { checkMemberInVoiceWithBot } from '../../utilities/checkMemberInVoiceWithBot.js'; +import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; +import { loggerError } from '../../utilities/logger.js'; +import { generateSkipMessage, generateSkipMessageFailure } from '../audio/skip.command.js'; +import { generateMessageAudioPlayerStop } from '../audio/stop.command.js'; import { generateMessageAudioPlayerPrevious, generateMessageAudioPlayerPreviousFailure -} from '../previous.command.js'; +} from '../audio/previous.command.js'; import { generateMessageAudioPlayerShuffle, generateMessageAudioPlayerShuffleFailure -} from '../shuffle.command.js'; +} from '../audio/shuffle.command.js'; enum ButtonIDs { stopMusic = 'stopMusic', @@ -30,7 +30,7 @@ enum ButtonIDs { toggleLoopMode = 'toggleLoopMode', previousSong = 'previousSong', skipSong = 'skipSong', - downloadSong = 'downloadSong', + //downloadSong = 'downloadSong', shuffle = 'shuffle', showQueue = 'showQueue' } @@ -40,7 +40,7 @@ export class MessagePlayerButtonsHandler { rowWithOnlyStop = new ActionRowBuilder(); collector: InteractionCollector; client: Client; - constructor(client: Client, textChannel: TextChannel) { + constructor(client: Client, textChannel: GuildTextBasedChannel) { this.client = client; this.rowPrimary.addComponents( diff --git a/src/commands/audio/audioPlayer/MessagePlayerEmbedBuilder.ts b/src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts similarity index 97% rename from src/commands/audio/audioPlayer/MessagePlayerEmbedBuilder.ts rename to src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts index c9ee04c..c84995e 100644 --- a/src/commands/audio/audioPlayer/MessagePlayerEmbedBuilder.ts +++ b/src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts @@ -1,7 +1,7 @@ import { EmbedBuilder, User } from 'discord.js'; import { AudioPlayerLoopMode, AudioPlayerState } from './AudioPlayerTypes.js'; -import { getNoun } from '../../../utilities/getNoun.js'; -import { formatSecondsToTime } from '../../../utilities/formatSecondsToTime.js'; +import { getNoun } from '../../utilities/getNoun.js'; +import { formatSecondsToTime } from '../../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; export class MessagePlayerEmbedBuilder extends EmbedBuilder { diff --git a/src/commands/audio/util/AudioCommandWrappers.ts b/src/commands/audioPlayer/util/AudioCommandWrappers.ts similarity index 100% rename from src/commands/audio/util/AudioCommandWrappers.ts rename to src/commands/audioPlayer/util/AudioCommandWrappers.ts diff --git a/src/commands/audio/util/downloadSong.ts b/src/commands/audioPlayer/util/downloadSong.ts similarity index 67% rename from src/commands/audio/util/downloadSong.ts rename to src/commands/audioPlayer/util/downloadSong.ts index 8b25a44..3f40636 100644 --- a/src/commands/audio/util/downloadSong.ts +++ b/src/commands/audioPlayer/util/downloadSong.ts @@ -4,11 +4,13 @@ import fs, { createReadStream, ReadStream } from 'fs'; import { pipeline } from 'stream/promises'; import { v4 as uuidv4 } from 'uuid'; import { unlink } from 'fs/promises'; -import { isURL } from 'distube'; +import { isURL, Playlist, Song } from 'distube'; import i18next from 'i18next'; -fs.rmSync('./downloads', { recursive: true, force: true }); -fs.mkdirSync('./downloads'); +const downloadFolderPath = process.cwd() + '/downloads'; + +fs.rmSync(downloadFolderPath, { recursive: true, force: true }); +fs.mkdirSync(downloadFolderPath); class DownloadSongError extends Error { constructor(message: DownloadSongMessage) { @@ -17,34 +19,37 @@ class DownloadSongError extends Error { } } -type DownloadSongMessage = 'is_not_url' | 'not_found' | 'song_is_too_large' | 'failed_loading'; -const maxDownloadSize = 10000000; //bytes +type DownloadSongMessage = + | 'is_not_url' + | 'not_found' + | 'song_is_too_large' + | 'failed_loading' + | 'this_is_playlist'; + +const maxDownloadSize = 2.5e7; //bytes +const maxDownloadSizeMB = maxDownloadSize / 1000000; export async function downloadSong( client: Client, request: string ): Promise { - let streamUrl = ''; + let streamUrl: string | undefined = ''; if (!isURL(request)) { throw new DownloadSongError('is_not_url'); } - for (const plugin of client.audioPlayer.distube.customPlugins) { - if (await plugin.validate(request)) { - streamUrl = await plugin.getStreamURL(request); - break; - } + const song: Song | Playlist = await client.audioPlayer.distube.handler.resolve(request); + if (song instanceof Playlist) { + throw new DownloadSongError('this_is_playlist'); } - for (const plugin of client.audioPlayer.distube.extractorPlugins) { - if (await plugin.validate(request)) { - streamUrl = await plugin.getStreamURL(request); - break; - } - } + await client.audioPlayer.distube.handler.attachStreamInfo(song); + + // @ts-expect-error Url property exists, I know it + streamUrl = song.stream.playFromSource ? song.stream.url : song.stream.song?.stream.url; - if (streamUrl === '') { + if (streamUrl === '' || streamUrl === undefined) { throw new DownloadSongError('not_found'); } @@ -68,6 +73,7 @@ async function convertWebmToMp3(webmStream: ReadableStream) { const file = fs.createWriteStream(file_name); const duplex = prism.FFmpeg.from(webmStream); + // @ts-expect-error Duplex can be provided to pipeline function await pipeline(duplex, file); return createReadStream(file_name); } @@ -88,7 +94,7 @@ export async function deleteMP3file(fileName: string) { export function DownloadSongErrorGetLocale(errorMessage: DownloadSongMessage) { if (errorMessage === 'song_is_too_large') { return i18next.t(`commands:download_song_error_${errorMessage}`, { - maxDownloadSize: maxDownloadSize / 1000000 + maxDownloadSize: maxDownloadSizeMB }); } return i18next.t(`commands:download_song_error_${errorMessage}`); diff --git a/src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts b/src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts new file mode 100644 index 0000000..6a4722f --- /dev/null +++ b/src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts @@ -0,0 +1,28 @@ +import { Playlist } from 'distube'; +import { EmbedBuilder } from 'discord.js'; +import i18next from 'i18next'; + +export function generateAddedPlaylistMessage(playlist: Playlist) { + return new EmbedBuilder() + .setTitle(playlist.name ?? i18next.t('audioplayer:player_embed_unknown')) + .setURL(playlist.url ?? null) + .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_list')}🎵` }) + .setThumbnail(playlist.thumbnail ?? null) + .addFields( + { + name: `${i18next.t('audioplayer:player_embed_requester')}`, + value: `${playlist.member!.user.toString()}`, + inline: true + }, + { + name: `${i18next.t('audioplayer:event_add_list_songs_count')}`, + value: `\`${playlist.songs.length}\``, + inline: true + }, + { + name: `${i18next.t('audioplayer:event_add_song_length')}`, + value: `\`${playlist.formattedDuration}\``, + inline: true + } + ); +} diff --git a/src/commands/audioPlayer/util/generateAddedSongMessage.ts b/src/commands/audioPlayer/util/generateAddedSongMessage.ts new file mode 100644 index 0000000..8301e35 --- /dev/null +++ b/src/commands/audioPlayer/util/generateAddedSongMessage.ts @@ -0,0 +1,28 @@ +import { Song } from 'distube'; +import { EmbedBuilder } from 'discord.js'; +import i18next from 'i18next'; + +export function generateAddedSongMessage(song: Song) { + return new EmbedBuilder() + .setTitle(song.name ?? i18next.t('audioplayer:player_embed_unknown')) + .setURL(song.url ?? null) + .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_song')}🎵` }) + .setThumbnail(song.thumbnail ?? null) + .addFields( + { + name: `${i18next.t('audioplayer:player_embed_requester')}`, + value: `${song.member!.user.toString()}`, + inline: true + }, + { + name: `${i18next.t('audioplayer:event_add_song_length')}`, + value: `\`${song.formattedDuration}\``, + inline: true + }, + { + name: `${i18next.t('audioplayer:event_add_song_author')}`, + value: `\`${song.uploader.name ?? i18next.t('audioplayer:player_embed_unknown')}\``, + inline: true + } + ); +} diff --git a/src/commands/audio/util/isAudioFile.ts b/src/commands/audioPlayer/util/isAudioFile.ts similarity index 100% rename from src/commands/audio/util/isAudioFile.ts rename to src/commands/audioPlayer/util/isAudioFile.ts diff --git a/src/commands/info/status.command.ts b/src/commands/info/status.command.ts index e7ab0b5..a79afa1 100644 --- a/src/commands/info/status.command.ts +++ b/src/commands/info/status.command.ts @@ -8,8 +8,6 @@ import { SlashCommandBuilder } from 'discord.js'; import { GroupInfo } from './InfoTypes.js'; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import node_os_pkg from 'node-os-utils'; import i18next from 'i18next'; diff --git a/src/events/interactionHandlers/slashCommandHandler.ts b/src/events/interactionHandlers/slashCommandHandler.ts index 00b18a0..f7da309 100644 --- a/src/events/interactionHandlers/slashCommandHandler.ts +++ b/src/events/interactionHandlers/slashCommandHandler.ts @@ -72,9 +72,6 @@ export async function slashCommandHandler(interaction: Interaction) { await command.slash_data.execute(interaction); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) - loggerError( - `${i18next.t('commandshandlers:slash_command_error')}: ${e}`, - loggerPrefixCommandHandler - ); + loggerError(`Error when executing slash command: ${e}`, loggerPrefixCommandHandler); } } diff --git a/src/events/messageHandlers/textCommandsHandler.ts b/src/events/messageHandlers/textCommandsHandler.ts index ffa3f42..3f86b73 100644 --- a/src/events/messageHandlers/textCommandsHandler.ts +++ b/src/events/messageHandlers/textCommandsHandler.ts @@ -123,9 +123,6 @@ export async function textCommandsHandler(client: Client, message: Message) { await command.text_data.execute(message, args); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) - loggerError( - `${i18next.t('commandshandlers:text_command_error')}: ${e}`, - loggerPrefixCommandHandler - ); + loggerError(`commandshandlers:text_command_error: ${e}`, loggerPrefixCommandHandler); } } diff --git a/src/events/onReady.event.ts b/src/events/onReady.event.ts index 2b5e5ac..cbb9c29 100644 --- a/src/events/onReady.event.ts +++ b/src/events/onReady.event.ts @@ -8,9 +8,7 @@ const event: BotEvent = { execute: (client) => { if (!client.user) return; - loggerSend( - `Bot ${client.user.username} is running, on version ${process.env.npm_package_version}` - ); + loggerSend(`Bot ${client.user.username} is successfully started!`); client.user.setActivity('/help'); } }; diff --git a/src/events/voiceChannelUpdate.ts b/src/events/voiceChannelUpdate.ts new file mode 100644 index 0000000..f210fc8 --- /dev/null +++ b/src/events/voiceChannelUpdate.ts @@ -0,0 +1,20 @@ +import { BotEvent } from '../Types'; +import { Client, Events, VoiceState } from 'discord.js'; +import { isVoiceChannelEmpty } from 'distube'; + +export const event: BotEvent = { + name: Events.VoiceStateUpdate, + execute: (client: Client, oldState: VoiceState) => { + if (!oldState?.channel) return; + //ENV.NODE_ENV === 'production' ? 120 : 5 + const queue = client.distube.queues.get(oldState); + if (!queue) return; + if (isVoiceChannelEmpty(oldState)) { + queue.pause(); + } else if (queue.paused) { + queue.resume(); + } + } +}; + +export default event; diff --git a/src/locales/ru/commandshandlers.json b/src/locales/ru/commandshandlers.json index bb1121d..a8d0bdc 100644 --- a/src/locales/ru/commandshandlers.json +++ b/src/locales/ru/commandshandlers.json @@ -1,6 +1,4 @@ { - "text_command_error": "Ошибка исполнения текстовой команды", - "slash_command_error": "Ошибка при исполнении \"/\" команды", "bot_not_enough_permissions_1": "У БОТА недостаточно прав на этом канале или сервере", "bot_not_enough_permissions_2": "Напишите /help (название команды), чтобы увидеть недостающие права", "bot_not_enough_permissions_3": "А также попросите администрацию сервера их выдать боту", diff --git a/src/main.ts b/src/main.ts index 22423ea..5842495 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,16 @@ +loggerSend(`Starting bot on version ${process.env.npm_package_version}`); + import { Client, GatewayIntentBits, Partials } from 'discord.js'; -import { loggerError } from './utilities/logger.js'; +import { loggerError, loggerSend } from './utilities/logger.js'; import { loginBot } from './utilities/loginBot.js'; -import { AudioPlayerCore } from './commands/audio/audioPlayer/AudioPlayerCore.js'; +import { AudioPlayerCore } from './commands/audioPlayer/AudioPlayerCore.js'; import loadLocale from './locales/Locale.js'; await loadLocale(); import { handlersLoad } from './handlers/handlersLoad.js'; -const client = new Client({ +const client = new Client({ intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildPresences, diff --git a/tsconfig.json b/tsconfig.json index 4ca1534..7d58356 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { - "module": "NodeNext", - "target": "es2021", + "baseUrl": ".", + "module": "preserve", + "target": "es2022", "sourceMap": true, "rootDir": "./src", "outDir": "./build", @@ -12,7 +13,7 @@ "resolveJsonModule": true, "forceConsistentCasingInFileNames": false, "allowSyntheticDefaultImports": true, - "skipLibCheck": true + "skipLibCheck": true, }, "compileOnSave": true, "include": [ @@ -22,5 +23,5 @@ "exclude": [ "node_modules", "build" - ], + ] } From 65e0fc01a00d48dc71ad9e914da979c4b930d81a Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Mon, 1 Jul 2024 16:02:14 +0300 Subject: [PATCH 02/13] 3.0.0-dev-1 Audioplayer stop now works again. Audioplayer finish state now works again. Refactored audioplayer discord events. When a voice channel is empty, audioplayer sets queue to pause, but when user reconnects, queue is resumed. --- README.md | 2 +- src/logo.png => logo.png | Bin package.json | 2 +- src/Types.ts | 2 +- .../AudioPlayerCore.ts | 52 ++++++++++++++---- .../AudioPlayerTypes.ts | 0 .../AudioPlayersManager.ts | 0 .../LoadPlugins.ts | 4 +- .../MessagePlayer.ts | 10 ++-- .../MessagePlayerButtonsHandler.ts | 38 ++++++++----- .../MessagePlayerEmbedBuilder.ts | 4 +- .../AudioPlayerEventChannelDelete.ts | 8 +++ .../AudioPlayerEventMessageCreate.ts} | 2 +- .../AudioPlayerEventMessageDeleted.ts | 19 +++++++ .../AudioPlayerEventVoiceChannelUpdate.ts | 13 +++++ .../util/AudioCommandWrappers.ts | 2 +- .../util/downloadSong.ts | 0 .../util/generateAddedPlaylistMessage.ts | 0 .../util/generateAddedSongMessage.ts | 0 .../util/isAudioFile.ts | 0 src/commands/audio/download.command.ts | 2 +- src/commands/audio/jump.command.ts | 2 +- src/commands/audio/play.command.ts | 22 ++++---- src/commands/audio/playfile.command.ts | 2 +- src/commands/audio/playing.command.ts | 2 +- src/commands/audio/previous.command.ts | 2 +- src/commands/audio/rewind.command.ts | 2 +- src/commands/audio/shuffle.command.ts | 2 +- src/commands/audio/skip.command.ts | 2 +- src/commands/audio/stop.command.ts | 2 +- src/events/messageCreate.event.ts | 6 +- src/events/messageDeleted.event.ts | 21 ++----- src/events/onChannelDelete.event.ts | 8 +-- src/events/voiceChannelUpdate.event.ts | 15 +++++ src/events/voiceChannelUpdate.ts | 20 ------- src/main.ts | 2 +- tsconfig.json | 2 +- 37 files changed, 167 insertions(+), 105 deletions(-) rename src/logo.png => logo.png (100%) rename src/{commands/audioPlayer => audioplayer}/AudioPlayerCore.ts (88%) rename src/{commands/audioPlayer => audioplayer}/AudioPlayerTypes.ts (100%) rename src/{commands/audioPlayer => audioplayer}/AudioPlayersManager.ts (100%) rename src/{commands/audioPlayer => audioplayer}/LoadPlugins.ts (94%) rename src/{commands/audioPlayer => audioplayer}/MessagePlayer.ts (96%) rename src/{commands/audioPlayer => audioplayer}/MessagePlayerButtonsHandler.ts (85%) rename src/{commands/audioPlayer => audioplayer}/MessagePlayerEmbedBuilder.ts (97%) create mode 100644 src/audioplayer/eventsHandlers/AudioPlayerEventChannelDelete.ts rename src/{events/messageHandlers/playerMessageHandler.ts => audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.ts} (84%) create mode 100644 src/audioplayer/eventsHandlers/AudioPlayerEventMessageDeleted.ts create mode 100644 src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts rename src/{commands/audioPlayer => audioplayer}/util/AudioCommandWrappers.ts (94%) rename src/{commands/audioPlayer => audioplayer}/util/downloadSong.ts (100%) rename src/{commands/audioPlayer => audioplayer}/util/generateAddedPlaylistMessage.ts (100%) rename src/{commands/audioPlayer => audioplayer}/util/generateAddedSongMessage.ts (100%) rename src/{commands/audioPlayer => audioplayer}/util/isAudioFile.ts (100%) create mode 100644 src/events/voiceChannelUpdate.event.ts delete mode 100644 src/events/voiceChannelUpdate.ts diff --git a/README.md b/README.md index 4c15a1b..9b8ab76 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- BotLogo + BotLogo

AICTest

diff --git a/src/logo.png b/logo.png similarity index 100% rename from src/logo.png rename to logo.png diff --git a/package.json b/package.json index 0917b5b..62cdd45 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-0", + "version": "3.0.0-dev-1", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/Types.ts b/src/Types.ts index 2752ea5..f67c8fe 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -1,6 +1,6 @@ import { Client, ClientEvents, Collection } from 'discord.js'; import { ICommand, ICommandGroup } from './CommandTypes.js'; -import { AudioPlayerCore } from './commands/audioPlayer/AudioPlayerCore.js'; +import { AudioPlayerCore } from './audioplayer/AudioPlayerCore.js'; import { DisTube } from 'distube'; declare module 'discord.js' { diff --git a/src/commands/audioPlayer/AudioPlayerCore.ts b/src/audioplayer/AudioPlayerCore.ts similarity index 88% rename from src/commands/audioPlayer/AudioPlayerCore.ts rename to src/audioplayer/AudioPlayerCore.ts index c35a5c6..2e7fcea 100644 --- a/src/commands/audioPlayer/AudioPlayerCore.ts +++ b/src/audioplayer/AudioPlayerCore.ts @@ -1,12 +1,12 @@ import { DisTube, PlayOptions, Queue, RepeatMode, Song, Events as DistubeEvents } from 'distube'; import { AudioPlayersManager } from './AudioPlayersManager.js'; -import { pagination } from '../../utilities/pagination/pagination.js'; -import { ButtonStyles, ButtonTypes } from '../../utilities/pagination/paginationTypes.js'; -import { clamp } from '../../utilities/clamp.js'; -import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; +import { pagination } from '../utilities/pagination/pagination.js'; +import { ButtonStyles, ButtonTypes } from '../utilities/pagination/paginationTypes.js'; +import { clamp } from '../utilities/clamp.js'; +import { generateErrorEmbed } from '../utilities/generateErrorEmbed.js'; import i18next from 'i18next'; -import { loggerError, loggerSend } from '../../utilities/logger.js'; -import { ENV } from '../../EnvironmentVariables.js'; +import { loggerError, loggerSend } from '../utilities/logger.js'; +import { ENV } from '../EnvironmentVariables.js'; import { LoadPlugins } from './LoadPlugins.js'; import { generateAddedPlaylistMessage } from './util/generateAddedPlaylistMessage.js'; import { generateAddedSongMessage } from './util/generateAddedSongMessage.js'; @@ -37,6 +37,7 @@ export class AudioPlayerCore { emitAddListWhenCreatingQueue: true, emitAddSongWhenCreatingQueue: true, savePreviousSongs: true, + joinNewVoiceChannel: true, plugins: LoadPlugins() }); @@ -54,7 +55,7 @@ export class AudioPlayerCore { try { // I am need manual connect user to a voice channel, because when I am using only Distube "play" // method, getVoiceConnection in @discordjs/voice is not working - await this.distube.voices.join(voiceChannel); + //await this.distube.voices.join(voiceChannel); joinVoiceChannel({ channelId: voiceChannel.id, @@ -70,15 +71,45 @@ export class AudioPlayerCore { } async stop(guild: Guild) { - if (this.distube.getQueue(guild)) { - await this.distube.stop(guild); + const queue = this.distube.getQueue(guild) + + if (queue) { + await queue.stop(); + queue.voice.leave(); } else { this.distube.voices.leave(guild); } + await this.playersManager.remove(guild.id); } async pause(guild: Guild) { + const queue = this.distube.getQueue(guild); + if (!queue) return; + const player = this.playersManager.get(queue.id); + if (!player) return; + if (!queue.paused) { + this.distube.pause(guild); + await player.setState('pause'); + } + + await player.update(); + } + + async resume(guild: Guild){ + const queue = this.distube.getQueue(guild); + if (!queue) return; + const player = this.playersManager.get(queue.id); + if (!player) return; + if (queue.paused) { + this.distube.resume(guild); + await player.setState('playing'); + } + + await player.update(); + } + + async pauseResume(guild: Guild){ const queue = this.distube.getQueue(guild); if (!queue) return; const player = this.playersManager.get(queue.id); @@ -321,9 +352,6 @@ export class AudioPlayerCore { if (queue._next || queue._prev || queue.stopped || queue.songs.length > 1) return; this.playersManager.get(queue.id)?.setState('waiting'); }) - .on(DistubeEvents.FINISH, async (queue) => { - queue.voice.leave(); - }) .on(DistubeEvents.ERROR, async (error, queue) => { queue.textChannel?.send({ embeds: [ diff --git a/src/commands/audioPlayer/AudioPlayerTypes.ts b/src/audioplayer/AudioPlayerTypes.ts similarity index 100% rename from src/commands/audioPlayer/AudioPlayerTypes.ts rename to src/audioplayer/AudioPlayerTypes.ts diff --git a/src/commands/audioPlayer/AudioPlayersManager.ts b/src/audioplayer/AudioPlayersManager.ts similarity index 100% rename from src/commands/audioPlayer/AudioPlayersManager.ts rename to src/audioplayer/AudioPlayersManager.ts diff --git a/src/commands/audioPlayer/LoadPlugins.ts b/src/audioplayer/LoadPlugins.ts similarity index 94% rename from src/commands/audioPlayer/LoadPlugins.ts rename to src/audioplayer/LoadPlugins.ts index e35f0c8..14ec0cb 100644 --- a/src/commands/audioPlayer/LoadPlugins.ts +++ b/src/audioplayer/LoadPlugins.ts @@ -1,6 +1,6 @@ import { ExtractorPlugin, InfoExtractorPlugin, PlayableExtractorPlugin } from 'distube'; -import { BOT_YOUTUBE_COOKIE, ENV } from '../../EnvironmentVariables.js'; -import { loggerSend, loggerWarn } from '../../utilities/logger.js'; +import { BOT_YOUTUBE_COOKIE, ENV } from '../EnvironmentVariables.js'; +import { loggerSend, loggerWarn } from '../utilities/logger.js'; import { SpotifyPlugin } from '@distube/spotify'; import { SoundCloudPlugin } from '@distube/soundcloud'; import { YtDlpPlugin } from '@distube/yt-dlp'; diff --git a/src/commands/audioPlayer/MessagePlayer.ts b/src/audioplayer/MessagePlayer.ts similarity index 96% rename from src/commands/audioPlayer/MessagePlayer.ts rename to src/audioplayer/MessagePlayer.ts index 8971c87..be2159f 100644 --- a/src/commands/audioPlayer/MessagePlayer.ts +++ b/src/audioplayer/MessagePlayer.ts @@ -3,10 +3,10 @@ import { MessagePlayerEmbedBuilder } from './MessagePlayerEmbedBuilder.js'; import { Queue, Song } from 'distube'; import { MessagePlayerButtonsHandler } from './MessagePlayerButtonsHandler.js'; import { AudioPlayerState } from './AudioPlayerTypes.js'; -import { checkBotInVoice } from '../../utilities/checkBotInVoice.js'; +import { checkBotInVoice } from '../utilities/checkBotInVoice.js'; import i18next from 'i18next'; -import { ENV } from '../../EnvironmentVariables.js'; -import { loggerError } from '../../utilities/logger.js'; +import { ENV } from '../EnvironmentVariables.js'; +import { loggerError } from '../utilities/logger.js'; export class MessagePlayer { private readonly client: Client; @@ -198,12 +198,12 @@ export class MessagePlayer { try { await this.messageWithPlayer?.delete(); } catch (e) { - if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); + //if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } }, 5000); } } catch (e) { - if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); + //if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } } diff --git a/src/commands/audioPlayer/MessagePlayerButtonsHandler.ts b/src/audioplayer/MessagePlayerButtonsHandler.ts similarity index 85% rename from src/commands/audioPlayer/MessagePlayerButtonsHandler.ts rename to src/audioplayer/MessagePlayerButtonsHandler.ts index bd73b1d..e6c8c7b 100644 --- a/src/commands/audioPlayer/MessagePlayerButtonsHandler.ts +++ b/src/audioplayer/MessagePlayerButtonsHandler.ts @@ -8,21 +8,22 @@ import { Client, GuildMember, ButtonInteraction, - Guild, GuildTextBasedChannel + Guild, + GuildTextBasedChannel } from 'discord.js'; -import { checkMemberInVoiceWithBot } from '../../utilities/checkMemberInVoiceWithBot.js'; -import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; -import { loggerError } from '../../utilities/logger.js'; -import { generateSkipMessage, generateSkipMessageFailure } from '../audio/skip.command.js'; -import { generateMessageAudioPlayerStop } from '../audio/stop.command.js'; +import { checkMemberInVoiceWithBot } from '../utilities/checkMemberInVoiceWithBot.js'; +import { generateErrorEmbed } from '../utilities/generateErrorEmbed.js'; +import { loggerError } from '../utilities/logger.js'; +import { generateSkipMessage, generateSkipMessageFailure } from '../commands/audio/skip.command.js'; +import { generateMessageAudioPlayerStop } from '../commands/audio/stop.command.js'; import { generateMessageAudioPlayerPrevious, generateMessageAudioPlayerPreviousFailure -} from '../audio/previous.command.js'; +} from '../commands/audio/previous.command.js'; import { generateMessageAudioPlayerShuffle, generateMessageAudioPlayerShuffleFailure -} from '../audio/shuffle.command.js'; +} from '../commands/audio/shuffle.command.js'; enum ButtonIDs { stopMusic = 'stopMusic', @@ -102,14 +103,23 @@ export class MessagePlayerButtonsHandler { switch (ButtonInteraction.customId) { case ButtonIDs.stopMusic: - await this.client.audioPlayer.stop(ButtonInteraction.guild as Guild); - await ButtonInteraction.reply({ - content: generateMessageAudioPlayerStop(ButtonInteraction.member as GuildMember) - }); + const guild = ButtonInteraction.guild as Guild; + + const player = this.client.audioPlayer.playersManager.get(guild.id); + + if (player) { + await player.textChannel.send({ + content: generateMessageAudioPlayerStop(ButtonInteraction.member as GuildMember) + }); + } + + await this.client.audioPlayer.stop(guild); + + await ButtonInteraction.deferUpdate(); break; case ButtonIDs.pauseMusic: - await this.client.audioPlayer.pause(ButtonInteraction.guild as Guild); + await this.client.audioPlayer.pauseResume(ButtonInteraction.guild as Guild); await ButtonInteraction.deferUpdate(); break; @@ -153,7 +163,7 @@ export class MessagePlayerButtonsHandler { break; // case ButtonIDs.downloadSong: { - // const song = this.client.audioPlayer.distube.getQueue(ButtonInteraction.guild as Guild)?.songs[0] + // const song = this.client.audioplayer.distube.getQueue(ButtonInteraction.guild as Guild)?.songs[0] // // if (!song) { // await ButtonInteraction.reply({embeds: [generateErrorEmbed(i18next.t("audioplayer:download_song_error"))]}) diff --git a/src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts b/src/audioplayer/MessagePlayerEmbedBuilder.ts similarity index 97% rename from src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts rename to src/audioplayer/MessagePlayerEmbedBuilder.ts index c84995e..1bffbb9 100644 --- a/src/commands/audioPlayer/MessagePlayerEmbedBuilder.ts +++ b/src/audioplayer/MessagePlayerEmbedBuilder.ts @@ -1,7 +1,7 @@ import { EmbedBuilder, User } from 'discord.js'; import { AudioPlayerLoopMode, AudioPlayerState } from './AudioPlayerTypes.js'; -import { getNoun } from '../../utilities/getNoun.js'; -import { formatSecondsToTime } from '../../utilities/formatSecondsToTime.js'; +import { getNoun } from '../utilities/getNoun.js'; +import { formatSecondsToTime } from '../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; export class MessagePlayerEmbedBuilder extends EmbedBuilder { diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventChannelDelete.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventChannelDelete.ts new file mode 100644 index 0000000..a7af156 --- /dev/null +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventChannelDelete.ts @@ -0,0 +1,8 @@ +import { Client, TextChannel } from 'discord.js'; + +export async function AudioPlayerEventChannelDelete(client: Client, channel: TextChannel) { + const player = client.audioPlayer.playersManager.get(channel.guild.id); + if (player?.textChannel.id === channel.id) { + await client.audioPlayer.stop(channel.guild); + } +} diff --git a/src/events/messageHandlers/playerMessageHandler.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.ts similarity index 84% rename from src/events/messageHandlers/playerMessageHandler.ts rename to src/audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.ts index 6b09dfe..27f3d13 100644 --- a/src/events/messageHandlers/playerMessageHandler.ts +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.ts @@ -2,7 +2,7 @@ import { TextChannel } from 'discord.js'; import { ENV } from '../../EnvironmentVariables.js'; import { loggerError } from '../../utilities/logger.js'; -export async function playerMessageHandler(textChannel: TextChannel) { +export async function AudioPlayerEventMessageCreate(textChannel: TextChannel) { try { const player = textChannel.client.audioPlayer.playersManager.get(textChannel.guild.id); if (player) { diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventMessageDeleted.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventMessageDeleted.ts new file mode 100644 index 0000000..ecbf243 --- /dev/null +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventMessageDeleted.ts @@ -0,0 +1,19 @@ +import { Client, Message, TextChannel } from 'discord.js'; +import { ENV } from '../../EnvironmentVariables.js'; +import { loggerError } from '../../utilities/logger.js'; + +export async function AudioPlayerEventMessageDeleted(client: Client, message: Message){ + if (!message.guild) return; + + const textChannel = message.channel as TextChannel; + const player = client.audioPlayer.playersManager.get(textChannel.guild.id); + if (player) { + if (player.textChannel.id !== textChannel.id) return; + if (player.lastDeletedMessage?.id === message.id) return; // If player deleted message them self, then don`t "trigger" event + try { + await player.recreatePlayer(); + } catch (e) { + if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); + } + } +} diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts new file mode 100644 index 0000000..a5254bb --- /dev/null +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts @@ -0,0 +1,13 @@ +import { Client, VoiceState } from 'discord.js'; +import { isVoiceChannelEmpty } from 'distube'; + +export async function AudioPlayerEventVoiceChannelUpdate(client: Client, oldState: VoiceState, newState: VoiceState) { + const messagePlayer = client.audioPlayer.playersManager.get(oldState.guild.id); + if (!messagePlayer) return; + + if (isVoiceChannelEmpty(oldState)) { + await client.audioPlayer.pause(oldState.guild); + } else if (!isVoiceChannelEmpty(newState) && messagePlayer.getState() === "pause") { + await client.audioPlayer.resume(oldState.guild); + } +} diff --git a/src/commands/audioPlayer/util/AudioCommandWrappers.ts b/src/audioplayer/util/AudioCommandWrappers.ts similarity index 94% rename from src/commands/audioPlayer/util/AudioCommandWrappers.ts rename to src/audioplayer/util/AudioCommandWrappers.ts index fddd686..c7b9633 100644 --- a/src/commands/audioPlayer/util/AudioCommandWrappers.ts +++ b/src/audioplayer/util/AudioCommandWrappers.ts @@ -1,4 +1,4 @@ -import { generateErrorEmbed } from '../../../utilities/generateErrorEmbed.js'; +import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { ChatInputCommandInteraction, Message } from 'discord.js'; import i18next from 'i18next'; diff --git a/src/commands/audioPlayer/util/downloadSong.ts b/src/audioplayer/util/downloadSong.ts similarity index 100% rename from src/commands/audioPlayer/util/downloadSong.ts rename to src/audioplayer/util/downloadSong.ts diff --git a/src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts b/src/audioplayer/util/generateAddedPlaylistMessage.ts similarity index 100% rename from src/commands/audioPlayer/util/generateAddedPlaylistMessage.ts rename to src/audioplayer/util/generateAddedPlaylistMessage.ts diff --git a/src/commands/audioPlayer/util/generateAddedSongMessage.ts b/src/audioplayer/util/generateAddedSongMessage.ts similarity index 100% rename from src/commands/audioPlayer/util/generateAddedSongMessage.ts rename to src/audioplayer/util/generateAddedSongMessage.ts diff --git a/src/commands/audioPlayer/util/isAudioFile.ts b/src/audioplayer/util/isAudioFile.ts similarity index 100% rename from src/commands/audioPlayer/util/isAudioFile.ts rename to src/audioplayer/util/isAudioFile.ts diff --git a/src/commands/audio/download.command.ts b/src/commands/audio/download.command.ts index 68d87e9..d6720e8 100644 --- a/src/commands/audio/download.command.ts +++ b/src/commands/audio/download.command.ts @@ -6,7 +6,7 @@ import { deleteMP3file, DownloadSongErrorGetLocale, getSongFileAttachment -} from '../audioPlayer/util/downloadSong.js'; +} from '../../audioplayer/util/downloadSong.js'; import i18next from 'i18next'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { ReadStream } from 'fs'; diff --git a/src/commands/audio/jump.command.ts b/src/commands/audio/jump.command.ts index 0d82c53..b06b35e 100644 --- a/src/commands/audio/jump.command.ts +++ b/src/commands/audio/jump.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/play.command.ts b/src/commands/audio/play.command.ts index 14c7397..be7ff01 100644 --- a/src/commands/audio/play.command.ts +++ b/src/commands/audio/play.command.ts @@ -15,6 +15,7 @@ import { truncateString } from '../../utilities/truncateString.js'; import i18next from 'i18next'; import { SearchResultType, YouTubePlugin, YouTubeSearchResultSong } from '@distube/youtube'; import { ExtractorPlugin } from 'distube'; +import ytsr from '@distube/ytsr'; export const services = 'Youtube, Spotify, Soundcloud, Yandex Music, HTTP-stream'; export default function (): ICommand { @@ -89,25 +90,22 @@ export default function (): ICommand { }; } +const liveText = i18next.t('commands:play_stream') + export async function songSearchAutocomplete(interaction: AutocompleteInteraction) { const focusedValue = interaction.options.getFocused(false); - if (focusedValue && !isValidURL(focusedValue)) { - const ytPlugin = interaction.client.audioPlayer.distube.plugins[0] as YouTubePlugin; + if (focusedValue) { - const choices = await ytPlugin.search(focusedValue, { - limit: 10, - type: SearchResultType.VIDEO, - safeSearch: false - }); + const choices = await ytsr(focusedValue, { safeSearch: true, limit: 10, type: SearchResultType.VIDEO }) - const finalResult = choices.map((choice: YouTubeSearchResultSong) => { - const duration = choice.isLive ? i18next.t('commands:play_stream') : choice.formattedDuration; - let choiceString = `${duration} | ${truncateString(choice.uploader.name ?? '', 20)} | `; - choiceString += truncateString(choice.name!, 100 - choiceString.length); + const finalResult = choices.items.map((video: ytsr.Video) => { + const duration = video.isLive ? liveText : video.duration; + let choiceString = `${duration} | ${truncateString(video.author?.name ?? ' ', 20)} | `; + choiceString += truncateString(video.name, 100 - choiceString.length); return { name: choiceString, - value: choice.url + value: video.url }; }); diff --git a/src/commands/audio/playfile.command.ts b/src/commands/audio/playfile.command.ts index c2e391b..5327293 100644 --- a/src/commands/audio/playfile.command.ts +++ b/src/commands/audio/playfile.command.ts @@ -8,7 +8,7 @@ import { VoiceChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; -import { isAudioFile } from '../audioPlayer/util/isAudioFile.js'; +import { isAudioFile } from '../../audioplayer/util/isAudioFile.js'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import i18next from 'i18next'; diff --git a/src/commands/audio/playing.command.ts b/src/commands/audio/playing.command.ts index b16a14d..db06604 100644 --- a/src/commands/audio/playing.command.ts +++ b/src/commands/audio/playing.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import { splitBar } from '../../utilities/splitBar.js'; import { Queue } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/previous.command.ts b/src/commands/audio/previous.command.ts index b551e3a..01097c2 100644 --- a/src/commands/audio/previous.command.ts +++ b/src/commands/audio/previous.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/rewind.command.ts b/src/commands/audio/rewind.command.ts index 00db881..620fbef 100644 --- a/src/commands/audio/rewind.command.ts +++ b/src/commands/audio/rewind.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import { formatSecondsToTime } from '../../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; diff --git a/src/commands/audio/shuffle.command.ts b/src/commands/audio/shuffle.command.ts index e9cb269..323d5ba 100644 --- a/src/commands/audio/shuffle.command.ts +++ b/src/commands/audio/shuffle.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; export default function (): ICommand { return { diff --git a/src/commands/audio/skip.command.ts b/src/commands/audio/skip.command.ts index f93dbc6..6883d2e 100644 --- a/src/commands/audio/skip.command.ts +++ b/src/commands/audio/skip.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; diff --git a/src/commands/audio/stop.command.ts b/src/commands/audio/stop.command.ts index 2b5f8f2..c50df3b 100644 --- a/src/commands/audio/stop.command.ts +++ b/src/commands/audio/stop.command.ts @@ -4,7 +4,7 @@ import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText -} from '../audioPlayer/util/AudioCommandWrappers.js'; +} from '../../audioplayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; export default function (): ICommand { diff --git a/src/events/messageCreate.event.ts b/src/events/messageCreate.event.ts index 4360b0f..9150947 100644 --- a/src/events/messageCreate.event.ts +++ b/src/events/messageCreate.event.ts @@ -1,7 +1,9 @@ import { BotEvent } from '../Types.js'; import { Client, Events, Message, TextChannel } from 'discord.js'; import { textCommandsHandler } from './messageHandlers/textCommandsHandler.js'; -import { playerMessageHandler } from './messageHandlers/playerMessageHandler.js'; +import { + AudioPlayerEventMessageCreate +} from '../audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.js'; const event: BotEvent = { name: Events.MessageCreate, @@ -9,7 +11,7 @@ const event: BotEvent = { await textCommandsHandler(client, message); if (!message.guild) return; - await playerMessageHandler(message.channel as TextChannel); + await AudioPlayerEventMessageCreate(message.channel as TextChannel); } }; diff --git a/src/events/messageDeleted.event.ts b/src/events/messageDeleted.event.ts index 7fc9bf3..601f433 100644 --- a/src/events/messageDeleted.event.ts +++ b/src/events/messageDeleted.event.ts @@ -1,24 +1,13 @@ import { BotEvent } from '../Types.js'; -import { Client, Events, Message, TextChannel } from 'discord.js'; -import { ENV } from '../EnvironmentVariables.js'; -import { loggerError } from '../utilities/logger.js'; +import { Client, Events, Message } from 'discord.js'; +import { + AudioPlayerEventMessageDeleted +} from '../audioplayer/eventsHandlers/AudioPlayerEventMessageDeleted.js'; const event: BotEvent = { name: Events.MessageDelete, execute: async (client: Client, message: Message) => { - if (!message.guild) return; - - const textChannel = message.channel as TextChannel; - const player = client.audioPlayer.playersManager.get(textChannel.guild.id); - if (player) { - if (player.textChannel.id !== textChannel.id) return; - if (player.lastDeletedMessage?.id === message.id) return; // If player deleted message them self, then don`t "trigger" event - try { - await player.recreatePlayer(); - } catch (e) { - if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); - } - } + await AudioPlayerEventMessageDeleted(client, message); } }; diff --git a/src/events/onChannelDelete.event.ts b/src/events/onChannelDelete.event.ts index 4787de5..8767974 100644 --- a/src/events/onChannelDelete.event.ts +++ b/src/events/onChannelDelete.event.ts @@ -1,13 +1,13 @@ import { BotEvent } from '../Types.js'; import { Client, Events, TextChannel } from 'discord.js'; +import { + AudioPlayerEventChannelDelete +} from '../audioplayer/eventsHandlers/AudioPlayerEventChannelDelete.js'; const event: BotEvent = { name: Events.ChannelDelete, execute: async (client: Client, channel: TextChannel) => { - const player = client.audioPlayer.playersManager.get(channel.guild.id); - if (player?.textChannel.id === channel.id) { - await client.audioPlayer.stop(channel.guild); - } + await AudioPlayerEventChannelDelete(client, channel) } }; diff --git a/src/events/voiceChannelUpdate.event.ts b/src/events/voiceChannelUpdate.event.ts new file mode 100644 index 0000000..299bff5 --- /dev/null +++ b/src/events/voiceChannelUpdate.event.ts @@ -0,0 +1,15 @@ +import { BotEvent } from '../Types'; +import { Client, Events, VoiceState } from 'discord.js'; +import { + AudioPlayerEventVoiceChannelUpdate +} from '../audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.js'; + +export const event: BotEvent = { + name: Events.VoiceStateUpdate, + execute: async (client: Client, oldState: VoiceState, newState: VoiceState) => { + //ENV.NODE_ENV === 'production' ? 120 : 5 + await AudioPlayerEventVoiceChannelUpdate(client, oldState, newState) + } +}; + +export default event; diff --git a/src/events/voiceChannelUpdate.ts b/src/events/voiceChannelUpdate.ts deleted file mode 100644 index f210fc8..0000000 --- a/src/events/voiceChannelUpdate.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { BotEvent } from '../Types'; -import { Client, Events, VoiceState } from 'discord.js'; -import { isVoiceChannelEmpty } from 'distube'; - -export const event: BotEvent = { - name: Events.VoiceStateUpdate, - execute: (client: Client, oldState: VoiceState) => { - if (!oldState?.channel) return; - //ENV.NODE_ENV === 'production' ? 120 : 5 - const queue = client.distube.queues.get(oldState); - if (!queue) return; - if (isVoiceChannelEmpty(oldState)) { - queue.pause(); - } else if (queue.paused) { - queue.resume(); - } - } -}; - -export default event; diff --git a/src/main.ts b/src/main.ts index 5842495..85db499 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,7 +3,7 @@ loggerSend(`Starting bot on version ${process.env.npm_package_version}`); import { Client, GatewayIntentBits, Partials } from 'discord.js'; import { loggerError, loggerSend } from './utilities/logger.js'; import { loginBot } from './utilities/loginBot.js'; -import { AudioPlayerCore } from './commands/audioPlayer/AudioPlayerCore.js'; +import { AudioPlayerCore } from './audioplayer/AudioPlayerCore.js'; import loadLocale from './locales/Locale.js'; await loadLocale(); diff --git a/tsconfig.json b/tsconfig.json index 7d58356..612fac3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "baseUrl": ".", + "baseUrl": "./", "module": "preserve", "target": "es2022", "sourceMap": true, From c20efce43bcfe228b396ff39d3931f1a171034c4 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Tue, 2 Jul 2024 13:27:26 +0300 Subject: [PATCH 03/13] 3.0.0-dev-2 Bringing back afk timer when everyone leaves the voice channel with bot. Added a source of the song/playlist icon in the title of embeds. Fixed the wrong localizations with the previous song button. --- README.md | 2 +- icons/audioplayer/player/play.png | Bin 0 -> 11658 bytes icons/audioplayer/services/apple-music.png | Bin 0 -> 12046 bytes icons/audioplayer/services/attach-file.png | Bin 0 -> 15081 bytes icons/audioplayer/services/audio-waves.png | Bin 0 -> 2783 bytes icons/audioplayer/services/soundcloud.png | Bin 0 -> 13665 bytes icons/audioplayer/services/spotify.png | Bin 0 -> 23642 bytes icons/audioplayer/services/yandex-music.png | Bin 0 -> 32599 bytes icons/audioplayer/services/youtube.png | Bin 0 -> 8862 bytes logo.png => icons/logo.png | Bin package.json | 2 +- src/audioplayer/AudioPlayerTypes.ts | 21 ++++++++++ src/audioplayer/MessagePlayer.ts | 38 ++++++++++++++---- .../MessagePlayerButtonsHandler.ts | 23 ++++++----- src/audioplayer/MessagePlayerEmbedBuilder.ts | 12 +++++- .../AudioPlayerEventVoiceChannelUpdate.ts | 10 ++++- .../util/generateAddedPlaylistMessage.ts | 7 +++- .../util/generateAddedSongMessage.ts | 7 +++- src/audioplayer/util/getIconFromSource.ts | 20 +++++++++ src/commands/audio/previous.command.ts | 4 +- src/events/messageCreate.event.ts | 4 +- tsconfig.json | 1 + 22 files changed, 118 insertions(+), 33 deletions(-) create mode 100644 icons/audioplayer/player/play.png create mode 100644 icons/audioplayer/services/apple-music.png create mode 100644 icons/audioplayer/services/attach-file.png create mode 100644 icons/audioplayer/services/audio-waves.png create mode 100644 icons/audioplayer/services/soundcloud.png create mode 100644 icons/audioplayer/services/spotify.png create mode 100644 icons/audioplayer/services/yandex-music.png create mode 100644 icons/audioplayer/services/youtube.png rename logo.png => icons/logo.png (100%) create mode 100644 src/audioplayer/util/getIconFromSource.ts diff --git a/README.md b/README.md index 9b8ab76..8c3e03a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- BotLogo + BotLogo

AICTest

diff --git a/icons/audioplayer/player/play.png b/icons/audioplayer/player/play.png new file mode 100644 index 0000000000000000000000000000000000000000..a18dd6e3e764fda651f90e7680fcfef8ed9a4dbf GIT binary patch literal 11658 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 b#URXma?@N9A(sQC7Sd8bq?V^@{n!5k1zP~} literal 0 HcmV?d00001 diff --git a/icons/audioplayer/services/apple-music.png b/icons/audioplayer/services/apple-music.png new file mode 100644 index 0000000000000000000000000000000000000000..1adfdb3013dd089c8f1e9ab0dbca511b8c84035c GIT binary patch literal 12046 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 a$qbj@mVEJ1B literal 0 HcmV?d00001 diff --git a/icons/audioplayer/services/audio-waves.png b/icons/audioplayer/services/audio-waves.png new file mode 100644 index 0000000000000000000000000000000000000000..749525d036f8cd15ea221d6d09e56131ce46a80d GIT binary patch literal 2783 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%0D&`U7r{GZNY%b29$W_#OOCPS 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 literal 0 HcmV?d00001 diff --git a/icons/audioplayer/services/yandex-music.png b/icons/audioplayer/services/yandex-music.png new file mode 100644 index 0000000000000000000000000000000000000000..ce681bd769bcbcf315851a11405e00ec49aa7f03 GIT binary patch literal 32599 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 ahdT!R|1Ti;96}B*fIxNbYS-Mh4gWt=$ag&e literal 0 HcmV?d00001 diff --git a/icons/audioplayer/services/youtube.png b/icons/audioplayer/services/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..cf640c6500f66dca4165efeada0919fa1efbc890 GIT binary patch literal 8862 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 literal 0 HcmV?d00001 diff --git a/logo.png b/icons/logo.png similarity index 100% rename from logo.png rename to icons/logo.png diff --git a/package.json b/package.json index 62cdd45..b612198 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-1", + "version": "3.0.0-dev-2", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/audioplayer/AudioPlayerTypes.ts b/src/audioplayer/AudioPlayerTypes.ts index 53e09ea..55581f3 100644 --- a/src/audioplayer/AudioPlayerTypes.ts +++ b/src/audioplayer/AudioPlayerTypes.ts @@ -1,2 +1,23 @@ export type AudioPlayerState = 'playing' | 'pause' | 'waiting' | 'loading' | 'destroying'; export type AudioPlayerLoopMode = 'disabled' | 'song' | 'queue'; + +export enum AudioPlayerIcons { + stop = '<:stopwhite:1014551716043173989>', + play = '<:play:1257590184455835698>', + pause = '<:pausewhite:1014551696174764133>', + toogleLoopMode = '<:repeatmodewhite:1014551751858331731>', + previous = '<:previousbutton:1092107334542696512>', + skip = '<:skipbutton:1092107438234275900>', + shuffle = '<:shufflebutton:1092107651384614912>', + list = '<:songlistwhite:1014551771705782405>' +} + +export enum AudioSourceIcons { + other = '<:audiowaves:1257591924693536829>', + attachment = '<:attachfile:1257591906658156576>', + youtube = '<:youtube:1257591994750992435>', + applemusic = '<:applemusic:1257591803260174467>', + yandexmusic = '<:yandexmusic:1257591977105555506>', + spotify = '<:spotify:1257591960726933576>', + soundcloud = '<:soundcloud:1257591943010193500>' +} diff --git a/src/audioplayer/MessagePlayer.ts b/src/audioplayer/MessagePlayer.ts index be2159f..a838980 100644 --- a/src/audioplayer/MessagePlayer.ts +++ b/src/audioplayer/MessagePlayer.ts @@ -1,4 +1,4 @@ -import { Client, GuildTextBasedChannel, Message, TextChannel } from 'discord.js'; +import { Client, GuildTextBasedChannel, Message } from 'discord.js'; import { MessagePlayerEmbedBuilder } from './MessagePlayerEmbedBuilder.js'; import { Queue, Song } from 'distube'; import { MessagePlayerButtonsHandler } from './MessagePlayerButtonsHandler.js'; @@ -24,13 +24,18 @@ export class MessagePlayer { // Variable for "recreationPlayer" lastDeletedMessage: Message | undefined; // Delay for player recreation - private updateTime = 3500; + private updateTime = 3500; // in ms // Timer for "recreationPlayer" private recreationTimer: NodeJS.Timeout | undefined; // Time for "waiting" state - private finishTime = 20000; + private finishTime = 20000; // in ms // Timer object for "waiting" state private finishTimer: NodeJS.Timeout | undefined; + + // If no one in voice channel, start afk timer + private afkTime = 20000; // in ms + private afkTimer: NodeJS.Timeout | undefined; + constructor(client: Client, txtChannel: GuildTextBasedChannel, queue: Queue) { this.client = client; this.textChannel = txtChannel; @@ -38,6 +43,25 @@ export class MessagePlayer { this.buttonsHandler = new MessagePlayerButtonsHandler(this.client, this.textChannel); } + async startAfkTimer() { + try { + this.afkTimer = setTimeout(async () => { + await this.client.audioPlayer.stop(this.textChannel.guild); + await this.textChannel.send(i18next.t('audioplayer:event_empty') as string); + await this.stopAfkTimer(); + await this.stopFinishTimer(); + }, this.afkTime); + } catch (e) { + if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); + } + } + + async stopAfkTimer() { + if (this.afkTimer) { + clearTimeout(this.afkTimer); + } + } + // If a player is in "waiting" state, they start finish timer. // It can be canceled by switching state to any other state async startFinishTimer() { @@ -52,6 +76,7 @@ export class MessagePlayer { await this.client.audioPlayer.stop(this.textChannel.guild); await this.textChannel.send(i18next.t('audioplayer:event_finish_time') as string); await this.stopFinishTimer(); + await this.stopAfkTimer(); } }, this.finishTime); } @@ -78,6 +103,7 @@ export class MessagePlayer { const currentSong: Song = this.queue.songs[0]; if (currentSong) { this.embedBuilder.setSongDuration(currentSong.duration, currentSong.isLive); + this.embedBuilder.setSongSource(currentSong); this.embedBuilder.setSongTitle( currentSong.name ?? i18next.t('audioplayer:player_embed_unknown'), currentSong.url! @@ -219,10 +245,8 @@ export class MessagePlayer { if (state === 'waiting') { await this.startFinishTimer(); - } else { - if (this.finishTimer && queue) { - clearTimeout(this.finishTimer); - } + } else if (queue) { + await this.stopFinishTimer(); } await this.update(); diff --git a/src/audioplayer/MessagePlayerButtonsHandler.ts b/src/audioplayer/MessagePlayerButtonsHandler.ts index e6c8c7b..490311c 100644 --- a/src/audioplayer/MessagePlayerButtonsHandler.ts +++ b/src/audioplayer/MessagePlayerButtonsHandler.ts @@ -3,7 +3,6 @@ import { ButtonBuilder, ButtonStyle, InteractionCollector, - TextChannel, ComponentType, Client, GuildMember, @@ -24,6 +23,7 @@ import { generateMessageAudioPlayerShuffle, generateMessageAudioPlayerShuffleFailure } from '../commands/audio/shuffle.command.js'; +import { AudioPlayerIcons } from './AudioPlayerTypes.js'; enum ButtonIDs { stopMusic = 'stopMusic', @@ -35,6 +35,7 @@ enum ButtonIDs { shuffle = 'shuffle', showQueue = 'showQueue' } + export class MessagePlayerButtonsHandler { rowPrimary = new ActionRowBuilder(); rowSecondary = new ActionRowBuilder(); @@ -48,23 +49,23 @@ export class MessagePlayerButtonsHandler { new ButtonBuilder() .setCustomId(ButtonIDs.stopMusic) .setStyle(ButtonStyle.Danger) - .setEmoji('<:stopwhite:1014551716043173989>'), + .setEmoji(AudioPlayerIcons.stop), new ButtonBuilder() .setCustomId(ButtonIDs.pauseMusic) .setStyle(ButtonStyle.Primary) - .setEmoji('<:pausewhite:1014551696174764133>'), + .setEmoji(AudioPlayerIcons.pause), new ButtonBuilder() .setCustomId(ButtonIDs.toggleLoopMode) .setStyle(ButtonStyle.Primary) - .setEmoji('<:repeatmodewhite:1014551751858331731>'), + .setEmoji(AudioPlayerIcons.toogleLoopMode), new ButtonBuilder() .setCustomId(ButtonIDs.previousSong) .setStyle(ButtonStyle.Primary) - .setEmoji('<:previousbutton:1092107334542696512>'), + .setEmoji(AudioPlayerIcons.previous), new ButtonBuilder() .setCustomId(ButtonIDs.skipSong) .setStyle(ButtonStyle.Primary) - .setEmoji('<:skipbutton:1092107438234275900>') + .setEmoji(AudioPlayerIcons.skip) ); this.rowSecondary.addComponents( @@ -72,18 +73,18 @@ export class MessagePlayerButtonsHandler { new ButtonBuilder() .setCustomId(ButtonIDs.shuffle) .setStyle(ButtonStyle.Primary) - .setEmoji('<:shufflebutton:1092107651384614912>'), + .setEmoji(AudioPlayerIcons.shuffle), new ButtonBuilder() .setCustomId(ButtonIDs.showQueue) .setStyle(ButtonStyle.Secondary) - .setEmoji('<:songlistwhite:1014551771705782405>') + .setEmoji(AudioPlayerIcons.list) ); this.rowWithOnlyStop.addComponents( new ButtonBuilder() .setCustomId(ButtonIDs.stopMusic) .setStyle(ButtonStyle.Danger) - .setEmoji('<:stopwhite:1014551716043173989>') + .setEmoji(AudioPlayerIcons.stop) ); this.collector = textChannel.createMessageComponentCollector({ @@ -102,7 +103,7 @@ export class MessagePlayerButtonsHandler { } switch (ButtonInteraction.customId) { - case ButtonIDs.stopMusic: + case ButtonIDs.stopMusic: { const guild = ButtonInteraction.guild as Guild; const player = this.client.audioPlayer.playersManager.get(guild.id); @@ -117,7 +118,7 @@ export class MessagePlayerButtonsHandler { await ButtonInteraction.deferUpdate(); break; - + } case ButtonIDs.pauseMusic: await this.client.audioPlayer.pauseResume(ButtonInteraction.guild as Guild); await ButtonInteraction.deferUpdate(); diff --git a/src/audioplayer/MessagePlayerEmbedBuilder.ts b/src/audioplayer/MessagePlayerEmbedBuilder.ts index 1bffbb9..3f595a3 100644 --- a/src/audioplayer/MessagePlayerEmbedBuilder.ts +++ b/src/audioplayer/MessagePlayerEmbedBuilder.ts @@ -1,8 +1,10 @@ import { EmbedBuilder, User } from 'discord.js'; -import { AudioPlayerLoopMode, AudioPlayerState } from './AudioPlayerTypes.js'; +import { AudioPlayerLoopMode, AudioPlayerState, AudioSourceIcons } from './AudioPlayerTypes.js'; import { getNoun } from '../utilities/getNoun.js'; import { formatSecondsToTime } from '../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; +import { Playlist, Song } from 'distube'; +import { getIconFromSource } from './util/getIconFromSource.js'; export class MessagePlayerEmbedBuilder extends EmbedBuilder { private playerState: AudioPlayerState = 'loading'; @@ -16,11 +18,13 @@ export class MessagePlayerEmbedBuilder extends EmbedBuilder { private titleUrl: string | null = null; private thumbnailURL: string | null = null; private formattedDuration = '00:00'; + private sourceIcon: AudioSourceIcons; constructor() { super(); this.setPlayerState('loading'); this.setNextSong(undefined); + this.sourceIcon = AudioSourceIcons.other; } update() { @@ -35,7 +39,7 @@ export class MessagePlayerEmbedBuilder extends EmbedBuilder { }); } this.setThumbnail(this.thumbnailURL); - this.setTitle(this.title); + this.setTitle(this.sourceIcon + this.title); this.setURL(this.titleUrl); this.addFields({ name: i18next.t('audioplayer:player_embed_author'), @@ -75,6 +79,10 @@ export class MessagePlayerEmbedBuilder extends EmbedBuilder { return this; } + setSongSource(playable: Song | Playlist) { + this.sourceIcon = getIconFromSource(playable.source); + } + setSongTitle(name: string, url: string) { this.title = name; this.titleUrl = url; diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts index a5254bb..b44c628 100644 --- a/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts @@ -1,13 +1,19 @@ import { Client, VoiceState } from 'discord.js'; import { isVoiceChannelEmpty } from 'distube'; -export async function AudioPlayerEventVoiceChannelUpdate(client: Client, oldState: VoiceState, newState: VoiceState) { +export async function AudioPlayerEventVoiceChannelUpdate( + client: Client, + oldState: VoiceState, + newState: VoiceState +) { const messagePlayer = client.audioPlayer.playersManager.get(oldState.guild.id); if (!messagePlayer) return; if (isVoiceChannelEmpty(oldState)) { + await messagePlayer.startAfkTimer(); await client.audioPlayer.pause(oldState.guild); - } else if (!isVoiceChannelEmpty(newState) && messagePlayer.getState() === "pause") { + } else if (!isVoiceChannelEmpty(newState) && messagePlayer.getState() === 'pause') { + await messagePlayer.stopAfkTimer(); await client.audioPlayer.resume(oldState.guild); } } diff --git a/src/audioplayer/util/generateAddedPlaylistMessage.ts b/src/audioplayer/util/generateAddedPlaylistMessage.ts index 6a4722f..e7cf060 100644 --- a/src/audioplayer/util/generateAddedPlaylistMessage.ts +++ b/src/audioplayer/util/generateAddedPlaylistMessage.ts @@ -1,12 +1,15 @@ import { Playlist } from 'distube'; import { EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; +import { getIconFromSource } from './getIconFromSource.js'; export function generateAddedPlaylistMessage(playlist: Playlist) { + const serviceIcon = getIconFromSource(playlist.source); + return new EmbedBuilder() - .setTitle(playlist.name ?? i18next.t('audioplayer:player_embed_unknown')) + .setTitle(`${serviceIcon} ${playlist.name}` ?? i18next.t('audioplayer:player_embed_unknown')) .setURL(playlist.url ?? null) - .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_list')}🎵` }) + .setAuthor({ name: `${i18next.t('audioplayer:event_add_list')}` }) .setThumbnail(playlist.thumbnail ?? null) .addFields( { diff --git a/src/audioplayer/util/generateAddedSongMessage.ts b/src/audioplayer/util/generateAddedSongMessage.ts index 8301e35..ff9d23e 100644 --- a/src/audioplayer/util/generateAddedSongMessage.ts +++ b/src/audioplayer/util/generateAddedSongMessage.ts @@ -1,12 +1,15 @@ import { Song } from 'distube'; import { EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; +import { getIconFromSource } from './getIconFromSource.js'; export function generateAddedSongMessage(song: Song) { + const serviceIcon = getIconFromSource(song.source); + return new EmbedBuilder() - .setTitle(song.name ?? i18next.t('audioplayer:player_embed_unknown')) + .setTitle(`${serviceIcon} ${song.name}` ?? i18next.t('audioplayer:player_embed_unknown')) .setURL(song.url ?? null) - .setAuthor({ name: `🎵${i18next.t('audioplayer:event_add_song')}🎵` }) + .setAuthor({ name: `${i18next.t('audioplayer:event_add_song')}` }) .setThumbnail(song.thumbnail ?? null) .addFields( { diff --git a/src/audioplayer/util/getIconFromSource.ts b/src/audioplayer/util/getIconFromSource.ts new file mode 100644 index 0000000..584a765 --- /dev/null +++ b/src/audioplayer/util/getIconFromSource.ts @@ -0,0 +1,20 @@ +import { AudioSourceIcons } from '../AudioPlayerTypes.js'; + +export function getIconFromSource(source: string): AudioSourceIcons { + switch (source) { + case 'applemusic': + return AudioSourceIcons.applemusic; + case 'spotify': + return AudioSourceIcons.spotify; + case 'youtube': + return AudioSourceIcons.youtube; + case 'file': + return AudioSourceIcons.attachment; + case 'soundcloud': + return AudioSourceIcons.soundcloud; + case 'yandexmusic': + return AudioSourceIcons.yandexmusic; + default: + return AudioSourceIcons.other; + } +} diff --git a/src/commands/audio/previous.command.ts b/src/commands/audio/previous.command.ts index 01097c2..0b18bcb 100644 --- a/src/commands/audio/previous.command.ts +++ b/src/commands/audio/previous.command.ts @@ -57,9 +57,9 @@ export default function (): ICommand { } export function generateMessageAudioPlayerPrevious(member: GuildMember, song: Song) { - return `:rewind: ${member} ${i18next.t('previous_success')} ${song.name} :rewind:`; + return `:rewind: ${member} ${i18next.t('audioplayer:previous_success')} ${song.name} :rewind:`; } export function generateMessageAudioPlayerPreviousFailure() { - return i18next.t('previous_error_song_not_exists'); + return i18next.t('audioplayer:previous_error_song_not_exists'); } diff --git a/src/events/messageCreate.event.ts b/src/events/messageCreate.event.ts index 9150947..91b7490 100644 --- a/src/events/messageCreate.event.ts +++ b/src/events/messageCreate.event.ts @@ -1,9 +1,7 @@ import { BotEvent } from '../Types.js'; import { Client, Events, Message, TextChannel } from 'discord.js'; import { textCommandsHandler } from './messageHandlers/textCommandsHandler.js'; -import { - AudioPlayerEventMessageCreate -} from '../audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.js'; +import { AudioPlayerEventMessageCreate } from '../audioplayer/eventsHandlers/AudioPlayerEventMessageCreate.js'; const event: BotEvent = { name: Events.MessageCreate, diff --git a/tsconfig.json b/tsconfig.json index 612fac3..a0823dc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,6 +13,7 @@ "resolveJsonModule": true, "forceConsistentCasingInFileNames": false, "allowSyntheticDefaultImports": true, + "preserveConstEnums": false, "skipLibCheck": true, }, "compileOnSave": true, From f90b73ec3b4b570cf69c114ffce895095720799a Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Tue, 2 Jul 2024 19:26:18 +0300 Subject: [PATCH 04/13] 3.0.0-dev-3 Refactored audioplayer buttons code. When audioplayer in paused/playing state, they have slightly different sets of buttons. LoggerSend no more add [ UNKNOWN ] prefix. --- package.json | 2 +- src/audioplayer/AudioPlayerCore.ts | 9 +- src/audioplayer/MessagePlayer.ts | 21 +-- .../MessagePlayerButtonsHandler.ts | 139 +++++++++++------- src/audioplayer/MessagePlayerEmbedBuilder.ts | 2 +- src/utilities/logger.ts | 2 +- 6 files changed, 97 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index b612198..8b0599f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-2", + "version": "3.0.0-dev-3", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/audioplayer/AudioPlayerCore.ts b/src/audioplayer/AudioPlayerCore.ts index 2e7fcea..ea52469 100644 --- a/src/audioplayer/AudioPlayerCore.ts +++ b/src/audioplayer/AudioPlayerCore.ts @@ -109,7 +109,7 @@ export class AudioPlayerCore { await player.update(); } - async pauseResume(guild: Guild){ + async pauseResume(guild: Guild) { const queue = this.distube.getQueue(guild); if (!queue) return; const player = this.playersManager.get(queue.id); @@ -305,11 +305,6 @@ export class AudioPlayerCore { } this.distube - // TODO: Write custom code for handling user disconnects - // .on(DistubeEvents.EMPTY, async (queue) => { - // await queue.textChannel?.send(i18next.t('audioplayer:event_empty') as string); - // await this.playersManager.remove(queue.id); - // }) .on(DistubeEvents.INIT_QUEUE, async (queue) => { await this.playersManager.add(queue.id, queue.textChannel as TextChannel, queue); @@ -350,7 +345,7 @@ export class AudioPlayerCore { .on(DistubeEvents.FINISH_SONG, async (queue) => { if (!this.playersManager.has(queue.id)) return; if (queue._next || queue._prev || queue.stopped || queue.songs.length > 1) return; - this.playersManager.get(queue.id)?.setState('waiting'); + await this.playersManager.get(queue.id)?.setState('waiting'); }) .on(DistubeEvents.ERROR, async (error, queue) => { queue.textChannel?.send({ diff --git a/src/audioplayer/MessagePlayer.ts b/src/audioplayer/MessagePlayer.ts index a838980..b6c82a9 100644 --- a/src/audioplayer/MessagePlayer.ts +++ b/src/audioplayer/MessagePlayer.ts @@ -125,22 +125,11 @@ export class MessagePlayer { private async updateMessageState() { if (!this.messageWithPlayer) return; try { - switch (this.state) { - case 'playing': - case 'pause': - await this.messageWithPlayer.edit({ - embeds: [this.embedBuilder], - components: this.buttonsHandler.getComponents() - }); - break; - case 'waiting': - case 'loading': - await this.messageWithPlayer.edit({ - embeds: [this.embedBuilder], - components: this.buttonsHandler.getComponentsOnlyStop() - }); - break; - } + this.buttonsHandler.setComponentsState(this.state); + await this.messageWithPlayer.edit({ + embeds: [this.embedBuilder], + components: this.buttonsHandler.getComponents() + }); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } diff --git a/src/audioplayer/MessagePlayerButtonsHandler.ts b/src/audioplayer/MessagePlayerButtonsHandler.ts index 490311c..feb6c80 100644 --- a/src/audioplayer/MessagePlayerButtonsHandler.ts +++ b/src/audioplayer/MessagePlayerButtonsHandler.ts @@ -23,7 +23,7 @@ import { generateMessageAudioPlayerShuffle, generateMessageAudioPlayerShuffleFailure } from '../commands/audio/shuffle.command.js'; -import { AudioPlayerIcons } from './AudioPlayerTypes.js'; +import { AudioPlayerIcons, AudioPlayerState } from './AudioPlayerTypes.js'; enum ButtonIDs { stopMusic = 'stopMusic', @@ -36,57 +36,80 @@ enum ButtonIDs { showQueue = 'showQueue' } +const rowPrimary = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId(ButtonIDs.stopMusic) + .setStyle(ButtonStyle.Danger) + .setEmoji(AudioPlayerIcons.stop), + new ButtonBuilder() + .setCustomId(ButtonIDs.pauseMusic) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.pause), + new ButtonBuilder() + .setCustomId(ButtonIDs.toggleLoopMode) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.toogleLoopMode), + new ButtonBuilder() + .setCustomId(ButtonIDs.previousSong) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.previous), + new ButtonBuilder() + .setCustomId(ButtonIDs.skipSong) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.skip) +); + +const rowPrimaryPaused = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId(ButtonIDs.stopMusic) + .setStyle(ButtonStyle.Danger) + .setEmoji(AudioPlayerIcons.stop), + new ButtonBuilder() + .setCustomId(ButtonIDs.pauseMusic) + .setStyle(ButtonStyle.Success) + .setEmoji(AudioPlayerIcons.play), + new ButtonBuilder() + .setCustomId(ButtonIDs.toggleLoopMode) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.toogleLoopMode), + new ButtonBuilder() + .setCustomId(ButtonIDs.previousSong) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.previous), + new ButtonBuilder() + .setCustomId(ButtonIDs.skipSong) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.skip) +); + +const rowSecondary = new ActionRowBuilder().addComponents( + //new ButtonBuilder().setCustomId(ButtonIDs.downloadSong).setStyle(ButtonStyle.Success).setEmoji('<:downloadwhite:1014553027614617650>'), + new ButtonBuilder() + .setCustomId(ButtonIDs.shuffle) + .setStyle(ButtonStyle.Primary) + .setEmoji(AudioPlayerIcons.shuffle), + new ButtonBuilder() + .setCustomId(ButtonIDs.showQueue) + .setStyle(ButtonStyle.Secondary) + .setEmoji(AudioPlayerIcons.list) +); + +const rowWithOnlyStop = new ActionRowBuilder().addComponents( + new ButtonBuilder() + .setCustomId(ButtonIDs.stopMusic) + .setStyle(ButtonStyle.Danger) + .setEmoji(AudioPlayerIcons.stop) +); + export class MessagePlayerButtonsHandler { - rowPrimary = new ActionRowBuilder(); - rowSecondary = new ActionRowBuilder(); - rowWithOnlyStop = new ActionRowBuilder(); - collector: InteractionCollector; - client: Client; + private collector: InteractionCollector; + private client: Client; + private components: Array>; + constructor(client: Client, textChannel: GuildTextBasedChannel) { + this.components = [rowPrimary, rowSecondary]; this.client = client; - this.rowPrimary.addComponents( - new ButtonBuilder() - .setCustomId(ButtonIDs.stopMusic) - .setStyle(ButtonStyle.Danger) - .setEmoji(AudioPlayerIcons.stop), - new ButtonBuilder() - .setCustomId(ButtonIDs.pauseMusic) - .setStyle(ButtonStyle.Primary) - .setEmoji(AudioPlayerIcons.pause), - new ButtonBuilder() - .setCustomId(ButtonIDs.toggleLoopMode) - .setStyle(ButtonStyle.Primary) - .setEmoji(AudioPlayerIcons.toogleLoopMode), - new ButtonBuilder() - .setCustomId(ButtonIDs.previousSong) - .setStyle(ButtonStyle.Primary) - .setEmoji(AudioPlayerIcons.previous), - new ButtonBuilder() - .setCustomId(ButtonIDs.skipSong) - .setStyle(ButtonStyle.Primary) - .setEmoji(AudioPlayerIcons.skip) - ); - - this.rowSecondary.addComponents( - //new ButtonBuilder().setCustomId(ButtonIDs.downloadSong).setStyle(ButtonStyle.Success).setEmoji('<:downloadwhite:1014553027614617650>'), - new ButtonBuilder() - .setCustomId(ButtonIDs.shuffle) - .setStyle(ButtonStyle.Primary) - .setEmoji(AudioPlayerIcons.shuffle), - new ButtonBuilder() - .setCustomId(ButtonIDs.showQueue) - .setStyle(ButtonStyle.Secondary) - .setEmoji(AudioPlayerIcons.list) - ); - - this.rowWithOnlyStop.addComponents( - new ButtonBuilder() - .setCustomId(ButtonIDs.stopMusic) - .setStyle(ButtonStyle.Danger) - .setEmoji(AudioPlayerIcons.stop) - ); - this.collector = textChannel.createMessageComponentCollector({ componentType: ComponentType.Button }); @@ -195,12 +218,24 @@ export class MessagePlayerButtonsHandler { }); } - getComponents(): Array> { - return [this.rowPrimary, this.rowSecondary]; + setComponentsState(state: AudioPlayerState) { + switch (state) { + case 'playing': + this.components = [rowPrimary, rowSecondary]; + break; + case 'pause': + this.components = [rowPrimaryPaused, rowSecondary]; + break; + case 'loading': + case 'waiting': + case 'destroying': + default: + this.components = [rowWithOnlyStop]; + } } - getComponentsOnlyStop(): Array> { - return [this.rowWithOnlyStop]; + getComponents(): Array> { + return this.components; } destroy() { diff --git a/src/audioplayer/MessagePlayerEmbedBuilder.ts b/src/audioplayer/MessagePlayerEmbedBuilder.ts index 3f595a3..04a02ae 100644 --- a/src/audioplayer/MessagePlayerEmbedBuilder.ts +++ b/src/audioplayer/MessagePlayerEmbedBuilder.ts @@ -39,7 +39,7 @@ export class MessagePlayerEmbedBuilder extends EmbedBuilder { }); } this.setThumbnail(this.thumbnailURL); - this.setTitle(this.sourceIcon + this.title); + this.setTitle(this.sourceIcon + " " + this.title); this.setURL(this.titleUrl); this.addFields({ name: i18next.t('audioplayer:player_embed_author'), diff --git a/src/utilities/logger.ts b/src/utilities/logger.ts index e6acdcc..d186e05 100644 --- a/src/utilities/logger.ts +++ b/src/utilities/logger.ts @@ -45,7 +45,7 @@ export function loggerSend( if (prefix) { console.log(`[ ${getCurrentTimestamp()} ] [ ${prefix} ] ${finalOutput}`); } else { - console.log(`[ ${getCurrentTimestamp()} ] [ UNKNOWN ] ${finalOutput}`); + console.log(`[ ${getCurrentTimestamp()} ] ${finalOutput}`); } } From 9ecbb1a14ae95ccd88f4df6dd593475685c477b0 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Tue, 2 Jul 2024 21:03:25 +0300 Subject: [PATCH 05/13] 3.0.0-dev-4 Added limit for songs count in queue (max 500 songs). --- package.json | 6 ++--- src/Types.ts | 2 -- src/audioplayer/AudioPlayerCore.ts | 22 ++++++++++------ src/audioplayer/AudioPlayersManager.ts | 2 +- src/commands/audio/play.command.ts | 36 +++++++++++++++++++++++--- src/handlers/Command.handler.ts | 2 +- src/locales/en/audioplayer.json | 1 + src/locales/en/commands.json | 1 + src/locales/ru/audioplayer.json | 2 ++ src/locales/ru/commands.json | 1 + 10 files changed, 56 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index 8b0599f..3cafb0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-3", + "version": "3.0.0-dev-4", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { @@ -40,7 +40,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@types/node": "^20.14.8", + "@types/node": "^20.14.9", "@types/node-os-utils": "^1.3.4", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", @@ -49,6 +49,6 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.1.3", "prettier": "^3.3.2", - "typescript": "^5.5.2" + "typescript": "^5.5.3" } } diff --git a/src/Types.ts b/src/Types.ts index f67c8fe..48f97c1 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -1,11 +1,9 @@ import { Client, ClientEvents, Collection } from 'discord.js'; import { ICommand, ICommandGroup } from './CommandTypes.js'; import { AudioPlayerCore } from './audioplayer/AudioPlayerCore.js'; -import { DisTube } from 'distube'; declare module 'discord.js' { export interface Client { - distube: DisTube; commands: Collection; commandsGroups: Collection; audioPlayer: AudioPlayerCore; diff --git a/src/audioplayer/AudioPlayerCore.ts b/src/audioplayer/AudioPlayerCore.ts index ea52469..75f65e4 100644 --- a/src/audioplayer/AudioPlayerCore.ts +++ b/src/audioplayer/AudioPlayerCore.ts @@ -22,6 +22,8 @@ import { } from 'discord.js'; import { joinVoiceChannel } from '@discordjs/voice'; +export const queueSongsLimit = 500; + export const loggerPrefixAudioplayer = `Audioplayer`; export class AudioPlayerCore { @@ -41,8 +43,6 @@ export class AudioPlayerCore { plugins: LoadPlugins() }); - this.client.distube = this.distube; - this.setupEvents(); } @@ -55,8 +55,6 @@ export class AudioPlayerCore { try { // I am need manual connect user to a voice channel, because when I am using only Distube "play" // method, getVoiceConnection in @discordjs/voice is not working - //await this.distube.voices.join(voiceChannel); - joinVoiceChannel({ channelId: voiceChannel.id, guildId: voiceChannel.guildId, @@ -71,7 +69,7 @@ export class AudioPlayerCore { } async stop(guild: Guild) { - const queue = this.distube.getQueue(guild) + const queue = this.distube.getQueue(guild); if (queue) { await queue.stop(); @@ -96,7 +94,7 @@ export class AudioPlayerCore { await player.update(); } - async resume(guild: Guild){ + async resume(guild: Guild) { const queue = this.distube.getQueue(guild); if (!queue) return; const player = this.playersManager.get(queue.id); @@ -333,8 +331,16 @@ export class AudioPlayerCore { } }) .on(DistubeEvents.ADD_LIST, async (queue, playlist) => { - if (queue.textChannel) { - await queue.textChannel.send({ embeds: [generateAddedPlaylistMessage(playlist)] }); + if (!queue.textChannel) return; + + await queue.textChannel.send({ embeds: [generateAddedPlaylistMessage(playlist)] }); + if (queue.songs.length >= queueSongsLimit) { + await queue.textChannel.send({ + content: i18next.t('audioplayer:event_add_list_limit', { + queueLimit: queueSongsLimit + }) as string + }); + queue.songs.length = queueSongsLimit; } const player = this.playersManager.get(queue.id); diff --git a/src/audioplayer/AudioPlayersManager.ts b/src/audioplayer/AudioPlayersManager.ts index c1fa079..b92d9f0 100644 --- a/src/audioplayer/AudioPlayersManager.ts +++ b/src/audioplayer/AudioPlayersManager.ts @@ -1,4 +1,4 @@ -import { Client, Collection, GuildTextBasedChannel, TextChannel } from 'discord.js'; +import { Client, Collection, GuildTextBasedChannel } from 'discord.js'; import { Queue } from 'distube'; import { MessagePlayer } from './MessagePlayer.js'; diff --git a/src/commands/audio/play.command.ts b/src/commands/audio/play.command.ts index be7ff01..d570465 100644 --- a/src/commands/audio/play.command.ts +++ b/src/commands/audio/play.command.ts @@ -1,7 +1,7 @@ import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { ApplicationCommandOptionChoiceData, - AutocompleteInteraction, GuildChannel, + AutocompleteInteraction, Client, Guild, GuildMember, Message, PermissionsBitField, @@ -10,12 +10,11 @@ import { VoiceChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; -import { isValidURL } from '../../utilities/isValidURL.js'; import { truncateString } from '../../utilities/truncateString.js'; import i18next from 'i18next'; -import { SearchResultType, YouTubePlugin, YouTubeSearchResultSong } from '@distube/youtube'; -import { ExtractorPlugin } from 'distube'; +import { SearchResultType } from '@distube/youtube'; import ytsr from '@distube/ytsr'; +import { queueSongsLimit } from '../../audioplayer/AudioPlayerCore.js'; export const services = 'Youtube, Spotify, Soundcloud, Yandex Music, HTTP-stream'; export default function (): ICommand { @@ -32,6 +31,15 @@ export default function (): ICommand { const member = message.member as GuildMember; const channel = message.channel as TextChannel; + if (queueSongsIsFull(message.client, message.guild as Guild)){ + await message.reply({ + content: i18next.t('commands:play_error_songs_limit', { + queueLimit: queueSongsLimit + }) as string + }); + return + } + await message.client.audioPlayer.play( member.voice.channel as VoiceBasedChannel, channel, @@ -60,12 +68,24 @@ export default function (): ICommand { execute: async (interaction) => { const songQuery = interaction.options.getString('request'); + if (queueSongsIsFull(interaction.client, interaction.guild as Guild)){ + await interaction.reply({ + content: i18next.t('commands:play_error_songs_limit', { + queueLimit: queueSongsLimit + }) as string + }); + return + } + await interaction.reply({ content: i18next.t('general:thinking') as string }); await interaction.deleteReply(); const member = interaction.member as GuildMember; + + + if (songQuery) { await interaction.client.audioPlayer.play(member.voice.channel as VoiceChannel, interaction.channel as TextChannel, songQuery, { member: interaction.member as GuildMember, @@ -115,3 +135,11 @@ export async function songSearchAutocomplete(interaction: AutocompleteInteractio await interaction.respond([]); } + +function queueSongsIsFull(client: Client, guild: Guild): boolean{ + const queue = client.audioPlayer.distube.getQueue(guild) + + if (!queue) return false + + return queue.songs.length >= queueSongsLimit +} diff --git a/src/handlers/Command.handler.ts b/src/handlers/Command.handler.ts index f78efd1..19e160c 100644 --- a/src/handlers/Command.handler.ts +++ b/src/handlers/Command.handler.ts @@ -19,7 +19,7 @@ const handler = async (client: Client) => { const commandsDir = path.join(getDirName(import.meta.url), '../commands'); const scanResult: string[] = getAllCommandFilesInDir(commandsDir); // Recursion for scan "commands" folder for files end with ".command.js" - const buildersArray: SlashBuilder[] = []; // Prepare builders array for send into Discord REST API + const buildersArray: SlashBuilder[] = []; // Prepare a builder array for sending into Discord REST API for (const filePath of scanResult) { const importPath = `file:///${filePath}`; diff --git a/src/locales/en/audioplayer.json b/src/locales/en/audioplayer.json index 46a4a0d..0fc48a1 100644 --- a/src/locales/en/audioplayer.json +++ b/src/locales/en/audioplayer.json @@ -12,6 +12,7 @@ "event_add_song_author": "Author", "event_add_list": "Playlist added", "event_add_list_songs_count": "Songs count", + "event_add_list_limit": "Some songs are added, but its trimmed to {{queueLimit}}", "player_embed_unknown": "Unknown", "player_embed_requester": "Requester", "player_embed_author": "Author", diff --git a/src/locales/en/commands.json b/src/locales/en/commands.json index dba8c7d..c24db88 100644 --- a/src/locales/en/commands.json +++ b/src/locales/en/commands.json @@ -17,6 +17,7 @@ "play_desc": "Playing requested song", "play_arg_link": "Links from {{services}} or any text", "play_stream": "Live", + "play_error_songs_limit": "You cant add new songs, because queue hit the limit in {{queueLimit}} songs", "download_desc": "Download song from the link", "download_arg_request": "Links from {{services}}", "download_please_wait": "Please wait, it can take a long time", diff --git a/src/locales/ru/audioplayer.json b/src/locales/ru/audioplayer.json index c5b8d14..60f0ca4 100644 --- a/src/locales/ru/audioplayer.json +++ b/src/locales/ru/audioplayer.json @@ -2,6 +2,7 @@ "audio_commands_wrapper_song_processing": "Песни всё ещё обрабатываются, подожди", "audio_commands_wrapper_player_not_exist": "Плеера не существует", "play_error": "Попробуйте другую ссылку", + "download_song_error": "Что-то пошло не так при получении ссылки на скачивание", "show_queue_title": "Сейчас играет", "show_queue_songs_in_queue": "Песни в очереди", "event_empty": "Все ушли от меня, значит я тоже ухожу", @@ -11,6 +12,7 @@ "event_add_song_author": "Автор", "event_add_list": "Добавлен плейлист", "event_add_list_songs_count": "Количество песен", + "event_add_list_limit": "Некоторые песни добавлены, но их количество было ограничено до {{queueLimit}}", "player_embed_unknown": "Неизвестно", "player_embed_requester": "Запросил", "player_embed_author": "Автор", diff --git a/src/locales/ru/commands.json b/src/locales/ru/commands.json index 9092f2c..b04bb00 100644 --- a/src/locales/ru/commands.json +++ b/src/locales/ru/commands.json @@ -17,6 +17,7 @@ "play_desc": "Проигрывает музыку указанную пользователем", "play_arg_link": "Ссылка с {{services}} или любой текст", "play_stream": "Стрим", + "play_error_songs_limit": "Вы не можете добавлять новые песни, потому-что достигнут лимит очереди в {{queueLimit}} песен", "download_desc": "Скачивает песню по ссылке", "download_arg_request": "Ссылка с {{services}}", "download_please_wait": "Пожалуйста, подождите. Это может занять много времени", From 89a9351757f22c0b4ad1c9b2fe71f6e792271b39 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Wed, 3 Jul 2024 22:52:48 +0300 Subject: [PATCH 06/13] 3.0.0-dev-5 Added warning embed. All audioplayer messages wrapped in embeds. Fixed localization for "previous song" command/button. --- icons/error.png | Bin 0 -> 13251 bytes icons/warning.png | Bin 0 -> 14385 bytes package.json | 2 +- src/audioplayer/AudioPlayerCore.ts | 15 +++- src/audioplayer/MessagePlayer.ts | 9 ++- .../MessagePlayerButtonsHandler.ts | 35 +++++---- src/commands/audio/jump.command.ts | 25 ++++--- src/commands/audio/play.command.ts | 69 +++++++++++------- src/commands/audio/previous.command.ts | 21 +++--- src/commands/audio/rewind.command.ts | 21 +++--- src/commands/audio/shuffle.command.ts | 25 ++++--- src/commands/audio/skip.command.ts | 27 ++++--- src/commands/audio/stop.command.ts | 17 +++-- src/locales/en/audioplayer.json | 2 +- src/locales/en/general.json | 1 + src/locales/ru/audioplayer.json | 2 +- src/locales/ru/general.json | 1 + src/utilities/generateErrorEmbed.ts | 7 +- src/utilities/generateSimpleEmbed.ts | 5 ++ src/utilities/generateWarningEmbed.ts | 9 +++ 20 files changed, 187 insertions(+), 106 deletions(-) create mode 100644 icons/error.png create mode 100644 icons/warning.png create mode 100644 src/utilities/generateSimpleEmbed.ts create mode 100644 src/utilities/generateWarningEmbed.ts diff --git a/icons/error.png b/icons/error.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f43b9d8a9fd6d49f2ddf3ec54fc5360bdfe966 GIT binary patch literal 13251 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�JoZ}b3fg!i_z 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 literal 0 HcmV?d00001 diff --git a/icons/warning.png b/icons/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..98fc5f363e2ab1a32ffc96d297783c6dbcbb2aa7 GIT binary patch literal 14385 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index 3cafb0c..dd0523d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-4", + "version": "3.0.0-dev-5", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/audioplayer/AudioPlayerCore.ts b/src/audioplayer/AudioPlayerCore.ts index 75f65e4..b16a8db 100644 --- a/src/audioplayer/AudioPlayerCore.ts +++ b/src/audioplayer/AudioPlayerCore.ts @@ -21,6 +21,7 @@ import { VoiceBasedChannel } from 'discord.js'; import { joinVoiceChannel } from '@discordjs/voice'; +import { generateWarningEmbed } from '../utilities/generateWarningEmbed.js'; export const queueSongsLimit = 500; @@ -64,7 +65,9 @@ export class AudioPlayerCore { await this.distube.play(voiceChannel, song, options); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); - await textChannel.send({ embeds: [generateErrorEmbed(i18next.t('audioplayer:play_error'))] }); + await textChannel.send({ + embeds: [generateErrorEmbed(e.message, i18next.t('audioplayer:play_error') as string)] + }); } } @@ -336,9 +339,13 @@ export class AudioPlayerCore { await queue.textChannel.send({ embeds: [generateAddedPlaylistMessage(playlist)] }); if (queue.songs.length >= queueSongsLimit) { await queue.textChannel.send({ - content: i18next.t('audioplayer:event_add_list_limit', { - queueLimit: queueSongsLimit - }) as string + embeds: [ + generateWarningEmbed( + i18next.t('audioplayer:event_add_list_limit', { + queueLimit: queueSongsLimit + }) as string + ) + ] }); queue.songs.length = queueSongsLimit; } diff --git a/src/audioplayer/MessagePlayer.ts b/src/audioplayer/MessagePlayer.ts index b6c82a9..b898fa4 100644 --- a/src/audioplayer/MessagePlayer.ts +++ b/src/audioplayer/MessagePlayer.ts @@ -7,6 +7,7 @@ import { checkBotInVoice } from '../utilities/checkBotInVoice.js'; import i18next from 'i18next'; import { ENV } from '../EnvironmentVariables.js'; import { loggerError } from '../utilities/logger.js'; +import { generateSimpleEmbed } from '../utilities/generateSimpleEmbed.js'; export class MessagePlayer { private readonly client: Client; @@ -47,7 +48,9 @@ export class MessagePlayer { try { this.afkTimer = setTimeout(async () => { await this.client.audioPlayer.stop(this.textChannel.guild); - await this.textChannel.send(i18next.t('audioplayer:event_empty') as string); + await this.textChannel.send({ + embeds: [generateSimpleEmbed(i18next.t('audioplayer:event_empty') as string)] + }); await this.stopAfkTimer(); await this.stopFinishTimer(); }, this.afkTime); @@ -74,7 +77,9 @@ export class MessagePlayer { if (queue) return; if (checkBotInVoice(this.textChannel.guild)) { await this.client.audioPlayer.stop(this.textChannel.guild); - await this.textChannel.send(i18next.t('audioplayer:event_finish_time') as string); + await this.textChannel.send({ + embeds: [generateSimpleEmbed(i18next.t('audioplayer:event_finish_time') as string)] + }); await this.stopFinishTimer(); await this.stopAfkTimer(); } diff --git a/src/audioplayer/MessagePlayerButtonsHandler.ts b/src/audioplayer/MessagePlayerButtonsHandler.ts index feb6c80..3e17bae 100644 --- a/src/audioplayer/MessagePlayerButtonsHandler.ts +++ b/src/audioplayer/MessagePlayerButtonsHandler.ts @@ -13,17 +13,17 @@ import { import { checkMemberInVoiceWithBot } from '../utilities/checkMemberInVoiceWithBot.js'; import { generateErrorEmbed } from '../utilities/generateErrorEmbed.js'; import { loggerError } from '../utilities/logger.js'; -import { generateSkipMessage, generateSkipMessageFailure } from '../commands/audio/skip.command.js'; -import { generateMessageAudioPlayerStop } from '../commands/audio/stop.command.js'; +import { generateSkipEmbed, generateSkipEmbedFailure } from '../commands/audio/skip.command.js'; import { - generateMessageAudioPlayerPrevious, - generateMessageAudioPlayerPreviousFailure -} from '../commands/audio/previous.command.js'; -import { - generateMessageAudioPlayerShuffle, - generateMessageAudioPlayerShuffleFailure + generateEmbedAudioPlayerShuffle, + generateEmbedAudioPlayerShuffleFailure } from '../commands/audio/shuffle.command.js'; import { AudioPlayerIcons, AudioPlayerState } from './AudioPlayerTypes.js'; +import { generateEmbedAudioPlayerStop } from '../commands/audio/stop.command.js'; +import { + generateEmbedAudioPlayerPrevious, + generateEmbedAudioPlayerPreviousFailure +} from '../commands/audio/previous.command.js'; enum ButtonIDs { stopMusic = 'stopMusic', @@ -133,7 +133,7 @@ export class MessagePlayerButtonsHandler { if (player) { await player.textChannel.send({ - content: generateMessageAudioPlayerStop(ButtonInteraction.member as GuildMember) + embeds: [generateEmbedAudioPlayerStop(ButtonInteraction.member as GuildMember)] }); } @@ -151,14 +151,13 @@ export class MessagePlayerButtonsHandler { const song = await this.client.audioPlayer.previous(ButtonInteraction.guild as Guild); if (song) { await ButtonInteraction.reply({ - content: generateMessageAudioPlayerPrevious( - ButtonInteraction.member as GuildMember, - song - ) + embeds: [ + generateEmbedAudioPlayerPrevious(ButtonInteraction.member as GuildMember, song) + ] }); } else { await ButtonInteraction.reply({ - content: generateMessageAudioPlayerPreviousFailure(), + embeds: [generateEmbedAudioPlayerPreviousFailure()], ephemeral: true }); } @@ -170,11 +169,11 @@ export class MessagePlayerButtonsHandler { if (song) { await ButtonInteraction.reply({ - content: generateSkipMessage(song, ButtonInteraction.member as GuildMember) + embeds: [generateSkipEmbed(song, ButtonInteraction.member as GuildMember)] }); } else { await ButtonInteraction.reply({ - content: generateSkipMessageFailure(), + embeds: [generateSkipEmbedFailure()], ephemeral: true }); } @@ -204,10 +203,10 @@ export class MessagePlayerButtonsHandler { case ButtonIDs.shuffle: { if (await this.client.audioPlayer.shuffle(ButtonInteraction.guild as Guild)) { await ButtonInteraction.reply({ - content: generateMessageAudioPlayerShuffle(ButtonInteraction.member as GuildMember) + embeds: [generateEmbedAudioPlayerShuffle(ButtonInteraction.member as GuildMember)] }); } else { - await ButtonInteraction.reply(generateMessageAudioPlayerShuffleFailure()); + await ButtonInteraction.reply({ embeds: [generateEmbedAudioPlayerShuffleFailure()] }); } break; } diff --git a/src/commands/audio/jump.command.ts b/src/commands/audio/jump.command.ts index b06b35e..d4e341b 100644 --- a/src/commands/audio/jump.command.ts +++ b/src/commands/audio/jump.command.ts @@ -1,5 +1,5 @@ import { CommandArgument, ICommand } from '../../CommandTypes.js'; -import { GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { EmbedBuilder, GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, @@ -8,6 +8,7 @@ import { import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { Song } from 'distube'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -32,9 +33,9 @@ export default function (): ICommand { await AudioCommandWrapperText(message, async () => { const song = await message.client.audioPlayer.jump(message.guild!, pos!); if (song) { - await message.reply(generateMessageAudioPlayerJump(message.member!, song)); + await message.reply({ embeds: [generateEmbedAudioPlayerJump(message.member!, song)] }); } else { - await message.reply(generateMessageAudioPlayerJumpFailure()); + await message.reply({ embeds: [generateEmbedAudioPlayerJumpFailure()] }); } }); } @@ -59,11 +60,11 @@ export default function (): ICommand { await AudioCommandWrapperInteraction(interaction, async () => { const song = await interaction.client.audioPlayer.jump(interaction.guild!, pos!); if (song) { - await interaction.reply( - generateMessageAudioPlayerJump(interaction.member as GuildMember, song) - ); + await interaction.reply({ + embeds: [generateEmbedAudioPlayerJump(interaction.member as GuildMember, song)] + }); } else { - await interaction.reply(generateMessageAudioPlayerJumpFailure()); + await interaction.reply({ embeds: [generateEmbedAudioPlayerJumpFailure()] }); } }); } @@ -78,10 +79,12 @@ export default function (): ICommand { }; } -function generateMessageAudioPlayerJump(member: GuildMember, song: Song) { - return `:fast_forward: ${member} ${i18next.t('commands:jump_success')} ${song.name} :fast_forward:`; +function generateEmbedAudioPlayerJump(member: GuildMember, song: Song): EmbedBuilder { + return generateSimpleEmbed( + `:fast_forward: ${member} ${i18next.t('commands:jump_success')} ${song.name} :fast_forward:` + ); } -function generateMessageAudioPlayerJumpFailure() { - return i18next.t('commands:jump_failure'); +function generateEmbedAudioPlayerJumpFailure(): EmbedBuilder { + return generateSimpleEmbed(i18next.t('commands:jump_failure')); } diff --git a/src/commands/audio/play.command.ts b/src/commands/audio/play.command.ts index d570465..9629c7e 100644 --- a/src/commands/audio/play.command.ts +++ b/src/commands/audio/play.command.ts @@ -1,12 +1,15 @@ import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { ApplicationCommandOptionChoiceData, - AutocompleteInteraction, Client, Guild, + AutocompleteInteraction, + Client, + Guild, GuildMember, Message, PermissionsBitField, SlashCommandBuilder, - TextChannel, VoiceBasedChannel, + TextChannel, + VoiceBasedChannel, VoiceChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; @@ -15,6 +18,7 @@ import i18next from 'i18next'; import { SearchResultType } from '@distube/youtube'; import ytsr from '@distube/ytsr'; import { queueSongsLimit } from '../../audioplayer/AudioPlayerCore.js'; +import { generateWarningEmbed } from '../../utilities/generateWarningEmbed.js'; export const services = 'Youtube, Spotify, Soundcloud, Yandex Music, HTTP-stream'; export default function (): ICommand { @@ -31,13 +35,17 @@ export default function (): ICommand { const member = message.member as GuildMember; const channel = message.channel as TextChannel; - if (queueSongsIsFull(message.client, message.guild as Guild)){ + if (queueSongsIsFull(message.client, message.guild as Guild)) { await message.reply({ - content: i18next.t('commands:play_error_songs_limit', { - queueLimit: queueSongsLimit - }) as string + embeds: [ + generateWarningEmbed( + i18next.t('commands:play_error_songs_limit', { + queueLimit: queueSongsLimit + }) as string + ) + ] }); - return + return; } await message.client.audioPlayer.play( @@ -68,13 +76,18 @@ export default function (): ICommand { execute: async (interaction) => { const songQuery = interaction.options.getString('request'); - if (queueSongsIsFull(interaction.client, interaction.guild as Guild)){ + if (queueSongsIsFull(interaction.client, interaction.guild as Guild)) { await interaction.reply({ - content: i18next.t('commands:play_error_songs_limit', { - queueLimit: queueSongsLimit - }) as string + embeds: [ + generateWarningEmbed( + i18next.t('commands:play_error_songs_limit', { + queueLimit: queueSongsLimit + }) as string + ) + ], + ephemeral: true }); - return + return; } await interaction.reply({ @@ -84,13 +97,16 @@ export default function (): ICommand { const member = interaction.member as GuildMember; - - if (songQuery) { - await interaction.client.audioPlayer.play(member.voice.channel as VoiceChannel, interaction.channel as TextChannel, songQuery, { - member: interaction.member as GuildMember, - textChannel: interaction.channel as TextChannel - }); + await interaction.client.audioPlayer.play( + member.voice.channel as VoiceChannel, + interaction.channel as TextChannel, + songQuery, + { + member: interaction.member as GuildMember, + textChannel: interaction.channel as TextChannel + } + ); } } }, @@ -110,14 +126,17 @@ export default function (): ICommand { }; } -const liveText = i18next.t('commands:play_stream') +const liveText = i18next.t('commands:play_stream'); export async function songSearchAutocomplete(interaction: AutocompleteInteraction) { const focusedValue = interaction.options.getFocused(false); if (focusedValue) { - - const choices = await ytsr(focusedValue, { safeSearch: true, limit: 10, type: SearchResultType.VIDEO }) + const choices = await ytsr(focusedValue, { + safeSearch: true, + limit: 10, + type: SearchResultType.VIDEO + }); const finalResult = choices.items.map((video: ytsr.Video) => { const duration = video.isLive ? liveText : video.duration; @@ -136,10 +155,10 @@ export async function songSearchAutocomplete(interaction: AutocompleteInteractio await interaction.respond([]); } -function queueSongsIsFull(client: Client, guild: Guild): boolean{ - const queue = client.audioPlayer.distube.getQueue(guild) +function queueSongsIsFull(client: Client, guild: Guild): boolean { + const queue = client.audioPlayer.distube.getQueue(guild); - if (!queue) return false + if (!queue) return false; - return queue.songs.length >= queueSongsLimit + return queue.songs.length >= queueSongsLimit; } diff --git a/src/commands/audio/previous.command.ts b/src/commands/audio/previous.command.ts index 0b18bcb..0254766 100644 --- a/src/commands/audio/previous.command.ts +++ b/src/commands/audio/previous.command.ts @@ -1,5 +1,5 @@ import { ICommand } from '../../CommandTypes.js'; -import { GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { EmbedBuilder, GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, @@ -7,6 +7,7 @@ import { } from '../../audioplayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -18,10 +19,10 @@ export default function (): ICommand { const song = await message.client.audioPlayer.previous(message.guild!); if (song) { await message.reply({ - content: generateMessageAudioPlayerPrevious(message.member as GuildMember, song) + embeds: [generateEmbedAudioPlayerPrevious(message.member as GuildMember, song)] }); } else { - await message.reply({ content: generateMessageAudioPlayerPreviousFailure() }); + await message.reply({ embeds: [generateEmbedAudioPlayerPreviousFailure()] }); } }); } @@ -35,11 +36,11 @@ export default function (): ICommand { const song = await interaction.client.audioPlayer.previous(interaction.guild!); if (song) { await interaction.reply({ - content: generateMessageAudioPlayerPrevious(interaction.member as GuildMember, song) + embeds: [generateEmbedAudioPlayerPrevious(interaction.member as GuildMember, song)] }); } else { await interaction.reply({ - content: generateMessageAudioPlayerPreviousFailure(), + embeds: [generateEmbedAudioPlayerPreviousFailure()], ephemeral: true }); } @@ -56,10 +57,12 @@ export default function (): ICommand { }; } -export function generateMessageAudioPlayerPrevious(member: GuildMember, song: Song) { - return `:rewind: ${member} ${i18next.t('audioplayer:previous_success')} ${song.name} :rewind:`; +export function generateEmbedAudioPlayerPrevious(member: GuildMember, song: Song): EmbedBuilder { + return generateSimpleEmbed( + `:rewind: ${member} ${i18next.t('commands:previous_success')} ${song.name} - ${song.uploader.name} :rewind:` + ); } -export function generateMessageAudioPlayerPreviousFailure() { - return i18next.t('audioplayer:previous_error_song_not_exists'); +export function generateEmbedAudioPlayerPreviousFailure() { + return generateSimpleEmbed(i18next.t('commands:previous_error_song_not_exists')); } diff --git a/src/commands/audio/rewind.command.ts b/src/commands/audio/rewind.command.ts index 620fbef..3641e4a 100644 --- a/src/commands/audio/rewind.command.ts +++ b/src/commands/audio/rewind.command.ts @@ -1,5 +1,5 @@ import { CommandArgument, ICommand } from '../../CommandTypes.js'; -import { GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { EmbedBuilder, GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, @@ -7,6 +7,7 @@ import { } from '../../audioplayer/util/AudioCommandWrappers.js'; import { formatSecondsToTime } from '../../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -21,11 +22,11 @@ export default function (): ICommand { if (time) { if (await message.client.audioPlayer.rewind(message.guild!, time)) { await message.reply({ - content: generateMessageAudioPlayerRewind(message.member!, time) + embeds: [generateEmbedAudioPlayerRewind(message.member!, time)] }); } } else { - await message.reply({ content: generateMessageAudioPlayerRewindFailure() }); + await message.reply({ embeds: [generateEmbedAudioPlayerRewindFailure()] }); } }); } @@ -50,12 +51,12 @@ export default function (): ICommand { if (time) { if (await interaction.client.audioPlayer.rewind(interaction.guild!, time)) { await interaction.reply({ - content: generateMessageAudioPlayerRewind(interaction.member as GuildMember, time) + embeds: [generateEmbedAudioPlayerRewind(interaction.member as GuildMember, time)] }); } } else { await interaction.reply({ - content: generateMessageAudioPlayerRewindFailure(), + embeds: [generateEmbedAudioPlayerRewindFailure()], ephemeral: true }); } @@ -93,10 +94,12 @@ function hmsToSeconds(str: string): number | undefined { return s; } -export function generateMessageAudioPlayerRewind(member: GuildMember, time: number) { - return `${member} ${i18next.t('commands:rewind_success')} ${formatSecondsToTime(time)}`; +export function generateEmbedAudioPlayerRewind(member: GuildMember, time: number): EmbedBuilder { + return generateSimpleEmbed( + `${member} ${i18next.t('commands:rewind_success')} ${formatSecondsToTime(time)}` + ); } -export function generateMessageAudioPlayerRewindFailure() { - return i18next.t('commands:rewind_failure'); +export function generateEmbedAudioPlayerRewindFailure(): EmbedBuilder { + return generateSimpleEmbed(i18next.t('commands:rewind_failure')); } diff --git a/src/commands/audio/shuffle.command.ts b/src/commands/audio/shuffle.command.ts index 323d5ba..2728029 100644 --- a/src/commands/audio/shuffle.command.ts +++ b/src/commands/audio/shuffle.command.ts @@ -1,11 +1,18 @@ import { ICommand } from '../../CommandTypes.js'; -import { GuildMember, Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { + EmbedBuilder, + GuildMember, + Message, + PermissionsBitField, + SlashCommandBuilder +} from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { text_data: { @@ -14,9 +21,9 @@ export default function (): ICommand { execute: async (message: Message): Promise => { await AudioCommandWrapperText(message, async (): Promise => { if (await message.client.audioPlayer.shuffle(message.guild!)) { - await message.reply({ content: generateMessageAudioPlayerShuffle(message.member!) }); + await message.reply({ embeds: [generateEmbedAudioPlayerShuffle(message.member!)] }); } else { - await message.reply(generateMessageAudioPlayerShuffleFailure()); + await message.reply({ embeds: [generateEmbedAudioPlayerShuffleFailure()] }); } }); } @@ -29,10 +36,10 @@ export default function (): ICommand { await AudioCommandWrapperInteraction(interaction, async (): Promise => { if (await interaction.client.audioPlayer.shuffle(interaction.guild!)) { await interaction.reply({ - content: generateMessageAudioPlayerShuffle(interaction.member as GuildMember) + embeds: [generateEmbedAudioPlayerShuffle(interaction.member as GuildMember)] }); } else { - await interaction.reply(generateMessageAudioPlayerShuffleFailure()); + await interaction.reply({ embeds: [generateEmbedAudioPlayerShuffleFailure()] }); } }); } @@ -47,10 +54,10 @@ export default function (): ICommand { }; } -export function generateMessageAudioPlayerShuffle(member: GuildMember): string { - return `${member} ${i18next.t('commands:shuffle_success')}`; +export function generateEmbedAudioPlayerShuffle(member: GuildMember): EmbedBuilder { + return generateSimpleEmbed(`${member} ${i18next.t('commands:shuffle_success')}`); } -export function generateMessageAudioPlayerShuffleFailure(): string { - return i18next.t('commands:shuffle_failure'); +export function generateEmbedAudioPlayerShuffleFailure(): EmbedBuilder { + return generateSimpleEmbed(i18next.t('commands:shuffle_failure')); } diff --git a/src/commands/audio/skip.command.ts b/src/commands/audio/skip.command.ts index 6883d2e..b43b856 100644 --- a/src/commands/audio/skip.command.ts +++ b/src/commands/audio/skip.command.ts @@ -1,5 +1,11 @@ import { ICommand } from '../../CommandTypes.js'; -import { GuildMember, Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { + EmbedBuilder, + GuildMember, + Message, + PermissionsBitField, + SlashCommandBuilder +} from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, @@ -7,6 +13,7 @@ import { } from '../../audioplayer/util/AudioCommandWrappers.js'; import { Song } from 'distube'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -17,9 +24,9 @@ export default function (): ICommand { await AudioCommandWrapperText(message, async () => { const song = await message.client.audioPlayer.skip(message.guild!); if (song) { - await message.reply({ content: generateSkipMessage(song, message.member!) }); + await message.reply({ embeds: [generateSkipEmbed(song, message.member!)] }); } else { - await message.reply({ content: generateSkipMessageFailure() }); + await message.reply({ embeds: [generateSkipEmbedFailure()] }); } }); } @@ -33,10 +40,10 @@ export default function (): ICommand { const song = await interaction.client.audioPlayer.skip(interaction.guild!); if (song) { await interaction.reply({ - content: generateSkipMessage(song, interaction.member as GuildMember) + embeds: [generateSkipEmbed(song, interaction.member as GuildMember)] }); } else { - await interaction.reply({ content: generateSkipMessageFailure(), ephemeral: true }); + await interaction.reply({ embeds: [generateSkipEmbedFailure()], ephemeral: true }); } }); } @@ -51,10 +58,12 @@ export default function (): ICommand { }; } -export function generateSkipMessage(song: Song, member: GuildMember): string { - return `:fast_forward: ${member} ${i18next.t('commands:skip_success')} ${song.name} - ${song.uploader.name} :fast_forward:`; +export function generateSkipEmbed(song: Song, member: GuildMember): EmbedBuilder { + return generateSimpleEmbed( + `:fast_forward: ${member} ${i18next.t('commands:skip_success')} ${song.name} - ${song.uploader.name} :fast_forward:` + ); } -export function generateSkipMessageFailure(): string { - return i18next.t('commands:skip_failure'); +export function generateSkipEmbedFailure(): EmbedBuilder { + return generateSimpleEmbed(i18next.t('commands:skip_failure')); } diff --git a/src/commands/audio/stop.command.ts b/src/commands/audio/stop.command.ts index c50df3b..1695468 100644 --- a/src/commands/audio/stop.command.ts +++ b/src/commands/audio/stop.command.ts @@ -1,11 +1,18 @@ import { ICommand } from '../../CommandTypes.js'; -import { GuildMember, Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; +import { + EmbedBuilder, + GuildMember, + Message, + PermissionsBitField, + SlashCommandBuilder +} from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { AudioCommandWrapperInteraction, AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -15,7 +22,7 @@ export default function (): ICommand { execute: async (message: Message) => { await AudioCommandWrapperText(message, async () => { await message.client.audioPlayer.stop(message.guild!); - await message.reply({ content: generateMessageAudioPlayerStop(message.member!) }); + await message.reply({ embeds: [generateEmbedAudioPlayerStop(message.member!)] }); }); } }, @@ -27,7 +34,7 @@ export default function (): ICommand { await AudioCommandWrapperInteraction(interaction, async () => { await interaction.client.audioPlayer.stop(interaction.guild!); await interaction.reply({ - content: generateMessageAudioPlayerStop(interaction.member as GuildMember) + embeds: [generateEmbedAudioPlayerStop(interaction.member as GuildMember)] }); }); } @@ -42,6 +49,6 @@ export default function (): ICommand { }; } -export function generateMessageAudioPlayerStop(member: GuildMember): string { - return `${member} ${i18next.t('commands:stop_success')}`; +export function generateEmbedAudioPlayerStop(member: GuildMember): EmbedBuilder { + return generateSimpleEmbed(`${member} ${i18next.t('commands:stop_success')}`); } diff --git a/src/locales/en/audioplayer.json b/src/locales/en/audioplayer.json index 0fc48a1..771800f 100644 --- a/src/locales/en/audioplayer.json +++ b/src/locales/en/audioplayer.json @@ -1,7 +1,7 @@ { "audio_commands_wrapper_song_processing": "Song is processing, please wait", "audio_commands_wrapper_player_not_exist": "Player is not exists", - "play_error": "With this link is something wrong", + "play_error": "With this song is something wrong", "download_song_error": "Something went wrong, when retrieving link to audio", "show_queue_title": "Now playing", "show_queue_songs_in_queue": "Songs in queue", diff --git a/src/locales/en/general.json b/src/locales/en/general.json index 563c890..36dec00 100644 --- a/src/locales/en/general.json +++ b/src/locales/en/general.json @@ -1,5 +1,6 @@ { "error": "Error", + "warning": "Warning", "thinking": "I am thinking", "page": "Page" } diff --git a/src/locales/ru/audioplayer.json b/src/locales/ru/audioplayer.json index 60f0ca4..16da67b 100644 --- a/src/locales/ru/audioplayer.json +++ b/src/locales/ru/audioplayer.json @@ -1,7 +1,7 @@ { "audio_commands_wrapper_song_processing": "Песни всё ещё обрабатываются, подожди", "audio_commands_wrapper_player_not_exist": "Плеера не существует", - "play_error": "Попробуйте другую ссылку", + "play_error": "Попробуйте другую песню, с этой какая-то ерунда происходит.", "download_song_error": "Что-то пошло не так при получении ссылки на скачивание", "show_queue_title": "Сейчас играет", "show_queue_songs_in_queue": "Песни в очереди", diff --git a/src/locales/ru/general.json b/src/locales/ru/general.json index dd13a3c..67012d1 100644 --- a/src/locales/ru/general.json +++ b/src/locales/ru/general.json @@ -1,5 +1,6 @@ { "error": "Ошибка", + "warning": "Предупреждение", "thinking": "Я думаю", "page": "Страница" } diff --git a/src/utilities/generateErrorEmbed.ts b/src/utilities/generateErrorEmbed.ts index 79e889e..38da149 100644 --- a/src/utilities/generateErrorEmbed.ts +++ b/src/utilities/generateErrorEmbed.ts @@ -1,9 +1,12 @@ import { EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; -export function generateErrorEmbed(errorMessage: string): EmbedBuilder { +export function generateErrorEmbed( + errorMessage: string, + errorName = i18next.t('general:error') +): EmbedBuilder { return new EmbedBuilder() - .setTitle(`⚠️ ${i18next.t('general:error')}`) + .setTitle(`<:error:1257892426790731786> ${errorName}`) .setColor('Red') .setDescription(errorMessage.slice(0, 2048)); } diff --git a/src/utilities/generateSimpleEmbed.ts b/src/utilities/generateSimpleEmbed.ts new file mode 100644 index 0000000..3017c76 --- /dev/null +++ b/src/utilities/generateSimpleEmbed.ts @@ -0,0 +1,5 @@ +import { EmbedBuilder } from 'discord.js'; + +export function generateSimpleEmbed(message: string): EmbedBuilder { + return new EmbedBuilder().setColor('Grey').setDescription(message.slice(0, 2048)); +} diff --git a/src/utilities/generateWarningEmbed.ts b/src/utilities/generateWarningEmbed.ts new file mode 100644 index 0000000..bcd09f2 --- /dev/null +++ b/src/utilities/generateWarningEmbed.ts @@ -0,0 +1,9 @@ +import { EmbedBuilder } from 'discord.js'; +import i18next from 'i18next'; + +export function generateWarningEmbed(warningMessage: string): EmbedBuilder { + return new EmbedBuilder() + .setTitle(`<:warning:1257892727014817865> ${i18next.t('general:warning')}`) + .setColor('Yellow') + .setDescription(warningMessage.slice(0, 2048)); +} From ea09e8ae669f9312c97da5bb842dc4393f741cc5 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Fri, 5 Jul 2024 12:04:34 +0300 Subject: [PATCH 07/13] Added wiki and issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 61 ++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 6 ++ .github/ISSUE_TEMPLATE/feature-request.yml | 35 +++++++++ .github/workflows/wiki.yaml | 15 ++++ README.md | 64 ----------------- wiki/API-Configure.md | 78 +++++++++++++++++++++ wiki/Commands.md | 0 wiki/Frequently-Asked-Questions.md | 4 ++ wiki/Home.md | 10 +++ wiki/Setup.md | 69 ++++++++++++++++++ wiki/images/discord-dev-enable-intents.png | Bin 0 -> 74614 bytes wiki/images/discord-dev-selected-app.png | Bin 0 -> 63515 bytes wiki/images/spotify-dev-create-app.png | Bin 0 -> 42495 bytes wiki/images/spotify-dev-main.png | Bin 0 -> 17232 bytes wiki/images/yandex-music-extension.png | Bin 0 -> 26800 bytes wiki/images/yandex-music-uid.png | Bin 0 -> 2911 bytes 16 files changed, 278 insertions(+), 64 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/workflows/wiki.yaml create mode 100644 wiki/API-Configure.md create mode 100644 wiki/Commands.md create mode 100644 wiki/Frequently-Asked-Questions.md create mode 100644 wiki/Home.md create mode 100644 wiki/Setup.md create mode 100644 wiki/images/discord-dev-enable-intents.png create mode 100644 wiki/images/discord-dev-selected-app.png create mode 100644 wiki/images/spotify-dev-create-app.png create mode 100644 wiki/images/spotify-dev-main.png create mode 100644 wiki/images/yandex-music-extension.png create mode 100644 wiki/images/yandex-music-uid.png diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..b6599f3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,61 @@ +name: Bug Report +description: Bug report for anything +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + Please also ensure you have searched for any existing reports of this issue before you begin - if one exists, please leave a thumbs-up and/or a comment on that one, rather than knowingly filing a duplicate report, as duplicates just slow things down. + + Note that most fields are required to be filled-in before you can submit this report, as it is all essential information which we will require in order to confirm and fix your issue. + + - type: dropdown + id: user-type + attributes: + label: Who are you? User (who just use bot from discord)/developer/admin (who download all bot stuff to host)? + description: If you are on an older version, update and confirm your issue stil exists! + multiple: true + options: + - User + - Developer + - Admin + validations: + required: true + + - type: textarea + id: description + attributes: + label: Description + description: Write a concise yet detailed description of the issue!) + validations: + required: true + + - type: textarea + id: steps + attributes: + label: Steps To Reproduce + description: Add detailed, ordered steps for someone else to recreate the issue into the gaps below (add as many steps into the middle as you require) + value: | + 1. Use command + 2. + 3. + 4. See the issue + validations: + required: true + + - type: dropdown + id: repro-rate + attributes: + label: How reliably can you recreate this issue using your steps above? + options: + - Always + - Most Times + - Only Sometimes + - Rarely + - Only Ever Happened Once + validations: + required: true + + - type: markdown + attributes: + value: Thanks for taking the time to fill out this bug report! diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ddbc450 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,6 @@ +blank_issues_enabled: false +contact_links: + - name: Frequently Asked Questions + url: https://github.com/AlexInCube/AICoTest/wiki/Frequently-Asked-Questions + about: AICoTest Frequently Asked Questions + diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..cacec3a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,35 @@ +name: Feature Request +description: Suggest an improvement for AICoTest! +labels: ["feature"] +body: + - type: textarea + id: problem + attributes: + label: Is your feature request related to a problem? + description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + validations: + required: true + + - type: textarea + id: solution + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. + validations: + required: false + + - type: textarea + id: additional + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false diff --git a/.github/workflows/wiki.yaml b/.github/workflows/wiki.yaml new file mode 100644 index 0000000..5728478 --- /dev/null +++ b/.github/workflows/wiki.yaml @@ -0,0 +1,15 @@ +name: Wiki +on: + push: + branches: [main, 3.0-dev] + paths: + - wiki/** + - .github/workflows/wiki.yml +permissions: + contents: write +jobs: + wiki: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: Andrew-Chen-Wang/github-wiki-action@v4 diff --git a/README.md b/README.md index 8c3e03a..743108e 100644 --- a/README.md +++ b/README.md @@ -11,67 +11,3 @@ Cool audiobot for Discord created by @Ale - Support YouTube, Spotify, Soundcloud, any HTTP-stream and Discord Attachments (/playfile support MP3/WAV/OGG) - Support Slash and Text commands (with customizable prefix per server using /setprefix) - Localization (English and Russian are currently supported) - -## 🎛️ Requirements -- Node.js 20 or higher -- MongoDB 6.0 or higher -- ffmpeg latest - -## How to run bot? -### ⚙️ Configure .env -You can use Docker image or install things from "Requirements" and source code locally. -But in both cases, you need to configure .env file. - -- Create .env.production -- Fill all fields in .env.production. If the field is marked as (Optional), you can skip it. -- (Required) To get Discord Token, follow this [guide](https://discordjs.guide/preparations/setting-up-a-bot-application.html#creating-your-bot). After following the guide, you need to enable privileged intents in [Discord Developer Portal.](https://github.com/AlexInCube/AlCoTest/assets/25522245/fdbcdcf1-9501-47f0-93bf-7e76806f623f) -- (Optional) To get Spotify Secret and ID, follow this [guide](https://stevesie.com/docs/pages/spotify-client-id-secret-developer-api) -- (Optional) To get Yandex Music token, follow this [guide](https://github.com/MarshalX/yandex-music-api/discussions/513) - -| Name | Example | Description | Required? | -|------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| -| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | -| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | -| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | -| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | -| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | -| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Client ID from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | This need to retrieve reports in direct message | ✔️ | -| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | -| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | -| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | -| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | -| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | - - -### 🍪 Youtube Cookie -Also, it is preferable to provide cookies for YouTube. -This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). -I highly recommend that you create a new Google account from which you get the cookie. -You cannot watch videos in your browser from this account, -otherwise your cookie will be reset, and you will need to retrieve it again. - -- Install an extension for extracting cookie, [EditThisCookie](https://www.editthiscookie.com/blog/2014/03/install-editthiscookie/) -- Go to [YouTube](https://www.youtube.com/) -- Log in to your account. (You should use a new account for this purpose) -- Click on the extension icon and click "Export" button. -- Create file yt-cookies.json and paste cookie in this file - -### 🖥️ Run locally -- Install things from "Requirements" section -- Follow the "Configure .env" section and put .env.production in folder with repository. -- Follow the "YouTube Cookie" section and put yt-cookies.json in the folder with repository. -- Run commands below - -```npm -npm install -npm run build -npm run production -``` - -### 🐋 Run in Docker -- Copy docker-compose.yml, Dockerfile in empty folder -- Follow the "Configure .env" section and put .env.production in folder with Dockerfile etc. -- Follow the "YouTube Cookie" section and put yt-cookies.json in the folder with Dockerfile etc. -- Run command ```docker-compose up --detach --force-recreate``` in folder with files diff --git a/wiki/API-Configure.md b/wiki/API-Configure.md new file mode 100644 index 0000000..db8aad4 --- /dev/null +++ b/wiki/API-Configure.md @@ -0,0 +1,78 @@ +[!Caution] +Don't share this API data with anyone because you can get compromised. +If this happens, reset the tokens and get them again. + +## Discord Developer Portal (required) + +1. Open the [Discord Developer Portal](https://discord.com/developers/applications) and log into your account. +2. Click on the "New Application" button. +3. Enter a name and confirm the pop-up window by clicking the "Create" button. + +You should see a page like this: + +![discord-dev-selected-app](./images/discord-dev-selected-app.png) + +You can edit your application's name, description, and avatar here. Once you've done that, then congratulations—you're now the proud owner of a shiny new Discord bot! You're not entirely done, though. + +4. On "General Information" page copies the Application ID, this is your Client ID. +5. On the sidebar select section "Bot" +6. Press "Reset token" button and copy token. +7. Also enable all "Privileged Gateway Intents" + +![discord-dev-enable-intents](./images/discord-dev-enable-intents.png) + +## 🍪 YouTube Cookie (optional) +Preferable to provide cookies for YouTube. +This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). +I highly recommend that you create a new Google account from which you can get the cookie. + +[!Warning] +Time to time, cookies are resets by YouTube, so you need to retrieve it again. +It's so annoying, but hasn't figured out a way to automate the cookie retrieval process. +If you know workaround, please create the [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose) + +1. Install an extension for extracting cookie, [EditThisCookie](https://www.editthiscookie.com/blog/2014/03/install-editthiscookie/) +2. Go to [YouTube](https://www.youtube.com/) +3. Log in to your account. (You should use a new account for this purpose) +4. Click on the extension icon and click "Export" button. +5. Create file yt-cookies.json and paste cookie in this file + +## Yandex Music (optional) +If you do not provide token and UID, Yandex Music will not work at all. + +[!Warning] +If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. + +### Token +1. Login into [Yandex](https://passport.yandex.ru/auth) account. +2. Download [browser extension](https://chromewebstore.google.com/detail/yandex-music-token/lcbjeookjibfhjjopieifgjnhlegmkib) +This must look like this ![yandex-extension](./images/yandex-music-extension.png) +3. Click "Скопировать токен" button. + +### UID +1. Login into [Yandex](https://passport.yandex.ru/auth) account. +2. You can retrieve uid by opening [Yandex Mail](https://mail.yandex.ru) and copy uid from the url in the address bar. +![yandex-uid](./images/yandex-music-uid.png) + +## Spotify (optional) +Spotify Module can work without provided data, but for more stability better provide custom application data. + +[!Warning] +If you want to fetch playlist with more than 100 songs, this API data is required! + +1. Login in [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) +2. Press "Create app" button![Spotify Dev Main](images/spotify-dev-main.png) +3. Fill the fields like this![Spotify Dev Create App](./images/spotify-dev-create-app.png) +4. Press "Save" +5. On the redirected page, press "Settings" +6. On "Basic Information" section copy Client ID. +7. Under the Client ID field, press "View Client Secret" and copy Client Secret. + +## Soundcloud (optional) + +1. Go to [SoundCloud](https://soundcloud.com) and login. +2. Open up the dev tools (Right-click -> inspect) and go to the Network tab. +3. Refresh the page with opened dev tools. +4. Find the request that has the name session (you can filter by typing session in the filter box) and click on it +5. Go to the Payload tab +6. You should see your client id in the Query String Parameters section, and your oauth token (access_token) in the Request Payload section diff --git a/wiki/Commands.md b/wiki/Commands.md new file mode 100644 index 0000000..e69de29 diff --git a/wiki/Frequently-Asked-Questions.md b/wiki/Frequently-Asked-Questions.md new file mode 100644 index 0000000..432c4f2 --- /dev/null +++ b/wiki/Frequently-Asked-Questions.md @@ -0,0 +1,4 @@ +## Spotify/Apple Music songs some times are wrong + +Bot can't get audio-stream from these services. So we can fetch only info about songs from these services. +Then bot trying to find a song on YouTube and play it. diff --git a/wiki/Home.md b/wiki/Home.md new file mode 100644 index 0000000..fbf4f21 --- /dev/null +++ b/wiki/Home.md @@ -0,0 +1,10 @@ +# Welcome to AICoTest wiki + +Here you can find information on how to use or setup bot. + +## Getting started with AICoTest + +- You can explore features of the bot in [[Commands]] +- If you want to set up bot on your own host, go to [[Setup]] +- Prior to seeking assistance, please review the [[Frequently Asked Questions]] section for potential resolutions to your issue. +- If you still require assistance or find a bug, create [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose) or [discussion](https://github.com/AlexInCube/AlCoTest/discussions/new?category=q-a). diff --git a/wiki/Setup.md b/wiki/Setup.md new file mode 100644 index 0000000..7dc7906 --- /dev/null +++ b/wiki/Setup.md @@ -0,0 +1,69 @@ +# How to setup bot? +## ⚙️ Configure .env +You can use Docker Compose or install all dependencies and source code locally. +But in both cases, you need to configure .env file. + +Also you need retrieve token, client id and enable intents on Discord Developer Portal. + +- Create file .env.production +- Fill all fields in .env.production. If the field is marked as (Optional), you can skip it. +- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](API-Configure.md#discord-developer-portal-required) section. +- (Optional) To get Spotify Secret and ID, follow the [Spotify](API-Configure.md#spotify-optional) section. +- (Optional) To get Yandex Music token, follow the [Yandex Music](API-Configure.md#yandex-music-optional) section. +- (Optional) To get SoundCloud token, follow the [Soundcloud](API-Configure.md#soundcloud-optional) section. + +| Name | Example | Description | Required? | +|------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| +| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | +| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | +| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | +| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | +| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | +| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Application ID from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | This need to retrieve reports in direct message | ✔️ | +| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | +| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | +| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | +| `BOT_YANDEXMUSIC_UID` | | Provide to enable Yandex Music module | ❌ | +| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | +| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | + +## 🐋 Run in Docker (recommended) +[!Note] +Using Docker provides the auto-update feature + +- Install [Docker](https://www.docker.com/get-started/) +- Copy docker-compose.yml, Dockerfile in empty folder +- Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with docker-compose.yml etc. +- (Optional) Follow the [YouTube Cookie](API-Configure.md#-youtube-cookie-optional) section and copy yt-cookies.json in the folder with docker-compose.yml etc. +- Your file structure must be like this +``` +AICoTest/ + ├─ .env.production + ├─ docker-compose.yml + ├─ yt-cookies.yml +``` +- Run command ```docker-compose up --detach --force-recreate``` from folder with files + +## 🖥️ Run locally (if you are not a developer, this way is no sense) +- Install [Node.js 22](https://nodejs.org/en/download/prebuilt-installer) or higher +- Install [Python 3.12](https://www.python.org/downloads/) +- Install C++ compiler. Follow this [guide](https://github.com/nodejs/node-gyp#on-windows) +- Install FFMpeg. Follow this [guide](https://www.wikihow.com/Install-FFmpeg-on-Windows) +- Clone repository to your computer +- Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with repository. +- (Optional) Follow the [YouTube Cookie](API-Configure.md#-youtube-cookie-optional) and copy yt-cookies.json in the folder with repository. +- Install Node.js packages in the folder with repository +```npm +npm install +``` +- Compile bot +``` +npm run build +``` +- Run the bot +``` +npm run production +``` + diff --git a/wiki/images/discord-dev-enable-intents.png b/wiki/images/discord-dev-enable-intents.png new file mode 100644 index 0000000000000000000000000000000000000000..ebdeffeca4ceea9fb7f7ce1d3d4c9bd4a735909c GIT binary patch literal 74614 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⁣A-Xwg=n4Ji9k2WePfW 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%0AZMn%ut7IRH=iRx|h(6qc@#zJ}c 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 f9zsCt?A$;<}E z^R{w|k3euq(wX4%X?mg=(cJ!ls+*4-#$zqtMjILkhWt+arlUL53yM?~=(VOd4*1}h zgJ#t`jPE^goWuAmA6XU_wP%%a_HTrWU{Y01INh3)O7DIyIpIbTFFar4a>Z=H1z;(eeG`i+k17`x1IRRAJ$hL1$ugUTKwF@p0WK^ov-QGHWzlqBnoPJ>3Xz7}E?wY-`>OIEb zJh}S^q`>f2osz08!RFd)%_638IJ3>9uqb4K*hlC@(8FG&cM_Q0l#KM|S({HJdo}a1n5;`%y53idD||;m z^qnF_-h0+oY4?b&T5hUyJr0#q=47^hDy(ypzx=-HK(G^B)Y()jn;lQ_&~QWyw<5_mrNuS#-h%2a@G)f1$833AKTx3@?@MeN4kr6%%*Ao zWQ2Ch-XEWCkvTWu@mW=TzT?(_IT7i({@N@=p4jyQ<^0)fc?7do`M%RP7g1HLk(&T^ zc1?O%bbpsLT&gqxNk@7sIUlhsQGb!^Nk2ej^tNvytx22P^6{;q6!>ZKEsfg)Y2)>y zG1W71dgkjLSpq!iFFQBfXKIRMIhKbJ*5l$e~UF7i46qg`f`kq&@~xkIum1GxO35O3-cl(>-5j`gEpCsfr-zu!dv+L!RmWPL71IjN? zEiS)h8=NyZk;Tl>qt}>*)+kXodq2bcqG>$pN%d2U)fGFcw(+~1u7 zbk8i>4B^cr9oI(!*^#vFHXQ^h?QrpMBKU;hoU2$n8SH5yYP|08saJ)_L3%{?&3zXM zLrTrK%f|W$Mc9R$$IZ^0*yJV+rlOr|j~LACqX`hO*u-mn|A&B9)z_=(sA$?+bdrM& zlrcxPGo+@k7d0gL=FZ9(sCLskAZejSW)%`>m85~&`9nWikc6&6jVr7w+9~eI$c3>y za%4TVt!nCLTa>>#iD0xbos=Fnl*OfH7(j{~rlzlrX{Oc)rDg}8>67J`1z{`V-%ZZ4 zoz(xGY49@sRE+)HOtIBm@`Q3vxC$4IQRo4TsAJAc4OvUV}LZ8vv z*cMHwV5}|)=`xUpXrnu(b}NQ_&>?Qa}pCpF#;AJm?YHFt% zgesM03i_B`4v=Z+mJq>yiO<-8WcwjKjj!!WPpVVS>P>f1ojba!4)%vIY}c>LIj%P9 z^y{zWshI78^~vIdq_4y&oy*U>R&B$7_6!l?X@8VW%6vQ3q{O(fRe*o$Ic;`FdO}74l&0K#o0)-4s-@wSfezWNI zl|v|vznnFQoUo=pKrc`y%Al>>Teg%23}X>?0<&3z)R$6!WYjzd%P6AG9(U*Ucn0*b zn63-?pA*)VP7+;8m@BiM+{aYT{PXrWg>(>icc)Hx9NKYqH_EfJ}9?Yd9k%~F5=wt)^ZXS#wyN)7*= zI?oKj$uU0eD@;rmO77jdsSD|p-pmnGdk`CYk`8RrPOw{(Ql_s#`t(v0#nymuy6IA& zdfJ0ly&5GdNm|C!nm}9hn09t@y}~Gn)`8LXAE-)C@J|3&nH?H;D9UoQF4GC4SO6Nx z9#TbCT`e#_ixMO^mcTaBtHXtEV_erCA5cGLb_^Y)-*<99)0f~qz=W$WSca#u-Rv!t zd~dOl)$YB%Ra>f>UGvnww30$!-(mF%r6i=w&6`zGpuqZ+*cB4$EN9U%$ z?eZURI^fw^`u=JdVODc3de+#o{Z`T^S4=G1jkzH{SHIA0o;08bM`Ce>G?3;@j>KYI zT4Rq_QV`#mF6FD%SEdUm9kb6Y%Q)jC&DJ>!<<6VnUA8adP-Hx z_r=l<^T+z+#^Gel-^1dXS>XrBF}moKmdfHmDj%DG2#^){{$l533ilMZC78wt_DY9H z)Ad(ujRQuh^S>uoup?isZN7)N>Guy(6>8;L!H$+-pR`jQ)2 zIE0Xb`1{F9lw^H;2{B5;<+DGeE!ThW<4E(c&AAtykT@Rrz_kfVVqCHTymX8o#nPg- zDt?&*B&#o;gj>!7UpmS(C+FDw@flFAIq3s6E(P&;Xkn-04&sW-vOOngS*UIc`fIPO zf88|s4qisb914U0R2)DjGvwFE4U+r?JSUINf6LwY2^w0&3>){;(`kP$0hzP54sgo)Sl?%zvBqc zn`SGP0|(Y69}_Kz7bA9`ZO6oPXAk$1@hG?ZUqQs7pBfmZw-4<9hj=4#<%*`%HTchb z>Bq=;7eA8yTiF05k4B@NIP!OsDJeYw_o{w~)A@Z(5uKipSqt!%8tU`McD6M)ZxA19 zsf%a6=Ev~ynZ6DE@jEw6uW|qEqxnH)Q3I&bthK@Ap4Z`SPwtiL?l#0%|K00S5c&GR zKO|#o79EPl`f{yK_eS?ETdzUEg=*w((<#uBvwM$#^1}6B*9Qg|bGfneZq@}SH;0V* zz}zUbgVRt~xtj<8<2gR4H$M*~vE4jC4x1NqlD3f@%{{fI?96q-e+1w|*_40%s@Xd% zzw80<3>nSE^*IvJ8;w4jPn3hAEbUc^VD#S_8_IW>{~5Aeom9uG(XXmw-xNwm1lFDa zs+=SJU6t6ul!vvxjj3DN1*c3`+!&p;BP`kyvMZ+CGMpj4+LTpn$J-0mzgPQWeX_&L zr)(le`dcmM-Fkm#I0KaJSUG-3mrU;Z{o>8$wn@kQi@Ovl;1zW`Vc$Pg^zL|)p*+CL zFTcG~2-T2tyNC@$c#Rs!wlKcM9RC)C&U_gcT?lYbHEnpO>WkZtNZ8jbClfe&7YWXF zMka5#z1j*P9kT9&(UjTmXZ}9H*}W%-+&zKD0yco_@`dAxHQQ{#AMuVZ+kwd1PO?++ zobAA$T&_RWLY{>0oib%@%d0(|aIYLP>Y^EjWQYN=R##SLwyu#4DXRge+4U_kuKa-D zE^lB!b>@#7`}p8r%;PSGt9`@LUbZ?A?OQL^*Kh))Z7JW6gF)ZBVtm$k(qMAy$R^;= zL_9zz0bb3atxW$=xNN;_Hcv;ts*O1>mEjOC%Bk^4fTV_L92*%aE(j-N8`=_EpZ7gd zo}R4JE>SFGe<}1ea(yEuG^nuN|-w`KhHQvmY0Z` zr`Q9jI2rX+PaXfvUFflE@TfooReZYi$1Jb%?`;mcom2gj9FiQ7uxLvTiZZY>x5>!q zA2xAHv;INy=!V7Baja>Z0-8YdGUcE9Mc3s$al2TgDE_Y`y2}v1csu)9sw1`Kmca~3 z8iKVYiu~zxN>~OPA>NTYMk@Nu#W4MG86F{f^RPz+DcY3LRX&ELqq}6NieY%z-OqqR zhW%tGkltztl5YwB5J(}6y@=GQ(mB^3=AJb0{Tn%8fVC0mUH`?xc)QY>i;YuA=(HqC z6lCci4kx%-dR`f;E?>4QOIrD~o8eYR3IkpAm)rZ#!0b{;ZcpqUWJtBn;s#|dp>hk8 zHyAA`YY@1UuzE0$tUnAH6N9Tms2;Hvotjp>yjq!$Ozi{|FITVwCFlkGT2LCnmDs;V zeQRElnvLBV`I=v;TN(X5(DziemkSoVP9AI zoqP83Y>Ve&^;f!@U9A(Aku6Q>JztRB->5;t>U;;}O^~!;W4$v{F?rWIw@5}CvJq4o zUj>d+6s^$uENSAfO->*h_h>w7;64hgKJl?3srMWpUa=Y8V@pNY46bKV-+j~5vD~6$ z=~-sXS3zq~sY}^gmKP_;!J6~N0Ox=cli?9qOSStcXM3bdjlGf>uz;>AE}r`6>Q)bCUfHjZGX z8y1<(*xU~_`jwGY4UtqXivMh3M*;_LNe=%zKliLJhcKKS=WKazv7Kxky5sUuG%7au zq|amVlccJi6oRyt1V72Pru15(5Ax!jf$Ce$R{k9ET!&Ybe5qY&mn3=;TL^lt_OWT{ z?-~|fqnFlBzoyZ)Wn5>ASvF^MDrm`h4+;$i){X27=Ug4!i{uj98;D->lxTvb(zJ;& zA1|I~fHVQwqIhody<|6QwgC%3K&*p4onA-GH>Yt1f%I=jA{sS#mWXqm@$^7?Gir64 ztZlQoU_yAo9flFnrX=+38kBUfG{XDOd%*M6&QZ^O~8y+}aRK2qC z_yQ*E6W)&_`0e?i-#p`W!ahd{Na(C;>LV(4>*%q1BGwr6_om(F0XI^k=ie5 zQ=CjGcDep4hgJq#vUMnP@^0A!h>>IErQ4@I>2P39^;P7&t+rDx-j#-S;B^E9rr!b2 z&vJtcq`w!nx^UcX`?`4sHz%Hx%z@0|$P|umxK%s54olL*CwX5(MuHV>cty{)=r@)x zZ;OvGU7yw$>EXKo`{K2JTYq&WXk*I|{>_-;fSvo?@YKn$CR&-m+`08QMc&cPrcA!5 zr!c`?+yuqziMxxbGNx$rLd$q}ug3?5sqO!_5z%A4Q{lF{4HNg;(eMmU!X=$8Hh+mM zJz{UWjTQ&l&CG1&xbNT$HqO}IeI9hS?wl}<{|rbW5AR5QnN(7Ps@UAzjuU}aEOxFL zRJo3&&JVhpY&*$-_%mQJh4E>R<^~3;R%ACeYv-P!`i-0V`y@$ki{>A!s4lM;*n4@U z=+{iFn9=paQ|@ANXWUIGW-#TX8esNj;4goyg4*K~tZ&YyUZn>odK^)`WpqF+bv&(eZsEh zoDd)s6~7Vv=xLd&7s>74vEAKlH@HRJ`i?NFp11@WNPjZ=#mh8Fv?65n4$tu6reC?^yhN8{(ZW)DLp@F*wd;cfc zFCorrKIDK|O>M|hVS0p3esu_?*}T3sC|1X=#>7kYD^FS8dg1(deeCL?iaX5=FU05V zuRV5UX#17rq#lHUe<7P&83F!mJQa!42TQoRKV8(?TnRWTNuBRlSR6jAcP`5vf%k+z z$mOsX$SGa#Hy)lQP3Py&Se3OKWV_?^OP3jJw7Kcm*Osl&Gw_bg>n$Xk2)o*2Pd)SG z5ZQ|n##_{y&6%0`6`Kr=@Z>3-pcRcFwa}AW-f`cVV0dC2j#$RCGJGC8ZPyo7>T+hu z1GlY9sUBnaTOw^Y{M#8vf=sGV7|+HF)vRGU05N0mk3F8!TKb~c&SvWxVWwi0aiqdL zLpeA^fXWlijZk+wd#}6e#%PiH=1cR0@paYP-`L-cn9aJsB)K7GeAh|oQ>7Zq%h>Bu z_SbFBEq*?CD8R)2^|9+uCuZ)^?@r!du=r z4*Zt1IzK)l!AOnJFXVqrAlcaUW24jVi+Xw(CO_+!4FI&uHh*K9JND-uqwotI*(NUT zOgAcfIe(X#Fdtac17x3G9jW~mr7R)&hYX$_GHlIcRcWkH~ZdGhV*Qz523tIu6gj~H8Mr15GpE3F9(C2 zot-b4Z0n!e^7fixo|ZP|$?TXC|3<8yo$0Pog|*h4JGB+AS_AlpFH(2*S|MxDVw~4n zNX07Mu?1c_M&Qr{vuloqCgxnDf&rRtjEy9`Kj)J#@SepJ;cqAx0t~!hu8HBF7TiC@lzs{X?!+V zNJJG03gDVMTEyiq!R<)gYc0(o;W-E`FIw?hzL}kwIwpF>00}x}6+X)li^9;tP_XXy z$U47HQT-5H(@Nc$D4zr)H+FZlM7GE)WJy$LWo+9L&#|Wpp zANN~WJn8Cm^64Ok(%83pV5e+^^Swkv#uW0gHfJYl;*|TsySGG3#u8|IA7q>92+u~y zy^0-{&mFOB3q~pJ6soUj@P;*4fGNgcQn+)MwEh$@FeH$Fd z?GLg87N#*+cn}v`5qSZL!&M()L`vnpN-ZvSi|r8MVRM#jxW&E`T6?H zGdd@fHrF1Z#(X2krbDUB`+!jSYqhHCN)^>4PDIKk7iNU%e`D?fIX}?jzM(zSr`-|d z^wc+&%tdoommNyf=vsgDc>F7LJ9}oFWsxz=Y{JZ9#T8{%)_E)fJ{X&7ZfMBnZ{0~K z%8_t!Yek_2#5+)A0Dg{9@WKn6rDw?X-hb0*WWBaxOPwS=GUNInA#0Q z&JgD1ZcGon$7}f{KGIDoEG+&`n61Ow;!W{nlql83VrId3VrlH%k$7v`B9Bo)mp!~I zzQb@`nnx}U*Fu`=&r;waGpsqK6mz3{A=72Xb+avX>1^`9XFn&cX6c6=(0+v+W5Tl*;_!Sezt zOTjdf>PM>1y)q~Eby2$k&gLZvCVqXz8U9)WBRse;S)2lN^4~XY3=fC&7)p1>It$IV z35+dN)H?jFcKQ&Fc+IzPODKO>t(;u*_xvA2g&p~a7AH6G74MGO4nlrdx-%x1L7iHQX!DIt4%(DWd}_4L zIdJ=FwgZf!QXvuYp4|OZ+EERJb=G)DJ@#m{|w#|3Gui0+|?X0xg9zRwo_8@E7jw&Z(?)UQT0=iH%|{4O1NOlxu}p>*~pr>(74E zC~8lKU6tQz(&-QLCbO_YFHMo}KGD#lhuNB?`+r-`4ZHIy@@qr$8k@NX}*QfUelZIcfT*Ot&ZwfeMVsxZ!UJ~>RpvPzR0cLehZT?24scG z9Wpr-^9D+WhD%PZJw-M1muT*Y)iNg(T9e6?t#e}}H`{b%?R#_9qZMtUZh6I|*!%FpIfOfQ{B^4I;_pydavNUeUgbl?oR4l;2VTPzxifP-u!-z54ZxeuDZ}Se`GDQ zWthRBkE|b{&7WdycE|Z;QWO!NQPE!qfe8f4L5<8Sj1#pSZ=ps>ZWAp~N|N1D%%P1( zume@%t;Uq;u_1sXiF33k%xURRGCJm_7jWI4G0n_S=SuqCFnR2U-^g+-jJQ^J(>&4DEtRZ0T`%JKf`hq%<&U%IR0 zuN4^_EASY~$Bch}t_9amyTGk7)?yYz^vs+jM0UmGjxZBqRWfvH|6ebkj>@ zkV4@H4n|7R`c-YpJdVaMAqld3mMJ$_*Lc`}P7Lqv)K^l|%;1`0OoU4=dU4ldw^FAC zt^{`tSxj=i7a)Acsv~@rlsfO5vT8m3A1(y3MXs6d1@x)TfLeC;r9M%bqEs&uCNAM& z9;>;<5n-XTE)3Ol6L(@Eyfaf>!~6rSKVfF4e?|iEbxh@Nu-Hh7;@}BsYRgpnK!cuo4xKG}d;laU1cSA8$&TYoSt!Pf-rhyANZ3-CSDR4gy42vMXT$O?1%{4z=-KnHK+?snMCGs5V ze$_*P0AFrfP=+n`dlyZA)9Bi{wb``5A}pcA(h-L>EiRQi>rSE^?M|8w z%F3xyW&mv%XC54{e0i3m8qsi@tD(F|B*Z`Xof-&YWKzc4fEYCxoSfx@o4FyJFAMN< zSw-ZEb2QELna0!)R#&f)+_e27GH4ph=9LCv^m*tH zOGzxyYVToIg1@J&j@6OehU6p~*+yJE>Gdt^`O~cjx5|3xRe_|U+@0APT(QUG__3*# zbuI1~`pLl;PDHtGBjFM|M?z=PISsRG3+@@%@*2oc=+Uf>0k1C(M1MUp0k!0S1GDZpJYGxEvc`KfCX9cgB-Wrf5Y|m!n3;xN z{)BGS)ID~pLMDQC=>KU@KQu8CK3 z-VtsMp59s+q~n>kW)96vCe_Rju3}c}H9Sv*yk>8carVg06!B0QB74qb2;)9us*K3| z_UmqD?qgv^3Hz9&5B>6#5TK!y-k2>M32))UwxYw5#|F@P5){2G8=K@kh>Uq8KzgniKcmAU;7G;vpA z)B9fa59n)m{QlqhI;^mFe*Z4^<=`;`2mfUNg%uS7#ChN#Q|<2Czk*P(wDhaL(8Jxg zKhZ;-N~c|%Y)Clg`-gTVo2I8{qyZK;)5VL|#&zFvI|m*N28P=E(5u%n&j3(OjD>|I zHlQ4U#@csTCSN|nO9>Sfnc-KH-vFI!z{?v@k^H~%@7Eoc{;XQ(@(!rQ?)mQBR=*r); z^hM>4Xr@K&F$=O%};+#?wm*3a1YWH~zUUdG~+&(pH03_Hd0sL%P_Xv|*F#^P`~wHrE-O z*Y8_*@OzSt$nFE_tTn|N3%gj#f2KNfDwk7MUY^6R=sUbR`42Lb_~^0qo2%a-96g5P zRJW0*k33HDUQ7>-<2SUP|EO11SGzQ+wJD0uei-Hof$aWJOY$OOp}$+g)<5a`73Le) zj!ZEB^IpdG*4EbUZc-xWbqQjsFJz={6#P?+4qIk7w72J7%y;2^Sjb<0o_)ieE>czR zvx}~qE6)X;JQ2fmq$4CFgGHll*s1sYx%Pn4ZDAj!OH#1xy?&<`~%*miLJR5kr^orR3+V+2`J zSBGiF>@IQ-ho}Qfr8Pi^*yqmp9avO=&WA9iW4x2&YSf5M-x!@8!!!aRBi!Q@w7%}P z8DlWGI$66?y0W^uBhY2g%DYvm`2n5_nSFXS^3(^Wn(%nMknocp78gW;*x#nr?p)V@ zU1LPlfuL@OF8iWbf%%vHV|BPUq*7%bCr-ylR8hQ1Ul0g{^GAiOS_l!2(KiZMdGCyR zLSSn-5O>+3!7R_d>cx3KlpJ3iig;gFVQYwpC)pRwdMViV<`8C~k2Gk`Qj`^^ENnIW zeRc!gu3lg1vpqB4_Oq!=iRVaFvSib4GsSDLbRQL%-Il%KG2mir@3=QLzd$gcbzb-O zT~Njz48|y#isAqrBuM33>12?@;lM;XU2<4aoipDy zOUf^9)SZ>Xi*vthM2hA{X<&EW#}`_N$%tJDdqDB6UWHS7-+3uE)#Y%e4Wb^Q(h|=x zNm>~+99`ewIAYap;9L4>`GEaWg-_Jlj37q?Jm9{ERtC|D{jehcxMI1Q!%;?@Q{Ova zYjPnxWh^p7scIzc3Izqz_F6M-($eb=?=Q(>*4Ea;royc5T9ELF`pF)y@4-F|XE)nF zKgm_l)3C^Je5s@R>D_Jz-SYkYVRnq_ly6Hm;c@#0*Lz>f#P{ABh7zrh2lBzD@cr9;PE@low2 z1xPF%_>C%0w-|k02|-p-VDc+90(-c;H76X3yYZ;fT_Ru#2p z!7M{p_Xb<-oQkGhru+VfE4_On`&1T6Ah9p!G2iWnS9GdvJR2u#A>$I?c0XW=jtW2b z4fjP;)??h9xtDFnN&LxqW*zbOVIe8_H-pi9raFBlD-m4o4BJ~0lJERK=yoxA}TRe0qudmBDKa@v|| zNN_2uW`;eXps+-5%ysqHzIe!fmuCh@EOIjD)xO(5>Y?RP2`tjN#|0Ha+v|c`m8%Y% zbpgag7PITD!hTCF4)bksPrp+6o%+X|0*1+yc}raISJgASj7R+)+B0cOA2&KPzm#gJ zvSdVn755Uho__C1ep%S^ae$F8jY{clPJgrK(Y7;cnQx)gP(({rhj&~Raj&@0ziF{( z(#+7UERlVKSt3Wyg&|U=Mq|4VuAPD&0QXl8{}M=<4vvl)hQxPhYXr?96bw7X2K%%k z?Hn`Gp4;pd)a%Z6d4;N)DWnO(0}M*yS(RkQFn1*7DJbwS1?X1&_rLA)HqTC@ve4|N z^`!cN9M@6I;qYu?ePD^^8|%?2tZ>YL;=E|dqP@TIBn0KK@EvVQnjC=kxqxKY`C5|5 z9XBO@2w&gTdO`MXX zj%f?COKr9*W-Q!q6K526mKrEWc>^G`XMaSJwbmBa$V#c>zMhZ7HC>#zdDGrv0(vngLtkK5K`IQdy5n7TTu+Cp^(n4XnX$qN#9+A2u+L13VWhhbg6I zr28tpB5M#jRm#r$3VRaz9wV7)mab(v_w=hWGOub?yi4K2C!4$3pX;k9)O;uwm|=FQ zpAc_%&hF6|MtiEKQE3=g2HYUl>QbxkUpQCT9&g6y?&kWGAtl!GX7dq*S|e5|?K&PdiY#B|;C zFg6p>s>)-sEw+!QMg5gkES5@@Ry9jD+vr|nY?AvScqp@YJPDI|A3z?mrNm0PcOB&C z+0Zx{mE)_%V7``7b=M9oK2e#9d&oFGN=1me@0n)I)NPE*ntqLg%x4#-f(}c!2Mo3I zZd}X`4+LQan-1MFUr5l64E4RQeyRUb%ZACz`R=WZ;>4E7m;U)2IMzpQAV_$95=kba<3px3{;RFji$VS;T(Jjo?= zfdTr#?dRP%Q2O<-5gfgHbcz8dt5wVS>e7-3w^q)VQ!FX5)xloRWh>1 zLAL(h)^aJ>l*wIK;^4TkHq7ZIt*z(QR0GG!CGkBpvw9drGPLKfhcuVcf0 z4|m9b*XvozNF56st>4Q-9BQ_+SiSIH_T6^;XXXOkX9w#|M2mC>r+;zbB35F#=^`U1 zNVBh9XQi^gCz%y8FYjG|IxPGollgq5*4nfn=4t0B9$Oa}RS$-rk8KD)M7@WQ4~F`F zWCtD&$JP3DVX!P%x$YV6gVuJu;I)|s4!}7o7haj?+S929k+=8mc)Sd~8FAEV2mW+O z3M5d{2F$xWk_ymcYl)?5S4-JJ=U}$O#(Jfm>9OYSZyatTRpgwqV^NB=H#&Kc?lRGBk{T+s?=)=rYdH5OG8x{h3q1>psaPIH zPAoDwZNw#erFA)@zD_1y0d?srONs+EpvSDvS3RKOqSyLL_VMdWvN?<=CTk`-Tv-U7 zc6mL+!Na3LWbxNL{vt!yo90_yrs68J&wLIi`O`q*ojmA>Wt(T_rFV(iRqVO2HH;jJ zj&E77=+J73)Ful*Ud1*4y^^dD6z8p0C@#ctY1ke3n-U(y=!|o* z9w&zf=)nri$X#T`RYU$tnKACT1WM|e{d$_~Pne)Qd!+Dd)rR1(i^vB^W|^zLyq4Z#%TtzIt@py#wV7K$ED~Q+<0}Gp=zk}TZSxm)_27^LbwQ*J7%9@T7Bg}@)zCgrJdl1&@vZKXmq}| zs=aso)5uSrhGN00dL07uNf&hK9GX zUE#0t2r0TqrSUBUbC4MysVU7&|Y~&bo^r|FIV)+gWe{vC4^JDLbtCt& z9d?|C-SrvhLxlbwr=a+xvZNdF$<1c$*ie6cWW~;}OCwib!r2~fPD5J?RTGuUu~ea5YJ2k=Bq=Qmt{6Or z0`pfYvflCHSpGKs^ctf%h`(UAIxuZv6Wva8{EQmm&PYYkcqaPzm%ETm?HV~;)QlLlAX97WLQ=V=5yx^^pRuBKL4N!z{q$%ttWc6p z-9%}R(Z;#E7h5Cg?&xrd8<|)3qAEn(TYEE=k1;Dv{iS1e%=7;0EK3j3O|52jjZN(W z8+{p7d#UA*GPYV61H!~}vR8^uE{jSG6{JmWbHP=RLgtJx3#K+#N*~3gGe=WEHSoBQO8AY0H zo7vDSy<2=yC*lEGTCLQ+#e=eKLn|g5``JWOLfvuu0&h&go$Hr@+l+VKdt?QTWJ?LC z7WFI~oPSp?C@IwdeQ}gk1E5-!Oa`$HeZjSmc>w6j7KWO%Ha0R2QY#C6`|R~A#f-Sb zYkJoOiAEydYYaJ@v0fKX{`And(&%q=(^Y4W~QWPHIi_h(Dx?88j3_ZfwpEP z&_e9wcD|16*LB~Nu%eXIu53u2x;9tjBYLw@bal|XWXno=wjmwv8z`-*ay*^u%jDdl zLa#0T=rzUh~}Ukb4rka+Aa03JY68jB`ZNmGR+`-6qLh)2r2bqQsd$SaY~kfWPNHCMw4{ zvAK1rNtj^HLpnp^w4mJfF5BVhDi7eyPmSY_Z#qy^!j0`YRln{^J%~?f@B3xk6NO;$ zYSLM^tiJD3&l>~AI&4xltb`}O+#9Z1O9XH8AV)Or4wsS|kmOGAhVmL&6zB@E0PSd| z7})ty5MjwvCv^S#^><_y?K;`9@s2ebb9VF{?;jJxiLZm-H|8~MAn+vjYpHxbA7v@|@G4??QKZ>yzI6&jQW5S7;|Et{9K7zV{zS*792F>~)+7Q9O)wjzpW zq-Fy-ZWH5QAB$`LOs0a=jQG5d7WuV2(l$Df{V184G7R%@acocX8Ws_4hcEOra9~xP z&33uo`Yzf9pQJK>qyF~<-!s{anE0C__vltfIIWM2tN&&{>g=#t!WnbEn!*3d`qX2| zC?$K%>%kaPYIK0!FTM7H7nn%j32H&I7i3?$UG5Smyy5mTBjN)){!c2=J9DY#YZ7UAiAy^?)EA@EgDmj!#N| zPmnMLY4|eZyg2Cl3P7i;4vCy?@1|dd zmRW9m+E?jPNI(9ak!aO!w`JAKXYT_obwgFqmF zJaBiuFG!|KhpaWEjP9OUIct0`J%tM5C9^xSG<7pZiE=K>N}f{5>JBxLVy3+^z))Ri z=dd!BgX2O2deLwrI*|&pk6uX8vKV{H3aSBvm+hqxx&&?{!s?76O)AOId$gYDX=A?? zC6z^onb@L~(ui;n>!>{_zQzO4176&OI&`G>3HiV^P5O!3lz}AyF0-I<_a@JEzA}LA z{`+KNFeEqE%4oWO!b}J44s9~>z)jKwTdvbx4}M~{(YdYB7xk3IPwI!`6-C~)fHU)b zoGGt>HY_$q=c)U2W)Qk}gL87)qUpPaSc$C4(d^Ah0~lPGbNLk|pGTQ((qa+zd^AS! zp5+&+E{<(i;W6VKetQ)Nr0Pw`XR5B)FcZ1~-MFD4u}{X~{-Px+S&ekEHW9Gz>WCly zA2uaBL~FI@9T4fpzt$gwL}Cr{76INTT1%)m`)9dq*Iz46L2j%^1?B5MLG&xXors6m z0ruY3M?$|vd94mNVWxF7i+9lq?y z;7qj{Lod$NaJL40{;QREln(6$z52YXtv$5`MK>xqc_o0Qzg@PwB2bWY8Bm#7b72R+yBO}PcX?W=M^v0jOGp}Q;8)*-I&=WE3-HOT9<-?{v0(DFn%|L zg5t5wLWxyZcle7^p!Iy`P)wCnnOIp|Eo+eU-*{niz5NHO@c2e0nBMHDGu-gf2B*sB zKXWLROgV37fL=IR=*>cUC_5hD0Ail>(8Bhbr>Cdymb!0J>D^8uY==qgG6Mn#zE(VJ^jlFUzeQ;^{p9u`L(%s~9z@kzP>OsM? zNIQ11cK71b6&`OE`78M4!HVB28;7|ne4hsR*EDfAbLm+WmN%d7R1As z<^9v%+HA1Qv)=xMe`j}%XLkGLX$SZw)c>7>h5mcXmKQLrY8; zAJ}5Y6mQaP#nIaAoZBmzrL}1*K#RU3(&U?4DRtgK+Sp5QNsH?Tc zc7$;L`_`NM{}%ZF-R0sQ$3NzIM48m~=Vo%=?0>6M52-#HIXSk2j(@ z9#%$qZWF6*S4S@XC*qs))j|kYPxQnHqcsATL?nmSLSeA%UE-=Vs!3U-&SB2@A+g3s zx34w?8@mP1_6d7?nTt*_NhOUcepY5wc<)twb^OmV;u)Z;`mP*w0vN*!U4&L>VNU?j z0kZNX=HL;|ID($vL?LSe3}hsB^I%2Z>-BRw_=@h=dewuhW^^wU$eSuW^p zj8?tFhzpK9pwLOY-nk$X%Rt~~%fnx~_H+Gfe3-+6yA7=ihd%mWxxhJRa9oJbBdu@7O(N|EJUzBn(>3kxz62yVOW z>Bndb+^Bp0vdzMA+1%)ZV9zBy)UI!IeBNYLK^)>c{$VzI7A(E7JTfG)sodHE{LkwE zqWU?nfRNJ!N~?;r=`&i>ln{qVw+ND}U zCw}+)0oRFqjZ2Gg34=h6tk#EVp`CrS$Qr)MVrs=1O0XhKi)FA`*mjBHgS;THA~~lsFGjg#oSpDqrZQGf`PX zr-3;2n03NF@WqY9C!FD;S}@LK$tOzW+ z=8tk1YE|_rU`jm~Gh;8H=`sZ-Z56vCs^=pW#9t;*nPN&yIu9&Qmwzo;o1KrI3wcK;}KWhat#^_6)j{W-%ckv*w8wa=qT@X z#{H~D7yF6qdo8Ni9RU-njVuo>_t25VY|{w%+ubb@4rY%Y2jw6_UGK#|8R<=e2TY*I z%hiE~h*nY?oblnNT%pdqE;gtXrCSc=rE(c$b0Quu=%`EfA*~RO^d&1bKRKI%4WUZaZrg zL6o&%CvQ^%0c@N_LpJkts9=+kqLaDXSNo#f>$Ws}g;zdH#tc1RUo{Ve7988e*8U9V zDL~|qkd>Y_()#|PYf$dg_G|TpljWt#iXSf%R};i8+bW%;RyEZi!F`v}myYO85FG5X zBCXqJwi0tWk|RdyQUB2R!QoUK+d&l6^A_WyD+kL%Yy3>iG|eN?AA5PSsj1^Dl$C=D z+DC)k+XH3|km*}%^%Lpf`6M=beky{#%QI*1j%(R)i7SrIu+gt@A9v0=%jRN?5cAu^ z0XdJZ$d-tDTG_34gpyBxj*j&&kBM7ke+rLd#)5=gSo*zAlKXN|xm=iQ0%6XB!A669 zyuqR?1l+f?v*jeqF)kJ@Rn#UO;>D~J<*J14bZR!$%UkCzlGh|s1S(C|rePf`F>!HE z)lXzBX%&xm!(7Siu9iPDZy3hpJoWJ?5>s>aq1gOap4&*(P#I5?%ERLA`5&uOh!!9H z(^PyG9xhm9qClYibJDHO=ds_dlXNOemx^f^lzuGz1l+OUUL982OyrRA^6snXF%-=w zluMp5%JK_~yLmFH#NBOy<8uo+v#){pHa}KITVMQ~S z&+x2tR6gNkg%u@rwHya{WY1<7gQ;87q!xbb@nJq^jevWM!`4b`>3!pkQ+id5F?S-P zT>USdiGA!G8+-H!dfsX`{n-bb3;7 z^ZMUTK__U}s~~=o%`wHhE1EoZ$FnaAEn=?b4|T9je%g5v1s{bKmt}B)ow^kE%-5_f z{@+zE8}fRddes{A1V%BR2TGc2P3QT~j!~V$#2RS@I^Ua$9n9zk5|DB@H-~;r9i(TU z|M-3*F%990={%p3{khiFmhc#tF<((3P@pmTxkmI6-70QDd??|d+Fl_8?xTIn#VJqG zs7&_sDCQgTa|tOA%d)*GlDn{=K5H06R*ta}ZX{ot_jq z;{JQ(kNx5l#CKITw7Sd>B#~M+l8I!`BsLj*Xy*cVZ>n?!tUZqUq;hau2#>57jgZ5S zA1YL3WaQy|bg(GN9WJT-)y0c_JyAiXu14KiETNOo_Uh?d=vGsY$D)vA6DM?Crve7$ zwybY1Gbi|I&*kc=d{-NANtI{X&qpcQ$SCh+M-{VCA8)1A69uy$R5bh7_k;ktQ~gJG z!(nU5X`M727}2$DrS26j>-%_R9w~O?(v{g@|FyK}y>{s`a0J)Gm45Y^%xXAN*OaM( z3~5sjYS{Pf5AlIlFVW2Q<4 zI8u*rAVqvFdt@wf z&a_`Vul;`T*I_ZW&gGh|;FV@Z54p~Sz7$YV(}!oZqIDc~um<|+vYL0-*f~iSgr3qu zMRcRzz&f*M&qtBl$ks4uB#JLr;SX?p!|d)_k71_PpUGVpud3^^rA(E87KnQ|O$YWs z((nl^n_~KVuT7_SjEWPI$cYV2lcub9C*oiu$%a*j$IJa0B{N$ZkZaBgWXm|i8$L58 z4ZHiQo9jw7S7~x+@#Nm+4#p-Aj5Yk)@!C7Czlf${yJ*4d)|u5d&eLsa-}^4AFBd8` z3;z-fU-`N&3*V?!W5pV4rBRmM`lp2VVqLB+%IKST0OC)PKB}qBDo@rNcl>w4s z@9`Jfg}Thx90rLgyU24D-oA~*C9?>VYtg|&f=p=vL_j^5&`DvEW}CG zb!Uc?z|=T5cJ3t0Z~=gfNSCcf*YRW7u~SAWjUy;4#V}tj z#Ety5rTi*AXyY(IILu{Or0@5l>K?ixpWOWc~scr7X>=& zw#SpQIWZ*L5y`i&w`9S@?Alja9tn*$Vkt*`{hR~`o}43F zyKu+h-b^&S9Z@=$F!L5#F%jHsxbGJom3dO+lX>RR;W^~5=wzw`cN>@lM)${@1XcS= z=)h^WWqTYmM~|jM>^3nTOCqyzRk|N^GPYSeZzH=F+P>f6+IXrj^Bn=;m$I)P$fK3X z&NufHmEd8MscqFE;KS1TG*00szT8w~FbEFO?=T z`8qC(3CG8fjMRx>+SG;_<)AwTJ%DXmX!a^Desp2P#s)L@=E(wQOX_J~`SnMfX^IDi z$l~|Xk{-Ql_x-A|Dj3?%)1K{qN5S9u15z-d1&*_x7Ck zM8eu7D&)T#^3r*M^jCKngXMA53}!P0H|c0NU*DPjaIMj z?P10qeZW2bR&ZMWP*6NV$D=>i!))3j!$(-LDI2Sd{cWdtg@WR%GvSi3*ItKh)AZ!M z&H2Ap{#$ejsC@gmC-$3bm87+3oB%H6#Pk$X0hsd7qSHDY|CQ*c6!&Tj5xN3Tc_L(B z=?!VGGkYxcFAY@#iNan<0O#y#IHxV+o*ni{t{DH-M_H(|(-v-%Eu% z^`Z_u(czThbyDWo+uxx7y2FG^5VAn{ec)#xng5Z9g0^wM*dzbm;p9Ps&{2^Z##^WPo~l`6d$YW9v#>XEu=Ks=%b;Nn2iSzX}OL%1H;V*Z_M7nQvT56aGlNd>&Z zWm9k7V1gJ~$V7MbY3VY$>oT%#ie%7KelfuEqssfV(BBQ(o(SAM{QSeY@S$miK#!@3 zpudkrQ(9r(D4fB@3HJ?d9hZ*&=-zDzmbYf|Er>`u_9s|3aa0fb*RGBwdsq<;B>Pyl zSEjCcjF@WtwCdoME2zhQdl;*SOT0fpD(NrMSJX_gKYd*Vd@0;8$3a8`C-5A1|CI#6 zFULUf1zH40Z4YZ9eEX>q_9d`f#;UFhSE7rNh&FTx#`;p*1ulQlchE*N`o3;gDpaX^dWGv-h%=5$)3h ztCfcDlNl=oP)dPg4nEw#+S1L0$J3(~4_n3uR+|L(d#x;33#shHR{49s-#?^tKVVw zMWSPE6yef+W$jX9T~OY8(PA1KCSPMa|HPU&<=v5pbFvt1c|7GK#{8NM|Gei=Eqjqn zgdI8}!Rj`uhpE!z66!M4uhzMPPrfjZRZC~G5zyac5n!7gn`_|$Cpt^Cs9CK+`tyP( z8%c56?ejhvJHjKL9m z9h>^dp55GBqGGvhCW3J|;EiFfp-bv7#?`q?z50sV<*;s740yx8(2*_aXi?NeSGY?# zm+{w&QHNWsnqrobk*uh(1b)NXc~bSeL?H?%V4k?rb`a`c%ZQOsO>-%o_vR?p*Ld}^ zec_!x;EX=Hc@BwIi(m(8Svu#AD$O4PXA7$cUjd~|%E;He=^Cysx}+D9dq;@|f6*fc zBA(B%a1%O$x1V>gB9xSd`{LUo+(8Z6J#vDs4*)^R-I{Y*#JiNW#GuOYa1+2>pI>D& zdp%x`GQ!vVAXSw1>Vy5&y`c!l$xna=@)E4R!0P>1SOd`(?&}Js}pgboF{zo+$-fYXaHI@rMy81EnI9cmkce za2|zNG29`w6#qIkDMhUG{I~i~R2c zT=E6<%JDmD@FRW6ciWQ5DWC?Oqc=88+rvwWO)pI&>|-mL!KhM>C2sUIu$=<4ok4*g z>1lPwXfaA?i@o>(jF4!RnG@3`~)+=zG?v;v_wu?f`-hh0Uc@uK5PKXIbf&MS2OpY{0b>o-1>k}GRQqij{n!!v70Tq6+&Q=tJe znmm1j<4HeuJhU_5;J9O>dK#tunp>rlj7D}l2VOJal~Pz+Q9bc@-AhK5ksAZ0rl}l8BKzP=dU_Y^7H`Okv`D3 zNgPW9G{eN?#Zi2_)hucajB+vD9&4II(|Hx#J8>X;g|#Hp$^85H;idC*hm zg^Q=dt$Ovh&!ku>SGv^gEIa~_0(M0|TrLkR80}MGOR2kO&18qK36X5p17zaL33%LW z!lhRjvtXxW>N={g2%J|!1u*1E;L1&kO(Cd39^OLCHfPci9h`9)PJH!qW-~c0Ik!Bp zIriPQLDC%y6rl|8zg|q06vqxZq+FH&<}bY%9B3>46OeyJ$hs5dp=0b;|Js3OGK(GpSo;N#6&N|6(c@`k#z>L4i!`Y`Z^(Fng8dCKDgY!lNnY^z5lO7Enm1zr2#9ZU1d8!qS5Arz&Mpn+j zy)ub(>bd3mVB(LZOX^><$mqfqlc|f)rfW8_#rrE|JA4_bHKb-)vNv1W3Lvt2@*S{R zE^m*}R?P+ZbLF&_iyThq?H;+PB4+BPOCvT+@G&A5MR3h59O^TubRp^E27x%f14a>E z$GxnM+`U8q2cBSUbI2AMU+$;#SKcH!=@DTZx0_xd@;vFm*bSgnZ|~t9xQO(PD)K{o zp5QX7jx4-1G4%%+ujZfVG;?2uxe&qg-?T zOPeWGsV2wMF_|%SDT5IYPx_IrlZxE3^d&8lrZJ*TuJ(hIjQQ4_tckB<@Qi@ z-^quny8u|(A+#%WCJ{nNNj$mWdxbTV%61*feSD*th>8FtC6$zm9z1lY0U&!3piiGU z8iM!g>wVc$o%%N&hKori*UCL7@#SgLW1wn&5rT1}(DLf*qwS4ynOAV;qnG$ulF6u~ zsHzRz1T6`O_EgyN9PopOh$J8hjP?5l1WF!B%X5ZTJmn1EnO;8U)jK#nz9+HFHsSzN z2E9x_sS;g`1QN<|5-f#(Ae%Qb>AsLNrpg?Z1=KiyYRw&{!Ar~e+Iq{hsB^4`FY~ej zs|NW_WF(UL4Rya3#ujMx3E^`HEM9$uCb}R>wx;3}fO~I}|LTv9cEQRv&YF{-s^Mlf zEm@y=4YN~SbhQC=)XDz3P*8L01c=4EerAh?;MyF*1q*84mR^<(6Zk2LnU!1tGNtnn z-PsoV6Rm(a>NIl+2}dKkIaWaNSXC%r<2E$BpSQzfFrw z`V@^DmuzC&xPj3H-rpQtJ=)Fo259#IB^rq6C0TV`L>9}Kp5!F19FrjV?VUD!$)*~t z0!=eQxadH6P^yjFVzKDj{kyUs2-1@*8>93Oe2++}X0r4O4GvGg7efgQro%4f5Rxn$ zC<)*Upgv0R_0KVIC>S6abYi_O%PTg+smfrORvIoPu|Kv-a>{U(zexRBav?^MaoH-_`PaB;I?L z*C6@0a*6wP`SuCgTxydw^1j|ZzSx(#paVLmx|8x1YO0uXX19s<$TCx1EZ#S?SyHqw zz928rDySTnmxrD%asYh1eoP;{u@9yo>T tZd%5#smbEv&35TR%M+z2R(_MulySf9+)kAbJZaBVo~kRrpS*te{{Y!#kS_oL literal 0 HcmV?d00001 diff --git a/wiki/images/yandex-music-extension.png b/wiki/images/yandex-music-extension.png new file mode 100644 index 0000000000000000000000000000000000000000..de67842251326f841fbc7f0d5df85545403bcbe5 GIT binary patch literal 26800 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

HBJwOVI9A*3K9VQ{dcL^X55)38)a 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 literal 0 HcmV?d00001 diff --git a/wiki/images/yandex-music-uid.png b/wiki/images/yandex-music-uid.png new file mode 100644 index 0000000000000000000000000000000000000000..4b89766515d6f5a9f43998e8ca9f89d980d78a6c GIT binary patch literal 2911 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 DU=XDi literal 0 HcmV?d00001 From 13216810795ea4e4edfccdd3daf96bcd5c09e609 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Sat, 6 Jul 2024 10:42:30 +0300 Subject: [PATCH 08/13] Relative paths to .md file don't work, so changed it to absolute paths. Fixed note, caution, warning blocks. --- wiki/API-Configure.md | 10 +++++----- wiki/Setup.md | 15 +++++++-------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/wiki/API-Configure.md b/wiki/API-Configure.md index db8aad4..b30f8ab 100644 --- a/wiki/API-Configure.md +++ b/wiki/API-Configure.md @@ -1,4 +1,4 @@ -[!Caution] +[!CAUTION] Don't share this API data with anyone because you can get compromised. If this happens, reset the tokens and get them again. @@ -21,12 +21,12 @@ You can edit your application's name, description, and avatar here. Once you've ![discord-dev-enable-intents](./images/discord-dev-enable-intents.png) -## 🍪 YouTube Cookie (optional) +## YouTube Cookie (optional) Preferable to provide cookies for YouTube. This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). I highly recommend that you create a new Google account from which you can get the cookie. -[!Warning] +[!WARNING] Time to time, cookies are resets by YouTube, so you need to retrieve it again. It's so annoying, but hasn't figured out a way to automate the cookie retrieval process. If you know workaround, please create the [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose) @@ -40,7 +40,7 @@ If you know workaround, please create the [issue](https://github.com/AlexInCube/ ## Yandex Music (optional) If you do not provide token and UID, Yandex Music will not work at all. -[!Warning] +[!WARNING] If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. ### Token @@ -57,7 +57,7 @@ This must look like this ![yandex-extension](./images/yandex-music-extension.png ## Spotify (optional) Spotify Module can work without provided data, but for more stability better provide custom application data. -[!Warning] +[!WARNING] If you want to fetch playlist with more than 100 songs, this API data is required! 1. Login in [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) diff --git a/wiki/Setup.md b/wiki/Setup.md index 7dc7906..43af980 100644 --- a/wiki/Setup.md +++ b/wiki/Setup.md @@ -1,4 +1,3 @@ -# How to setup bot? ## ⚙️ Configure .env You can use Docker Compose or install all dependencies and source code locally. But in both cases, you need to configure .env file. @@ -7,10 +6,10 @@ Also you need retrieve token, client id and enable intents on Discord Developer - Create file .env.production - Fill all fields in .env.production. If the field is marked as (Optional), you can skip it. -- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](API-Configure.md#discord-developer-portal-required) section. -- (Optional) To get Spotify Secret and ID, follow the [Spotify](API-Configure.md#spotify-optional) section. -- (Optional) To get Yandex Music token, follow the [Yandex Music](API-Configure.md#yandex-music-optional) section. -- (Optional) To get SoundCloud token, follow the [Soundcloud](API-Configure.md#soundcloud-optional) section. +- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#discord-developer-portal-required) section. +- (Optional) To get Spotify Secret and ID, follow the [Spotify](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#spotify-optional) section. +- (Optional) To get Yandex Music token, follow the [Yandex Music](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#yandex-music-optional) section. +- (Optional) To get SoundCloud token, follow the [Soundcloud](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#soundcloud-optional) section. | Name | Example | Description | Required? | |------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| @@ -30,13 +29,13 @@ Also you need retrieve token, client id and enable intents on Discord Developer | `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | ## 🐋 Run in Docker (recommended) -[!Note] +[!NOTE] Using Docker provides the auto-update feature - Install [Docker](https://www.docker.com/get-started/) - Copy docker-compose.yml, Dockerfile in empty folder - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with docker-compose.yml etc. -- (Optional) Follow the [YouTube Cookie](API-Configure.md#-youtube-cookie-optional) section and copy yt-cookies.json in the folder with docker-compose.yml etc. +- (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) section and copy yt-cookies.json in the folder with docker-compose.yml etc. - Your file structure must be like this ``` AICoTest/ @@ -53,7 +52,7 @@ AICoTest/ - Install FFMpeg. Follow this [guide](https://www.wikihow.com/Install-FFmpeg-on-Windows) - Clone repository to your computer - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with repository. -- (Optional) Follow the [YouTube Cookie](API-Configure.md#-youtube-cookie-optional) and copy yt-cookies.json in the folder with repository. +- (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) and copy yt-cookies.json in the folder with repository. - Install Node.js packages in the folder with repository ```npm npm install From 48612b0f5f330eb3cfa9cbae1e97c3395e1e6c62 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Sat, 6 Jul 2024 10:44:52 +0300 Subject: [PATCH 09/13] Fixed note, caution, warning blocks again. --- wiki/API-Configure.md | 22 +++++++++++----------- wiki/Setup.md | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/wiki/API-Configure.md b/wiki/API-Configure.md index b30f8ab..001d281 100644 --- a/wiki/API-Configure.md +++ b/wiki/API-Configure.md @@ -1,6 +1,6 @@ -[!CAUTION] -Don't share this API data with anyone because you can get compromised. -If this happens, reset the tokens and get them again. +> [!CAUTION] +> Don't share this API data with anyone because you can get compromised. +> If this happens, reset the tokens and get them again. ## Discord Developer Portal (required) @@ -26,10 +26,10 @@ Preferable to provide cookies for YouTube. This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). I highly recommend that you create a new Google account from which you can get the cookie. -[!WARNING] -Time to time, cookies are resets by YouTube, so you need to retrieve it again. -It's so annoying, but hasn't figured out a way to automate the cookie retrieval process. -If you know workaround, please create the [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose) +> [!WARNING] +> Time to time, cookies are resets by YouTube, so you need to retrieve it again. +> It's so annoying, but hasn't figured out a way to automate the cookie retrieval process. +> If you know workaround, please create the [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose) 1. Install an extension for extracting cookie, [EditThisCookie](https://www.editthiscookie.com/blog/2014/03/install-editthiscookie/) 2. Go to [YouTube](https://www.youtube.com/) @@ -40,8 +40,8 @@ If you know workaround, please create the [issue](https://github.com/AlexInCube/ ## Yandex Music (optional) If you do not provide token and UID, Yandex Music will not work at all. -[!WARNING] -If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. +> [!WARNING] +> If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. ### Token 1. Login into [Yandex](https://passport.yandex.ru/auth) account. @@ -57,8 +57,8 @@ This must look like this ![yandex-extension](./images/yandex-music-extension.png ## Spotify (optional) Spotify Module can work without provided data, but for more stability better provide custom application data. -[!WARNING] -If you want to fetch playlist with more than 100 songs, this API data is required! +> [!WARNING] +> If you want to fetch playlist with more than 100 songs, this API data is required! 1. Login in [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) 2. Press "Create app" button![Spotify Dev Main](images/spotify-dev-main.png) diff --git a/wiki/Setup.md b/wiki/Setup.md index 43af980..9937cea 100644 --- a/wiki/Setup.md +++ b/wiki/Setup.md @@ -29,8 +29,8 @@ Also you need retrieve token, client id and enable intents on Discord Developer | `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | ## 🐋 Run in Docker (recommended) -[!NOTE] -Using Docker provides the auto-update feature +> [!NOTE] +> Using Docker provides the auto-update feature - Install [Docker](https://www.docker.com/get-started/) - Copy docker-compose.yml, Dockerfile in empty folder From 64f77acca53f794a15a858d6ee0086cd54291b12 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Sat, 6 Jul 2024 14:06:45 +0300 Subject: [PATCH 10/13] 3.0.0-dev-6 Reworked /report command, now it gives a link to issues or discussions. Removed modal handling. Command //setPrefix now accepts prefix with length of two characters. Added wiki page for Commands. Command audiodebug available only for overpowered user. --- README.md | 2 +- package.json | 2 +- src/commands/admin/setPrefix.command.ts | 4 +- src/commands/audio/audiodebug.command.ts | 3 + src/commands/info/report.command.ts | 38 ++---- src/events/interactionCreate.event.ts | 2 - .../interactionHandlers/modalsHandler.ts | 23 ---- src/locales/en/commands.json | 10 +- src/locales/ru/commands.json | 10 +- src/utilities/isOverpoweredUser.ts | 5 + wiki/API-Configure.md | 26 ++-- wiki/Commands.md | 129 ++++++++++++++++++ wiki/Setup.md | 57 ++++---- .../discord-dev-enable-intents.png | Bin .../discord-dev-selected-app.png | Bin .../spotify-dev-create-app.png | Bin .../{ => api-configure}/spotify-dev-main.png | Bin .../yandex-music-extension.png | Bin .../{ => api-configure}/yandex-music-uid.png | Bin wiki/images/commands/play-audioplayer.png | Bin 0 -> 21398 bytes wiki/images/commands/play-autocomplete.png | Bin 0 -> 58840 bytes wiki/images/commands/play-file.png | Bin 0 -> 10820 bytes wiki/images/commands/playing.png | Bin 0 -> 5157 bytes 23 files changed, 204 insertions(+), 107 deletions(-) delete mode 100644 src/events/interactionHandlers/modalsHandler.ts create mode 100644 src/utilities/isOverpoweredUser.ts rename wiki/images/{ => api-configure}/discord-dev-enable-intents.png (100%) rename wiki/images/{ => api-configure}/discord-dev-selected-app.png (100%) rename wiki/images/{ => api-configure}/spotify-dev-create-app.png (100%) rename wiki/images/{ => api-configure}/spotify-dev-main.png (100%) rename wiki/images/{ => api-configure}/yandex-music-extension.png (100%) rename wiki/images/{ => api-configure}/yandex-music-uid.png (100%) create mode 100644 wiki/images/commands/play-audioplayer.png create mode 100644 wiki/images/commands/play-autocomplete.png create mode 100644 wiki/images/commands/play-file.png create mode 100644 wiki/images/commands/playing.png diff --git a/README.md b/README.md index 743108e..fd7255b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Cool audiobot for Discord created by @Ale ## 🌟 Features - Command /alcotest which shows your alcohol count in blood -- Audioplayer based on [Distube](https://github.com/skick1234/DisTube) with buttons ![image](https://i.imgur.com/zqQ6ViY.png) +- Audioplayer based on [Distube](https://github.com/skick1234/DisTube) with buttons ![play-audioplayer](/wiki/images/commands/play-audioplayer.png) - Support YouTube, Spotify, Soundcloud, any HTTP-stream and Discord Attachments (/playfile support MP3/WAV/OGG) - Support Slash and Text commands (with customizable prefix per server using /setprefix) - Localization (English and Russian are currently supported) diff --git a/package.json b/package.json index dd0523d..dda26b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-5", + "version": "3.0.0-dev-6", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/commands/admin/setPrefix.command.ts b/src/commands/admin/setPrefix.command.ts index 3016f1f..4578798 100644 --- a/src/commands/admin/setPrefix.command.ts +++ b/src/commands/admin/setPrefix.command.ts @@ -9,7 +9,7 @@ export default function (): ICommand { text_data: { name: 'setprefix', description: i18next.t('commands:set_prefix_desc'), - arguments: [new CommandArgument('символ', true)], + arguments: [new CommandArgument('newprefix', true)], execute: async (message: Message, args: string[]): Promise => { const prefix: string = args[0]; if (!prefix) return; @@ -50,7 +50,7 @@ export default function (): ICommand { async function changePrefixTo(guild: Guild, prefix: string): Promise { if (prefix === '/' || prefix === '@' || prefix === '#') return i18next.t('commands:set_prefix_restrict_prefixes', { prefixes: '/ @ #' }) as string; - if (prefix.length > 1) return i18next.t('commands:set_prefix_length_error') as string; + if (prefix.length > 2) return i18next.t('commands:set_prefix_length_error') as string; await setGuildOption(guild, 'prefix', prefix); return i18next.t('commands:set_prefix_success_change', { prefix: prefix }) as string; } diff --git a/src/commands/audio/audiodebug.command.ts b/src/commands/audio/audiodebug.command.ts index 178938a..fcaa8be 100644 --- a/src/commands/audio/audiodebug.command.ts +++ b/src/commands/audio/audiodebug.command.ts @@ -1,6 +1,7 @@ import { ICommand } from '../../CommandTypes.js'; import { PermissionsBitField } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; +import { isOverpoweredUser } from '../../utilities/isOverpoweredUser.js'; export default function (): ICommand { return { @@ -8,6 +9,8 @@ export default function (): ICommand { name: 'audiodebug', description: 'Debug info about audioplayers', execute: async (message) => { + if (!isOverpoweredUser(message.author.id)) return; + await message.reply({ content: message.client.audioPlayer.playersManager.debug(), allowedMentions: { users: [] } diff --git a/src/commands/info/report.command.ts b/src/commands/info/report.command.ts index 858e725..ee33878 100644 --- a/src/commands/info/report.command.ts +++ b/src/commands/info/report.command.ts @@ -1,17 +1,13 @@ import { ICommand } from '../../CommandTypes.js'; import { - ActionRowBuilder, ChatInputCommandInteraction, Message, - ModalActionRowComponentBuilder, - ModalBuilder, PermissionsBitField, - SlashCommandBuilder, - TextInputBuilder, - TextInputStyle + SlashCommandBuilder } from 'discord.js'; import { GroupInfo } from './InfoTypes.js'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -19,7 +15,7 @@ export default function (): ICommand { name: 'report', description: i18next.t('commands:report_desc'), execute: async (message: Message) => { - await message.reply(i18next.t('commands:report_text_error') as string); + await message.reply({ embeds: [generateReportEmbed()] }); } }, slash_data: { @@ -27,7 +23,7 @@ export default function (): ICommand { .setName('report') .setDescription(i18next.t('commands:report_desc')), execute: async (interaction: ChatInputCommandInteraction) => { - await interaction.showModal(generateModalWindow()); + await interaction.reply({ embeds: [generateReportEmbed()], ephemeral: true }); } }, group: GroupInfo, @@ -35,24 +31,12 @@ export default function (): ICommand { }; } -function generateModalWindow() { - const modal = new ModalBuilder() - .setCustomId('reportModal') - .setTitle(i18next.t('commands:report_modal_title')); - - const reportInput = new TextInputBuilder() - .setCustomId('reportInput') - .setLabel(i18next.t('commands:report_modal_text_label')) - .setStyle(TextInputStyle.Paragraph) - .setMinLength(20) - .setPlaceholder(i18next.t('commands:report_modal_text_placeholder')) - .setRequired(true); - - const firstActionRow = new ActionRowBuilder().addComponents( - reportInput +function generateReportEmbed() { + return generateSimpleEmbed( + i18next.t('commands:report_message', { + issueLink: 'https://github.com/AlexInCube/AlCoTest/issues/new/choose', + discussionLink: 'https://github.com/AlexInCube/AlCoTest/discussions/new?category=q-a', + interpolation: { escapeValue: false } + }) ); - - modal.addComponents(firstActionRow); - - return modal; } diff --git a/src/events/interactionCreate.event.ts b/src/events/interactionCreate.event.ts index 87cccd3..bc73dcb 100644 --- a/src/events/interactionCreate.event.ts +++ b/src/events/interactionCreate.event.ts @@ -1,7 +1,6 @@ import { BotEvent } from '../Types.js'; import { slashCommandHandler } from './interactionHandlers/slashCommandHandler.js'; import { autocompleteHandler } from './interactionHandlers/autocompleteHandler.js'; -import { modalsHandler } from './interactionHandlers/modalsHandler.js'; import { Client, Events, Interaction } from 'discord.js'; const event: BotEvent = { @@ -9,7 +8,6 @@ const event: BotEvent = { execute: async (client: Client, interaction: Interaction) => { await slashCommandHandler(interaction); await autocompleteHandler(interaction); - await modalsHandler(interaction); } }; diff --git a/src/events/interactionHandlers/modalsHandler.ts b/src/events/interactionHandlers/modalsHandler.ts deleted file mode 100644 index cb4a041..0000000 --- a/src/events/interactionHandlers/modalsHandler.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { submitReport } from '../../handlers/MongoSchemas/SchemaReport.js'; -import { Interaction } from 'discord.js'; -import i18next from 'i18next'; -import { ENV } from '../../EnvironmentVariables.js'; - -export async function modalsHandler(interaction: Interaction) { - if (!interaction.isModalSubmit()) return; - if (interaction.customId === 'reportModal') { - await interaction.reply({ - content: i18next.t('commands:report_modal_feedback') as string, - ephemeral: true - }); - - const reportInput = interaction.fields.getTextInputValue('reportInput'); - const overpoweredHuman = interaction.client.users.cache.get(ENV.BOT_DISCORD_OVERPOWERED_ID); - if (overpoweredHuman) { - await overpoweredHuman.send( - `New report from ${interaction.user.username} with ID: ${interaction.user.id}\n\n${reportInput}` - ); - } - await submitReport(interaction.user.id, reportInput); - } -} diff --git a/src/locales/en/commands.json b/src/locales/en/commands.json index c24db88..763f7f0 100644 --- a/src/locales/en/commands.json +++ b/src/locales/en/commands.json @@ -2,7 +2,7 @@ "set_prefix_desc": "Change prefix for TEXT commands and only for current server", "set_prefix_arg_newprefix_desc": "Don't forget to inform the other server members about the changed prefix", "set_prefix_restrict_prefixes": "You can't specify characters {{prefixes}} as a prefix", - "set_prefix_length_error": "The prefix cannot be longer than one character", + "set_prefix_length_error": "The prefix cannot be longer than two characters", "set_prefix_success_change": "Prefix successful changed on this server to {{prefix}}", "help_desc": "Commands list", "help_arg_command": "command name", @@ -56,12 +56,8 @@ "stop_success": "turned off the audioplayer", "alcotest_desc": "Writes the percentage of beer in your blood", "alcotest_success": "You are consisting of beer on the", - "report_desc": "Opens a modal window for sending a message to the developer", - "report_text_error": "Unfortunately, this command only works if it is called with /. So write /report", - "report_modal_title": "Creating a wish/complaint", - "report_modal_text_label": "What functionality to add or what to fix", - "report_modal_text_placeholder": "Describe clearly and precisely", - "report_modal_feedback": "Maybe I'll listen to you.", + "report_desc": "Return links to Github Issues or GitHub Discussions", + "report_message": "Create [Issue]({{issueLink}}) or [Discussion]({{discussionLink}})", "status_desc": "View bot status", "status_embed_title": "Bot status", "status_embed_bot_version": "Bot version", diff --git a/src/locales/ru/commands.json b/src/locales/ru/commands.json index b04bb00..7e64d87 100644 --- a/src/locales/ru/commands.json +++ b/src/locales/ru/commands.json @@ -2,7 +2,7 @@ "set_prefix_desc": "Меняет префикс для ТЕКСТОВЫХ команд и только для текущего сервера", "set_prefix_arg_newprefix_desc": "Не забудьте сообщить остальным участникам сервера об изменённом префиксе", "set_prefix_restrict_prefixes": "Нельзя указывать символы {{prefixes}} в качестве префикса", - "set_prefix_length_error": "Префикс не может быть длиннее одного символа", + "set_prefix_length_error": "Префикс не может быть длиннее двух символов", "set_prefix_success_change": "Префикс на этом сервере успешно изменён на {{prefix}}", "help_desc": "Список команд", "help_arg_command": "название команды", @@ -56,12 +56,8 @@ "stop_success": "выключил(-а) плеер", "alcotest_desc": "Пишет процент пива в твоей крови", "alcotest_success": "Вы состоите из пива на", - "report_desc": "Открывает окно для отправки сообщения разработчику", - "report_text_error": "К сожалению эта команда работает только если она вызвана через /. Так что напишите /report", - "report_modal_title": "Создание пожелания/жалобы", - "report_modal_text_label": "Какой функционал добавить или что исправить", - "report_modal_text_placeholder": "Описывайте ясно и чётко", - "report_modal_feedback": "Возможно я к тебе прислушаюсь", + "report_desc": "Возвращает ссылки на Github Issues или Github Discussions", + "report_message": "Создайте [Issue]({{issueLink}}) или [Discussion]({{discussionLink}})", "status_desc": "Просмотр состояния бота", "status_embed_title": "Состояние бота", "status_embed_bot_version": "Версия бота", diff --git a/src/utilities/isOverpoweredUser.ts b/src/utilities/isOverpoweredUser.ts new file mode 100644 index 0000000..72f35ee --- /dev/null +++ b/src/utilities/isOverpoweredUser.ts @@ -0,0 +1,5 @@ +import { ENV } from '../EnvironmentVariables.js'; + +export function isOverpoweredUser(userId: string): boolean { + return userId === ENV.BOT_DISCORD_OVERPOWERED_ID; +} diff --git a/wiki/API-Configure.md b/wiki/API-Configure.md index 001d281..4c13f4c 100644 --- a/wiki/API-Configure.md +++ b/wiki/API-Configure.md @@ -2,7 +2,7 @@ > Don't share this API data with anyone because you can get compromised. > If this happens, reset the tokens and get them again. -## Discord Developer Portal (required) +# Discord Developer Portal (required) 1. Open the [Discord Developer Portal](https://discord.com/developers/applications) and log into your account. 2. Click on the "New Application" button. @@ -10,7 +10,7 @@ You should see a page like this: -![discord-dev-selected-app](./images/discord-dev-selected-app.png) +![discord-dev-selected-app](images/api-configure/discord-dev-selected-app.png) You can edit your application's name, description, and avatar here. Once you've done that, then congratulations—you're now the proud owner of a shiny new Discord bot! You're not entirely done, though. @@ -19,9 +19,9 @@ You can edit your application's name, description, and avatar here. Once you've 6. Press "Reset token" button and copy token. 7. Also enable all "Privileged Gateway Intents" -![discord-dev-enable-intents](./images/discord-dev-enable-intents.png) +![discord-dev-enable-intents](images/api-configure/discord-dev-enable-intents.png) -## YouTube Cookie (optional) +# YouTube Cookie (optional) Preferable to provide cookies for YouTube. This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). I highly recommend that you create a new Google account from which you can get the cookie. @@ -37,38 +37,38 @@ I highly recommend that you create a new Google account from which you can get t 4. Click on the extension icon and click "Export" button. 5. Create file yt-cookies.json and paste cookie in this file -## Yandex Music (optional) +# Yandex Music (optional) If you do not provide token and UID, Yandex Music will not work at all. > [!WARNING] > If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. -### Token +## Token 1. Login into [Yandex](https://passport.yandex.ru/auth) account. 2. Download [browser extension](https://chromewebstore.google.com/detail/yandex-music-token/lcbjeookjibfhjjopieifgjnhlegmkib) -This must look like this ![yandex-extension](./images/yandex-music-extension.png) +This must look like this ![yandex-extension](images/api-configure/yandex-music-extension.png) 3. Click "Скопировать токен" button. -### UID +## UID 1. Login into [Yandex](https://passport.yandex.ru/auth) account. 2. You can retrieve uid by opening [Yandex Mail](https://mail.yandex.ru) and copy uid from the url in the address bar. -![yandex-uid](./images/yandex-music-uid.png) +![yandex-uid](images/api-configure/yandex-music-uid.png) -## Spotify (optional) +# Spotify (optional) Spotify Module can work without provided data, but for more stability better provide custom application data. > [!WARNING] > If you want to fetch playlist with more than 100 songs, this API data is required! 1. Login in [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) -2. Press "Create app" button![Spotify Dev Main](images/spotify-dev-main.png) -3. Fill the fields like this![Spotify Dev Create App](./images/spotify-dev-create-app.png) +2. Press "Create app" button![Spotify Dev Main](images/api-configure/spotify-dev-main.png) +3. Fill the fields like this![Spotify Dev Create App](images/api-configure/spotify-dev-create-app.png) 4. Press "Save" 5. On the redirected page, press "Settings" 6. On "Basic Information" section copy Client ID. 7. Under the Client ID field, press "View Client Secret" and copy Client Secret. -## Soundcloud (optional) +# Soundcloud (optional) 1. Go to [SoundCloud](https://soundcloud.com) and login. 2. Open up the dev tools (Right-click -> inspect) and go to the Network tab. diff --git a/wiki/Commands.md b/wiki/Commands.md index e69de29..574ddd8 100644 --- a/wiki/Commands.md +++ b/wiki/Commands.md @@ -0,0 +1,129 @@ +# About command system +Bot supports slash and text command systems. + +## Slash commands +Nothing special, start writing / and select command from the list + +## Text commands +If a bot owner does not change the default prefix in .env.production file, the prefix is // + +> [!NOTE] +> If bot prefix conflicting with another bot on server, +> administrator can set the second text prefix for server using [/setPrefix](#setprefix) command + +# Commands list +## Admin +It Can be used only by server administrators (people who have a role with "Administrator" permission) + +### setPrefix +Changes bot prefix for the server + +Example: /newPrefix $$ + +Prefix symbols cannot be symbols: / @ #, because these symbols reserved for Discord purpose. +Prefix length cannot be longer than two symbols. + +## Audio + +The bot philosophy built around audioplayer to reduce commands using. + +Use [/play](#play) or [/playfile](#playfile) to spawn audioplayer +![play-audioplayer](images/commands/play-audioplayer.png) + +Most of the time of using bot, you need only add songs by [/play](#play) or [/playfile](#playfile) + +When any message created in chat where audioplayer is spawned, +bot will recreate the player so that the player is always at the bottom of the chat room. + +> [!NOTE] +> Highly recommended to create a text channel for the bot + +> [!WARNING] +> Audio commands which change audioplayer state require audioplayer and be with bot in the same voice channel to exist. +> Also this kind of commands needs to be written in the same channel where audioplayer was spawned. + +### play + +Example: /play https://open.spotify.com/track/46gSk82duJtX3TTA182ruG?si=c668ab77755f4d88 + +Spawn audioplayer in a text channel if not exists. +Accept songs/playlist from links. +Support searching on YouTube +when you write something like this ![play-autocomplete](images/commands/play-autocomplete.png) + +### playfile + +Do the same things as play command, but accept MP3/WAV/OGG files instead of text/links + +![play-file](images/commands/play-file.png) + +### playing + +Return the current playback time of the song +![playing](images/commands/playing.png) + +### download + +Accept links you songs and return mp3 file in a text channel where the command is called. + +Example: /download https://www.youtube.com/watch?v=60ItHLz5WEA + +### jump + +If your queue has a large count of songs, you can jump to the desired song. +To get the number of songs you want, press the button in audioplayer to get a queue songs list. + +Example: /jump 4 + +### previous + +Returns to previous played/skipped song in queue + +### rewind + +Allow you to change the current playback time. +Accept time in HH:MM:SS or MM:SS or SS format. + +Example: 1:02:32 + +### shuffle + +Shuffle the next songs in the queue + +### skip + +Skip current playing song + +### stop + +Kill the audioplayer + +### audiodebug + +Give the current count of spawned audioplayers + +> [!NOTE] +> This command supported only by text command system +> Also you must be overpowered user. + +## Fun + +### alcotest +Generate random number for 0 to 100 + +## Info + +### help +Return the command list or certain command description + +Command list example: /help +Certain command example: /help play + +### inviteLink +Return the link for inviting the bot. Give the link to the administrator on another server. + +### status +Return bot status data, about: OS, Ram Usage, Cpu Model, Cpu Usage, AICoTest Version, Servers Count. + +### report +Return links to GitHub Issues or GitHub Discussions. diff --git a/wiki/Setup.md b/wiki/Setup.md index 9937cea..351960c 100644 --- a/wiki/Setup.md +++ b/wiki/Setup.md @@ -1,34 +1,36 @@ -## ⚙️ Configure .env +# ⚙️ Configure .env + You can use Docker Compose or install all dependencies and source code locally. -But in both cases, you need to configure .env file. +But in both cases, you need to configure .env file. Also you need retrieve token, client id and enable intents on Discord Developer Portal. - Create file .env.production - Fill all fields in .env.production. If the field is marked as (Optional), you can skip it. -- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#discord-developer-portal-required) section. +- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#discord-developer-portal-required) section. - (Optional) To get Spotify Secret and ID, follow the [Spotify](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#spotify-optional) section. - (Optional) To get Yandex Music token, follow the [Yandex Music](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#yandex-music-optional) section. - (Optional) To get SoundCloud token, follow the [Soundcloud](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#soundcloud-optional) section. -| Name | Example | Description | Required? | -|------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| -| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | -| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | -| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | -| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | -| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | -| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Application ID from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | This need to retrieve reports in direct message | ✔️ | -| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | -| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | -| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | -| `BOT_YANDEXMUSIC_UID` | | Provide to enable Yandex Music module | ❌ | -| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | -| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | - -## 🐋 Run in Docker (recommended) +| Name | Example | Description | Required? | +|------------------------------|-----------------------|---------------------------------------------------------------------------|-----------| +| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | +| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | +| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | +| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | +| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | +| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Application ID from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | Discord bot owner user ID, required for having more bot control for owner | ✔️ | +| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | +| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | +| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | +| `BOT_YANDEXMUSIC_UID` | | Provide to enable Yandex Music module | ❌ | +| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | +| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | + +# 🐋 Run in Docker (recommended) + > [!NOTE] > Using Docker provides the auto-update feature @@ -37,15 +39,18 @@ Also you need retrieve token, client id and enable intents on Discord Developer - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with docker-compose.yml etc. - (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) section and copy yt-cookies.json in the folder with docker-compose.yml etc. - Your file structure must be like this + ``` AICoTest/ ├─ .env.production ├─ docker-compose.yml ├─ yt-cookies.yml ``` -- Run command ```docker-compose up --detach --force-recreate``` from folder with files -## 🖥️ Run locally (if you are not a developer, this way is no sense) +- Run command `docker-compose up --detach --force-recreate` from folder with files + +# 🖥️ Run locally (if you are not a developer, this way is no sense) + - Install [Node.js 22](https://nodejs.org/en/download/prebuilt-installer) or higher - Install [Python 3.12](https://www.python.org/downloads/) - Install C++ compiler. Follow this [guide](https://github.com/nodejs/node-gyp#on-windows) @@ -54,15 +59,19 @@ AICoTest/ - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with repository. - (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) and copy yt-cookies.json in the folder with repository. - Install Node.js packages in the folder with repository + ```npm npm install ``` + - Compile bot + ``` npm run build ``` + - Run the bot + ``` npm run production ``` - diff --git a/wiki/images/discord-dev-enable-intents.png b/wiki/images/api-configure/discord-dev-enable-intents.png similarity index 100% rename from wiki/images/discord-dev-enable-intents.png rename to wiki/images/api-configure/discord-dev-enable-intents.png diff --git a/wiki/images/discord-dev-selected-app.png b/wiki/images/api-configure/discord-dev-selected-app.png similarity index 100% rename from wiki/images/discord-dev-selected-app.png rename to wiki/images/api-configure/discord-dev-selected-app.png diff --git a/wiki/images/spotify-dev-create-app.png b/wiki/images/api-configure/spotify-dev-create-app.png similarity index 100% rename from wiki/images/spotify-dev-create-app.png rename to wiki/images/api-configure/spotify-dev-create-app.png diff --git a/wiki/images/spotify-dev-main.png b/wiki/images/api-configure/spotify-dev-main.png similarity index 100% rename from wiki/images/spotify-dev-main.png rename to wiki/images/api-configure/spotify-dev-main.png diff --git a/wiki/images/yandex-music-extension.png b/wiki/images/api-configure/yandex-music-extension.png similarity index 100% rename from wiki/images/yandex-music-extension.png rename to wiki/images/api-configure/yandex-music-extension.png diff --git a/wiki/images/yandex-music-uid.png b/wiki/images/api-configure/yandex-music-uid.png similarity index 100% rename from wiki/images/yandex-music-uid.png rename to wiki/images/api-configure/yandex-music-uid.png diff --git a/wiki/images/commands/play-audioplayer.png b/wiki/images/commands/play-audioplayer.png new file mode 100644 index 0000000000000000000000000000000000000000..ad93649f1fa6c109b40fc3f0a4025a5c2046f888 GIT binary patch literal 21398 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 literal 0 HcmV?d00001 diff --git a/wiki/images/commands/play-file.png b/wiki/images/commands/play-file.png new file mode 100644 index 0000000000000000000000000000000000000000..aff33964faccac6c19bf158ffa1e57962bd7c98c GIT binary patch literal 10820 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 literal 0 HcmV?d00001 diff --git a/wiki/images/commands/playing.png b/wiki/images/commands/playing.png new file mode 100644 index 0000000000000000000000000000000000000000..ffebf5cce48c58509c8864d86f0a9b07e94c692e GIT binary patch literal 5157 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 Date: Sat, 6 Jul 2024 14:12:33 +0300 Subject: [PATCH 11/13] 3.0.0 Fix image placements in commands wiki. Fixed wrong branches in wiki action. --- .github/workflows/wiki.yaml | 2 +- package.json | 2 +- wiki/Commands.md | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/wiki.yaml b/.github/workflows/wiki.yaml index 5728478..54d2d7f 100644 --- a/.github/workflows/wiki.yaml +++ b/.github/workflows/wiki.yaml @@ -1,7 +1,7 @@ name: Wiki on: push: - branches: [main, 3.0-dev] + branches: ['master'] paths: - wiki/** - .github/workflows/wiki.yml diff --git a/package.json b/package.json index dda26b6..454b16f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-6", + "version": "3.0.0", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/wiki/Commands.md b/wiki/Commands.md index 574ddd8..cd1769b 100644 --- a/wiki/Commands.md +++ b/wiki/Commands.md @@ -28,6 +28,7 @@ Prefix length cannot be longer than two symbols. The bot philosophy built around audioplayer to reduce commands using. Use [/play](#play) or [/playfile](#playfile) to spawn audioplayer + ![play-audioplayer](images/commands/play-audioplayer.png) Most of the time of using bot, you need only add songs by [/play](#play) or [/playfile](#playfile) @@ -60,6 +61,7 @@ Do the same things as play command, but accept MP3/WAV/OGG files instead of text ### playing Return the current playback time of the song + ![playing](images/commands/playing.png) ### download From dd321d6d6b8e2843b8c5b49bea6923d0fa8c3f93 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Sat, 6 Jul 2024 14:21:45 +0300 Subject: [PATCH 12/13] Added pnpm-lock.yaml --- pnpm-lock.yaml | 3024 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3024 insertions(+) create mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..76d6c60 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3024 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@discordjs/rest': + specifier: ^1.7.1 + version: 1.7.1 + '@discordjs/voice': + specifier: ^0.16.1 + version: 0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1) + '@distube/direct-link': + specifier: ^1.0.1 + version: 1.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/file': + specifier: ^1.0.1 + version: 1.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/soundcloud': + specifier: ^2.0.1 + version: 2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/spotify': + specifier: ^2.0.2 + version: 2.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/youtube': + specifier: ^1.0.2 + version: 1.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/yt-dlp': + specifier: ^2.0.1 + version: 2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + '@distube/ytdl-core': + specifier: ^4.13.4 + version: 4.13.4 + '@distube/ytsr': + specifier: ^2.0.4 + version: 2.0.4 + '@types/selenium-webdriver': + specifier: ^4.1.24 + version: 4.1.24 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + discord.js: + specifier: ^14.15.3 + version: 14.15.3 + distube: + specifier: ^5.0.2 + version: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + distube-apple-music: + specifier: ^0.1.0 + version: 0.1.0(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + distube-yandex-music-plugin: + specifier: ^1.0.4 + version: 1.0.4(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + i18next: + specifier: ^22.5.1 + version: 22.5.1 + i18next-fs-backend: + specifier: ^2.3.1 + version: 2.3.1 + mongoose: + specifier: ^7.7.0 + version: 7.7.0 + node-os-utils: + specifier: ^1.3.7 + version: 1.3.7 + opusscript: + specifier: ^0.1.1 + version: 0.1.1 + prism-media: + specifier: ^1.3.5 + version: 1.3.5(@discordjs/opus@0.9.0)(opusscript@0.1.1) + selenium-webdriver: + specifier: ^4.22.0 + version: 4.22.0 + sodium-native: + specifier: ^4.1.1 + version: 4.1.1 + uuid: + specifier: ^9.0.1 + version: 9.0.1 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@types/node': + specifier: ^20.14.9 + version: 20.14.9 + '@types/node-os-utils': + specifier: ^1.3.4 + version: 1.3.4 + '@types/uuid': + specifier: ^9.0.8 + version: 9.0.8 + '@typescript-eslint/eslint-plugin': + specifier: ^5.62.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.0)(typescript@5.5.3) + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) + prettier: + specifier: ^3.3.2 + version: 3.3.2 + typescript: + specifier: ^5.5.3 + version: 5.5.3 + +packages: + + '@babel/runtime@7.24.7': + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} + engines: {node: '>=6.9.0'} + + '@discordjs/builders@1.8.2': + resolution: {integrity: sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@1.5.3': + resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==} + engines: {node: '>=16.11.0'} + + '@discordjs/collection@2.1.0': + resolution: {integrity: sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==} + engines: {node: '>=18'} + + '@discordjs/formatters@0.4.0': + resolution: {integrity: sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==} + engines: {node: '>=16.11.0'} + + '@discordjs/node-pre-gyp@0.4.5': + resolution: {integrity: sha512-YJOVVZ545x24mHzANfYoy0BJX5PDyeZlpiJjDkUBM/V/Ao7TFX9lcUvCN4nr0tbr5ubeaXxtEBILUrHtTphVeQ==} + hasBin: true + + '@discordjs/opus@0.9.0': + resolution: {integrity: sha512-NEE76A96FtQ5YuoAVlOlB3ryMPrkXbUCTQICHGKb8ShtjXyubGicjRMouHtP1RpuDdm16cDa+oI3aAMo1zQRUQ==} + engines: {node: '>=12.0.0'} + + '@discordjs/rest@1.7.1': + resolution: {integrity: sha512-Ofa9UqT0U45G/eX86cURQnX7gzOJLG2oC28VhIk/G6IliYgQF7jFByBJEykPSHE4MxPhqCleYvmsrtfKh1nYmQ==} + engines: {node: '>=16.9.0'} + + '@discordjs/rest@2.3.0': + resolution: {integrity: sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==} + engines: {node: '>=16.11.0'} + + '@discordjs/util@0.3.1': + resolution: {integrity: sha512-HxXKYKg7vohx2/OupUN/4Sd02Ev3PBJ5q0gtjdcvXb0ErCva8jNHWfe/v5sU3UKjIB/uxOhc+TDOnhqffj9pRA==} + engines: {node: '>=16.9.0'} + + '@discordjs/util@1.1.0': + resolution: {integrity: sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==} + engines: {node: '>=16.11.0'} + + '@discordjs/voice@0.16.1': + resolution: {integrity: sha512-uiWiW0Ta6K473yf8zs13RfKuPqm/xU4m4dAidMkIdwqgy1CztbbZBtPLfDkVSKzpW7s6m072C+uQcs4LwF3FhA==} + engines: {node: '>=16.11.0'} + + '@discordjs/ws@1.1.1': + resolution: {integrity: sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==} + engines: {node: '>=16.11.0'} + + '@distube/direct-link@1.0.1': + resolution: {integrity: sha512-NbUzRj1mVOkpmcUrjQ1KjfYDQEeS8uRWGPcgunNmRGdI+BQ5BG+pcHK1r6wMVwzaIdQrpg3X6Sh/T7uG3bdImg==} + peerDependencies: + distube: '5' + + '@distube/file@1.0.1': + resolution: {integrity: sha512-XdWxh4zNI1hdNBf7tAnCL07Mytl63xxVhtF3M3jrh/aklqY9MXlI+bqogmuCa2j8bqTE3XJ/TBwgIhNoyy//JA==} + peerDependencies: + distube: '5' + + '@distube/soundcloud@2.0.1': + resolution: {integrity: sha512-sAjdyQ0N4LGyYem2Y2P3HSgX6CMHZUnIxVR11Q4JqfA1JNuHLyIp/yvoGG55wOiCkY48b2UpOo1fSxnzuc7FRw==} + deprecated: This version is deprecated, please upgrade to the latest version. + peerDependencies: + distube: '5' + + '@distube/spotify@2.0.2': + resolution: {integrity: sha512-rIncX05PhedMZuZyhgz7dt9y/nxir9KPmxUo6sBxfITQcztkXlG3r0EhKivp9+BRCQlEBO/GitRTHVwhRKtmLg==} + peerDependencies: + distube: '5' + + '@distube/youtube@1.0.2': + resolution: {integrity: sha512-vNOE7kGhg3pC87iqT3Q4eu+yTae8Nr3J1XDR67YMH9HAg1RsPjwM7TvfabZoGxIUiPl4ua/PG6s8Nfxf2U9cxQ==} + peerDependencies: + distube: '5' + + '@distube/yt-dlp@2.0.1': + resolution: {integrity: sha512-9c16lRU6jbyal38UUr5E36+2lp36s0DaJySOtFjuAPgaJkp2xvKvyd+s4rFZSqVQGJO5GOhBiH+HD115SKfKAw==} + peerDependencies: + distube: '5' + + '@distube/ytdl-core@4.13.4': + resolution: {integrity: sha512-AMuKFWN8MHq+gtlhMq2O4jMm7KNtFbXpFMxK6NgDsyMxZT+obH+wVCu/2sj+ZBn6HOnGofvrmb6kAx0P59+lFw==} + engines: {node: '>=16'} + + '@distube/ytpl@1.2.1': + resolution: {integrity: sha512-cp9nDYyGTZ2DNHURQXS76ptKWijLMspoxJEj03i++9tJf0LFGTWkskL3sLwcY4qQPLXjlH9FAXwwpjVttdXvZQ==} + engines: {node: '>=8'} + + '@distube/ytsr@2.0.4': + resolution: {integrity: sha512-OiSWgARQ9LTj+dXt3jmMFzUH4l86VVCD4dVC4hEHNXdqp+DyU4QEzc+W6YY6//kWkvzTaUxOo7JUY7lBzwIF0A==} + engines: {node: '>=14.0'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@mongodb-js/saslprep@1.1.7': + resolution: {integrity: sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@sapphire/async-queue@1.5.2': + resolution: {integrity: sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@sapphire/shapeshift@3.9.7': + resolution: {integrity: sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==} + engines: {node: '>=v16'} + + '@sapphire/snowflake@3.5.3': + resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node-os-utils@1.3.4': + resolution: {integrity: sha512-BCUYrbdoO4FUbx6MB9atLNFnkxdliFaxdiTJMIPPiecXIApc5zf4NIqV5G1jWv/ReZvtYyHLs40RkBjHX+vykA==} + + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + + '@types/selenium-webdriver@4.1.24': + resolution: {integrity: sha512-oR5MVATv+P2dmhceZJPDm99MmOC9yAK8YpIgJbHEFQ/MbSPC1lA6Ohw441WNUcQ6B1fMAOMu0u59fRKKj9AGGg==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/uuid@9.0.8': + resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==} + + '@types/webidl-conversions@7.0.3': + resolution: {integrity: sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==} + + '@types/whatwg-url@8.2.2': + resolution: {integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vladfrangu/async_event_emitter@2.4.0': + resolution: {integrity: sha512-eNb/9DMwNvhhgn1UuQ8Rl90jhj9PBkYH4oQ522TkiWUVWRfbh3PjdOTFkVGNKs5+xUXalkgFrUSwtY8u0g0S4g==} + engines: {node: '>=v14.0.0', npm: '>=7.0.0'} + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + bson@5.5.1: + resolution: {integrity: sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==} + engines: {node: '>=14.20.1'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + discord-api-types@0.37.61: + resolution: {integrity: sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==} + + discord-api-types@0.37.83: + resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} + + discord-api-types@0.37.91: + resolution: {integrity: sha512-yPGOP1SlkRtnT9Vor5noZHNm7t+EpRdaDvEoeqWTSCzeenMWyB1RbOGKYxdZ1OZijji51Yd1yodhOTi9CfrrQg==} + + discord.js@14.15.3: + resolution: {integrity: sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==} + engines: {node: '>=16.11.0'} + + distube-apple-music@0.1.0: + resolution: {integrity: sha512-f+YMXZ5+9RX7HTvtp0V51A987RwiniiCyDzwy0ZFVFgWQq0EPqziYEmZ5D1RSZ6c5s6+YCc9vIC8KPulezdhIw==} + peerDependencies: + distube: '5' + + distube-yandex-music-plugin@1.0.4: + resolution: {integrity: sha512-A3VnMHqyoKxsp/2S1ZSuYpSOQboY2H2kr4zwIY7OYoVBAy4ZDbzKC2IWB47F49n+bz6kgi4tnps5WI+8wg2DRg==} + peerDependencies: + distube: '5' + + distube@5.0.2: + resolution: {integrity: sha512-VR+js/RS+sbxQIGaewh1jZtQDeSE1x05V6CFDb7/KATXSln+nUemIh/RTqKPuPeFJhcPcYGdZWPvEliDU/RS/g==} + engines: {node: '>=18.17'} + peerDependencies: + '@discordjs/voice': '*' + discord.js: '14' + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.3: + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-type@18.7.0: + resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} + engines: {node: '>=14.16'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + formidable@1.2.6: + resolution: {integrity: sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==} + deprecated: 'Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau' + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + himalaya@1.1.0: + resolution: {integrity: sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==} + + http-cookie-agent@6.0.5: + resolution: {integrity: sha512-sfZ8fDgDP3B1YB+teqSnAK1aPgBu8reUUGxSsndP2XnYN6cM29EURXWXZqQQiaRdor3B4QjpkUNfv21syaO4DA==} + engines: {node: '>=18.0.0'} + peerDependencies: + tough-cookie: ^4.0.0 + undici: ^5.11.0 || ^6.0.0 + peerDependenciesMeta: + undici: + optional: true + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + i18next-fs-backend@2.3.1: + resolution: {integrity: sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg==} + + i18next@22.5.1: + resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {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. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-unfetch@4.0.2: + resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + + kareem@2.5.1: + resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} + engines: {node: '>=12.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + m3u8stream@0.8.6: + resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==} + engines: {node: '>=12'} + + magic-bytes.js@1.10.0: + resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + memory-pager@1.5.0: + resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + miniget@4.2.3: + resolution: {integrity: sha512-SjbDPDICJ1zT+ZvQwK0hUcRY4wxlhhNpHL9nJOB2MEAXRGagTljsO8MEDzQMTFf0Q8g4QNi8P9lEm/g7e+qgzA==} + engines: {node: '>=12'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mongodb-connection-string-url@2.6.0: + resolution: {integrity: sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==} + + mongodb@5.9.2: + resolution: {integrity: sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==} + engines: {node: '>=14.20.1'} + peerDependencies: + '@aws-sdk/credential-providers': ^3.188.0 + '@mongodb-js/zstd': ^1.0.0 + kerberos: ^1.0.0 || ^2.0.0 + mongodb-client-encryption: '>=2.3.0 <3' + snappy: ^7.2.2 + peerDependenciesMeta: + '@aws-sdk/credential-providers': + optional: true + '@mongodb-js/zstd': + optional: true + kerberos: + optional: true + mongodb-client-encryption: + optional: true + snappy: + optional: true + + mongoose@7.7.0: + resolution: {integrity: sha512-+HcoN/hmkB5IjAqWYA2ZAQeExGD8FNMe6L/eTYB04gqp9S2ZEngVivGkdtGrA4BYRf0suH+3rMNFW2JPOqC4Mg==} + engines: {node: '>=14.20.1'} + + mpath@0.9.0: + resolution: {integrity: sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==} + engines: {node: '>=4.0.0'} + + mquery@5.0.0: + resolution: {integrity: sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==} + engines: {node: '>=14.0.0'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true + + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + + node-os-utils@1.3.7: + resolution: {integrity: sha512-fvnX9tZbR7WfCG5BAy3yO/nCLyjVWD6MghEq0z5FDfN+ZXpLWNITBdbifxQkQ25ebr16G0N7eRWJisOcMEHG3Q==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + opusscript@0.1.1: + resolution: {integrity: sha512-mL0fZZOUnXdZ78woRXp18lApwpp0lF5tozJOD1Wut0dgrA9WuQTgSels/CSmFleaAZrJi/nci5KOVtbuxeWoQA==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + peek-readable@5.1.0: + resolution: {integrity: sha512-Tq2I+yoz6Xq3S09E2PyjzOy/oYuNg5v7wyjmrw7OQYSKc7QnDs63q4RXFXraMoI6LZyiEOJ/wDEYzGDPhWwNPA==} + engines: {node: '>=14.16'} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + + prism-media@1.3.5: + resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} + peerDependencies: + '@discordjs/opus': '>=0.8.0 <1.0.0' + ffmpeg-static: ^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0 + node-opus: ^0.3.3 + opusscript: ^0.0.8 + peerDependenciesMeta: + '@discordjs/opus': + optional: true + ffmpeg-static: + optional: true + node-opus: + optional: true + opusscript: + optional: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.12.2: + resolution: {integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + selenium-webdriver@4.22.0: + resolution: {integrity: sha512-GNbrkCHmy249ai885wgXqTfqL2lZnclUH/P8pwTDIqzyFxU3YhDiN7p/c9tMFA4NhgRdEBO2QCG+CWmG7xr/Mw==} + engines: {node: '>= 14.21.0'} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + sift@16.0.1: + resolution: {integrity: sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sodium-native@4.1.1: + resolution: {integrity: sha512-LXkAfRd4FHtkQS4X6g+nRcVaN7mWVNepV06phIsC6+IZFvGh1voW5TNQiQp2twVaMf05gZqQjuS+uWLM6gHhNQ==} + + soundcloud.ts@0.5.3: + resolution: {integrity: sha512-ZMH6gG5e7WqJrIYXTv14MNArPhx3WzfrL1Ij/2qBDW8mVbNJc8lxOQOc4kLvrfvDl5TkCdZa7zXOiwD6ESXq+g==} + + sparse-bitfield@3.0.3: + resolution: {integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==} + + spotify-uri@4.1.0: + resolution: {integrity: sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng==} + engines: {node: '>= 16'} + + spotify-url-info@3.2.15: + resolution: {integrity: sha512-NlolD2mqZjvt91hq0XVy3db55FCL2li1XBivkf/i+zUW1K9RP9nIOK5Bpg82DmBf96sjl4TYRI3zPOS94LPulQ==} + engines: {node: '>= 12'} + + spotify-web-api-node@5.0.2: + resolution: {integrity: sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strtok3@7.0.0: + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} + + superagent@6.1.0: + resolution: {integrity: sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==} + engines: {node: '>= 7.0.0'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tiny-typed-emitter@2.1.0: + resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} + + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + ts-mixer@6.0.4: + resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + undici@6.13.0: + resolution: {integrity: sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==} + engines: {node: '>=18.0'} + + undici@6.19.2: + resolution: {integrity: sha512-JfjKqIauur3Q6biAtHJ564e3bWa8VvT+7cSiOJHFbX4Erv6CLGDpg8z+Fmg/1OI/47RA+GI2QZaF48SSaLvyBA==} + engines: {node: '>=18.17'} + + unfetch@5.0.0: + resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml2js@0.6.2: + resolution: {integrity: sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==} + engines: {node: '>=4.0.0'} + + xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + ym-api-meowed@1.3.4: + resolution: {integrity: sha512-vHnfdGLgmOj8ST6fXmpKsK/YDO1JxdHJFcRuqrtEJeLFv727vtX2AVUjF46qNpjhVARD/GHqMDL3HE9ixjLdJg==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@3.23.8: + resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} + +snapshots: + + '@babel/runtime@7.24.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@discordjs/builders@1.8.2': + dependencies: + '@discordjs/formatters': 0.4.0 + '@discordjs/util': 1.1.0 + '@sapphire/shapeshift': 3.9.7 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + ts-mixer: 6.0.4 + tslib: 2.6.2 + + '@discordjs/collection@1.5.3': {} + + '@discordjs/collection@2.1.0': {} + + '@discordjs/formatters@0.4.0': + dependencies: + discord-api-types: 0.37.83 + + '@discordjs/node-pre-gyp@0.4.5': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.2 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@discordjs/opus@0.9.0': + dependencies: + '@discordjs/node-pre-gyp': 0.4.5 + node-addon-api: 5.1.0 + transitivePeerDependencies: + - encoding + - supports-color + optional: true + + '@discordjs/rest@1.7.1': + dependencies: + '@discordjs/collection': 1.5.3 + '@discordjs/util': 0.3.1 + '@sapphire/async-queue': 1.5.2 + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.37.91 + file-type: 18.7.0 + tslib: 2.6.3 + undici: 5.28.4 + + '@discordjs/rest@2.3.0': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@sapphire/snowflake': 3.5.3 + '@vladfrangu/async_event_emitter': 2.4.0 + discord-api-types: 0.37.83 + magic-bytes.js: 1.10.0 + tslib: 2.6.2 + undici: 6.13.0 + + '@discordjs/util@0.3.1': {} + + '@discordjs/util@1.1.0': {} + + '@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1)': + dependencies: + '@types/ws': 8.5.10 + discord-api-types: 0.37.61 + prism-media: 1.3.5(@discordjs/opus@0.9.0)(opusscript@0.1.1) + tslib: 2.6.3 + ws: 8.17.1 + transitivePeerDependencies: + - '@discordjs/opus' + - bufferutil + - ffmpeg-static + - node-opus + - opusscript + - utf-8-validate + + '@discordjs/ws@1.1.1': + dependencies: + '@discordjs/collection': 2.1.0 + '@discordjs/rest': 2.3.0 + '@discordjs/util': 1.1.0 + '@sapphire/async-queue': 1.5.2 + '@types/ws': 8.5.10 + '@vladfrangu/async_event_emitter': 2.4.0 + discord-api-types: 0.37.83 + tslib: 2.6.2 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@distube/direct-link@1.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + undici: 6.19.2 + + '@distube/file@1.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + + '@distube/soundcloud@2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + soundcloud.ts: 0.5.3 + + '@distube/spotify@2.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + spotify-uri: 4.1.0 + spotify-url-info: 3.2.15 + spotify-web-api-node: 5.0.2 + undici: 6.19.2 + transitivePeerDependencies: + - supports-color + + '@distube/youtube@1.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + '@distube/ytdl-core': 4.13.4 + '@distube/ytpl': 1.2.1 + '@distube/ytsr': 2.0.4 + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + transitivePeerDependencies: + - supports-color + + '@distube/yt-dlp@2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + dependencies: + dargs: 7.0.0 + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + undici: 6.19.2 + + '@distube/ytdl-core@4.13.4': + dependencies: + http-cookie-agent: 6.0.5(tough-cookie@4.1.4)(undici@6.19.2) + m3u8stream: 0.8.6 + miniget: 4.2.3 + sax: 1.4.1 + tough-cookie: 4.1.4 + undici: 6.19.2 + transitivePeerDependencies: + - supports-color + + '@distube/ytpl@1.2.1': + dependencies: + undici: 5.28.4 + + '@distube/ytsr@2.0.4': + dependencies: + undici: 6.19.2 + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fastify/busboy@2.1.1': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@mongodb-js/saslprep@1.1.7': + dependencies: + sparse-bitfield: 3.0.3 + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgr/core@0.1.1': {} + + '@sapphire/async-queue@1.5.2': {} + + '@sapphire/shapeshift@3.9.7': + dependencies: + fast-deep-equal: 3.1.3 + lodash: 4.17.21 + + '@sapphire/snowflake@3.5.3': {} + + '@tokenizer/token@0.3.0': {} + + '@types/json-schema@7.0.15': {} + + '@types/node-os-utils@1.3.4': {} + + '@types/node@20.14.9': + dependencies: + undici-types: 5.26.5 + + '@types/selenium-webdriver@4.1.24': + dependencies: + '@types/node': 20.14.9 + '@types/ws': 8.5.10 + + '@types/semver@7.5.8': {} + + '@types/uuid@9.0.8': {} + + '@types/webidl-conversions@7.0.3': {} + + '@types/whatwg-url@8.2.2': + dependencies: + '@types/node': 20.14.9 + '@types/webidl-conversions': 7.0.3 + + '@types/ws@8.5.10': + dependencies: + '@types/node': 20.14.9 + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) + debug: 4.3.5 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.2 + tsutils: 3.21.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.3) + debug: 4.3.5 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.2 + tsutils: 3.21.0(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.3) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vladfrangu/async_event_emitter@2.4.0': {} + + abbrev@1.1.1: + optional: true + + acorn-jsx@5.3.2(acorn@8.12.0): + dependencies: + acorn: 8.12.0 + + acorn@8.12.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + optional: true + + agent-base@7.1.1: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + aproba@2.0.0: + optional: true + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + asynckit@0.4.0: {} + + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + bson@5.5.1: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chownr@2.0.0: + optional: true + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-support@1.1.3: + optional: true + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + component-emitter@1.3.1: {} + + concat-map@0.0.1: {} + + console-control-strings@1.1.0: + optional: true + + cookiejar@2.1.4: {} + + core-util-is@1.0.3: {} + + cross-env@7.0.3: + dependencies: + cross-spawn: 7.0.3 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + + dargs@7.0.0: {} + + data-uri-to-buffer@4.0.1: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + delayed-stream@1.0.0: {} + + delegates@1.0.0: + optional: true + + detect-libc@2.0.3: + optional: true + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + discord-api-types@0.37.61: {} + + discord-api-types@0.37.83: {} + + discord-api-types@0.37.91: {} + + discord.js@14.15.3: + dependencies: + '@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.1 + '@sapphire/snowflake': 3.5.3 + discord-api-types: 0.37.83 + fast-deep-equal: 3.1.3 + lodash.snakecase: 4.1.1 + tslib: 2.6.2 + undici: 6.13.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + distube-apple-music@0.1.0(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)): + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + isomorphic-unfetch: 4.0.2 + node-html-parser: 6.1.13 + + distube-yandex-music-plugin@1.0.4(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)): + dependencies: + distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) + ym-api-meowed: 1.3.4 + transitivePeerDependencies: + - debug + + distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3): + dependencies: + '@discordjs/voice': 0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1) + discord.js: 14.15.3 + tiny-typed-emitter: 2.1.0 + undici: 6.19.2 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dotenv@16.4.5: {} + + emoji-regex@8.0.0: + optional: true + + entities@4.5.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): + dependencies: + eslint: 8.57.0 + prettier: 3.3.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-type@18.7.0: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + form-data@3.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + formidable@1.2.6: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + optional: true + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + gauge@3.0.2: + dependencies: + aproba: 2.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.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-unicode@2.0.1: + optional: true + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + himalaya@1.1.0: {} + + http-cookie-agent@6.0.5(tough-cookie@4.1.4)(undici@6.19.2): + dependencies: + agent-base: 7.1.1 + tough-cookie: 4.1.4 + optionalDependencies: + undici: 6.19.2 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + optional: true + + i18next-fs-backend@2.3.1: {} + + i18next@22.5.1: + dependencies: + '@babel/runtime': 7.24.7 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + immediate@3.0.6: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isomorphic-unfetch@4.0.2: + dependencies: + node-fetch: 3.3.2 + unfetch: 5.0.0 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsbn@1.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jszip@3.10.1: + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + + kareem@2.5.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lie@3.3.0: + dependencies: + immediate: 3.0.6 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash@4.17.21: {} + + m3u8stream@0.8.6: + dependencies: + miniget: 4.2.3 + sax: 1.4.1 + + magic-bytes.js@1.10.0: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + optional: true + + memory-pager@1.5.0: + optional: true + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} + + miniget@4.2.3: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + optional: true + + minipass@5.0.0: + optional: true + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + optional: true + + mkdirp@1.0.4: + optional: true + + mongodb-connection-string-url@2.6.0: + dependencies: + '@types/whatwg-url': 8.2.2 + whatwg-url: 11.0.0 + + mongodb@5.9.2: + dependencies: + bson: 5.5.1 + mongodb-connection-string-url: 2.6.0 + socks: 2.8.3 + optionalDependencies: + '@mongodb-js/saslprep': 1.1.7 + + mongoose@7.7.0: + dependencies: + bson: 5.5.1 + kareem: 2.5.1 + mongodb: 5.9.2 + mpath: 0.9.0 + mquery: 5.0.0 + ms: 2.1.3 + sift: 16.0.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@mongodb-js/zstd' + - kerberos + - mongodb-client-encryption + - snappy + - supports-color + + mpath@0.9.0: {} + + mquery@5.0.0: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + ms@2.1.2: {} + + ms@2.1.3: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + node-addon-api@5.1.0: + optional: true + + node-domexception@1.0.0: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + optional: true + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + node-gyp-build@4.8.1: {} + + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + + node-os-utils@1.3.7: {} + + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + optional: true + + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + optional: true + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: + optional: true + + object-inspect@1.13.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + opusscript@0.1.1: {} + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + pako@1.0.11: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-type@4.0.0: {} + + peek-readable@5.1.0: {} + + picomatch@2.3.1: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.3.2: {} + + prism-media@1.3.5(@discordjs/opus@0.9.0)(opusscript@0.1.1): + optionalDependencies: + '@discordjs/opus': 0.9.0 + opusscript: 0.1.1 + + process-nextick-args@2.0.1: {} + + proxy-from-env@1.1.0: {} + + psl@1.9.0: {} + + punycode@2.3.1: {} + + qs@6.12.2: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + regenerator-runtime@0.14.1: {} + + requires-port@1.0.0: {} + + resolve-from@4.0.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + sax@1.4.1: {} + + selenium-webdriver@4.22.0: + dependencies: + jszip: 3.10.1 + tmp: 0.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + semver@6.3.1: + optional: true + + semver@7.6.2: {} + + set-blocking@2.0.0: + optional: true + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + sift@16.0.1: {} + + signal-exit@3.0.7: + optional: true + + slash@3.0.0: {} + + smart-buffer@4.2.0: {} + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + sodium-native@4.1.1: + dependencies: + node-gyp-build: 4.8.1 + + soundcloud.ts@0.5.3: + dependencies: + undici: 6.19.2 + + sparse-bitfield@3.0.3: + dependencies: + memory-pager: 1.5.0 + optional: true + + spotify-uri@4.1.0: {} + + spotify-url-info@3.2.15: + dependencies: + himalaya: 1.1.0 + spotify-uri: 4.1.0 + + spotify-web-api-node@5.0.2: + dependencies: + superagent: 6.1.0 + transitivePeerDependencies: + - supports-color + + sprintf-js@1.1.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + optional: true + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-json-comments@3.1.1: {} + + strtok3@7.0.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.1.0 + + superagent@6.1.0: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.5 + fast-safe-stringify: 2.1.1 + form-data: 3.0.1 + formidable: 1.2.6 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.12.2 + readable-stream: 3.6.2 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + optional: true + + text-table@0.2.0: {} + + tiny-typed-emitter@2.1.0: {} + + tmp@0.2.3: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@0.0.3: + optional: true + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + ts-mixer@6.0.4: {} + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + tslib@2.6.3: {} + + tsutils@3.21.0(typescript@5.5.3): + dependencies: + tslib: 1.14.1 + typescript: 5.5.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.5.3: {} + + undici-types@5.26.5: {} + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + undici@6.13.0: {} + + undici@6.19.2: {} + + unfetch@5.0.0: {} + + universalify@0.2.0: {} + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@3.0.1: + optional: true + + webidl-conversions@7.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + optional: true + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + optional: true + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + ws@8.17.1: {} + + xml2js@0.6.2: + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + + xmlbuilder@11.0.1: {} + + yallist@4.0.0: + optional: true + + ym-api-meowed@1.3.4: + dependencies: + axios: 1.7.2 + xml2js: 0.6.2 + transitivePeerDependencies: + - debug + + yocto-queue@0.1.0: {} + + zod@3.23.8: {} From 7c2a67850461455e2f776832249cf9ee909e0df7 Mon Sep 17 00:00:00 2001 From: AlexInCube Date: Sat, 6 Jul 2024 14:28:33 +0300 Subject: [PATCH 13/13] Fixes in pnpm-lock.yaml. Update the @distube/soundcloud to 2.0.2. --- package.json | 6 +- pnpm-lock.yaml | 196 ++++++++++++------------------------------------- 2 files changed, 48 insertions(+), 154 deletions(-) diff --git a/package.json b/package.json index 454b16f..3b7cc37 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0", + "version": "3.0.1", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { @@ -17,7 +17,7 @@ "@discordjs/voice": "^0.16.1", "@distube/direct-link": "^1.0.1", "@distube/file": "^1.0.1", - "@distube/soundcloud": "^2.0.1", + "@distube/soundcloud": "^2.0.2", "@distube/spotify": "^2.0.2", "@distube/youtube": "^1.0.2", "@distube/yt-dlp": "^2.0.1", @@ -40,7 +40,7 @@ "zod": "^3.23.8" }, "devDependencies": { - "@types/node": "^20.14.9", + "@types/node": "^20.14.10", "@types/node-os-utils": "^1.3.4", "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.62.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 76d6c60..ba2b7a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ importers: specifier: ^1.0.1 version: 1.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) '@distube/soundcloud': - specifier: ^2.0.1 - version: 2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) + specifier: ^2.0.2 + version: 2.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) '@distube/spotify': specifier: ^2.0.2 version: 2.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3)) @@ -38,9 +38,6 @@ importers: '@distube/ytsr': specifier: ^2.0.4 version: 2.0.4 - '@types/selenium-webdriver': - specifier: ^4.1.24 - version: 4.1.24 cross-env: specifier: 7.0.3 version: 7.0.3 @@ -77,9 +74,6 @@ importers: prism-media: specifier: ^1.3.5 version: 1.3.5(@discordjs/opus@0.9.0)(opusscript@0.1.1) - selenium-webdriver: - specifier: ^4.22.0 - version: 4.22.0 sodium-native: specifier: ^4.1.1 version: 4.1.1 @@ -91,8 +85,8 @@ importers: version: 3.23.8 devDependencies: '@types/node': - specifier: ^20.14.9 - version: 20.14.9 + specifier: ^20.14.10 + version: 20.14.10 '@types/node-os-utils': specifier: ^1.3.4 version: 1.3.4 @@ -185,9 +179,8 @@ packages: peerDependencies: distube: '5' - '@distube/soundcloud@2.0.1': - resolution: {integrity: sha512-sAjdyQ0N4LGyYem2Y2P3HSgX6CMHZUnIxVR11Q4JqfA1JNuHLyIp/yvoGG55wOiCkY48b2UpOo1fSxnzuc7FRw==} - deprecated: This version is deprecated, please upgrade to the latest version. + '@distube/soundcloud@2.0.2': + resolution: {integrity: sha512-+SgxJ9jRA0SxInWj23rsvi12nzJ7tNpo42A5SRgeoHVvDp7XgBgTEDg2vvVfnj1WaVIptulZsD7gHDAudURODA==} peerDependencies: distube: '5' @@ -293,11 +286,8 @@ packages: '@types/node-os-utils@1.3.4': resolution: {integrity: sha512-BCUYrbdoO4FUbx6MB9atLNFnkxdliFaxdiTJMIPPiecXIApc5zf4NIqV5G1jWv/ReZvtYyHLs40RkBjHX+vykA==} - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} - - '@types/selenium-webdriver@4.1.24': - resolution: {integrity: sha512-oR5MVATv+P2dmhceZJPDm99MmOC9yAK8YpIgJbHEFQ/MbSPC1lA6Ohw441WNUcQ6B1fMAOMu0u59fRKKj9AGGg==} + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} @@ -375,8 +365,8 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vladfrangu/async_event_emitter@2.4.0': - resolution: {integrity: sha512-eNb/9DMwNvhhgn1UuQ8Rl90jhj9PBkYH4oQ522TkiWUVWRfbh3PjdOTFkVGNKs5+xUXalkgFrUSwtY8u0g0S4g==} + '@vladfrangu/async_event_emitter@2.4.1': + resolution: {integrity: sha512-cedU1DrzO4oliUigSAOqSgts6wEfGGSbpO1hYxvKbz8sr7a0meyP3GxnL6hIUtBK0nMG6zHfIYWcqOIb+MRI7w==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} abbrev@1.1.1: @@ -387,8 +377,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true @@ -492,9 +482,6 @@ packages: cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -556,8 +543,8 @@ packages: discord-api-types@0.37.83: resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} - discord-api-types@0.37.91: - resolution: {integrity: sha512-yPGOP1SlkRtnT9Vor5noZHNm7t+EpRdaDvEoeqWTSCzeenMWyB1RbOGKYxdZ1OZijji51Yd1yodhOTi9CfrrQg==} + discord-api-types@0.37.92: + resolution: {integrity: sha512-7xnedbQRLRef/O+4jKPyIFwl6YqoyihOG3OSneiRmVJMBk30ph2YuZGcHjeX1Kk/a3yQWeyCKe4RZJB3iECcxg==} discord.js@14.15.3: resolution: {integrity: sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==} @@ -856,9 +843,6 @@ packages: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} - immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -898,9 +882,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -923,9 +904,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - kareem@2.5.1: resolution: {integrity: sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==} engines: {node: '>=12.0.0'} @@ -937,9 +915,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1132,9 +1107,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1155,8 +1127,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - peek-readable@5.1.0: - resolution: {integrity: sha512-Tq2I+yoz6Xq3S09E2PyjzOy/oYuNg5v7wyjmrw7OQYSKc7QnDs63q4RXFXraMoI6LZyiEOJ/wDEYzGDPhWwNPA==} + peek-readable@5.1.1: + resolution: {integrity: sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==} engines: {node: '>=14.16'} picomatch@2.3.1: @@ -1193,9 +1165,6 @@ packages: opusscript: optional: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -1216,9 +1185,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -1249,19 +1215,12 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - selenium-webdriver@4.22.0: - resolution: {integrity: sha512-GNbrkCHmy249ai885wgXqTfqL2lZnclUH/P8pwTDIqzyFxU3YhDiN7p/c9tMFA4NhgRdEBO2QCG+CWmG7xr/Mw==} - engines: {node: '>= 14.21.0'} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -1278,9 +1237,6 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1324,8 +1280,8 @@ packages: resolution: {integrity: sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng==} engines: {node: '>= 16'} - spotify-url-info@3.2.15: - resolution: {integrity: sha512-NlolD2mqZjvt91hq0XVy3db55FCL2li1XBivkf/i+zUW1K9RP9nIOK5Bpg82DmBf96sjl4TYRI3zPOS94LPulQ==} + spotify-url-info@3.2.16: + resolution: {integrity: sha512-szXt1PLt8lqhaXsTNYH7zPd+EBj6Ha0xtqitqicCijGX6x/jYvn6wgGaK2F1OQfJzx8lxDNfZbtarn4DxzaZ2Q==} engines: {node: '>= 12'} spotify-web-api-node@5.0.2: @@ -1338,9 +1294,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -1352,8 +1305,8 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strtok3@7.0.0: - resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + strtok3@7.1.0: + resolution: {integrity: sha512-19dQEwG6Jd+VabjPRyBhymIF069vZiqWSZa2jJBoKJTsqGKnTxowGoQaLnz+yLARfDI041IUQekyPUMWElOgsQ==} engines: {node: '>=14.16'} superagent@6.1.0: @@ -1379,10 +1332,6 @@ packages: tiny-typed-emitter@2.1.0: resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} - tmp@0.2.3: - resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} - engines: {node: '>=14.14'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1501,8 +1450,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -1589,7 +1538,7 @@ snapshots: '@discordjs/util': 0.3.1 '@sapphire/async-queue': 1.5.2 '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.37.91 + discord-api-types: 0.37.92 file-type: 18.7.0 tslib: 2.6.3 undici: 5.28.4 @@ -1600,7 +1549,7 @@ snapshots: '@discordjs/util': 1.1.0 '@sapphire/async-queue': 1.5.2 '@sapphire/snowflake': 3.5.3 - '@vladfrangu/async_event_emitter': 2.4.0 + '@vladfrangu/async_event_emitter': 2.4.1 discord-api-types: 0.37.83 magic-bytes.js: 1.10.0 tslib: 2.6.2 @@ -1616,7 +1565,7 @@ snapshots: discord-api-types: 0.37.61 prism-media: 1.3.5(@discordjs/opus@0.9.0)(opusscript@0.1.1) tslib: 2.6.3 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - '@discordjs/opus' - bufferutil @@ -1632,10 +1581,10 @@ snapshots: '@discordjs/util': 1.1.0 '@sapphire/async-queue': 1.5.2 '@types/ws': 8.5.10 - '@vladfrangu/async_event_emitter': 2.4.0 + '@vladfrangu/async_event_emitter': 2.4.1 discord-api-types: 0.37.83 tslib: 2.6.2 - ws: 8.17.1 + ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -1649,7 +1598,7 @@ snapshots: dependencies: distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) - '@distube/soundcloud@2.0.1(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': + '@distube/soundcloud@2.0.2(distube@5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3))': dependencies: distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) soundcloud.ts: 0.5.3 @@ -1658,7 +1607,7 @@ snapshots: dependencies: distube: 5.0.2(@discordjs/voice@0.16.1(@discordjs/opus@0.9.0)(opusscript@0.1.1))(discord.js@14.15.3) spotify-uri: 4.1.0 - spotify-url-info: 3.2.15 + spotify-url-info: 3.2.16 spotify-web-api-node: 5.0.2 undici: 6.19.2 transitivePeerDependencies: @@ -1769,15 +1718,10 @@ snapshots: '@types/node-os-utils@1.3.4': {} - '@types/node@20.14.9': + '@types/node@20.14.10': dependencies: undici-types: 5.26.5 - '@types/selenium-webdriver@4.1.24': - dependencies: - '@types/node': 20.14.9 - '@types/ws': 8.5.10 - '@types/semver@7.5.8': {} '@types/uuid@9.0.8': {} @@ -1786,12 +1730,12 @@ snapshots: '@types/whatwg-url@8.2.2': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@types/webidl-conversions': 7.0.3 '@types/ws@8.5.10': dependencies: - '@types/node': 20.14.9 + '@types/node': 20.14.10 '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': dependencies: @@ -1879,16 +1823,16 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vladfrangu/async_event_emitter@2.4.0': {} + '@vladfrangu/async_event_emitter@2.4.1': {} abbrev@1.1.1: optional: true - acorn-jsx@5.3.2(acorn@8.12.0): + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: - acorn: 8.12.0 + acorn: 8.12.1 - acorn@8.12.0: {} + acorn@8.12.1: {} agent-base@6.0.2: dependencies: @@ -1994,8 +1938,6 @@ snapshots: cookiejar@2.1.4: {} - core-util-is@1.0.3: {} - cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 @@ -2048,7 +1990,7 @@ snapshots: discord-api-types@0.37.83: {} - discord-api-types@0.37.91: {} + discord-api-types@0.37.92: {} discord.js@14.15.3: dependencies: @@ -2195,8 +2137,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 esquery@1.5.0: @@ -2247,7 +2189,7 @@ snapshots: file-type@18.7.0: dependencies: readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 + strtok3: 7.1.0 token-types: 5.0.1 fill-range@7.1.1: @@ -2401,8 +2343,6 @@ snapshots: ignore@5.3.1: {} - immediate@3.0.6: {} - import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -2435,8 +2375,6 @@ snapshots: is-path-inside@3.0.3: {} - isarray@1.0.0: {} - isexe@2.0.0: {} isomorphic-unfetch@4.0.2: @@ -2456,13 +2394,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jszip@3.10.1: - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - kareem@2.5.1: {} keyv@4.5.4: @@ -2474,10 +2405,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lie@3.3.0: - dependencies: - immediate: 3.0.6 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -2659,8 +2586,6 @@ snapshots: dependencies: p-limit: 3.1.0 - pako@1.0.11: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -2673,7 +2598,7 @@ snapshots: path-type@4.0.0: {} - peek-readable@5.1.0: {} + peek-readable@5.1.1: {} picomatch@2.3.1: {} @@ -2690,8 +2615,6 @@ snapshots: '@discordjs/opus': 0.9.0 opusscript: 0.1.1 - process-nextick-args@2.0.1: {} - proxy-from-env@1.1.0: {} psl@1.9.0: {} @@ -2706,16 +2629,6 @@ snapshots: queue-microtask@1.2.3: {} - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -2742,21 +2655,10 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} sax@1.4.1: {} - selenium-webdriver@4.22.0: - dependencies: - jszip: 3.10.1 - tmp: 0.2.3 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - semver@6.3.1: optional: true @@ -2774,8 +2676,6 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - setimmediate@1.0.5: {} - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -2818,7 +2718,7 @@ snapshots: spotify-uri@4.1.0: {} - spotify-url-info@3.2.15: + spotify-url-info@3.2.16: dependencies: himalaya: 1.1.0 spotify-uri: 4.1.0 @@ -2838,10 +2738,6 @@ snapshots: strip-ansi: 6.0.1 optional: true - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -2852,10 +2748,10 @@ snapshots: strip-json-comments@3.1.1: {} - strtok3@7.0.0: + strtok3@7.1.0: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.1.0 + peek-readable: 5.1.1 superagent@6.1.0: dependencies: @@ -2896,8 +2792,6 @@ snapshots: tiny-typed-emitter@2.1.0: {} - tmp@0.2.3: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3000,7 +2894,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.1: {} + ws@8.18.0: {} xml2js@0.6.2: dependencies: