diff --git a/.gitignore b/.gitignore index 4150873..20d7da9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ build data /downloads/ /yt-cookies.json +lavanodes.json diff --git a/README.md b/README.md index 3cb3510..f79ade5 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Cool audiobot for Discord created by @Ale ## 🌟 Features ![play-audioplayer](/wiki/images/commands/play-audioplayer.png) -- Audioplayer based on [Distube](https://github.com/skick1234/DisTube) with buttons +- Audioplayer based on [Riffy](https://github.com/riffy-team/riffy) (Lavalink interface for Node.js) - Playlists for songs - Lyrics for songs - Downloading of songs via /download command @@ -26,3 +26,8 @@ If you have issues, try to update your `docker-compose.yml`, `updateAndRunInDock And run `sh updateAndRunInDocker.sh`. If bugs are persisted on the latest version of bot, please create [issue](https://github.com/AlexInCube/AlCoTest/issues/new/choose). + +## Migration Guide from v3 to v4 + +The bot rewrote to use Lavalink instead of Distube.js to provide more services and stability. +Now you need to provide the lavanodes.json and set up your lavaserver. diff --git a/package.json b/package.json index bffe114..6e816fc 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,12 @@ { "name": "aicbot", - "version": "3.8.1", + "version": "4.0.0-dev", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { "build": "tsc", "development": "tsc&& cross-env NODE_ENV=development node --trace-deprecation build/main.js ", "production": "cross-env NODE_ENV=production node build/main.js", - "cookies_grabbing": "cross-env NODE_ENV=development node build/Script_getCookie.js", "test": "tsc&& cross-env NODE_ENV=development node --test", "eslint": "eslint \"src/**/*.{ts,js}\"", "prettier:format": "prettier --write \"**/*.{ts,js}\"", @@ -23,51 +22,33 @@ "dependencies": { "@discordjs/rest": "2.4.0", "@discordjs/voice": "0.17.0", - "@distube/direct-link": "1.0.1", - "@distube/file": "1.0.1", - "@distube/soundcloud": "2.0.3", - "@distube/spotify": "2.0.2", - "@distube/youtube": "1.0.4", - "@distube/yt-dlp": "2.0.1", - "@distube/ytdl-core": "4.14.4", - "@distube/ytsr": "2.0.4", "cross-env": "7.0.3", - "discord.js": "14.16.2", - "distube": "5.0.2", - "distube-apple-music": "0.1.0", - "distube-vk-music-plugin": "2.0.3", - "distube-yandex-music-plugin": "1.0.5", + "discord.js": "14.16.3", "dotenv": "16.4.5", - "genius-lyrics": "4.4.7", - "i18next": "23.15.1", + "i18next": "23.15.2", "i18next-fs-backend": "2.3.2", "mongoose": "8.6.3", - "node-cron": "3.0.3", "node-os-utils": "1.3.7", "opusscript": "0.1.1", "prism-media": "1.3.5", - "puppeteer": "23.3.1", - "puppeteer-extra": "3.3.6", - "puppeteer-extra-plugin-stealth": "2.11.2", - "sodium-native": "4.2.0", - "soundcloud.ts": "0.5.5", + "riffy": "1.0.7-rc.2", + "sodium-native": "4.2.1", "uuid": "10.0.0", "zod": "3.23.8" }, "devDependencies": { - "@eslint/js": "9.10.0", - "@types/node": "22.5.5", - "@types/node-cron": "3.0.11", + "@eslint/js": "9.12.0", + "@types/node": "22.7.5", "@types/node-os-utils": "1.3.4", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.6.0", - "@typescript-eslint/parser": "8.6.0", - "eslint": "9.10.0", + "@typescript-eslint/eslint-plugin": "8.8.1", + "@typescript-eslint/parser": "8.8.1", + "eslint": "9.12.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.2.1", - "globals": "15.9.0", + "globals": "15.11.0", "prettier": "3.3.3", - "typescript": "5.6.2", - "typescript-eslint": "8.6.0" + "typescript": "5.6.3", + "typescript-eslint": "8.8.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5e94cf..b88f01f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,66 +14,24 @@ importers: '@discordjs/voice': specifier: 0.17.0 version: 0.17.0(opusscript@0.1.1) - '@distube/direct-link': - specifier: 1.0.1 - version: 1.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/file': - specifier: 1.0.1 - version: 1.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/soundcloud': - specifier: 2.0.3 - version: 2.0.3(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/spotify': - specifier: 2.0.2 - version: 2.0.2(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/youtube': - specifier: 1.0.4 - version: 1.0.4(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/yt-dlp': - specifier: 2.0.1 - version: 2.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - '@distube/ytdl-core': - specifier: 4.14.4 - version: 4.14.4 - '@distube/ytsr': - specifier: 2.0.4 - version: 2.0.4 cross-env: specifier: 7.0.3 version: 7.0.3 discord.js: - specifier: 14.16.2 - version: 14.16.2 - distube: - specifier: 5.0.2 - version: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - distube-apple-music: - specifier: 0.1.0 - version: 0.1.0(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - distube-vk-music-plugin: - specifier: 2.0.3 - version: 2.0.3(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) - distube-yandex-music-plugin: - specifier: 1.0.5 - version: 1.0.5(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)) + specifier: 14.16.3 + version: 14.16.3 dotenv: specifier: 16.4.5 version: 16.4.5 - genius-lyrics: - specifier: 4.4.7 - version: 4.4.7 i18next: - specifier: 23.15.1 - version: 23.15.1 + specifier: 23.15.2 + version: 23.15.2 i18next-fs-backend: specifier: 2.3.2 version: 2.3.2 mongoose: specifier: 8.6.3 version: 8.6.3(socks@2.8.3) - node-cron: - specifier: 3.0.3 - version: 3.0.3 node-os-utils: specifier: 1.3.7 version: 1.3.7 @@ -83,21 +41,12 @@ importers: prism-media: specifier: 1.3.5 version: 1.3.5(opusscript@0.1.1) - puppeteer: - specifier: 23.3.1 - version: 23.3.1(typescript@5.6.2) - puppeteer-extra: - specifier: 3.3.6 - version: 3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)) - puppeteer-extra-plugin-stealth: - specifier: 2.11.2 - version: 2.11.2(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) + riffy: + specifier: 1.0.7-rc.2 + version: 1.0.7-rc.2 sodium-native: - specifier: 4.2.0 - version: 4.2.0 - soundcloud.ts: - specifier: 0.5.5 - version: 0.5.5 + specifier: 4.2.1 + version: 4.2.1 uuid: specifier: 10.0.0 version: 10.0.0 @@ -106,14 +55,11 @@ importers: version: 3.23.8 devDependencies: '@eslint/js': - specifier: 9.10.0 - version: 9.10.0 + specifier: 9.12.0 + version: 9.12.0 '@types/node': - specifier: 22.5.5 - version: 22.5.5 - '@types/node-cron': - specifier: 3.0.11 - version: 3.0.11 + specifier: 22.7.5 + version: 22.7.5 '@types/node-os-utils': specifier: 1.3.4 version: 1.3.4 @@ -121,47 +67,35 @@ importers: specifier: 10.0.0 version: 10.0.0 '@typescript-eslint/eslint-plugin': - specifier: 8.6.0 - version: 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) + specifier: 8.8.1 + version: 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': - specifier: 8.6.0 - version: 8.6.0(eslint@9.10.0)(typescript@5.6.2) + specifier: 8.8.1 + version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) eslint: - specifier: 9.10.0 - version: 9.10.0 + specifier: 9.12.0 + version: 9.12.0 eslint-config-prettier: specifier: 9.1.0 - version: 9.1.0(eslint@9.10.0) + version: 9.1.0(eslint@9.12.0) eslint-plugin-prettier: specifier: 5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint@9.10.0)(prettier@3.3.3) + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3) globals: - specifier: 15.9.0 - version: 15.9.0 + specifier: 15.11.0 + version: 15.11.0 prettier: specifier: 3.3.3 version: 3.3.3 typescript: - specifier: 5.6.2 - version: 5.6.2 + specifier: 5.6.3 + version: 5.6.3 typescript-eslint: - specifier: 8.6.0 - version: 8.6.0(eslint@9.10.0)(typescript@5.6.2) + specifier: 8.8.1 + version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) packages: - '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.25.6': resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} engines: {node: '>=6.9.0'} @@ -198,48 +132,6 @@ packages: 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.3': - resolution: {integrity: sha512-Hm0xtSVJge67W1QdXcOBjJmVaQWR45S1BrPP8oXie4dgYPPasNksXAqEAo8KwsqFNCVwHkCQcgQlTcgU7LzYBg==} - peerDependencies: - distube: '5' - - '@distube/spotify@2.0.2': - resolution: {integrity: sha512-rIncX05PhedMZuZyhgz7dt9y/nxir9KPmxUo6sBxfITQcztkXlG3r0EhKivp9+BRCQlEBO/GitRTHVwhRKtmLg==} - peerDependencies: - distube: '5' - - '@distube/youtube@1.0.4': - resolution: {integrity: sha512-7iQbtLSv4kpgiX2XtP28CB3z2kgaxw6F8+jNu1RztnW7ckPK3N/8Ayl1yh41YpbrRIHbNMzIVTwguYG0s2ZOuA==} - peerDependencies: - distube: '5' - - '@distube/yt-dlp@2.0.1': - resolution: {integrity: sha512-9c16lRU6jbyal38UUr5E36+2lp36s0DaJySOtFjuAPgaJkp2xvKvyd+s4rFZSqVQGJO5GOhBiH+HD115SKfKAw==} - peerDependencies: - distube: '5' - - '@distube/ytdl-core@4.14.4': - resolution: {integrity: sha512-dHb4GW3qATIjRsS6VIhm3Pop7FdUcDFhsnyQlsPeXW7UhTPuNS0BmraKiTpFbpp0Ky+rxBQjJBfPRFsM+dT1fg==} - engines: {node: '>=14.0'} - - '@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} @@ -254,32 +146,40 @@ packages: resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.1.0': resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.10.0': - resolution: {integrity: sha512-fuXtbiP5GWIn8Fz+LWoOMVf/Jxm+aajZYkhi6CuEm4SxymFM+eUWzbO9qXT+L0iCkL5+KGYMCSGxo686H19S1g==} + '@eslint/js@9.12.0': + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.4': resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.1.0': - resolution: {integrity: sha512-autAXT203ixhqei9xt+qkYOvY8l6LAFIdT2UXc/RPNeUVfqRF1BV94GTJyVPFKT8nFM6MyVJhjLj9E8JWvf5zQ==} + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/retry@0.3.0': - resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} '@mongodb-js/saslprep@1.1.9': @@ -301,11 +201,6 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@puppeteer/browsers@2.4.0': - resolution: {integrity: sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==} - engines: {node: '>=18'} - hasBin: true - '@sapphire/async-queue@1.5.3': resolution: {integrity: sha512-x7zadcfJGxFka1Q3f8gCts1F0xMwCKbZweM85xECGI0hBTeIZJGGCrHgLggihBoprlQ/hBmDR5LKfIPqnmHM3w==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} @@ -318,27 +213,17 @@ packages: resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node-cron@3.0.11': - resolution: {integrity: sha512-0ikrnug3/IyneSHqCBeslAhlK2aBfYek1fGo4bP4QnZPmiqSGRK+Oy7ZMisLWkesffJvQ1cqAcBnJC+8+nxIAg==} + '@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@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} - - '@types/puppeteer@7.0.4': - resolution: {integrity: sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==} - deprecated: This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed. + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} '@types/uuid@10.0.0': resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} @@ -352,11 +237,8 @@ packages: '@types/ws@8.5.12': resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@typescript-eslint/eslint-plugin@8.6.0': - resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + '@typescript-eslint/eslint-plugin@8.8.1': + resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -366,8 +248,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.6.0': - resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + '@typescript-eslint/parser@8.8.1': + resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -376,12 +258,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.6.0': - resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} + '@typescript-eslint/scope-manager@8.8.1': + resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.6.0': - resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} + '@typescript-eslint/type-utils@8.8.1': + resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -389,12 +271,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.6.0': - resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + '@typescript-eslint/types@8.8.1': + resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.6.0': - resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} + '@typescript-eslint/typescript-estree@8.8.1': + resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -402,14 +284,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.6.0': - resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + '@typescript-eslint/utils@8.8.1': + resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.6.0': - resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} + '@typescript-eslint/visitor-keys@8.8.1': + resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vladfrangu/async_event_emitter@2.4.6': @@ -433,14 +315,6 @@ packages: 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@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -448,51 +322,12 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.7.7: - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - - b4a@1.6.6: - resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - bare-events@2.4.2: - resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} - - bare-fs@2.3.5: - resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} - - bare-os@2.4.4: - resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} - - bare-path@2.1.3: - resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} - - bare-stream@2.3.0: - resolution: {integrity: sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -507,51 +342,18 @@ packages: resolution: {integrity: sha512-iOJg8pr7wq2tg/zSlCCHMi3hMm5JTOxLTagf3zxhcenHsFp+c6uOs6K7W5UE7A4QIJGtqh/ZovFNMP4mOPJynQ==} engines: {node: '>=16.20.1'} - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - 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@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chromium-bidi@0.6.5: - resolution: {integrity: sha512-RuLrmzYrxSb0s9SgpB+QN5jJucPduZQ/9SIe76MDxYJuecPW5mxMdacJ1f4EtgiV+R0p3sCkznTMvH0MPGFqjA==} - peerDependencies: - devtools-protocol: '*' - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@0.2.4: - resolution: {integrity: sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==} - engines: {node: '>=0.10.0'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -559,24 +361,9 @@ packages: 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==} - cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -586,24 +373,13 @@ packages: 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'} + cssstyle@4.1.0: + resolution: {integrity: sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==} + engines: {node: '>=18'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} @@ -614,27 +390,18 @@ packages: supports-color: optional: true + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - devtools-protocol@0.0.1330662: - resolution: {integrity: sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw==} + discord-api-types@0.37.100: + resolution: {integrity: sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==} discord-api-types@0.37.83: resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==} @@ -642,91 +409,22 @@ packages: discord-api-types@0.37.97: resolution: {integrity: sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==} - discord.js@14.16.2: - resolution: {integrity: sha512-VGNi9WE2dZIxYM8/r/iatQQ+3LT8STW4hhczJOwm+DBeHq66vsKDCk8trChNCB01sMO9crslYuEMeZl2d7r3xw==} + discord.js@14.16.3: + resolution: {integrity: sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==} engines: {node: '>=18'} - distube-apple-music@0.1.0: - resolution: {integrity: sha512-f+YMXZ5+9RX7HTvtp0V51A987RwiniiCyDzwy0ZFVFgWQq0EPqziYEmZ5D1RSZ6c5s6+YCc9vIC8KPulezdhIw==} - peerDependencies: - distube: '5' - - distube-vk-music-plugin@2.0.3: - resolution: {integrity: sha512-F9O7jw09bBjd40hT7Nh+DGQ+ghZVoLv1GdN0pe4r9pp/KSXdzzMEwNaxvkyInZTK+1otiMhr55m09FSbgfigRw==} - peerDependencies: - distube: '5' - - distube-yandex-music-plugin@1.0.5: - resolution: {integrity: sha512-sHsnUxdFFVzqTNPhmC9w6nYsseVS2Tsuwgy5IedPCj4bJLTc3iOWUbNBAYNgQnsxPPExH7S/kFWjxXQ/0NAoKg==} - 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' - - 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==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - 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'} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - eslint-config-prettier@9.1.0: resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true @@ -747,20 +445,20 @@ packages: eslint-config-prettier: optional: true - eslint-scope@8.0.2: - resolution: {integrity: sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==} + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.10.0: - resolution: {integrity: sha512-Y4D0IgtBZfOcOUAIQTSXBKoNGfY0REGqHJG6+Q81vNippW5YlKjHFj4soMxamKK1NXHUWuBZTLdU3Km+L/pcHw==} + eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -769,15 +467,10 @@ packages: jiti: optional: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -794,20 +487,12 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - 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-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -818,19 +503,9 @@ packages: 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==} - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -850,76 +525,10 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - follow-redirects@1.15.9: - resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-in@0.1.8: - resolution: {integrity: sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==} - engines: {node: '>=0.10.0'} - - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} - - 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-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - genius-lyrics@4.4.7: - resolution: {integrity: sha512-cgO5nSeFqtLZAUyWB+8XWMRBIRzPUSUC42N3CoDGRgKX1anGAyDUhM6/RVIJXCNnQa6XHZHswKcKgHaRiyl+GQ==} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-uri@6.0.3: - resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} - engines: {node: '>= 14'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -928,66 +537,24 @@ packages: 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@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@15.11.0: + resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} engines: {node: '>=18'} - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - 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'} - - 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 + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} @@ -1000,11 +567,12 @@ packages: i18next-fs-backend@2.3.2: resolution: {integrity: sha512-LIwUlkqDZnUI8lnUxBnEj8K/FrHQTT/Sc+1rvDm9E8YvvY5YxzoEAASNx+W5M9DfD5s77lI5vSAFWeTp26B/3Q==} - i18next@23.15.1: - resolution: {integrity: sha512-wB4abZ3uK7EWodYisHl/asf8UYEhrI/vj/8aoSsrj/ZDxj4/UXPOa1KvFt1Fq5hkUHquNqwFlDprmjZ8iySgYA==} + i18next@23.15.2: + resolution: {integrity: sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ==} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -1018,35 +586,14 @@ packages: 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-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - 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'} @@ -1055,27 +602,12 @@ packages: 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'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - isomorphic-unfetch@4.0.2: - resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1083,21 +615,24 @@ packages: jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + jsdom@24.1.3: + resolution: {integrity: sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - 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==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - kareem@2.6.3: resolution: {integrity: sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==} engines: {node: '>=12.0.0'} @@ -1105,29 +640,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kind-of@2.0.1: - resolution: {integrity: sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==} - engines: {node: '>=0.10.0'} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - lazy-cache@0.2.7: - resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} - engines: {node: '>=0.10.0'} - - lazy-cache@1.0.4: - resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} - engines: {node: '>=0.10.0'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1141,32 +657,16 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - m3u8stream@0.8.6: - resolution: {integrity: sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==} - engines: {node: '>=12'} - magic-bytes.js@1.10.0: resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} memory-pager@1.5.0: resolution: {integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==} - merge-deep@3.0.3: - resolution: {integrity: sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==} - engines: {node: '>=0.10.0'} - 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.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1179,15 +679,6 @@ packages: 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==} @@ -1195,13 +686,6 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - mixin-object@2.0.1: - resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==} - engines: {node: '>=0.10.0'} - mongodb-connection-string-url@3.0.1: resolution: {integrity: sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==} @@ -1250,41 +734,15 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - - node-cron@3.0.3: - resolution: {integrity: sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==} - engines: {node: '>=6.0.0'} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - - 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.2: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} 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==} - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - 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==} + nwsapi@2.2.13: + resolution: {integrity: sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -1301,40 +759,21 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - pac-proxy-agent@7.0.2: - resolution: {integrity: sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse5@7.2.0: + resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} 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'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -1369,122 +808,21 @@ packages: opusscript: optional: true - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - proxy-agent@6.4.0: - resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} - engines: {node: '>= 14'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - psl@1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@23.3.1: - resolution: {integrity: sha512-m5gTpITEqqpSgAvPUI/Ch9igh5sNJV+BVVbqQMzqirRDVHDCkLGHaydEQZx2NZvSXdwCFrIV///cpSlX/uD0Sg==} - engines: {node: '>=18'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - puppeteer-extra-plugin-stealth@2.11.2: - resolution: {integrity: sha512-bUemM5XmTj9i2ZerBzsk2AN5is0wHMNE6K0hXBzBXOzP5m5G3Wl0RHhiqKeHToe/uIH8AoZiGhc1tCkLZQPKTQ==} - engines: {node: '>=8'} - peerDependencies: - playwright-extra: '*' - puppeteer-extra: '*' - peerDependenciesMeta: - playwright-extra: - optional: true - puppeteer-extra: - optional: true + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - puppeteer-extra-plugin-user-data-dir@2.4.1: - resolution: {integrity: sha512-kH1GnCcqEDoBXO7epAse4TBPJh9tEpVEK/vkedKfjOVOhZAvLkHGc9swMs5ChrJbRnf8Hdpug6TJlEuimXNQ+g==} - engines: {node: '>=8'} - peerDependencies: - playwright-extra: '*' - puppeteer-extra: '*' - peerDependenciesMeta: - playwright-extra: - optional: true - puppeteer-extra: - optional: true - - puppeteer-extra-plugin-user-preferences@2.4.1: - resolution: {integrity: sha512-i1oAZxRbc1bk8MZufKCruCEC3CCafO9RKMkkodZltI4OqibLFXF3tj6HZ4LZ9C5vCXZjYcDWazgtY69mnmrQ9A==} - engines: {node: '>=8'} - peerDependencies: - playwright-extra: '*' - puppeteer-extra: '*' - peerDependenciesMeta: - playwright-extra: - optional: true - puppeteer-extra: - optional: true - - puppeteer-extra-plugin@3.2.3: - resolution: {integrity: sha512-6RNy0e6pH8vaS3akPIKGg28xcryKscczt4wIl0ePciZENGE2yoaQJNd17UiEbdmh5/6WW6dPcfRWT9lxBwCi2Q==} - engines: {node: '>=9.11.2'} - peerDependencies: - playwright-extra: '*' - puppeteer-extra: '*' - peerDependenciesMeta: - playwright-extra: - optional: true - puppeteer-extra: - optional: true - - puppeteer-extra@3.3.6: - resolution: {integrity: sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==} - engines: {node: '>=8'} - peerDependencies: - '@types/puppeteer': '*' - puppeteer: '*' - puppeteer-core: '*' - peerDependenciesMeta: - '@types/puppeteer': - optional: true - puppeteer: - optional: true - puppeteer-core: - optional: true - - puppeteer@23.3.1: - resolution: {integrity: sha512-BxkuJyCv46ZKW8KEHiVMHgHEC89jKK9FffReWjbw1IfBUmNx+6JIZyqOtaJeSwyolTdVqqb5fiPiXflKeH3dKQ==} - engines: {node: '>=18'} - hasBin: true - - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} - - querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -1497,33 +835,27 @@ packages: 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 + riffy@1.0.7-rc.2: + resolution: {integrity: sha512-FpxnmPn4JSoCGF/dizOLRIsAQXhSnqo9hgRMEFEmSZ7j9691oqPUz4e8EPuDNcTqBoITpbca2JESAZAJaTjKTQ==} + + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - shallow-clone@0.1.2: - resolution: {integrity: sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1532,10 +864,6 @@ packages: 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@17.1.3: resolution: {integrity: sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==} @@ -1543,94 +871,37 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socks-proxy-agent@8.0.4: - resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} - engines: {node: '>= 14'} - socks@2.8.3: resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - sodium-native@4.2.0: - resolution: {integrity: sha512-rdJRAf/RE/IRFUUoUsz10slNAQDTGz5ChpIeR1Ti0BtGYstl6Uok4hHALPBdnFcLml6qXJ2pDd0/De09mPa6mg==} - - soundcloud.ts@0.5.5: - resolution: {integrity: sha512-bygjhC1w/w26Nk0Y+4D4cWSEJ1TdxLaE6+w4pCazFzPF+J4mzuB62ggWmFa7BiwnirzNf9lgPbjzrQYGege4Ew==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + sodium-native@4.2.1: + resolution: {integrity: sha512-48X3PfRLW+f0fgb3J7f7mkZ9eBKcGR/bD5mdXXLAx4RWwKUe3095yPQgiUUQTfh8Q29JzwhSQATitQDBIozN/w==} 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.16: - resolution: {integrity: sha512-szXt1PLt8lqhaXsTNYH7zPd+EBj6Ha0xtqitqicCijGX6x/jYvn6wgGaK2F1OQfJzx8lxDNfZbtarn4DxzaZ2Q==} - 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==} - streamx@2.20.1: - resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - 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'} - 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@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.9.1: resolution: {integrity: sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==} engines: {node: ^14.18.0 || >=16.0.0} - tar-fs@3.0.6: - resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} - - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} - - text-decoder@1.2.0: - resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} - text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tiny-typed-emitter@2.1.0: - resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1643,6 +914,10 @@ packages: resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} engines: {node: '>=14'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -1659,11 +934,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typed-query-selector@2.12.0: - resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - - typescript-eslint@8.6.0: - resolution: {integrity: sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA==} + typescript-eslint@8.8.1: + resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1671,71 +943,56 @@ packages: typescript: optional: true - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - undici@6.19.8: resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} 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'} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - urlpattern-polyfill@10.0.0: - resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - vk-music-api-wrapper@1.0.5: - resolution: {integrity: sha512-rltV6I4xErc4zQQBvMc8QocuDHIX/K9u3hBeqA7AntP7SRwtMoGu0n3K+KD+8H4JbwQ1ymN2CPEaCqLmEwSwHA==} - - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url@13.0.0: resolution: {integrity: sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==} engines: {node: '>=16'} + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1745,13 +1002,6 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -1764,31 +1014,12 @@ packages: 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'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - ym-api-meowed@1.3.4: - resolution: {integrity: sha512-vHnfdGLgmOj8ST6fXmpKsK/YDO1JxdHJFcRuqrtEJeLFv727vtX2AVUjF46qNpjhVARD/GHqMDL3HE9ixjLdJg==} + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -1799,20 +1030,6 @@ packages: snapshots: - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.1.0 - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.0 - '@babel/runtime@7.25.6': dependencies: regenerator-runtime: 0.14.1 @@ -1879,67 +1096,9 @@ snapshots: - bufferutil - utf-8-validate - '@distube/direct-link@1.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - undici: 6.19.8 - - '@distube/file@1.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - - '@distube/soundcloud@2.0.3(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - soundcloud.ts: 0.5.5 - - '@distube/spotify@2.0.2(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - spotify-uri: 4.1.0 - spotify-url-info: 3.2.16 - spotify-web-api-node: 5.0.2 - undici: 6.19.8 - transitivePeerDependencies: - - supports-color - - '@distube/youtube@1.0.4(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - '@distube/ytdl-core': 4.14.4 - '@distube/ytpl': 1.2.1 - '@distube/ytsr': 2.0.4 - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - transitivePeerDependencies: - - supports-color - - '@distube/yt-dlp@2.0.1(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2))': - dependencies: - dargs: 7.0.0 - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - undici: 6.19.8 - - '@distube/ytdl-core@4.14.4': - dependencies: - http-cookie-agent: 6.0.5(tough-cookie@4.1.4)(undici@5.28.4) - m3u8stream: 0.8.6 - miniget: 4.2.3 - sax: 1.4.1 - tough-cookie: 4.1.4 - undici: 5.28.4 - transitivePeerDependencies: - - supports-color - - '@distube/ytpl@1.2.1': + '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)': dependencies: - undici: 5.28.4 - - '@distube/ytsr@2.0.4': - dependencies: - undici: 6.19.8 - - '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0)': - dependencies: - eslint: 9.10.0 + eslint: 9.12.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.1': {} @@ -1952,11 +1111,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/core@0.6.0': {} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.7 - espree: 10.1.0 + espree: 10.2.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -1966,19 +1127,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.10.0': {} + '@eslint/js@9.12.0': {} '@eslint/object-schema@2.1.4': {} - '@eslint/plugin-kit@0.1.0': + '@eslint/plugin-kit@0.2.0': dependencies: levn: 0.4.1 - '@fastify/busboy@2.1.1': {} + '@humanfs/core@0.19.0': {} + + '@humanfs/node@0.16.5': + dependencies: + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.3.1': {} '@mongodb-js/saslprep@1.1.9': dependencies: @@ -1998,19 +1164,6 @@ snapshots: '@pkgr/core@0.1.1': {} - '@puppeteer/browsers@2.4.0': - dependencies: - debug: 4.3.7 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.4.0 - semver: 7.6.3 - tar-fs: 3.0.6 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - '@sapphire/async-queue@1.5.3': {} '@sapphire/shapeshift@4.0.0': @@ -2020,32 +1173,16 @@ snapshots: '@sapphire/snowflake@3.5.3': {} - '@tootallnate/quickjs-emscripten@0.23.0': {} - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - - '@types/ms@0.7.34': {} + '@types/estree@1.0.6': {} - '@types/node-cron@3.0.11': {} + '@types/json-schema@7.0.15': {} '@types/node-os-utils@1.3.4': {} - '@types/node@22.5.5': + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 - '@types/puppeteer@7.0.4(typescript@5.6.2)': - dependencies: - puppeteer: 23.3.1(typescript@5.6.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - optional: true - '@types/uuid@10.0.0': {} '@types/webidl-conversions@7.0.3': {} @@ -2056,92 +1193,87 @@ snapshots: '@types/ws@8.5.12': dependencies: - '@types/node': 22.5.5 - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 22.5.5 - optional: true + '@types/node': 22.7.5 - '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 - eslint: 9.10.0 + '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.8.1 + eslint: 9.12.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.7 - eslint: 9.10.0 + eslint: 9.12.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.6.0': + '@typescript-eslint/scope-manager@8.8.1': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 - '@typescript-eslint/type-utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.6.0': {} + '@typescript-eslint/types@8.8.1': {} - '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.6.0(eslint@9.10.0)(typescript@5.6.2)': + '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - eslint: 9.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + eslint: 9.12.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.6.0': + '@typescript-eslint/visitor-keys@8.8.1': dependencies: - '@typescript-eslint/types': 8.6.0 + '@typescript-eslint/types': 8.8.1 eslint-visitor-keys: 3.4.3 '@vladfrangu/async_event_emitter@2.4.6': {} @@ -2165,68 +1297,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 argparse@2.0.1: {} - arr-union@3.1.0: {} - - ast-types@0.13.4: - dependencies: - tslib: 2.7.0 - asynckit@0.4.0: {} - axios@1.7.7: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - b4a@1.6.6: {} - balanced-match@1.0.2: {} - bare-events@2.4.2: - optional: true - - bare-fs@2.3.5: - dependencies: - bare-events: 2.4.2 - bare-path: 2.1.3 - bare-stream: 2.3.0 - optional: true - - bare-os@2.4.4: - optional: true - - bare-path@2.1.3: - dependencies: - bare-os: 2.4.4 - optional: true - - bare-stream@2.3.0: - dependencies: - b4a: 1.6.6 - streamx: 2.20.1 - optional: true - - base64-js@1.5.1: {} - - basic-ftp@5.0.5: {} - - boolbase@1.0.0: {} - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -2242,86 +1322,25 @@ snapshots: bson@6.8.0: {} - buffer-crc32@0.2.13: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.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@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chromium-bidi@0.6.5(devtools-protocol@0.0.1330662): - dependencies: - devtools-protocol: 0.0.1330662 - mitt: 3.0.1 - urlpattern-polyfill: 10.0.0 - zod: 3.23.8 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - clone-deep@0.2.4: - dependencies: - for-own: 0.1.5 - is-plain-object: 2.0.4 - kind-of: 3.2.2 - lazy-cache: 1.0.4 - shallow-clone: 0.1.2 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - component-emitter@1.3.1: {} - concat-map@0.0.1: {} - cookiejar@2.1.4: {} - - cosmiconfig@9.0.0(typescript@5.6.2): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.6.2 - cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 @@ -2332,51 +1351,32 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-select@5.1.0: + cssstyle@4.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: {} + rrweb-cssom: 0.7.1 - dargs@7.0.0: {} - - data-uri-to-buffer@4.0.1: {} - - data-uri-to-buffer@6.0.2: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 debug@4.3.7: dependencies: ms: 2.1.3 - deep-is@0.1.4: {} - - deepmerge@4.3.1: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 + decimal.js@10.4.3: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 + deep-is@0.1.4: {} delayed-stream@1.0.0: {} - devtools-protocol@0.0.1330662: {} + discord-api-types@0.37.100: {} discord-api-types@0.37.83: {} discord-api-types@0.37.97: {} - discord.js@14.16.2: + discord.js@14.16.3: dependencies: '@discordjs/builders': 1.9.0 '@discordjs/collection': 1.5.3 @@ -2385,7 +1385,7 @@ snapshots: '@discordjs/util': 1.1.1 '@discordjs/ws': 1.1.1 '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.37.97 + discord-api-types: 0.37.100 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 tslib: 2.7.0 @@ -2394,126 +1394,56 @@ snapshots: - bufferutil - utf-8-validate - distube-apple-music@0.1.0(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)): - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - isomorphic-unfetch: 4.0.2 - node-html-parser: 6.1.13 - - distube-vk-music-plugin@2.0.3(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)): - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - vk-music-api-wrapper: 1.0.5 - - distube-yandex-music-plugin@1.0.5(distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2)): - dependencies: - distube: 5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2) - ym-api-meowed: 1.3.4 - transitivePeerDependencies: - - debug - - distube@5.0.2(@discordjs/voice@0.17.0(opusscript@0.1.1))(discord.js@14.16.2): - dependencies: - '@discordjs/voice': 0.17.0(opusscript@0.1.1) - discord.js: 14.16.2 - tiny-typed-emitter: 2.1.0 - undici: 6.19.8 - - 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: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - entities@4.5.0: {} - env-paths@2.2.1: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - escalade@3.2.0: {} - - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - eslint-config-prettier@9.1.0(eslint@9.10.0): + eslint-config-prettier@9.1.0(eslint@9.12.0): dependencies: - eslint: 9.10.0 + eslint: 9.12.0 - eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0))(eslint@9.10.0)(prettier@3.3.3): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0))(eslint@9.12.0)(prettier@3.3.3): dependencies: - eslint: 9.10.0 + eslint: 9.12.0 prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.1 optionalDependencies: - eslint-config-prettier: 9.1.0(eslint@9.10.0) + eslint-config-prettier: 9.1.0(eslint@9.12.0) - eslint-scope@8.0.2: + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} + eslint-visitor-keys@4.1.0: {} - eslint@9.10.0: + eslint@9.12.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.10.0 - '@eslint/plugin-kit': 0.1.0 + '@eslint/js': 9.12.0 + '@eslint/plugin-kit': 0.2.0 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.7 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.2 - eslint-visitor-keys: 4.0.0 - espree: 10.1.0 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -2523,24 +1453,20 @@ snapshots: ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.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@10.1.0: + espree@10.2.0: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 - - esprima@4.0.1: {} + eslint-visitor-keys: 4.1.0 esquery@1.6.0: dependencies: @@ -2554,22 +1480,10 @@ snapshots: esutils@2.0.3: {} - extract-zip@2.0.1: - dependencies: - debug: 4.3.7 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} - fast-fifo@1.3.2: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2582,21 +1496,10 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} - fastq@1.17.1: dependencies: reusify: 1.0.4 - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -2617,78 +1520,12 @@ snapshots: flatted@3.3.1: {} - follow-redirects@1.15.9: {} - - for-in@0.1.8: {} - - for-in@1.0.2: {} - - for-own@0.1.5: - dependencies: - for-in: 1.0.2 - - 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-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs.realpath@1.0.0: {} - - function-bind@1.1.2: {} - - genius-lyrics@4.4.7: - dependencies: - node-html-parser: 6.1.13 - undici: 6.19.8 - - get-caller-file@2.0.5: {} - - 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 - - get-stream@5.2.0: - dependencies: - pump: 3.0.2 - - get-uri@6.0.3: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.3.7 - fs-extra: 11.2.0 - transitivePeerDependencies: - - supports-color - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2697,55 +1534,17 @@ snapshots: 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@14.0.0: {} - globals@15.9.0: {} - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graceful-fs@4.2.11: {} + globals@15.11.0: {} graphemer@1.4.0: {} - has-flag@3.0.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: {} - - hasown@2.0.2: + html-encoding-sniffer@4.0.0: 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@5.28.4): - dependencies: - agent-base: 7.1.1 - tough-cookie: 4.1.4 - optionalDependencies: - undici: 5.28.4 - transitivePeerDependencies: - - supports-color + whatwg-encoding: 3.1.1 http-proxy-agent@7.0.2: dependencies: @@ -2763,11 +1562,13 @@ snapshots: i18next-fs-backend@2.3.2: {} - i18next@23.15.1: + i18next@23.15.2: dependencies: '@babel/runtime': 7.25.6 - ieee754@1.2.1: {} + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 ignore@5.3.2: {} @@ -2778,96 +1579,76 @@ snapshots: 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-arrayish@0.2.1: {} - - is-buffer@1.1.6: {} - - is-extendable@0.1.1: {} + optional: true is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-number@7.0.0: {} - is-path-inside@3.0.3: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 + is-potential-custom-element-name@1.0.1: {} isexe@2.0.0: {} - isobject@3.0.1: {} - - isomorphic-unfetch@4.0.2: - dependencies: - node-fetch: 3.3.2 - unfetch: 5.0.0 - - js-tokens@4.0.0: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + jsbn@1.1.0: + optional: true - json-buffer@3.0.1: {} + jsdom@24.1.3: + dependencies: + cssstyle: 4.1.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.13 + parse5: 7.2.0 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - json-parse-even-better-errors@2.3.1: {} + json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - kareem@2.6.3: {} keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kind-of@2.0.1: - dependencies: - is-buffer: 1.1.6 - - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - lazy-cache@0.2.7: {} - - lazy-cache@1.0.4: {} - levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - lines-and-columns@1.2.4: {} - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -2878,27 +1659,12 @@ snapshots: lodash@4.17.21: {} - lru-cache@7.18.3: {} - - m3u8stream@0.8.6: - dependencies: - miniget: 4.2.3 - sax: 1.4.1 - magic-bytes.js@1.10.0: {} memory-pager@1.5.0: {} - merge-deep@3.0.3: - dependencies: - arr-union: 3.1.0 - clone-deep: 0.2.4 - kind-of: 3.2.2 - merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -2910,10 +1676,6 @@ snapshots: dependencies: mime-db: 1.52.0 - mime@2.6.0: {} - - miniget@4.2.3: {} - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -2922,13 +1684,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - mitt@3.0.1: {} - - mixin-object@2.0.1: - dependencies: - for-in: 0.1.8 - is-extendable: 0.1.1 - mongodb-connection-string-url@3.0.1: dependencies: '@types/whatwg-url': 11.0.5 @@ -2973,38 +1728,11 @@ snapshots: natural-compare@1.4.0: {} - netmask@2.0.2: {} - - node-cron@3.0.3: - dependencies: - uuid: 8.3.2 - - node-domexception@1.0.0: {} - - 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.2: {} - node-html-parser@6.1.13: - dependencies: - css-select: 5.1.0 - he: 1.2.0 - node-os-utils@1.3.7: {} - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - object-inspect@1.13.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 + nwsapi@2.2.13: {} optionator@0.9.4: dependencies: @@ -3025,45 +1753,18 @@ snapshots: dependencies: p-limit: 3.1.0 - pac-proxy-agent@7.0.2: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.1 - debug: 4.3.7 - get-uri: 6.0.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-json@5.2.0: + parse5@7.2.0: dependencies: - '@babel/code-frame': 7.24.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + entities: 4.5.0 path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - path-key@3.1.1: {} - pend@1.2.0: {} - - picocolors@1.1.0: {} - picomatch@2.3.1: {} prelude-ls@1.2.1: {} @@ -3078,168 +1779,46 @@ snapshots: optionalDependencies: opusscript: 0.1.1 - progress@2.0.3: {} - - proxy-agent@6.4.0: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.5 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.2 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.4 - transitivePeerDependencies: - - supports-color - - proxy-from-env@1.1.0: {} - psl@1.9.0: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} - puppeteer-core@23.3.1: - dependencies: - '@puppeteer/browsers': 2.4.0 - chromium-bidi: 0.6.5(devtools-protocol@0.0.1330662) - debug: 4.3.7 - devtools-protocol: 0.0.1330662 - typed-query-selector: 2.12.0 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - puppeteer-extra-plugin-stealth@2.11.2(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))): - dependencies: - debug: 4.3.7 - puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) - puppeteer-extra-plugin-user-preferences: 2.4.1(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) - optionalDependencies: - puppeteer-extra: 3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)) - transitivePeerDependencies: - - supports-color - - puppeteer-extra-plugin-user-data-dir@2.4.1(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))): - dependencies: - debug: 4.3.7 - fs-extra: 10.1.0 - puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) - rimraf: 3.0.2 - optionalDependencies: - puppeteer-extra: 3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)) - transitivePeerDependencies: - - supports-color - - puppeteer-extra-plugin-user-preferences@2.4.1(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))): - dependencies: - debug: 4.3.7 - deepmerge: 4.3.1 - puppeteer-extra-plugin: 3.2.3(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) - puppeteer-extra-plugin-user-data-dir: 2.4.1(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))) - optionalDependencies: - puppeteer-extra: 3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)) - transitivePeerDependencies: - - supports-color - - puppeteer-extra-plugin@3.2.3(puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2))): - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.7 - merge-deep: 3.0.3 - optionalDependencies: - puppeteer-extra: 3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)) - transitivePeerDependencies: - - supports-color - - puppeteer-extra@3.3.6(@types/puppeteer@7.0.4(typescript@5.6.2))(puppeteer-core@23.3.1)(puppeteer@23.3.1(typescript@5.6.2)): - dependencies: - '@types/debug': 4.1.12 - debug: 4.3.7 - deepmerge: 4.3.1 - optionalDependencies: - '@types/puppeteer': 7.0.4(typescript@5.6.2) - puppeteer: 23.3.1(typescript@5.6.2) - puppeteer-core: 23.3.1 - transitivePeerDependencies: - - supports-color - - puppeteer@23.3.1(typescript@5.6.2): - dependencies: - '@puppeteer/browsers': 2.4.0 - chromium-bidi: 0.6.5(devtools-protocol@0.0.1330662) - cosmiconfig: 9.0.0(typescript@5.6.2) - devtools-protocol: 0.0.1330662 - puppeteer-core: 23.3.1 - typed-query-selector: 2.12.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - typescript - - utf-8-validate - - qs@6.13.0: - dependencies: - side-channel: 1.0.6 - querystringify@2.2.0: {} queue-microtask@1.2.3: {} - queue-tick@1.0.1: {} - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - regenerator-runtime@0.14.1: {} - require-directory@2.1.1: {} - requires-port@1.0.0: {} resolve-from@4.0.0: {} reusify@1.0.4: {} - rimraf@3.0.2: + riffy@1.0.7-rc.2: dependencies: - glob: 7.2.3 + jsdom: 24.1.3 + undici: 6.19.8 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + rrweb-cssom@0.7.1: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.2.1: {} - - sax@1.4.1: {} - - semver@7.6.3: {} + safer-buffer@2.1.2: {} - set-function-length@1.2.2: + saxes@6.0.0: 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 + xmlchars: 2.2.0 - shallow-clone@0.1.2: - dependencies: - is-extendable: 0.1.1 - kind-of: 2.0.1 - lazy-cache: 0.2.7 - mixin-object: 2.0.1 + semver@7.6.3: {} shebang-command@2.0.0: dependencies: @@ -3247,137 +1826,43 @@ snapshots: 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@17.1.3: {} - smart-buffer@4.2.0: {} - - socks-proxy-agent@8.0.4: - dependencies: - agent-base: 7.1.1 - debug: 4.3.7 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color + smart-buffer@4.2.0: + optional: true socks@2.8.3: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 + optional: true - sodium-native@4.2.0: + sodium-native@4.2.1: dependencies: node-gyp-build: 4.8.2 - soundcloud.ts@0.5.5: - dependencies: - undici: 6.19.8 - - source-map@0.6.1: - optional: true - sparse-bitfield@3.0.3: dependencies: memory-pager: 1.5.0 - spotify-uri@4.1.0: {} - - spotify-url-info@3.2.16: - 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: {} - - streamx@2.20.1: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.0 - optionalDependencies: - bare-events: 2.4.2 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 + sprintf-js@1.1.3: + optional: true strip-json-comments@3.1.1: {} - superagent@6.1.0: - dependencies: - component-emitter: 1.3.1 - cookiejar: 2.1.4 - debug: 4.3.7 - 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.13.0 - readable-stream: 3.6.2 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 + symbol-tree@3.2.4: {} + synckit@0.9.1: dependencies: '@pkgr/core': 0.1.1 tslib: 2.7.0 - tar-fs@3.0.6: - dependencies: - pump: 3.0.2 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 2.3.5 - bare-path: 2.1.3 - - tar-stream@3.1.7: - dependencies: - b4a: 1.6.6 - fast-fifo: 1.3.2 - streamx: 2.20.1 - - text-decoder@1.2.0: - dependencies: - b4a: 1.6.6 - text-table@0.2.0: {} - through@2.3.8: {} - - tiny-typed-emitter@2.1.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -3393,9 +1878,13 @@ snapshots: dependencies: punycode: 2.3.1 - ts-api-utils@1.3.0(typescript@5.6.2): + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: - typescript: 5.6.2 + typescript: 5.6.3 ts-mixer@6.0.4: {} @@ -3405,40 +1894,25 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typed-query-selector@2.12.0: {} - - typescript-eslint@8.6.0(eslint@9.10.0)(typescript@5.6.2): + typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.10.0)(typescript@5.6.2))(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/parser': 8.6.0(eslint@9.10.0)(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.10.0)(typescript@5.6.2) + '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.6.2 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - typescript@5.6.2: {} - - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 + typescript@5.6.3: {} undici-types@6.19.8: {} - undici@5.28.4: - dependencies: - '@fastify/busboy': 2.1.1 - undici@6.19.8: {} - unfetch@5.0.0: {} - universalify@0.2.0: {} - universalify@2.0.1: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -3448,73 +1922,41 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 - urlpattern-polyfill@10.0.0: {} - - util-deprecate@1.0.2: {} - uuid@10.0.0: {} - uuid@8.3.2: {} + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 - vk-music-api-wrapper@1.0.5: {} + webidl-conversions@7.0.0: {} - web-streams-polyfill@3.3.3: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 - webidl-conversions@7.0.0: {} + whatwg-mimetype@4.0.0: {} whatwg-url@13.0.0: dependencies: tr46: 4.1.1 webidl-conversions: 7.0.0 + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 word-wrap@1.2.5: {} - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - ws@8.18.0: {} - xml2js@0.6.2: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + xml-name-validator@5.0.0: {} - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - - ym-api-meowed@1.3.4: - dependencies: - axios: 1.7.7 - xml2js: 0.6.2 - transitivePeerDependencies: - - debug + xmlchars@2.2.0: {} yocto-queue@0.1.0: {} diff --git a/src/CookiesAutomation.ts b/src/CookiesAutomation.ts deleted file mode 100644 index d146e1a..0000000 --- a/src/CookiesAutomation.ts +++ /dev/null @@ -1,83 +0,0 @@ -import puppeteer from 'puppeteer-extra'; -import StealthPlugin from 'puppeteer-extra-plugin-stealth'; -import fs from 'fs'; -import { ENV } from './EnvironmentVariables.js'; -import { loggerError, loggerSend, loggerWarn } from './utilities/logger.js'; - -// Need to bypass error "This browser or app may not be secure" after Google form email input -const stealth = StealthPlugin(); -stealth.enabledEvasions.delete('iframe.contentWindow'); -stealth.enabledEvasions.delete('media.codecs'); -puppeteer.use(stealth); - -export async function getYoutubeCookie() { - if (!ENV.BOT_GOOGLE_EMAIL || !ENV.BOT_GOOGLE_PASSWORD) { - loggerWarn('BOT_GOOGLE_EMAIL or BOT_GOOGLE_PASSWORD is are wrong or not provided'); - - return; - } - - loggerSend('Trying to fetch cookie from Google Auth, this might be take a time'); - - const browser = await puppeteer.launch({ - headless: true, - args: ['--remote-debugging-port=9222', '--remote-debugging-address=0.0.0.0', '--no-sandbox'] - }); - const page = await browser.newPage(); - await page.goto('https://www.youtube.com', { waitUntil: 'networkidle2' }); - - try { - // Press "Sign In" button on YouTube in accept cookie usage - await page.click( - '#topbar > div.top-buttons.style-scope.ytd-consent-bump-v2-lightbox > div:nth-child(2) > ytd-button-renderer > yt-button-shape > a' - ); - } catch { - // Press "Sign In" on navbar - await page.click('#buttons > ytd-button-renderer > yt-button-shape > a'); - } - // Type Email in form - await page.waitForSelector('#identifierId', { visible: true }); - await page.type('#identifierId', ENV.BOT_GOOGLE_EMAIL); - await page.click('#identifierNext'); - - // Type Password in form - await page.waitForSelector('#password', { visible: true }); - await page.type('#password input', ENV.BOT_GOOGLE_PASSWORD); - // @ts-expect-error Because page.click() on '#passwordNext' is not working. So i use page.evaluate() to workaround - await page.evaluate((selector) => document.querySelector(selector).click(), '#passwordNext'); - - // Skip measures of security (if Google asks) - try { - const NotNowSelector = - '#yDmH0d > c-wiz:nth-child(9) > div > div > div > div.L5MEH.Bokche.ypEC4c > div.lq3Znf > div:nth-child(1) > button > span'; - await page.waitForSelector(NotNowSelector, { timeout: 1e4 }); - await page.click(NotNowSelector); - } catch { - await page.goto('https://www.youtube.com', { waitUntil: 'networkidle2' }); - } - - const cookies = await page.cookies(); - - await browser.close(); - - if (cookies.length < 10) { - loggerError('Something went wrong during authentication to Google'); - return undefined; - } - - const cookiesJson = JSON.stringify(cookies, null, 2); - fs.writeFileSync('yt-cookies.json', cookiesJson); - - //loggerSend(cookiesJson); - - if (!cookies) loggerError('Failed to fetch YouTube cookies'); - if (cookiesJson) loggerSend('YouTube Cookies fetched successfully'); - - return cookies; -} - -/* -function checkCookiesValid(){ - distube.resolve -} -*/ diff --git a/src/DiscordTypes.ts b/src/DiscordTypes.ts index c29b6be..acd903f 100644 --- a/src/DiscordTypes.ts +++ b/src/DiscordTypes.ts @@ -1,4 +1,4 @@ -import { Client, ClientEvents, Collection } from 'discord.js'; +import { Client, ClientEvents, Collection, Events } from 'discord.js'; import { ICommand, ICommandGroup } from './CommandTypes.js'; import { AudioPlayersManager } from './audioplayer/AudioPlayersManager.js'; @@ -11,7 +11,7 @@ declare module 'discord.js' { } export interface BotEvent { - name: keyof ClientEvents; + name: Events; once?: boolean | false; // eslint-disable-next-line @typescript-eslint/no-explicit-any execute: (client: Client, ...args: any) => void; diff --git a/src/EnvironmentVariables.ts b/src/EnvironmentVariables.ts index 7854913..9d90c8b 100644 --- a/src/EnvironmentVariables.ts +++ b/src/EnvironmentVariables.ts @@ -5,7 +5,7 @@ import { z } from 'zod'; import * as dotenv from 'dotenv'; -import { loggerSend } from './utilities/logger.js'; +import { loggerError, loggerSend } from './utilities/logger.js'; import path from 'path'; import fs from 'fs'; @@ -24,7 +24,7 @@ if (fs.existsSync(envPath)) { ); } -const envVariables = z.object({ +const envSchema = z.object({ NODE_ENV: z.enum(['development', 'production']).default('development'), BOT_VERBOSE_LOGGING: z @@ -84,7 +84,7 @@ const envVariables = z.object({ BOT_GENIUS_TOKEN: z.string().optional() }); -export const ENV = envVariables.parse(process.env); +export const ENV = envSchema.parse(process.env); if (fs.existsSync(envPath)) { loggerSend(`Environment variables is loaded from ${envPath}`, loggerPrefixEnv); diff --git a/src/LavalinkNodes.ts b/src/LavalinkNodes.ts new file mode 100644 index 0000000..7996c24 --- /dev/null +++ b/src/LavalinkNodes.ts @@ -0,0 +1,29 @@ +import path from 'path'; +import fs from 'fs'; +import { loggerError, loggerSend } from './utilities/logger.js'; +import { z } from 'zod'; + +const loggerPrefixLava = 'Lavalink'; + +const lavaNodesFileName = `lavanodes.json`; +const lavaNodesPath = path.resolve(process.cwd(), lavaNodesFileName); + +if (fs.existsSync(lavaNodesPath)) { + loggerSend(`LavaNodes is found in ${lavaNodesPath}`, loggerPrefixLava); +} else { + loggerError(`${lavaNodesFileName} not found`, loggerPrefixLava); + process.exit(1); +} + +const lavaNodesFile = JSON.parse(fs.readFileSync(lavaNodesPath, { encoding: 'utf8', flag: 'r' })); + +const lavaNodesSchema = z.array( + z.object({ + host: z.string(), + port: z.number(), + password: z.string(), + secure: z.boolean() + }) +); + +export const LavaNodes = lavaNodesSchema.parse(lavaNodesFile); diff --git a/src/Script_getCookie.ts b/src/Script_getCookie.ts deleted file mode 100644 index 4a12308..0000000 --- a/src/Script_getCookie.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { getYoutubeCookie } from './CookiesAutomation.js'; -import { loggerSend } from './utilities/logger.js'; - -const cookie = await getYoutubeCookie(); - -if (cookie) { - loggerSend('Cookies written in yt-cookies.json'); -} else { - loggerSend('Cookies fetching is failure'); -} diff --git a/src/audioplayer/AudioPlayersManager.ts b/src/audioplayer/AudioPlayersManager.ts index debdac2..bf95ff1 100644 --- a/src/audioplayer/AudioPlayersManager.ts +++ b/src/audioplayer/AudioPlayersManager.ts @@ -1,11 +1,9 @@ -import { DisTube, Events as DistubeEvents, Playlist, PlayOptions, Queue, RepeatMode, Song } from 'distube'; import { AudioPlayersStore } from './AudioPlayersStore.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 { DistubePlugin } from './LoadPlugins.js'; import { generateAddedPlaylistMessage } from './util/generateAddedPlaylistMessage.js'; import { generateAddedSongMessage } from './util/generateAddedSongMessage.js'; import { @@ -14,34 +12,36 @@ import { CommandInteraction, EmbedBuilder, Guild, + GuildMember, Interaction, TextChannel, VoiceBasedChannel } from 'discord.js'; -import { joinVoiceChannel } from '@discordjs/voice'; import { generateWarningEmbed } from '../utilities/generateWarningEmbed.js'; import { generateLyricsEmbed } from './Lyrics.js'; import { getGuildOptionLeaveOnEmpty, setGuildOptionLeaveOnEmpty } from '../schemas/SchemaGuild.js'; import { addSongToGuildSongsHistory } from '../schemas/SchemaSongsHistory.js'; import { PaginationList } from './PaginationList.js'; +import { nodeResponse, Player, Queue, Riffy, Track } from 'riffy'; +import { LavaNodes } from '../LavalinkNodes.js'; export const loggerPrefixAudioplayer = `Audioplayer`; export class AudioPlayersManager { client: Client; playersManager: AudioPlayersStore; - distube: DisTube; - constructor(client: Client, plugins: Array) { + riffy: Riffy; + constructor(client: Client) { this.client = client; this.client.audioPlayer = this; this.playersManager = new AudioPlayersStore(this.client); - this.distube = new DisTube(this.client, { - nsfw: true, - emitAddListWhenCreatingQueue: true, - emitAddSongWhenCreatingQueue: true, - savePreviousSongs: true, - joinNewVoiceChannel: true, - plugins + this.riffy = new Riffy(this.client, LavaNodes, { + send: (payload) => { + const guild = client.guilds.cache.get(payload.d.guild_id); + if (guild) guild.shard.send(payload); + }, + defaultSearchPlatform: 'ytmsearch', + restVersion: 'v4' }); this.setupEvents(); @@ -50,106 +50,117 @@ export class AudioPlayersManager { async play( voiceChannel: VoiceBasedChannel, textChannel: TextChannel, - query: string | Song | Playlist, - options?: PlayOptions - ) { + query: string, + member: GuildMember + ): Promise { try { - const playableThing: Song | Playlist = await this.distube.handler.resolve(query); - - // 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 - joinVoiceChannel({ - channelId: voiceChannel.id, - guildId: voiceChannel.guildId, - adapterCreator: voiceChannel.guild.voiceAdapterCreator + const player: Player = this.riffy.createConnection({ + guildId: textChannel.guild.id, + voiceChannel: voiceChannel.id, + textChannel: textChannel.id, + deaf: true }); - await this.distube.play(voiceChannel, playableThing, options); + const resolve: nodeResponse = await this.riffy.resolve({ query, requester: member.id }); + const { loadType, tracks, playlistInfo } = resolve; + + if (loadType === 'playlist') { + if (!playlistInfo) return; + for (const track of resolve.tracks) { + track.info.requester = member; + player.queue.add(track); + } + + await textChannel.send(`Added ${tracks.length} songs from ${playlistInfo.name} playlist.`); + + if (!player.playing && !player.paused) await player.play(); + } else if (loadType === 'search' || loadType === 'track') { + const track = tracks.shift(); + if (!track) return; + track.info.requester = member; + + player.queue.add(track); + + await textChannel.send(`Added **${track.info.title}** to the queue.`); + + if (!player.playing && !player.paused) await player.play(); + } else { + await textChannel.send(`There were no results found for your query.`); + } } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); await textChannel.send({ embeds: [generateErrorEmbed(`${query}\n${e.message}`, i18next.t('audioplayer:play_error') as string)] }); - - const queue = this.distube.getQueue(voiceChannel.guildId); - - if (!queue) return; - if (queue.songs.length === 0) await this.stop(voiceChannel.guild.id); } } - async stop(guildId: string) { - const queue = this.distube.getQueue(guildId); - - if (queue) { - await queue.stop(); - queue.voice.leave(); - } else { - this.distube.voices.leave(guildId); - } - + async stop(guildId: string): Promise { + const riffyPlayer = this.riffy.players.get(guildId); + if (!riffyPlayer) return; + riffyPlayer.destroy(); await this.playersManager.remove(guildId); } - async pause(guild: Guild) { - const queue = this.distube.getQueue(guild); - if (!queue) return; - const player = this.playersManager.get(queue.id); + async pause(guild: Guild): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + const player = this.playersManager.get(guild.id); if (!player) return; - if (!queue.paused) { - this.distube.pause(guild); + if (!riffyPlayer.paused) { + riffyPlayer.pause(); 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); + async resume(guild: Guild): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + const player = this.playersManager.get(guild.id); if (!player) return; - if (queue.paused) { - this.distube.resume(guild); + if (riffyPlayer.paused) { + await riffyPlayer.play(); 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); + async pauseResume(guild: Guild): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + + if (!riffyPlayer) return; + const player = this.playersManager.get(guild.id); if (!player) return; - if (queue.paused) { - this.distube.resume(guild); - await player.setState('playing'); + if (riffyPlayer.paused) { + await this.resume(guild); } else { - this.distube.pause(guild); - await player.setState('pause'); + await this.pause(guild); } await player.update(); } - async changeLoopMode(guild: Guild) { - const queue = this.distube.getQueue(guild); - if (!queue) return; - const player = this.playersManager.get(queue.id); + async changeLoopMode(guild: Guild): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + + if (!riffyPlayer) return; + const player = this.playersManager.get(guild.id); if (!player) return; - switch (queue.repeatMode) { - case RepeatMode.DISABLED: - queue.setRepeatMode(RepeatMode.SONG); + switch (riffyPlayer.loop) { + case 'none': + riffyPlayer.setLoop('track'); player.embedBuilder.setLoopMode('song'); break; - case RepeatMode.SONG: - queue.setRepeatMode(RepeatMode.QUEUE); + case 'track': + riffyPlayer.setLoop('queue'); player.embedBuilder.setLoopMode('queue'); break; - case RepeatMode.QUEUE: - queue.setRepeatMode(RepeatMode.DISABLED); + case 'queue': + riffyPlayer.setLoop('none'); player.embedBuilder.setLoopMode('disabled'); break; } @@ -157,13 +168,13 @@ export class AudioPlayersManager { await player.update(); } - async skip(guild: Guild): Promise { + async skip(guild: Guild): Promise { try { - const queue = this.distube.getQueue(guild); - if (queue) { - await this.distube.skip(guild.id); - return queue.songs[0]; - } + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + + riffyPlayer.stop(); + return riffyPlayer.queue.first; } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } @@ -171,46 +182,60 @@ export class AudioPlayersManager { } async shuffle(guild: Guild): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + try { - let queue = this.distube.getQueue(guild); - if (queue) { - queue = await this.distube.shuffle(guild); - const player = this.playersManager.get(queue.id); - if (!player) return undefined; - await player.update(); - return queue; - } + const queue = riffyPlayer.queue; + queue.shuffle(); + const player = this.playersManager.get(guild.id); + if (!player) return undefined; + await player.update(); + return queue; } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } return undefined; } - async jump(guild: Guild, position: number): Promise { + // TODO: Implement Jump in audioplayer + async jump(guild: Guild, position: number): Promise { + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + loggerError('Riffy JUMP is not implemented.'); + /* try { - const queue = this.distube.getQueue(guild); + const queue = riffyPlayer.queue if (queue) { - return this.distube.jump(guild, clamp(position, 1, queue.songs.length)); + return queue. jump(guild, clamp(position, 1, queue.songs.length)); } } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } return undefined; + + */ + return undefined; } - async previous(guild: Guild): Promise { + // TODO: Implement Previous in audioplayer + async previous(guild: Guild): Promise { + /* try { - const queue = this.distube.getQueue(guild); - if (queue) { - return await this.distube.previous(guild); - } + const riffyPlayer = this.riffy.players.get(guild.id); + if (!riffyPlayer) return; + return await riffyPlayer. .previous(guild); } catch (e) { if (ENV.BOT_VERBOSE_LOGGING) loggerError(e); } + */ return undefined; } + // TODO: Implement Rewind in audioplayer async rewind(guild: Guild, time: number): Promise { + return false; + /* try { const queue = this.distube.getQueue(guild); if (!queue) return false; @@ -223,9 +248,14 @@ export class AudioPlayersManager { } catch { return false; } + + */ } + // TODO: Implement showLyrics in audioplayer async showLyrics(interaction: ButtonInteraction) { + await interaction.reply({ content: 'undefined' }); + /* if (!interaction.guild) return; const queue = this.distube.getQueue(interaction.guild); if (!queue) { @@ -235,9 +265,14 @@ export class AudioPlayersManager { const song = queue.songs[0]; await interaction.reply({ embeds: [await generateLyricsEmbed(song.name!)] }); + + */ } - async showQueue(interaction: Interaction) { + // TODO: Implement showQueue in audioplayer + async showQueue(interaction: ButtonInteraction) { + await interaction.reply({ content: 'undefined' }); + /* if (!interaction.guild) return; const queue = this.distube.getQueue(interaction.guild); if (!queue) { @@ -275,6 +310,8 @@ export class AudioPlayersManager { } await PaginationList(interaction as CommandInteraction, arrayEmbeds, interaction.user); + + */ } async setLeaveOnEmpty(guild: Guild, mode: boolean) { @@ -286,6 +323,7 @@ export class AudioPlayersManager { } private setupEvents() { + /* if (ENV.BOT_VERBOSE_LOGGING) { this.distube.on(DistubeEvents.DEBUG, (message) => { loggerSend(message, loggerPrefixAudioplayer); @@ -375,5 +413,7 @@ export class AudioPlayersManager { embeds: [generateErrorEmbed(errorMessage, errorName)] }); }); + + */ } } diff --git a/src/audioplayer/AudioPlayersStore.ts b/src/audioplayer/AudioPlayersStore.ts index ddce13d..ff37011 100644 --- a/src/audioplayer/AudioPlayersStore.ts +++ b/src/audioplayer/AudioPlayersStore.ts @@ -1,6 +1,6 @@ import { Client, Collection, GuildTextBasedChannel } from 'discord.js'; -import { Queue } from 'distube'; import { PlayerInstance } from './PlayerInstance.js'; +import { Riffy } from 'riffy'; export class AudioPlayersStore { private readonly client: Client; @@ -8,10 +8,10 @@ export class AudioPlayersStore { constructor(_client: Client) { this.client = _client; } - async add(guildId: string, textChannel: GuildTextBasedChannel, queue: Queue): Promise { + async add(guildId: string, textChannel: GuildTextBasedChannel, riffy: Riffy): Promise { if (this.client.guilds.cache.get(guildId)) { if (!this.collection.has(guildId)) { - this.collection.set(guildId, new PlayerInstance(this.client, textChannel, queue)); + this.collection.set(guildId, new PlayerInstance(this.client, textChannel, riffy)); } return this.collection.get(guildId); diff --git a/src/audioplayer/LoadPlugins.ts b/src/audioplayer/LoadPlugins.ts deleted file mode 100644 index 13a28df..0000000 --- a/src/audioplayer/LoadPlugins.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { ExtractorPlugin, InfoExtractorPlugin, PlayableExtractorPlugin } from 'distube'; -import { ENV } from '../EnvironmentVariables.js'; -import { loggerError, loggerSend, loggerWarn } from '../utilities/logger.js'; -import { SpotifyPlugin } from '@distube/spotify'; -import { YtDlpPlugin } from '@distube/yt-dlp'; -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'; -import { SoundCloudPlugin } from './plugins/soundcloud.js'; -import { getYoutubeCookie } from '../CookiesAutomation.js'; -import Cron from 'node-cron'; - -import fs from 'fs'; -import { VKMusicPlugin } from 'distube-vk-music-plugin'; - -const loggerPrefixAudioplayerPluginsLoader = 'Audioplayer Plugin Loader'; - -export type DistubePlugin = ExtractorPlugin | InfoExtractorPlugin | PlayableExtractorPlugin; - -const YtPlugin = new YouTubePlugin({}); - -export async function LoadPlugins(): Promise> { - const plugins: Array = []; - - if (ENV.BOT_VKONTAKTE_TOKEN) { - plugins.push( - new VKMusicPlugin({ - token: ENV.BOT_VKONTAKTE_TOKEN - }) - ); - } else { - loggerWarn( - 'VKontakte Music plugin is disabled, because BOT_VKONTAKTE_TOKEN are wrong or not provided', - loggerPrefixAudioplayerPluginsLoader - ); - } - - await loadPluginsPartYoutube(plugins); - - 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', - loggerPrefixAudioplayerPluginsLoader - ); - } - - 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', - loggerPrefixAudioplayerPluginsLoader - ); - } - - 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', - loggerPrefixAudioplayerPluginsLoader - ); - } - - 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()); - - // YouTube Plugin and YtDLP are different thing - plugins.push( - new YtDlpPlugin({ - update: true - }) - ); - - loggerSend( - `Loaded plugins: ${plugins.map((plugin: DistubePlugin) => { - return ' ' + plugin.constructor.name; - })}`, - loggerPrefixAudioplayerPluginsLoader - ); - - return plugins; -} - -function setupYtCookieSchedule() { - if (ENV.BOT_GOOGLE_EMAIL && ENV.BOT_GOOGLE_PASSWORD) { - loggerSend('Google data is provided, setup cron job for cookies fetching', loggerPrefixAudioplayerPluginsLoader); - Cron.schedule('0 0 * * *', async () => { - const cookies = await getYoutubeCookie(); - if (!cookies) return; - YtPlugin.cookies = cookies; - loggerSend('Cookies is fetched by cron job through Google Auth', loggerPrefixAudioplayerPluginsLoader); - }); - } -} - -async function loadPluginsPartYoutube(plugins: Array) { - plugins.push(YtPlugin); - - setupYtCookieSchedule(); - - if (fs.existsSync('yt-cookies.json')) { - try { - YtPlugin.cookies = JSON.parse(fs.readFileSync('yt-cookies.json', { encoding: 'utf8', flag: 'r' })); - loggerSend("'yt-cookies.json' is loaded", loggerPrefixAudioplayerPluginsLoader); - } catch { - loggerError("'yt-cookies.json' error when parsing", loggerPrefixAudioplayerPluginsLoader); - if (ENV.BOT_GOOGLE_EMAIL && ENV.BOT_GOOGLE_PASSWORD) { - YtPlugin.cookies = await getYoutubeCookie(); - } - } - } else { - loggerWarn("'yt-cookies.json' not found", loggerPrefixAudioplayerPluginsLoader); - - if (ENV.BOT_GOOGLE_EMAIL && ENV.BOT_GOOGLE_PASSWORD) { - loggerSend('Trying to fetch cookie from Google Auth, this might be take a time'); - YtPlugin.cookies = await getYoutubeCookie(); - } - } - - if (YtPlugin.cookies === undefined) { - loggerWarn( - 'Could not find any cookies, Please, follow instructions in README.md', - loggerPrefixAudioplayerPluginsLoader - ); - } -} diff --git a/src/audioplayer/Lyrics.ts b/src/audioplayer/Lyrics.ts index a6e5512..18520b5 100644 --- a/src/audioplayer/Lyrics.ts +++ b/src/audioplayer/Lyrics.ts @@ -1,16 +1,12 @@ -import Genius from 'genius-lyrics'; import { ENV } from '../EnvironmentVariables.js'; import { Colors, EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; import { loggerWarn } from '../utilities/logger.js'; import { generateErrorEmbed } from '../utilities/generateErrorEmbed.js'; -const Lyrics = new Genius.Client(ENV.BOT_GENIUS_TOKEN); - -if (!ENV.BOT_GENIUS_TOKEN) { - loggerWarn('BOT_GENIUS_TOKEN is not provided, lyrics module disabled', 'Lyrics'); -} +// TODO: Reimplement lyrics with Lava-Lyrics export async function getLyricsSong(searchQuery: string) { + /* const geniusSearch = await Lyrics.songs.search(searchQuery); if (geniusSearch.length === 0) { @@ -18,9 +14,11 @@ export async function getLyricsSong(searchQuery: string) { } return geniusSearch[0]; + */ } export async function generateLyricsEmbed(songQuery: string) { + /* const geniusSong = await getLyricsSong(songQuery); if (!geniusSong) { @@ -41,4 +39,6 @@ export async function generateLyricsEmbed(songQuery: string) { } catch { return generateErrorEmbed(i18next.t('commands:lyrics_embed_lyrics_not_found')); } + + */ } diff --git a/src/audioplayer/PlayerButtons.ts b/src/audioplayer/PlayerButtons.ts index bb5a360..2789331 100644 --- a/src/audioplayer/PlayerButtons.ts +++ b/src/audioplayer/PlayerButtons.ts @@ -205,20 +205,20 @@ export class PlayerButtons { case ButtonIDs.favorite: { try { - const queue = ButtonInteraction.client.audioPlayer.distube.getQueue(ButtonInteraction.guild as Guild); + const riffyPlayer = ButtonInteraction.client.audioPlayer.riffy.get((ButtonInteraction.guild as Guild).id); - if (!queue || queue.songs.length === 0) { + if (!riffyPlayer || riffyPlayer.queue.length === 0) { await ButtonInteraction.deferUpdate(); return; } - await UserPlaylistAddFavoriteSong(ButtonInteraction.user.id, queue.songs[0]); + await UserPlaylistAddFavoriteSong(ButtonInteraction.user.id, riffyPlayer.queue.first); await ButtonInteraction.reply({ embeds: [ generateSimpleEmbed( i18next.t('audioplayer:song_added_to_favorite', { - name: queue.songs[0].name!, + name: riffyPlayer.queue.first?.info.title, interpolation: { escapeValue: false } }) ) diff --git a/src/audioplayer/PlayerEmbed.ts b/src/audioplayer/PlayerEmbed.ts index d1a8165..8edb916 100644 --- a/src/audioplayer/PlayerEmbed.ts +++ b/src/audioplayer/PlayerEmbed.ts @@ -2,9 +2,9 @@ import { EmbedBuilder, User } from 'discord.js'; import { AudioPlayerLoopMode, AudioPlayerState, AudioSourceIcons } from './AudioPlayerIcons.js'; import { formatSecondsToTime } from '../utilities/formatSecondsToTime.js'; import i18next from 'i18next'; -import { Playlist, Song } from 'distube'; import { getIconFromSource } from './util/getIconFromSource.js'; import { getSongsNoun } from './util/getSongsNoun.js'; +import { nodeResponse, Track } from 'riffy'; export class PlayerEmbed extends EmbedBuilder { private playerState: AudioPlayerState = 'loading'; @@ -76,8 +76,8 @@ export class PlayerEmbed extends EmbedBuilder { return this; } - setSongSource(playable: Song | Playlist) { - this.sourceIcon = getIconFromSource(playable.source); + setSongSource(playable: Track) { + this.sourceIcon = getIconFromSource(playable.info.sourceName); } setSongTitle(name: string, url: string) { diff --git a/src/audioplayer/PlayerInstance.ts b/src/audioplayer/PlayerInstance.ts index 3af1293..9c759ac 100644 --- a/src/audioplayer/PlayerInstance.ts +++ b/src/audioplayer/PlayerInstance.ts @@ -1,6 +1,5 @@ import { Client, GuildTextBasedChannel, Message } from 'discord.js'; import { PlayerEmbed } from './PlayerEmbed.js'; -import { Queue, Song } from 'distube'; import { PlayerButtons } from './PlayerButtons.js'; import { AudioPlayerState } from './AudioPlayerIcons.js'; import { checkBotInVoice } from '../utilities/checkBotInVoice.js'; @@ -8,6 +7,7 @@ import i18next from 'i18next'; import { ENV } from '../EnvironmentVariables.js'; import { loggerError } from '../utilities/logger.js'; import { generateSimpleEmbed } from '../utilities/generateSimpleEmbed.js'; +import { Player, Riffy, Track } from 'riffy'; export class PlayerInstance { private readonly client: Client; @@ -21,7 +21,7 @@ export class PlayerInstance { private buttonsHandler: PlayerButtons; // Message where player is stored right now private messageWithPlayer: Message | undefined; - private queue: Queue; + private riffy; // Variable for "recreationPlayer" lastDeletedMessage: Message | undefined; // Delay for player recreation @@ -39,10 +39,10 @@ export class PlayerInstance { private leaveOnEmpty: boolean; - constructor(client: Client, txtChannel: GuildTextBasedChannel, queue: Queue) { + constructor(client: Client, txtChannel: GuildTextBasedChannel, riffy: Riffy) { this.client = client; this.textChannel = txtChannel; - this.queue = queue; + this.riffy = riffy; this.buttonsHandler = new PlayerButtons(this.client, this.textChannel); this.leaveOnEmpty = false; } @@ -75,9 +75,9 @@ export class PlayerInstance { if (checkBotInVoice(this.textChannel.guild)) { await this.stopFinishTimer(); this.finishTimer = setTimeout(async () => { - const queue = this.client.audioPlayer.distube.getQueue(this.textChannel.guild.id); + const riffyPlayer = this.riffy.get(this.textChannel.guild.id); // loggerSend('try to stop player on cooldown') - if (queue) return; + if (riffyPlayer) return; if (checkBotInVoice(this.textChannel.guild)) { await this.client.audioPlayer.stop(this.textChannel.guild.id); await this.textChannel.send({ @@ -100,29 +100,28 @@ export class PlayerInstance { } // 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.id); - if (queue) { - this.queue = queue; - } + const riffyPlayer: Player = this.riffy.get(this.textChannel.guild.id); + // loggerSend('try to stop player on cooldown') + if (!riffyPlayer) return; this.embedBuilder.setPlayerState(this.state); - const currentSong: Song = this.queue.songs[0]; + const currentSong: Track | null = riffyPlayer.queue.first; if (currentSong) { - this.embedBuilder.setSongDuration(currentSong.duration, currentSong.isLive); + this.embedBuilder.setSongDuration(currentSong.info.length, currentSong.info.stream); this.embedBuilder.setSongSource(currentSong); this.embedBuilder.setSongTitle( - currentSong.name ?? i18next.t('audioplayer:player_embed_unknown'), - currentSong.url! + currentSong.info.title ?? i18next.t('audioplayer:player_embed_unknown'), + currentSong.info.uri! ); - this.embedBuilder.setThumbnailURL(currentSong.thumbnail ?? null); - this.embedBuilder.setUploader(currentSong.uploader.name); + this.embedBuilder.setThumbnailURL(currentSong.info.thumbnail); + this.embedBuilder.setUploader(currentSong.info.author); - if (currentSong.user) { - this.embedBuilder.setRequester(currentSong.user!); + if (currentSong.info.requester) { + this.embedBuilder.setRequester(currentSong.info.requester!); } } - this.embedBuilder.setNextSong(this.queue.songs[1]?.name); - this.embedBuilder.setQueueData(this.queue.songs.length, this.queue.duration); + this.embedBuilder.setNextSong(riffyPlayer.queue.at(1)?.info.title); + this.embedBuilder.setQueueData(riffyPlayer.queue.length, 99999); this.embedBuilder.update(); } @@ -188,8 +187,8 @@ export class PlayerInstance { async update() { if (!this.messageWithPlayer) return; if (this.state === 'destroying') return; - if (!this.client.audioPlayer.distube.voices.has(this.messageWithPlayer.guild!)) { - //loggerSend("I am not in channel, so destroy") + const riffyPlayer: Player = this.riffy.get(this.textChannel.guild.id); + if (!riffyPlayer) { await this.destroy(); return; } @@ -231,16 +230,12 @@ export class PlayerInstance { // Changed state of the player and update player message async setState(state: AudioPlayerState) { 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.id); - if (queue) { - this.queue = queue; - } + const riffyPlayer: Player = this.riffy.get(this.textChannel.guild.id); + if (!riffyPlayer) return; if (this.state === 'waiting' && this.leaveOnEmpty) { await this.startFinishTimer(); - } else if (queue) { + } else if (riffyPlayer.queue.length > 0) { await this.stopFinishTimer(); } @@ -269,6 +264,8 @@ export class PlayerInstance { // Debug info for text command $audiodebug debug(): string { - return `GuildName: ${this.textChannel.guild.name}, Player State: ${this.state}, GuildID: ${this.textChannel.guildId}, VoiceChannelID: ${this.queue.voice.channel.id}, VoiceChannelName: ${this.queue.voice.channel.name}, TextChannelId: ${this.textChannel.id}, TextChannelName: ${this.textChannel.name} Message ID: ${this.messageWithPlayer?.id}\n`; + const riffyPlayer: Player = this.riffy.get(this.textChannel.guild.id); + if (!riffyPlayer) return 'undefined'; + return `GuildName: ${this.textChannel.guild.name}, Player State: ${this.state}, GuildID: ${this.textChannel.guildId}, VoiceChannel: ${riffyPlayer.voiceChannel}, TextChannelId: ${this.textChannel.id}, TextChannelName: ${this.textChannel.name} Message ID: ${this.messageWithPlayer?.id}\n`; } } diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventRaw.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventRaw.ts new file mode 100644 index 0000000..75ddbb4 --- /dev/null +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventRaw.ts @@ -0,0 +1,6 @@ +import { Client, GatewayDispatchEvents } from 'discord.js'; + +export async function AudioPlayerEventRaw(client: Client, d: any) { + if (![GatewayDispatchEvents.VoiceStateUpdate, GatewayDispatchEvents.VoiceServerUpdate].includes(d.t)) return; + client.audioPlayer.riffy.updateVoiceState(d); +} diff --git a/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts index 4d5f27b..162fe73 100644 --- a/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts +++ b/src/audioplayer/eventsHandlers/AudioPlayerEventVoiceChannelUpdate.ts @@ -1,8 +1,9 @@ import { Client, VoiceState } from 'discord.js'; -import { isVoiceChannelEmpty } from 'distube'; import { getGuildOptionLeaveOnEmpty } from '../../schemas/SchemaGuild.js'; +// TODO: Implement AudioPlayerEventVoiceChannelUpdate export async function AudioPlayerEventVoiceChannelUpdate(client: Client, oldState: VoiceState, newState: VoiceState) { + /* const messagePlayer = client.audioPlayer.playersManager.get(oldState.guild.id); if (!messagePlayer) return; @@ -15,4 +16,6 @@ export async function AudioPlayerEventVoiceChannelUpdate(client: Client, oldStat await client.audioPlayer.resume(oldState.guild); } } + + */ } diff --git a/src/audioplayer/plugins/soundcloud.ts b/src/audioplayer/plugins/soundcloud.ts deleted file mode 100644 index 92c6e9b..0000000 --- a/src/audioplayer/plugins/soundcloud.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Soundcloud } from 'soundcloud.ts'; -import { DisTubeError, ExtractorPlugin, Playlist, Song, checkInvalidKey } from 'distube'; -import type { ResolveOptions } from 'distube'; -import type { SoundcloudPlaylistV2, SoundcloudTrackV2 } from 'soundcloud.ts'; - -type Falsy = undefined | null | false | 0 | ''; -const isTruthy = (x: T | Falsy): x is T => Boolean(x); -export enum SearchType { - Track = 'track', - Playlist = 'playlist' -} - -export interface SoundCloudPluginOptions { - clientId?: string; - oauthToken?: string; -} - -export class SoundCloudPlugin extends ExtractorPlugin { - soundcloud: Soundcloud; - constructor(options: SoundCloudPluginOptions = {}) { - super(); - if (typeof options !== 'object' || Array.isArray(options)) { - throw new DisTubeError('INVALID_TYPE', ['object', 'undefined'], options, 'SoundCloudPluginOptions'); - } - checkInvalidKey(options, ['clientId', 'oauthToken'], 'SoundCloudPluginOptions'); - if (options.clientId && typeof options.clientId !== 'string') { - throw new DisTubeError('INVALID_TYPE', 'string', options.clientId, 'clientId'); - } - if (options.oauthToken && typeof options.oauthToken !== 'string') { - throw new DisTubeError('INVALID_TYPE', 'string', options.oauthToken, 'oauthToken'); - } - - this.soundcloud = new Soundcloud(options.clientId, options.oauthToken); - } - search(query: string, type?: SearchType.Track, limit?: number, options?: ResolveOptions): Promise[]>; - search( - query: string, - type: SearchType.Playlist, - limit?: number, - options?: ResolveOptions - ): Promise[]>; - search( - query: string, - type?: SearchType, - limit?: number, - options?: ResolveOptions - ): Promise[] | Playlist[]>; - async search(query: string, type: SearchType = SearchType.Track, limit = 10, options: ResolveOptions = {}) { - if (typeof query !== 'string') { - throw new DisTubeError('INVALID_TYPE', 'string', query, 'query'); - } - if (!Object.values(SearchType).includes(type)) { - throw new DisTubeError('INVALID_TYPE', Object.values(SearchType), type, 'type'); - } - if (typeof limit !== 'number' || limit < 1 || !Number.isInteger(limit)) { - throw new DisTubeError('INVALID_TYPE', 'natural number', limit, 'limit'); - } - if (typeof options !== 'object' || Array.isArray(options)) { - throw new DisTubeError('INVALID_TYPE', 'object', options, 'ResolveOptions'); - } - - await this.soundcloud.api.getClientId().catch(() => { - throw new DisTubeError( - 'SOUNDCLOUD_PLUGIN_NO_CLIENT_ID', - 'Cannot find SoundCloud client id automatically. Please provide a client id in the constructor.\nGuide: https://github.com/distubejs/soundcloud#documentation' - ); - }); - - switch (type) { - case SearchType.Track: { - const data = await this.soundcloud.tracks.searchV2({ q: query, limit }); - if (!data?.collection?.length) { - throw new DisTubeError('SOUNDCLOUD_PLUGIN_NO_RESULT', `Cannot find any "${query}" ${type} on SoundCloud!`); - } - return data.collection.map((t: SoundcloudTrackV2) => new SoundCloudSong(this, t, options)); - } - case SearchType.Playlist: { - const data = await this.soundcloud.playlists.searchV2({ q: query, limit }); - const playlists = data.collection; - return ( - await Promise.all( - playlists.map( - async (p: SoundcloudPlaylistV2) => - new SoundCloudPlaylist(this, await this.soundcloud.playlists.fetch(p), options) - ) - ) - ).filter(isTruthy); - } - default: - throw new DisTubeError('SOUNDCLOUD_PLUGIN_UNSUPPORTED_TYPE', `${type} search is not supported!`); - } - } - - validate(url: string) { - return /^https?:\/\/(?:(?:www|m)\.)?soundcloud\.com\/(.*)$/.test(url); - } - - async resolve(url: string, options: ResolveOptions) { - await this.soundcloud.api.getClientId().catch(() => { - throw new DisTubeError( - 'SOUNDCLOUD_PLUGIN_NO_CLIENT_ID', - 'Cannot find SoundCloud client id automatically. Please provide a client id in the constructor.\nGuide: https://github.com/distubejs/soundcloud#documentation' - ); - }); - const opt = { ...options, source: 'soundcloud' }; - url = url.replace(/:\/\/(m|www)\./g, '://'); - const data = await this.soundcloud.resolve.getV2(url, true).catch((e: { message: string }) => { - throw new DisTubeError('SOUNDCLOUD_PLUGIN_RESOLVE_ERROR', e.message); - }); - if (!data || !['track', 'playlist'].includes(data.kind)) { - throw new DisTubeError('SOUNDCLOUD_PLUGIN_NOT_SUPPORTED', 'Only public tracks and playlists are supported.'); - } - - return data.kind === 'playlist' - ? new SoundCloudPlaylist(this, await this.soundcloud.playlists.fetch(data), opt) - : new SoundCloudSong(this, data, opt); - } - - async getRelatedSongs(song: SoundCloudSong) { - if (!song.url) { - throw new DisTubeError('SOUNDCLOUD_PLUGIN_INVALID_SONG', 'Cannot get related songs from invalid song.'); - } - const related = await this.soundcloud.tracks.relatedV2(song.url, 10); - return related.filter((t: SoundcloudTrackV2) => t.title).map((t: SoundcloudTrackV2) => new SoundCloudSong(this, t)); - } - - async getStreamURL(song: SoundCloudSong) { - if (!song.url) { - throw new DisTubeError('SOUNDCLOUD_PLUGIN_INVALID_SONG', 'Cannot get stream url from invalid song.'); - } - const stream = await this.soundcloud.util.streamLink(song.url); - if (!stream) { - throw new DisTubeError( - 'SOUNDCLOUD_PLUGIN_RATE_LIMITED', - 'Reached SoundCloud rate limits\nSee more: https://developers.soundcloud.com/docs/api/rate-limits#play-requests' - ); - } - return stream; - } - - async searchSong(query: string, options: ResolveOptions) { - const songs = await this.search(query, SearchType.Track, 1, options); - return songs[0]; - } -} - -class SoundCloudSong extends Song { - constructor(plugin: SoundCloudPlugin, info: SoundcloudTrackV2, options: ResolveOptions = {}) { - super( - { - plugin, - source: 'soundcloud', - playFromSource: true, - id: info.id.toString(), - name: info.title, - url: info.permalink_url, - thumbnail: info.artwork_url, - duration: info.duration / 1000, - views: info.playback_count, - uploader: { - name: info.user?.username, - url: info.user?.permalink_url - }, - likes: info.likes_count, - reposts: info.reposts_count - }, - options - ); - } -} - -class SoundCloudPlaylist extends Playlist { - constructor(plugin: SoundCloudPlugin, info: SoundcloudPlaylistV2, options: ResolveOptions = {}) { - super( - { - source: 'soundcloud', - id: info.id.toString(), - name: info.title, - url: info.permalink_url, - thumbnail: info.artwork_url ?? undefined, - songs: info.tracks.map((s: SoundcloudTrackV2) => new SoundCloudSong(plugin, s, options)) - }, - options - ); - } -} - -export default SoundCloudPlugin; diff --git a/src/audioplayer/tests/AudioServices.test.ts b/src/audioplayer/tests/AudioServices.test.ts index 6859c07..4cc90d3 100644 --- a/src/audioplayer/tests/AudioServices.test.ts +++ b/src/audioplayer/tests/AudioServices.test.ts @@ -1,6 +1,7 @@ +//TODO: Refactor tests for AudioServices +/* import * as assert from 'node:assert'; import { describe, it, before, after } from 'node:test'; -import { DisTube } from 'distube'; import { Client } from 'discord.js'; import { LoadPlugins } from '../LoadPlugins.js'; import '../../EnvironmentVariables.js'; @@ -137,3 +138,6 @@ after(() => { process.exit(0); }, 1000); }); + + + */ diff --git a/src/audioplayer/util/downloadSong.ts b/src/audioplayer/util/downloadSong.ts index 00ef146..562877a 100644 --- a/src/audioplayer/util/downloadSong.ts +++ b/src/audioplayer/util/downloadSong.ts @@ -1,10 +1,11 @@ +// TODO: Reimplement song downloading +/* import { AttachmentBuilder, Client } from 'discord.js'; import prism from 'prism-media'; import fs, { createReadStream, ReadStream } from 'fs'; import { pipeline } from 'stream/promises'; import { v4 as uuidv4 } from 'uuid'; import { unlink } from 'fs/promises'; -import { isURL, Playlist, Song } from 'distube'; import i18next from 'i18next'; import path from 'path'; @@ -108,3 +109,4 @@ export function DownloadSongErrorGetLocale(errorMessage: DownloadSongMessage) { return errorMessage; } +*/ diff --git a/src/audioplayer/util/generateAddedPlaylistMessage.ts b/src/audioplayer/util/generateAddedPlaylistMessage.ts index c9bcc96..f30bdff 100644 --- a/src/audioplayer/util/generateAddedPlaylistMessage.ts +++ b/src/audioplayer/util/generateAddedPlaylistMessage.ts @@ -1,10 +1,11 @@ -import { Playlist } from 'distube'; +// @ts-nocheck import { EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; import { getIconFromSource } from './getIconFromSource.js'; +import { nodeResponse } from 'riffy'; -export function generateAddedPlaylistMessage(playlist: Playlist) { - const serviceIcon = getIconFromSource(playlist.source); +export function generateAddedPlaylistMessage(playlist: nodeResponse) { + const serviceIcon = getIconFromSource(playlist.pluginInfo?.name ?? undefined); return new EmbedBuilder() .setTitle(playlist.name ? `${serviceIcon} ${playlist.name}` : i18next.t('audioplayer:player_embed_unknown')) diff --git a/src/audioplayer/util/generateAddedSongMessage.ts b/src/audioplayer/util/generateAddedSongMessage.ts index 51ba5e3..ab1e66f 100644 --- a/src/audioplayer/util/generateAddedSongMessage.ts +++ b/src/audioplayer/util/generateAddedSongMessage.ts @@ -1,4 +1,4 @@ -import { Song } from 'distube'; +// @ts-nocheck import { EmbedBuilder } from 'discord.js'; import i18next from 'i18next'; import { getIconFromSource } from './getIconFromSource.js'; diff --git a/src/audioplayer/util/getIconFromSource.ts b/src/audioplayer/util/getIconFromSource.ts index d7bdf47..134fb19 100644 --- a/src/audioplayer/util/getIconFromSource.ts +++ b/src/audioplayer/util/getIconFromSource.ts @@ -1,5 +1,4 @@ import { AudioSourceIcons } from '../AudioPlayerIcons.js'; -import { VK_MUSIC_PLUGIN_SOURCE } from 'distube-vk-music-plugin'; export function getIconFromSource(source: string): AudioSourceIcons { switch (source) { @@ -15,7 +14,7 @@ export function getIconFromSource(source: string): AudioSourceIcons { return AudioSourceIcons.soundcloud; case 'yandexmusic': return AudioSourceIcons.yandexmusic; - case VK_MUSIC_PLUGIN_SOURCE: + case 'vkontakte': return AudioSourceIcons.vkontakte; default: return AudioSourceIcons.other; diff --git a/src/audioplayer/util/queueSongsIsFull.ts b/src/audioplayer/util/queueSongsIsFull.ts index 3882fa2..9059477 100644 --- a/src/audioplayer/util/queueSongsIsFull.ts +++ b/src/audioplayer/util/queueSongsIsFull.ts @@ -2,9 +2,11 @@ import { Client, Guild } from 'discord.js'; import { ENV } from '../../EnvironmentVariables.js'; export function queueSongsIsFull(client: Client, guild: Guild): boolean { - const queue = client.audioPlayer.distube.getQueue(guild); + try { + const riffyPlayer = client.audioPlayer.riffy.get(guild.id); - if (!queue) return false; - - return queue.songs.length >= ENV.BOT_MAX_SONGS_IN_QUEUE; + return riffyPlayer.queue.length >= ENV.BOT_MAX_SONGS_IN_QUEUE; + } catch { + return false; + } } diff --git a/src/commands/audio/download.command.ts b/src/commands/audio/download.command.ts index 447e0c0..b3974a9 100644 --- a/src/commands/audio/download.command.ts +++ b/src/commands/audio/download.command.ts @@ -1,12 +1,8 @@ +// @ts-nocheck import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { PermissionsBitField, SlashCommandBuilder, TextChannel } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; import { services } from './play.command.js'; -import { - deleteMP3file, - DownloadSongErrorGetLocale, - getSongFileAttachment -} 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 b6a6b91..ad324a6 100644 --- a/src/commands/audio/jump.command.ts +++ b/src/commands/audio/jump.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { EmbedBuilder, GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; @@ -6,7 +7,6 @@ import { AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; -import { Song } from 'distube'; import i18next from 'i18next'; import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; diff --git a/src/commands/audio/lyrics.command.ts b/src/commands/audio/lyrics.command.ts index 8ab6477..1d560e1 100644 --- a/src/commands/audio/lyrics.command.ts +++ b/src/commands/audio/lyrics.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { CommandArgument, ICommand } from '../../CommandTypes.js'; import { Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import i18next from 'i18next'; diff --git a/src/commands/audio/pl-add.command.ts b/src/commands/audio/pl-add.command.ts index beb281c..05bad9b 100644 --- a/src/commands/audio/pl-add.command.ts +++ b/src/commands/audio/pl-add.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { CommandArgument, ICommand, ReplyContext } from '../../CommandTypes.js'; import { GroupAudio } from './AudioTypes.js'; import { Message, PermissionsBitField, SlashCommandBuilder, User } from 'discord.js'; @@ -8,7 +9,6 @@ import { UserPlaylistAddSong, UserPlaylistNamesAutocomplete } from '../../schemas/SchemaPlaylist.js'; -import { Playlist } from 'distube'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { ENV } from '../../EnvironmentVariables.js'; import { loggerError } from '../../utilities/logger.js'; diff --git a/src/commands/audio/pl-play.command.ts b/src/commands/audio/pl-play.command.ts index deca9f4..0710c17 100644 --- a/src/commands/audio/pl-play.command.ts +++ b/src/commands/audio/pl-play.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { CommandArgument, ICommand, ReplyContext } from '../../CommandTypes.js'; import { GroupAudio } from './AudioTypes.js'; import { @@ -14,7 +15,6 @@ import { PlaylistIsNotExists, UserPlaylistGet, UserPlaylistNamesAutocomplete } f import { queueSongsIsFull } from '../../audioplayer/util/queueSongsIsFull.js'; import { generateWarningEmbed } from '../../utilities/generateWarningEmbed.js'; import { ENV } from '../../EnvironmentVariables.js'; -import { Song } from 'distube'; import { generateErrorEmbed } from '../../utilities/generateErrorEmbed.js'; import { loggerError } from '../../utilities/logger.js'; import { commandEmptyReply } from '../../utilities/commandEmptyReply.js'; diff --git a/src/commands/audio/play.command.ts b/src/commands/audio/play.command.ts index 8230da7..6cca880 100644 --- a/src/commands/audio/play.command.ts +++ b/src/commands/audio/play.command.ts @@ -13,8 +13,6 @@ import { import { GroupAudio } from './AudioTypes.js'; import { truncateString } from '../../utilities/truncateString.js'; import i18next from 'i18next'; -import { SearchResultType } from '@distube/youtube'; -import ytsr from '@distube/ytsr'; import { generateWarningEmbed } from '../../utilities/generateWarningEmbed.js'; import { ENV } from '../../EnvironmentVariables.js'; import { queueSongsIsFull } from '../../audioplayer/util/queueSongsIsFull.js'; @@ -72,7 +70,7 @@ 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, @@ -95,6 +93,7 @@ export async function songSearchAutocomplete(interaction: AutocompleteInteractio } await interaction.respond([]); + */ } async function playAndReply(ctx: ReplyContext, songQuery: string) { @@ -116,8 +115,10 @@ async function playAndReply(ctx: ReplyContext, songQuery: string) { const member = ctx.member as GuildMember; - await ctx.client.audioPlayer.play(member.voice.channel as VoiceChannel, ctx.channel as TextChannel, songQuery, { - member, - textChannel: ctx.channel as TextChannel - }); + await ctx.client.audioPlayer.play( + member.voice.channel as VoiceChannel, + ctx.channel as TextChannel, + songQuery, + member + ); } diff --git a/src/commands/audio/playfile.command.ts b/src/commands/audio/playfile.command.ts index 48a37f7..6a489ad 100644 --- a/src/commands/audio/playfile.command.ts +++ b/src/commands/audio/playfile.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { ICommand } from '../../CommandTypes.js'; import { Guild, diff --git a/src/commands/audio/playing.command.ts b/src/commands/audio/playing.command.ts index 35cb092..925c117 100644 --- a/src/commands/audio/playing.command.ts +++ b/src/commands/audio/playing.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { ICommand } from '../../CommandTypes.js'; import { EmbedBuilder, Guild, Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; @@ -6,7 +7,6 @@ import { AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; import { splitBar } from '../../utilities/splitBar.js'; -import { Queue } from 'distube'; import i18next from 'i18next'; export default function (): ICommand { diff --git a/src/commands/audio/previous.command.ts b/src/commands/audio/previous.command.ts index 869df32..5705372 100644 --- a/src/commands/audio/previous.command.ts +++ b/src/commands/audio/previous.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { ICommand } from '../../CommandTypes.js'; import { EmbedBuilder, GuildMember, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; @@ -5,7 +6,6 @@ import { AudioCommandWrapperInteraction, AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; -import { Song } from 'distube'; import i18next from 'i18next'; import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; diff --git a/src/commands/audio/skip.command.ts b/src/commands/audio/skip.command.ts index 9e34ac6..a8e10db 100644 --- a/src/commands/audio/skip.command.ts +++ b/src/commands/audio/skip.command.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { ICommand } from '../../CommandTypes.js'; import { EmbedBuilder, GuildMember, Message, PermissionsBitField, SlashCommandBuilder } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; @@ -5,7 +6,6 @@ import { AudioCommandWrapperInteraction, AudioCommandWrapperText } from '../../audioplayer/util/AudioCommandWrappers.js'; -import { Song } from 'distube'; import i18next from 'i18next'; import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; diff --git a/src/events/onReady.event.ts b/src/events/onReady.event.ts index 1eacd88..27c0ff9 100644 --- a/src/events/onReady.event.ts +++ b/src/events/onReady.event.ts @@ -8,6 +8,8 @@ const event: BotEvent = { execute: (client) => { if (!client.user) return; + client.audioPlayer.riffy.init(client.user.id); + loggerSend(`Bot ${client.user.username} is successfully started!`); client.user.setActivity('/help'); } diff --git a/src/events/raw.event.ts b/src/events/raw.event.ts new file mode 100644 index 0000000..04e5bec --- /dev/null +++ b/src/events/raw.event.ts @@ -0,0 +1,12 @@ +import { BotEvent } from '../DiscordTypes.js'; +import { Events, GatewayDispatchEvents } from 'discord.js'; +import { AudioPlayerEventRaw } from '../audioplayer/eventsHandlers/AudioPlayerEventRaw.js'; + +const event: BotEvent = { + name: Events.Raw, + execute: (client, d) => { + AudioPlayerEventRaw(client, d); + } +}; + +export default event; diff --git a/src/handlers/Event.handler.ts b/src/handlers/Event.handler.ts index c79e7c0..649a0a5 100644 --- a/src/handlers/Event.handler.ts +++ b/src/handlers/Event.handler.ts @@ -24,9 +24,9 @@ const handler = async (client: Client) => { const event: BotEvent = eventModule.default; if (event.once) { - client.once(event.name, (...args) => event.execute(client, ...args)); + client.once(event.name as string, (...args) => event.execute(client, ...args)); } else { - client.on(event.name, (...args) => event.execute(client, ...args)); + client.on(event.name as string, (...args) => event.execute(client, ...args)); } if (ENV.BOT_VERBOSE_LOGGING) diff --git a/src/main.ts b/src/main.ts index 193d235..e771bcf 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,6 @@ import { loginBot } from './utilities/loginBot.js'; import { AudioPlayersManager } from './audioplayer/AudioPlayersManager.js'; import loadLocale from './locales/Locale.js'; import { handlersLoad } from './handlersLoad.js'; -import { LoadPlugins } from './audioplayer/LoadPlugins.js'; loggerSend(`Starting bot on version ${process.env.npm_package_version}`); @@ -20,7 +19,7 @@ client.rest.on('rateLimited', (args) => { loggerError(`Client encountered a rate limit: ${JSON.stringify(args)}`); }); -new AudioPlayersManager(client, await LoadPlugins()); +new AudioPlayersManager(client); await handlersLoad(client); diff --git a/src/schemas/SchemaPlaylist.ts b/src/schemas/SchemaPlaylist.ts index 14b7a1d..074c059 100644 --- a/src/schemas/SchemaPlaylist.ts +++ b/src/schemas/SchemaPlaylist.ts @@ -1,5 +1,5 @@ +// @ts-nocheck import { Document, model, Schema } from 'mongoose'; -import { Song } from 'distube'; import { ENV } from '../EnvironmentVariables.js'; import { getOrCreateUser } from './SchemaUser.js'; import { ApplicationCommandOptionChoiceData, AutocompleteInteraction } from 'discord.js'; diff --git a/src/schemas/SchemaSongsHistory.ts b/src/schemas/SchemaSongsHistory.ts index f9398e8..985ce90 100644 --- a/src/schemas/SchemaSongsHistory.ts +++ b/src/schemas/SchemaSongsHistory.ts @@ -1,6 +1,6 @@ +// @ts-nocheck import { Document, model, Schema } from 'mongoose'; import { getOrCreateGuildSettings, GuildModelClass } from './SchemaGuild.js'; -import { Playlist, Song } from 'distube'; import { ENV } from '../EnvironmentVariables.js'; interface ISchemaSongHistoryUnit {