diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..ec57642 --- /dev/null +++ b/.env.example @@ -0,0 +1,22 @@ +# Yout Bot Token +TOKEN= + +# Your Bot ID +BOT_ID= + +# GLOBAL PREFIX +PREFIX= + +# OWNERS ID +OWNER_ID= + +# MONGO URL +MONGO_CONNECTION= + +# Webhooks Links +ERROR_LOGS= +JOIN_LEAVE_LOGS= + + +# SUPPORT SERVER +SUPPORT_SERVER= \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..074703b --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,29 @@ +## Problem description + +Clearly and concisely describe the problem. Include any relevant context or information. + +## Node.js version + +Specify the version of Node.js that you are using. + +## Operating system + +Specify the operating system (e.g. Windows, macOS, Linux) that you are using. + +## Bot version + +Specify the version of the bot that you are using. + +## Steps to reproduce + +1. +2. +3. + +## Expected behavior + +Describe how the code or function in question should work. + +## Current behavior + +Describe how the code or function is currently working. Include any error or error message that appears. \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7f12c22 --- /dev/null +++ b/.gitignore @@ -0,0 +1,105 @@ +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +.package-lock.json \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..dedd917 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 NoBody. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..0f6eb74 --- /dev/null +++ b/Readme.md @@ -0,0 +1,51 @@ +# CUCHUS MUSIC | DISCORD MUSIC BOT + +[![GitHub package.json version](https://img.shields.io/github/package-json/v/NoBody-UU/cuchus-music.svg)](https://github.com/NoBody-UU/cuchus-music) +[![Discord](https://img.shields.io/discord/644672989014523940.svg)](https://discord.gg/MqNKpdrGjw) +[![npm](https://img.shields.io/npm/v/npm.svg)](https://www.npmjs.com/) +[![node](https://img.shields.io/node/v/discord.js.svg)](https://nodejs.org/) + +Welcome to Cuchus Music, the Discord music bot that allows you to play songs from Spotify, YouTube, and SoundCloud directly on your server! With our bot, you can search and play songs by title or artist, and much more. Start enjoying the music you love now with Cuchus Music! + +## Installation + +1. Clone the repository. To clone the repository, use Git and run the command `git clone https://github.com/NoBody-UU/cuchus-music.git`. +2. Run the command `cd cuchus-music`. +3. Install the necessary dependencies by running the command `npm install`. +4. Rename the file `env.example` to `.env`. +5. Assign values to the environment variables in the `.env` file. **Attention! These data must be kept secret and must not be shared with anyone.** +6. Run the bot by running the command `node .` or running the file `start.bat`. + +## Documentation + +For more detailed information about the Cuchus Music Discord bot and its features, see the documentation at [DOCUMENTATION](https://doc-cuchus-music.nobody-dev.me). + +## Contribution + +We welcome any contributions to Cuchus Music Discord Bot, whether it be reporting bugs, proposing new features, or fixing issues. To contribute, please follow these steps: + +1. Fork the repository and create a new branch for your changes. +2. Make your changes and commit them to your branch. +3. Open a pull request and describe the changes you have made. +4. If your changes are in line with the project goals and meet our quality standards, they will be merged into the main branch. + +Please note that all contributors are expected to follow our code of conduct. By contributing to this project, you agree to abide by its terms. + +## License + +This project is licensed under the MIT license. For more details, see the [LICENSE](LICENSE) file. + +
+ +### EXTRA-INFO + +If you want to test the bot before deploying it to your server, you can invite the test version using this link: [invite link](https://discord.com/api/oauth2/authorize?client_id=1033487955509137570&permissions=8&scope=bot%20applications.commands). +If you have any questions or queries, don't hesitate to contact me on Discord: `NoBody#9666` or in my [Discord server](). + +You can also invite my multi-functional bot(**CUCHUS**) using this link: [CLICK HERE](). + +I hope you enjoy using the bot and feel free to reach out to me if you need any help or have any suggestions. + + +| ¡Please leave a ⭐ to help the project| +|----------------------------------------------| \ No newline at end of file diff --git a/Start.bat b/Start.bat new file mode 100644 index 0000000..ffcbadf --- /dev/null +++ b/Start.bat @@ -0,0 +1,8 @@ +@echo off +title Cuchus Music By: NoBody + +:Reconnected + +node index.js + +goto Reconnected diff --git a/bot.js b/bot.js new file mode 100644 index 0000000..556c376 --- /dev/null +++ b/bot.js @@ -0,0 +1,71 @@ +const { Client, Collection, GatewayIntentBits, WebhookClient } = require("discord.js"); +const { DisTube } = require('distube'); +const { SoundCloudPlugin } = require('@distube/soundcloud'); +const { SpotifyPlugin } = require('@distube/spotify'); +const { YtDlpPlugin } = require("@distube/yt-dlp"); +const { I18n } = require("@hammerhq/localization"); +const Logger = require("./src/helpers/Logger"); +const { initializeMongoose } = require("./src/Database/mongoose"); +const { LINKS, TOKEN } = require("./settings/config.js"); + +class MainClient extends Client { + constructor() { + super({ + shards: "auto", + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildMembers, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.GuildVoiceStates, + GatewayIntentBits.MessageContent, + ], + allowedMentions: { + parse: ["roles", "users", "everyone"], + repliedUser: false + }, + }); + + // find unhandled Rejections and Uncaught Exception + process.on("unhandledRejection", (err) => client.logger.error(`Unhandled exception`, err)); + process.on("uncaughtException", (err) => client.logger.error(`Uncaught Exception`, err)); + + this.config = require('./settings/config.js'); + this.prefix = this.config.PREFIX; + this.owner = this.config.OWNER_ID; + // Language is future feature... + this.i18n = new I18n(this.config.LANGUAGE); + this.logger = Logger; + this.joinLeaveWebhook = LINKS.JOIN_LEAVE_LOGS ? new WebhookClient({ url: LINKS.JOIN_LEAVE_LOGS }) : undefined; + // initialize the database + initializeMongoose(); + + const client = this; + + this.distube = new DisTube(client, { + searchSongs: 0, /// SET TO 5 FOR ENABLE SEARCH MODE! + searchCooldown: 30, + leaveOnEmpty: true, + emptyCooldown: 60, + leaveOnFinish: false, + leaveOnStop: true, + plugins: [ + new SoundCloudPlugin(), + new SpotifyPlugin({ + emitEventsAfterFetching: true + }), + new YtDlpPlugin()], + }); + + ["aliases", "commands"].forEach(x => client[x] = new Collection()); + ["loadCommands", "loadEvents", "loadDistube"].forEach(x => require(`./src/handlers/${x}`)(client)); + + } + + + + connect() { + return super.login(TOKEN); + + }; +}; +module.exports = MainClient; diff --git a/index.js b/index.js new file mode 100644 index 0000000..a5d272c --- /dev/null +++ b/index.js @@ -0,0 +1,8 @@ + +const MainClient = require("./bot"); +const client = new MainClient(); + +client.connect() + +module.exports = client; + diff --git a/langs/Readme.md b/langs/Readme.md new file mode 100644 index 0000000..ed6501a --- /dev/null +++ b/langs/Readme.md @@ -0,0 +1,3 @@ +# DISCORD MUSIC BOT | Languages + +### Coming soon... \ No newline at end of file diff --git a/logs/.gitkeep b/logs/.gitkeep new file mode 100644 index 0000000..f4132f9 --- /dev/null +++ b/logs/.gitkeep @@ -0,0 +1 @@ +Logs files will be created here. \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..f1d1142 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3849 @@ +{ + "name": "cuchus", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "cuchus", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@discordjs/voice": "^0.7.5", + "@distube/soundcloud": "^1.3.0", + "@distube/spotify": "^1.5.1", + "@distube/yt-dlp": "^1.1.3", + "@distube/ytdl-core": "^4.11.7", + "@hammerhq/localization": "^0.1.5", + "chalk": "^4.1.2", + "common-tags": "^1.8.2", + "delay": "^5.0.0", + "discord.js": "^14.1.2", + "distube": "^4.0.4", + "dotenv": "^14.3.2", + "ffmpeg-static": "^4.4.1", + "figlet": "^1.5.2", + "fixedsize-map": "^1.0.1", + "libsodium-wrappers": "^0.7.9", + "lyrics-finder": "^21.7.0", + "mongoose": "^6.8.0", + "opusscript": "^0.0.8", + "path": "^0.12.7", + "pino": "^8.8.0", + "pino-pretty": "^9.1.1" + }, + "devDependencies": { + "node": "^17.0.1" + } + }, + "node_modules/@derhuerst/http-basic": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.4.tgz", + "integrity": "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==", + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^2.0.0", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.2.0.tgz", + "integrity": "sha512-ARy4BUTMU+S0ZI6605NDqfWO+qZqV2d/xfY32z3hVSsd9IaAKJBZ1ILTZLy87oIjW8+gUpQmk9Kt0ZP9bmmd8Q==", + "dependencies": { + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.37.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + }, + "node_modules/@discordjs/collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.1.0.tgz", + "integrity": "sha512-PQ2Bv6pnT7aGPCKWbvvNRww5tYCGpggIQVgpuF9TdDPeR6n6vQYxezXiLVOS9z2B62Dp4c+qepQ15SgJbLYtCQ==", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.1.0.tgz", + "integrity": "sha512-yCrthRTQeUyNThQEpCk7bvQJlwQmz6kU0tf3dcWBv2WX3Bncl41x7Wc+v5b5OsIxfNYq38PvVtWircu9jtYZug==", + "dependencies": { + "@discordjs/collection": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.3", + "file-type": "^17.1.6", + "tslib": "^2.4.0", + "undici": "^5.9.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + }, + "node_modules/@discordjs/voice": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.7.5.tgz", + "integrity": "sha512-lUk+CmIXNKslT6DkC9IF9rpsqhzlTiedauUCPBzepjd4XWxwBZiyVIzR6QpbAirxkAwCoAbbje+3Ho71PGLEAw==", + "deprecated": "no longer supported", + "dependencies": { + "@types/ws": "^8.2.0", + "discord-api-types": "^0.24.0", + "prism-media": "^1.3.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.3.1", + "ws": "^8.2.3" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@discordjs/voice/node_modules/prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "peerDependencies": { + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/@distube/soundcloud": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@distube/soundcloud/-/soundcloud-1.3.0.tgz", + "integrity": "sha512-Aft/3hpoVbmtFOkQNMortQofuHZg9qzPDXOkf57SHimOUtBexB/6BcSLLs8Ne0cXklhtiTh/jQSZarOWAwvKAQ==", + "dependencies": { + "soundcloud.ts": "^0.4.9" + }, + "peerDependencies": { + "distube": "3||4" + } + }, + "node_modules/@distube/spotify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@distube/spotify/-/spotify-1.5.1.tgz", + "integrity": "sha512-89S2LaTefn88BoOs4Cy6mRC7mIgGjzc0d9/GKbyyDnWG7APSjC7JevJAC+R207btIl/+o/JozGeroIllJx1s3g==", + "dependencies": { + "spotify-uri": "^3.0.3", + "spotify-url-info": "^3.1.10", + "spotify-web-api-node": "^5.0.2", + "undici": "^5.14.0" + }, + "peerDependencies": { + "distube": "^3.3.1||4" + } + }, + "node_modules/@distube/yt-dlp": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", + "integrity": "sha512-kInFaIgNK7bhUJwY5o/ejBpwHdtLEH9l/GPBl9G7ddMKFYx7/MA5vKZ2F3oZQVMq9pzphPMRpSGi4UBT9L6O2g==", + "hasInstallScript": true, + "dependencies": { + "dargs": "^7.0.0", + "execa": "^5.1.1", + "mkdirp": "^1.0.4", + "undici": "^5.7.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "distube": "3.x||4.x" + } + }, + "node_modules/@distube/ytdl-core": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.11.7.tgz", + "integrity": "sha512-Bq4kxRAOZOFxgQ11g65tHp502yYMNEsFsO3VO7NqTfTLiQvKVLEqvenikm0873cPMgz+qXp0VJzpeLkmB4zEzg==", + "dependencies": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@distube/ytpl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@distube/ytpl/-/ytpl-1.1.1.tgz", + "integrity": "sha512-/2I7GpdCv9SFdA4UprDGkq1y4ZkoAA1WYTZNmx/DjzZ0oVCLfxY9ZdYNQY5YwQqs4D4vNbXPvf6CliiWo5D3QA==", + "dependencies": { + "miniget": "^4.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@distube/ytsr": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", + "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", + "dependencies": { + "miniget": "^4.2.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@hammerhq/localization": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@hammerhq/localization/-/localization-0.1.5.tgz", + "integrity": "sha512-GHexSukmB903OysxtVPFIwSoy82ku6CghSyGXL1GGV4VywQ8LnSAXNfsXKxbhq+/CvwBfMvR/nqq5Vo+GA0SiA==", + "dependencies": { + "yaml": "^2.1.3" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", + "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + }, + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.2.tgz", + "integrity": "sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/node": { + "version": "18.7.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", + "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/audioconcat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/audioconcat/-/audioconcat-0.1.4.tgz", + "integrity": "sha512-RH7f6n1kfQTathHadWJp8b/hz7y9GYdhKDtkqany8qYxkv0RQamY+7dFBbJOxLh86ouMTYmKYenSdkxSbubmOA==", + "dependencies": { + "fluent-ffmpeg": "^2.0.0", + "lodash.merge": "^4.6.2" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", + "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==", + "deprecated": "No longer supported. Install the latest release!", + "engines": { + "node": ">=12" + } + }, + "node_modules/discord.js": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.3.0.tgz", + "integrity": "sha512-CpIwoAAuELiHSgVKRMzsCADS6ZlJwAZ9RlvcJYdEgS00aW36dSvXyBgE+S3pigkc7G+jU6BEalMUWIJFveqrBQ==", + "dependencies": { + "@discordjs/builders": "^1.2.0", + "@discordjs/collection": "^1.1.0", + "@discordjs/rest": "^1.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.3", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.0", + "undici": "^5.9.1", + "ws": "^8.8.1" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + }, + "node_modules/distube": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.4.tgz", + "integrity": "sha512-Y/CePsz7pVeOXR6H40L+oHCERlMFO4eZYjrzQcGYrC0m+dTgp5OGseCUmwyWX1bjdSZdFHn4WMZ9yXvt1vJgjA==", + "funding": [ + { + "type": "individual", + "url": "https://paypal.me/Skickkk" + }, + { + "type": "patreon", + "url": "https://patreon.com/DisTube" + } + ], + "dependencies": { + "@distube/ytdl-core": "^4.11.3", + "@distube/ytpl": "^1.1.1", + "@distube/ytsr": "^1.1.8", + "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "undici": "^5.8.0" + }, + "engines": { + "node": ">=16.9.0" + }, + "peerDependencies": { + "@discordjs/opus": "*", + "@discordjs/voice": "*", + "discord.js": "14" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + } + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dotenv": { + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-copy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.0.tgz", + "integrity": "sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "hasInstallScript": true, + "dependencies": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/figlet": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", + "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fixedsize-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fixedsize-map/-/fixedsize-map-1.0.1.tgz", + "integrity": "sha512-ip1ywpWp+/ZUyDjmoPjLzmtal4ui5/KpBOU43pviQJiOGL+D9sI6V52nQkevtz370oWvoMnZol8+decHU+w8Jg==" + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "dependencies": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fluent-ffmpeg/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/help-me": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.1.0.tgz", + "integrity": "sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==", + "dependencies": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/himalaya": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", + "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" + }, + "node_modules/html-to-text": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", + "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", + "dependencies": { + "he": "^1.2.0", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/kareem": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.0.tgz", + "integrity": "sha512-rVBUGGwvqg130iwYu8k7lutHuDBFj1yGRdnlE44wEhxAmFBad1zcL66PdWC1raw3tIObY6XWhtv3VL04xQb/cg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "dependencies": { + "libsodium": "^0.7.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lyrics-finder": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", + "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", + "dependencies": { + "encoding": "^0.1.13", + "html-to-text": "^5.1.1", + "node-fetch": "^2.6.0" + }, + "bin": { + "lyrics-finder": "src/bin.js" + } + }, + "node_modules/m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "dependencies": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/miniget": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz", + "integrity": "sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/minimatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.1.tgz", + "integrity": "sha512-koT87tecZmxPKtxRQD8hCKfn+ockEL2xBiUvx3isQGI6mFmagWt4f4AyCE9J4sKepnLhMacoCTQQA6SLAI2L6w==", + "dependencies": { + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "@aws-sdk/credential-providers": "^3.186.0", + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/mongodb-connection-string-url/node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mongoose": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.8.0.tgz", + "integrity": "sha512-zlUfjcLya3pLfLTxwyH5S9bZUolJWGKF2M7PEV0118jv4VWHR/krjb6LIWu1RPQN2rwYmnmjjzJLVhbhmHqSmg==", + "dependencies": { + "bson": "^4.7.0", + "kareem": "2.5.0", + "mongodb": "4.12.1", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/node": { + "version": "17.9.1", + "resolved": "https://registry.npmjs.org/node/-/node-17.9.1.tgz", + "integrity": "sha512-Jmv4WrsWcZI6/SEUF6G0+9R73yQnVN/9VQnqkC1s/VJrxUkwyCodnOQLvXEVqfh13RNeHpFO92cWxjV0TB5Rww==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.0.tgz", + "integrity": "sha512-pTeU6NgUrexiLNtd+AKwvg6cngHMvj5FZ5e2bbv2ogBSIc9yhkXSSaTScfSRZnwHIh5YFmYSYlemLWkiKD7rog==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opusscript": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz", + "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==" + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/pino": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.8.0.tgz", + "integrity": "sha512-cF8iGYeu2ODg2gIwgAHcPrtR63ILJz3f7gkogaHC/TXVVXxZgInmNYiIpDYEwgEkxZti2Se6P2W2DxlBIZe6eQ==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-9.1.1.tgz", + "integrity": "sha512-iJrnjgR4FWQIXZkUF48oNgoRI9BpyMhaEmihonHeCnZ6F50ZHAS4YGfGBT/ZVNsPmd+hzkIPGzjKdY08+/yAXw==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", + "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" + }, + "node_modules/prism-media": { + "version": "1.3.3", + "resolved": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "integrity": "sha512-2a/62b86i60OksrnliRwG7IGMHjFHM0KiRYk6YBi43IZpCZCf/ZLjXIbMGtzzeTZhEJy1Fi6Ke6kKtn2ObNjPw==", + "license": "Apache-2.0", + "peerDependencies": { + "@discordjs/opus": "*", + "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", + "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/secure-json-parse": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.6.0.tgz", + "integrity": "sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A==" + }, + "node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sonic-boom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", + "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/soundcloud.ts": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.9.tgz", + "integrity": "sha512-T8NXiRMz7se2LxHuUBk0T+/TMfZAOiS3s11Vhj/Eq37ficTRGfrUTxj68eovPCP5ViR8unTOMpGcRYZB4SX47w==", + "dependencies": { + "audioconcat": "^0.1.4", + "axios": "^0.21.1" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/spotify-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-3.0.3.tgz", + "integrity": "sha512-mMstJ4dAMki6GbUjg94kp/h9ZH+7T7+ro/KUC00WVh+WKoLgMRrTKLkWMIwCZNO53Xa8DRHQw/6jwYtRZrVI3g==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/spotify-url-info": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.1.10.tgz", + "integrity": "sha512-T2LNhdtQ10GkzzInPUWFtAF2bIVY7zlu2HaQ+59OAH92Q04xIlyVg3jT5pbzo3R7MiEIzRzRoq4RDTVw+8DI5A==", + "dependencies": { + "himalaya": "~1.1.0", + "spotify-uri": "~3.0.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/spotify-web-api-node": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", + "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", + "dependencies": { + "superagent": "^6.1.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/thread-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", + "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-mixer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/undici": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", + "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==", + "engines": { + "node": ">= 14" + } + } + }, + "dependencies": { + "@derhuerst/http-basic": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.4.tgz", + "integrity": "sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^2.0.0", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + } + }, + "@discordjs/builders": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.2.0.tgz", + "integrity": "sha512-ARy4BUTMU+S0ZI6605NDqfWO+qZqV2d/xfY32z3hVSsd9IaAKJBZ1ILTZLy87oIjW8+gUpQmk9Kt0ZP9bmmd8Q==", + "requires": { + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.37.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + } + } + }, + "@discordjs/collection": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.1.0.tgz", + "integrity": "sha512-PQ2Bv6pnT7aGPCKWbvvNRww5tYCGpggIQVgpuF9TdDPeR6n6vQYxezXiLVOS9z2B62Dp4c+qepQ15SgJbLYtCQ==" + }, + "@discordjs/rest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.1.0.tgz", + "integrity": "sha512-yCrthRTQeUyNThQEpCk7bvQJlwQmz6kU0tf3dcWBv2WX3Bncl41x7Wc+v5b5OsIxfNYq38PvVtWircu9jtYZug==", + "requires": { + "@discordjs/collection": "^1.0.1", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.37.3", + "file-type": "^17.1.6", + "tslib": "^2.4.0", + "undici": "^5.9.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + } + } + }, + "@discordjs/voice": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.7.5.tgz", + "integrity": "sha512-lUk+CmIXNKslT6DkC9IF9rpsqhzlTiedauUCPBzepjd4XWxwBZiyVIzR6QpbAirxkAwCoAbbje+3Ho71PGLEAw==", + "requires": { + "@types/ws": "^8.2.0", + "discord-api-types": "^0.24.0", + "prism-media": "^1.3.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.3.1", + "ws": "^8.2.3" + }, + "dependencies": { + "prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "requires": {} + } + } + }, + "@distube/soundcloud": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@distube/soundcloud/-/soundcloud-1.3.0.tgz", + "integrity": "sha512-Aft/3hpoVbmtFOkQNMortQofuHZg9qzPDXOkf57SHimOUtBexB/6BcSLLs8Ne0cXklhtiTh/jQSZarOWAwvKAQ==", + "requires": { + "soundcloud.ts": "^0.4.9" + } + }, + "@distube/spotify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@distube/spotify/-/spotify-1.5.1.tgz", + "integrity": "sha512-89S2LaTefn88BoOs4Cy6mRC7mIgGjzc0d9/GKbyyDnWG7APSjC7JevJAC+R207btIl/+o/JozGeroIllJx1s3g==", + "requires": { + "spotify-uri": "^3.0.3", + "spotify-url-info": "^3.1.10", + "spotify-web-api-node": "^5.0.2", + "undici": "^5.14.0" + } + }, + "@distube/yt-dlp": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", + "integrity": "sha512-kInFaIgNK7bhUJwY5o/ejBpwHdtLEH9l/GPBl9G7ddMKFYx7/MA5vKZ2F3oZQVMq9pzphPMRpSGi4UBT9L6O2g==", + "requires": { + "dargs": "^7.0.0", + "execa": "^5.1.1", + "mkdirp": "^1.0.4", + "undici": "^5.7.0" + } + }, + "@distube/ytdl-core": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.11.7.tgz", + "integrity": "sha512-Bq4kxRAOZOFxgQ11g65tHp502yYMNEsFsO3VO7NqTfTLiQvKVLEqvenikm0873cPMgz+qXp0VJzpeLkmB4zEzg==", + "requires": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.2.4" + } + }, + "@distube/ytpl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@distube/ytpl/-/ytpl-1.1.1.tgz", + "integrity": "sha512-/2I7GpdCv9SFdA4UprDGkq1y4ZkoAA1WYTZNmx/DjzZ0oVCLfxY9ZdYNQY5YwQqs4D4vNbXPvf6CliiWo5D3QA==", + "requires": { + "miniget": "^4.2.1" + } + }, + "@distube/ytsr": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", + "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", + "requires": { + "miniget": "^4.2.2" + } + }, + "@hammerhq/localization": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@hammerhq/localization/-/localization-0.1.5.tgz", + "integrity": "sha512-GHexSukmB903OysxtVPFIwSoy82ku6CghSyGXL1GGV4VywQ8LnSAXNfsXKxbhq+/CvwBfMvR/nqq5Vo+GA0SiA==", + "requires": { + "yaml": "^2.1.3" + } + }, + "@sapphire/async-queue": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.0.tgz", + "integrity": "sha512-JkLdIsP8fPAdh9ZZjrbHWR/+mZj0wvKS5ICibcLrRI1j84UmLMshx5n9QmL8b95d4onJ2xxiyugTgSAX7AalmA==" + }, + "@sapphire/shapeshift": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.6.0.tgz", + "integrity": "sha512-tu2WLRdo5wotHRvsCkspg3qMiP6ETC3Q1dns1Q5V6zKUki+1itq6AbhMwohF9ZcLoYqg+Y8LkgRRtVxxTQVTBQ==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + } + }, + "@sapphire/snowflake": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.2.tgz", + "integrity": "sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==" + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/node": { + "version": "18.7.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", + "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "requires": { + "@types/node": "*" + } + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "audioconcat": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/audioconcat/-/audioconcat-0.1.4.tgz", + "integrity": "sha512-RH7f6n1kfQTathHadWJp8b/hz7y9GYdhKDtkqany8qYxkv0RQamY+7dFBbJOxLh86ouMTYmKYenSdkxSbubmOA==", + "requires": { + "fluent-ffmpeg": "^2.0.0", + "lodash.merge": "^4.6.2" + } + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "cookiejar": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", + "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "discord-api-types": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.24.0.tgz", + "integrity": "sha512-X0uA2a92cRjowUEXpLZIHWl4jiX1NsUpDhcEOpa1/hpO1vkaokgZ8kkPtPih9hHth5UVQ3mHBu/PpB4qjyfJ4A==" + }, + "discord.js": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.3.0.tgz", + "integrity": "sha512-CpIwoAAuELiHSgVKRMzsCADS6ZlJwAZ9RlvcJYdEgS00aW36dSvXyBgE+S3pigkc7G+jU6BEalMUWIJFveqrBQ==", + "requires": { + "@discordjs/builders": "^1.2.0", + "@discordjs/collection": "^1.1.0", + "@discordjs/rest": "^1.1.0", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.37.3", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.0", + "undici": "^5.9.1", + "ws": "^8.8.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.5.tgz", + "integrity": "sha512-RhzoX02jw2M+n/AU5K74KTM4J8Sn3ZImUJvoA4lh+SDcrqi1ddSjrafciF4bECj4rPc2vHwoyyTNgbUwE8vbpA==" + } + } + }, + "distube": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.4.tgz", + "integrity": "sha512-Y/CePsz7pVeOXR6H40L+oHCERlMFO4eZYjrzQcGYrC0m+dTgp5OGseCUmwyWX1bjdSZdFHn4WMZ9yXvt1vJgjA==", + "requires": { + "@distube/ytdl-core": "^4.11.3", + "@distube/ytpl": "^1.1.1", + "@distube/ytsr": "^1.1.8", + "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "undici": "^5.8.0" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dotenv": { + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==" + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "requires": { + "iconv-lite": "^0.6.2" + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==" + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "fast-copy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.0.tgz", + "integrity": "sha512-4HzS+9pQ5Yxtv13Lhs1Z1unMXamBdn5nA4bEi1abYpDNSpSp7ODYQ1KPMF6nTatfEzgH6/zPvXKU1zvHiUjWlA==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "ffmpeg-static": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.4.1.tgz", + "integrity": "sha512-gyGTIf5kgmLDmH7Rwj8vMmNK46bjXKKofHS2gY+LUqoTe/iybVuTuvnhJQR2tZHlKlDG7A/BIH7cRa2jWDKgWw==", + "requires": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + } + }, + "figlet": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", + "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" + }, + "file-type": { + "version": "17.1.6", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.6.tgz", + "integrity": "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.9", + "token-types": "^5.0.0-alpha.2" + } + }, + "fixedsize-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fixedsize-map/-/fixedsize-map-1.0.1.tgz", + "integrity": "sha512-ip1ywpWp+/ZUyDjmoPjLzmtal4ui5/KpBOU43pviQJiOGL+D9sI6V52nQkevtz370oWvoMnZol8+decHU+w8Jg==" + }, + "fluent-ffmpeg": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", + "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", + "requires": { + "async": ">=0.2.9", + "which": "^1.1.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "help-me": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-4.1.0.tgz", + "integrity": "sha512-5HMrkOks2j8Fpu2j5nTLhrBhT7VwHwELpqnSnx802ckofys5MO2SkLpgSz3dgNFHV7IYFX2igm5CM75SmuYidw==", + "requires": { + "glob": "^8.0.0", + "readable-stream": "^3.6.0" + } + }, + "himalaya": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", + "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" + }, + "html-to-text": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", + "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", + "requires": { + "he": "^1.2.0", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0" + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==" + }, + "kareem": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.0.tgz", + "integrity": "sha512-rVBUGGwvqg130iwYu8k7lutHuDBFj1yGRdnlE44wEhxAmFBad1zcL66PdWC1raw3tIObY6XWhtv3VL04xQb/cg==" + }, + "libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "requires": { + "libsodium": "^0.7.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "lyrics-finder": { + "version": "21.7.0", + "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", + "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", + "requires": { + "encoding": "^0.1.13", + "html-to-text": "^5.1.1", + "node-fetch": "^2.6.0" + } + }, + "m3u8stream": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", + "integrity": "sha512-LZj8kIVf9KCphiHmH7sbFQTVe4tOemb202fWwvJwR9W5ENW/1hxJN6ksAWGhQgSBSa3jyWhnjKU1Fw1GaOdbyA==", + "requires": { + "miniget": "^4.2.2", + "sax": "^1.2.4" + } + }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "miniget": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/miniget/-/miniget-4.2.2.tgz", + "integrity": "sha512-a7voNL1N5lDMxvTMExOkg+Fq89jM2vY8pAi9ZEWzZtfNmdfP6RXkvUtFnCAXoCv2T9k1v/fUJVaAEuepGcvLYA==" + }, + "minimatch": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mongodb": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.12.1.tgz", + "integrity": "sha512-koT87tecZmxPKtxRQD8hCKfn+ockEL2xBiUvx3isQGI6mFmagWt4f4AyCE9J4sKepnLhMacoCTQQA6SLAI2L6w==", + "requires": { + "@aws-sdk/credential-providers": "^3.186.0", + "bson": "^4.7.0", + "mongodb-connection-string-url": "^2.5.4", + "saslprep": "^1.0.3", + "socks": "^2.7.1" + } + }, + "mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + } + } + }, + "mongoose": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.8.0.tgz", + "integrity": "sha512-zlUfjcLya3pLfLTxwyH5S9bZUolJWGKF2M7PEV0118jv4VWHR/krjb6LIWu1RPQN2rwYmnmjjzJLVhbhmHqSmg==", + "requires": { + "bson": "^4.7.0", + "kareem": "2.5.0", + "mongodb": "4.12.1", + "mpath": "0.9.0", + "mquery": "4.0.3", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==" + }, + "mquery": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz", + "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==", + "requires": { + "debug": "4.x" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node": { + "version": "17.9.1", + "resolved": "https://registry.npmjs.org/node/-/node-17.9.1.tgz", + "integrity": "sha512-Jmv4WrsWcZI6/SEUF6G0+9R73yQnVN/9VQnqkC1s/VJrxUkwyCodnOQLvXEVqfh13RNeHpFO92cWxjV0TB5Rww==", + "dev": true, + "requires": { + "node-bin-setup": "^1.0.0" + } + }, + "node-bin-setup": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.0.tgz", + "integrity": "sha512-pTeU6NgUrexiLNtd+AKwvg6cngHMvj5FZ5e2bbv2ogBSIc9yhkXSSaTScfSRZnwHIh5YFmYSYlemLWkiKD7rog==", + "dev": true + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "on-exit-leak-free": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", + "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "opusscript": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz", + "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ==" + }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==" + }, + "path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "requires": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==" + }, + "pino": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.8.0.tgz", + "integrity": "sha512-cF8iGYeu2ODg2gIwgAHcPrtR63ILJz3f7gkogaHC/TXVVXxZgInmNYiIpDYEwgEkxZti2Se6P2W2DxlBIZe6eQ==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.0.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.1.0", + "thread-stream": "^2.0.0" + } + }, + "pino-abstract-transport": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.0.0.tgz", + "integrity": "sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==", + "requires": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } + } + } + }, + "pino-pretty": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-9.1.1.tgz", + "integrity": "sha512-iJrnjgR4FWQIXZkUF48oNgoRI9BpyMhaEmihonHeCnZ6F50ZHAS4YGfGBT/ZVNsPmd+hzkIPGzjKdY08+/yAXw==", + "requires": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.0", + "fast-safe-stringify": "^2.1.1", + "help-me": "^4.0.1", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "readable-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.2.0.tgz", + "integrity": "sha512-gJrBHsaI3lgBoGMW/jHZsQ/o/TIWiu5ENCJG1BB7fuCKzpFM8GaS2UoBVt9NO+oI+3FcrBNbUkl3ilDe09aY4A==", + "requires": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10" + } + } + } + }, + "pino-std-serializers": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.0.0.tgz", + "integrity": "sha512-mMMOwSKrmyl+Y12Ri2xhH1lbzQxwwpuru9VjyJpgFIH4asSj88F2csdMwN6+M5g1Ll4rmsYghHLQJw81tgZ7LQ==" + }, + "prism-media": { + "version": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "integrity": "sha512-2a/62b86i60OksrnliRwG7IGMHjFHM0KiRYk6YBi43IZpCZCf/ZLjXIbMGtzzeTZhEJy1Fi6Ke6kKtn2ObNjPw==", + "requires": {} + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "process-warning": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-2.1.0.tgz", + "integrity": "sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + } + }, + "real-require": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", + "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-stable-stringify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.1.tgz", + "integrity": "sha512-dVHE6bMtS/bnL2mwualjc6IxEv1F+OCUpA46pKUj6F8uDbUM0jCCulPqRNPSnWwGNKx5etqMjZYdXtrm5KJZGA==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "secure-json-parse": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.6.0.tgz", + "integrity": "sha512-B9osKohb6L+EZ6Kve3wHKfsAClzOC/iISA2vSuCe5Jx5NAKiwitfxx8ZKYapHXr0sYRj7UZInT7pLb3rp2Yx6A==" + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "sonic-boom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.2.1.tgz", + "integrity": "sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "soundcloud.ts": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.9.tgz", + "integrity": "sha512-T8NXiRMz7se2LxHuUBk0T+/TMfZAOiS3s11Vhj/Eq37ficTRGfrUTxj68eovPCP5ViR8unTOMpGcRYZB4SX47w==", + "requires": { + "audioconcat": "^0.1.4", + "axios": "^0.21.1" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "spotify-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spotify-uri/-/spotify-uri-3.0.3.tgz", + "integrity": "sha512-mMstJ4dAMki6GbUjg94kp/h9ZH+7T7+ro/KUC00WVh+WKoLgMRrTKLkWMIwCZNO53Xa8DRHQw/6jwYtRZrVI3g==" + }, + "spotify-url-info": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/spotify-url-info/-/spotify-url-info-3.1.10.tgz", + "integrity": "sha512-T2LNhdtQ10GkzzInPUWFtAF2bIVY7zlu2HaQ+59OAH92Q04xIlyVg3jT5pbzo3R7MiEIzRzRoq4RDTVw+8DI5A==", + "requires": { + "himalaya": "~1.1.0", + "spotify-uri": "~3.0.3" + } + }, + "spotify-web-api-node": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", + "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", + "requires": { + "superagent": "^6.1.0" + } + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + } + }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "thread-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.2.0.tgz", + "integrity": "sha512-rUkv4/fnb4rqy/gGy7VuqK6wE1+1DOCOWy4RMeaV69ZHMP11tQKZvZSip1yTgrKCMZzEMcCL/bKfHvSfDHx+iQ==", + "requires": { + "real-require": "^0.2.0" + } + }, + "tiny-typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", + "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==" + }, + "token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-mixer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.1.tgz", + "integrity": "sha512-hvE+ZYXuINrx6Ei6D6hz+PTim0Uf++dYbK9FFifLNwQj+RwKquhQpn868yZsCtJYiclZF1u8l6WZxxKi+vv7Rg==" + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "undici": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.14.0.tgz", + "integrity": "sha512-yJlHYw6yXPPsuOH0x2Ib1Km61vu4hLiRRQoafs+WUgX1vO64vgnxiCEN9dpIrhZyHFsai3F0AEj4P9zy19enEQ==", + "requires": { + "busboy": "^1.6.0" + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.1.3.tgz", + "integrity": "sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..75f563b --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "cuchus-music", + "version": "1.0.0", + "description": "Simple Music Bot with distube.js", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "author": "NoBody", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/NoBody-UU/cuchus-music.git" + }, + "bugs": { + "url": "https://github.com/NoBody-UU/cuchus-music/issues" + }, + "dependencies": { + "@discordjs/voice": "^0.7.5", + "@distube/soundcloud": "^1.3.0", + "@distube/spotify": "^1.5.1", + "@distube/yt-dlp": "^1.1.3", + "@distube/ytdl-core": "^4.11.7", + "@hammerhq/localization": "^0.1.5", + "chalk": "^4.1.2", + "common-tags": "^1.8.2", + "delay": "^5.0.0", + "discord.js": "^14.1.2", + "distube": "^4.0.4", + "dotenv": "^14.3.2", + "ffmpeg-static": "^4.4.1", + "figlet": "^1.5.2", + "fixedsize-map": "^1.0.1", + "libsodium-wrappers": "^0.7.9", + "lyrics-finder": "^21.7.0", + "mongoose": "^6.8.0", + "opusscript": "^0.0.8", + "path": "^0.12.7", + "pino": "^8.8.0", + "pino-pretty": "^9.1.1" + }, + "devDependencies": { + "node": "^17.0.1" + } +} diff --git a/settings/buttons.js b/settings/buttons.js new file mode 100644 index 0000000..d572d52 --- /dev/null +++ b/settings/buttons.js @@ -0,0 +1,32 @@ +const { ButtonStyle } = require("discord.js"); + +module.exports = { + PLAYING: { + pause: { + label: "Pause", // Button Name + emoji: "⏯", // Button Emoji + style: ButtonStyle.Success, // OPTIONS: Primary - Secondary - Success - Danger + }, + previous: { + label: "Previous", + emoji: "⬅", + style: ButtonStyle.Primary, + }, + stop: { + label: "Stop", + emoji: "✖", + style: ButtonStyle.Danger, + }, + skip: { + label: "Skip", + emoji: "➡", + style: ButtonStyle.Primary, + }, + loop: { + label: "Loop", + emoji: "🔁", + style: ButtonStyle.Success, + }, + }, + +} \ No newline at end of file diff --git a/settings/config.js b/settings/config.js new file mode 100644 index 0000000..e70dce6 --- /dev/null +++ b/settings/config.js @@ -0,0 +1,41 @@ +require("dotenv").config(); +const { resolve } = require("path"); + +module.exports = { + TOKEN: process.env.TOKEN || "YOUR_TOKEN", // TOKEN BOT + BOT_ID: process.env.BOT_ID || "BOT_ID", // BOT ID + PREFIX: process.env.PREFIX || "-", // Bot Prefix (Default is "-" ) + OWNER_ID: process.env.OWNER_ID || "OWNER_ID", // Owner ID + + LINKS: { + JOIN_LEAVE_LOGS: process.env.JOIN_LEAVE_LOGS || "xxx", // Webhook join & leave guilds + ERROR_LOGS: process.env.ERROR_LOGS || "xxx", // Webhook link for Error Logs + MONGO_CONNECTION: process.env.MONGO_CONNECTION|| "YOUR_MONGO_URL", // MongoDB Url + SUPPORT_SERVER: process.env.SUPPORT_SERVER || "https://discord.gg/MqNKpdrGjw", // Your Discord Support Server + }, + + EMBED_COLORS: + { + DEFAULT: "#ffec1d", // Default Color + ERROR: "#fe333e", // ERROR Color + }, + + CACHE_SIZE: { + GUILDS: 100, + USERS: 10000, + MEMBERS: 10000, + }, + + // Language: ignore this session + LANGUAGE: { + defaultLocale: "en", // Default Language + directory: resolve("langs"), + }, +} + +/* +╔═════════════════════════════════════════════════════╗ +║ || - || Developed by NoBody#9666 || - || ║ +║ ----------| discord.gg/FMbXwGPJGm |--------- ║ +╚═════════════════════════════════════════════════════╝ +*/ \ No newline at end of file diff --git a/src/Database/mongoose.js b/src/Database/mongoose.js new file mode 100644 index 0000000..7cac170 --- /dev/null +++ b/src/Database/mongoose.js @@ -0,0 +1,30 @@ +const mongoose = require("mongoose"); +const { LINKS } = require("../../settings/config"); +const Logger = require("../helpers/Logger"); +const chalk = require("chalk") + +mongoose.set('strictQuery', true); + +module.exports = { + async initializeMongoose() { + Logger.log(`[LOADING] DataBase(Mongoose)...`); + + try { + await mongoose.connect( LINKS.MONGO_CONNECTION, { + keepAlive: true, + }); + + Logger.success(chalk.green("[Mongoose] Database connection established")); + + return mongoose.connection + } catch (error) { + Logger.error("[Mongoose] Failed to connect to DataBase:", error); + process.exit(); + } + }, + + schemas: { + Guild: require("./schemas/Guild"), + User: require("./schemas/User.js") + }, +}; diff --git a/src/Database/schemas/Guild.js b/src/Database/schemas/Guild.js new file mode 100644 index 0000000..a9fb043 --- /dev/null +++ b/src/Database/schemas/Guild.js @@ -0,0 +1,64 @@ +const mongoose = require("mongoose"); +const FixedSizeMap = require("fixedsize-map"); +const { getUser } = require("./User.js"); +const { PREFIX, LANGUAGE, CACHE_SIZE } = require("../../../settings/config"); + +const cache = new FixedSizeMap(CACHE_SIZE.GUILDS); + +const Schema = new mongoose.Schema({ + _id: String, + data: { + name: String, + region: String, + owner: { type: String, ref: "users" }, + joinedAt: Date, + leftAt: Date, + bots: { type: Number, default: 0 }, + }, + + // prefix and language are futures features + prefix: { type: String, default: PREFIX }, + language: { type: String, default: LANGUAGE.defaultLocale}, +}); + +const Model = mongoose.model("guild", Schema); +module.exports = Model; +module.exports = { + /** + * @param {import('discord.js').Guild} guild + */ + getSettings: async (guild) => { + if (!guild) throw new Error("Guild is undefined"); + if (!guild.id) throw new Error("Guild Id is undefined"); + + const cached = cache.get(guild.id); + if (cached) return cached; + + let guildData = await Model.findById(guild.id); + if (!guildData) { + // save owner details + guild + .fetchOwner() + .then(async (owner) => { + const userDb = await getUser(owner); + await userDb.save(); + }) + .catch((ex) => {}); + + // create a new guild model + guildData = new Model({ + _id: guild.id, + data: { + name: guild.name, + region: guild.preferredLocale, + owner: guild.ownerId, + joinedAt: guild.joinedAt, + }, + }); + + await guildData.save(); + } + cache.add(guild.id, guildData); + return guildData; + }, +}; diff --git a/src/Database/schemas/User.js b/src/Database/schemas/User.js new file mode 100644 index 0000000..781f9ff --- /dev/null +++ b/src/Database/schemas/User.js @@ -0,0 +1,51 @@ +const mongoose = require("mongoose"); +const FixedSizeMap = require("fixedsize-map"); +const { CACHE_SIZE } = require("../../../settings/config"); + +const cache = new FixedSizeMap(CACHE_SIZE.USERS); + +const Schema = new mongoose.Schema( + { + _id: String, + username: String, + discriminator: String, + logged: Boolean, + }, + { + timestamps: { + createdAt: "created_at", + updatedAt: "updated_at", + }, + } +); + +const Model = mongoose.model("user", Schema); + +module.exports = { + /** + * @param {import('discord.js').User} user + */ + getUser: async (user) => { + if (!user) throw new Error("User is required."); + if (!user.id) throw new Error("User Id is required."); + + const cached = cache.get(user.id); + if (cached) return cached; + + let userDb = await Model.findById(user.id); + if (!userDb) { + userDb = new Model({ + _id: user.id, + username: user.username, + discriminator: user.discriminator, + }); + } + else if (!userDb.username || !userDb.discriminator) { + userDb.username = user.username; + userDb.discriminator = user.discriminator; + } + cache.add(user.id, userDb); + return userDb; + }, + +}; diff --git a/src/commands/filters/3d.js b/src/commands/filters/3d.js new file mode 100644 index 0000000..4dd2417 --- /dev/null +++ b/src/commands/filters/3d.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "3d", + description: "Turning on 3d filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("3d"); + + const embed = new EmbedBuilder() + .setAuthor({ text: 'Turned on: 3d', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/bassboost.js b/src/commands/filters/bassboost.js new file mode 100644 index 0000000..0326ec5 --- /dev/null +++ b/src/commands/filters/bassboost.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "bassboost", + description: "Turning on bassboost filter", + category: "filters", + accessableby: "Member", + aliases: ["bb"] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("bassboost") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Bassboost', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/earrape.js b/src/commands/filters/earrape.js new file mode 100644 index 0000000..6eb8318 --- /dev/null +++ b/src/commands/filters/earrape.js @@ -0,0 +1,30 @@ +const { EmbedBuilder } = require('discord.js'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "earrape", + description: "Turning on earrape volume", + category: "filters", + accessableby: "Member", + aliases: ["loud"] + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.setVolume(1000) + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`\`🔊\` | **Volume charge to:** \`Earrape\``); + + msg.edit({ content: ' ', embeds: [embed] }) + + } +}; + diff --git a/src/commands/filters/earwax.js b/src/commands/filters/earwax.js new file mode 100644 index 0000000..1e9a540 --- /dev/null +++ b/src/commands/filters/earwax.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "earwax", + description: "Turning on earwax filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("earwax") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Earwax', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/echo.js b/src/commands/filters/echo.js new file mode 100644 index 0000000..25a60e1 --- /dev/null +++ b/src/commands/filters/echo.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "echo", + description: "Turning on echo filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("echo") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Echo', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/filter.js b/src/commands/filters/filter.js new file mode 100644 index 0000000..03ef23d --- /dev/null +++ b/src/commands/filters/filter.js @@ -0,0 +1,40 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "filter", + description: "Change the filter if you want!", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + const filter = args[0]; + + if (filter === "off" && queue.filters.size) queue.filters.clear(); + else if (Object.keys(client.distube.filters).includes(filter)) { + if (queue.filters.has(filter)) queue.filters.remove(filter) + else queue.filters.add(filter) + } else if (args[0]) msg.edit(`Invalid filter!`) + + const embed = new EmbedBuilder() + .setAuthor({ name: `Currently Filter`, iconURL: `https://cdn.discordapp.com/emojis/741605543046807626.gif`}) + .setDescription(`\🎲 **Filter:** \`${queue.filters.names.join(", ") || "Normal"}\``) + .setFooter({ text: `🔩 **Example:** \`${client.prefix}filter 3d\``}) + .setTimestamp() + .setColor(EMBED_COLORS.DEFAULT); + + await delay(3000) + msg.edit({ content: ' ', embeds: [embed] }) + } +}; // testing version + diff --git a/src/commands/filters/flanger.js b/src/commands/filters/flanger.js new file mode 100644 index 0000000..c52b677 --- /dev/null +++ b/src/commands/filters/flanger.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "flager", + description: "Turning on flager filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("flanger") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Flanger', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/gate.js b/src/commands/filters/gate.js new file mode 100644 index 0000000..7cec99b --- /dev/null +++ b/src/commands/filters/gate.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "gate", + description: "Turning on gate filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("gate") + + const embed = new EmbedBuilder() + .setAuthor({ name:'Turned on: Gate', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/haas.js b/src/commands/filters/haas.js new file mode 100644 index 0000000..6503c33 --- /dev/null +++ b/src/commands/filters/haas.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "haas", + description: "Turning on haas filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("haas") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Haas', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/karaoke.js b/src/commands/filters/karaoke.js new file mode 100644 index 0000000..ce59aac --- /dev/null +++ b/src/commands/filters/karaoke.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "karaoke", + description: "Turning on karaoke filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("karaoke") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Karaoke', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/mcompand.js b/src/commands/filters/mcompand.js new file mode 100644 index 0000000..7171a50 --- /dev/null +++ b/src/commands/filters/mcompand.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "mcompand", + description: "Turning on mcompand filter", + category: "filters", + accessableby: "Member", + aliases: ["mp"] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("mcompand") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Mcompand', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/nightcore.js b/src/commands/filters/nightcore.js new file mode 100644 index 0000000..b7e7470 --- /dev/null +++ b/src/commands/filters/nightcore.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "nightcore", + description: "Turning on nightcore filter", + category: "filters", + accessableby: "Member", + aliases: ["nc"] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("nightcore") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Nightcore', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/phaser.js b/src/commands/filters/phaser.js new file mode 100644 index 0000000..fe16d5b --- /dev/null +++ b/src/commands/filters/phaser.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "phaser", + description: "Turning on phaser filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("phaser") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Phaser', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/reset.js b/src/commands/filters/reset.js new file mode 100644 index 0000000..098ba36 --- /dev/null +++ b/src/commands/filters/reset.js @@ -0,0 +1,32 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "reset", + description: "Reseting all filter currently in use", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.clear(); + queue.setVolume(50) + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Filter has been: Reseted', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(3000); + msg.edit({ content: ' ', embeds: [embed] }); + } +}; /// testing version + diff --git a/src/commands/filters/reverse.js b/src/commands/filters/reverse.js new file mode 100644 index 0000000..935282a --- /dev/null +++ b/src/commands/filters/reverse.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "reverse", + description: "Turning on reverse filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("reverse") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Reverse', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/surround.js b/src/commands/filters/surround.js new file mode 100644 index 0000000..5c0b465 --- /dev/null +++ b/src/commands/filters/surround.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "surround", + description: "Turning on surround filter", + category: "filters", + accessableby: "Member", + aliases: ["sr"] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("surround") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Surround', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/tremolo.js b/src/commands/filters/tremolo.js new file mode 100644 index 0000000..9c66ea9 --- /dev/null +++ b/src/commands/filters/tremolo.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "tremolo", + description: "Turning on tremolo filter", + category: "filters", + accessableby: "Member", + aliases: [] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("tremolo") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Tremolo', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/filters/vaporwave.js b/src/commands/filters/vaporwave.js new file mode 100644 index 0000000..a7cefa1 --- /dev/null +++ b/src/commands/filters/vaporwave.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require('discord.js'); +const delay = require('delay'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "vaporwave", + description: "Turning on vaporwave filter", + category: "filters", + accessableby: "Member", + aliases: ["vw"] + }, + run: async (client, message) => { + const msg = await message.channel.send("⏳ **Processing.....**") + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + queue.filters.add("vaporwave") + + const embed = new EmbedBuilder() + .setAuthor({ name: 'Turned on: Vaporwave', iconURL: 'https://cdn.discordapp.com/emojis/758423098885275748.gif'}) + .setColor(EMBED_COLORS.DEFAULT); + + await delay(5000); + msg.edit({ content: ' ', embeds: [embed] }) + } +}; /// testing version + diff --git a/src/commands/music/autoplay.js b/src/commands/music/autoplay.js new file mode 100644 index 0000000..8518b5f --- /dev/null +++ b/src/commands/music/autoplay.js @@ -0,0 +1,38 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "autoplay", + aliases: ["ap"], + description: "Toggles autoplay for the current guild.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`There is nothing in the queue right now!`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("You need to be in a same/voice channel.") + + if (!queue.autoplay) { + client.distube.toggleAutoplay(message); + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | Activate **Autoplay** mode.`); + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.toggleAutoplay(message); + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | Disable **Autoplay** mode.`); + + msg.edit({ content: ' ', embeds: [embed] }); + } + } +} \ No newline at end of file diff --git a/src/commands/music/join.js b/src/commands/music/join.js new file mode 100644 index 0000000..ab53f19 --- /dev/null +++ b/src/commands/music/join.js @@ -0,0 +1,60 @@ +const { EmbedBuilder, PermissionsBitField } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "join", + aliases: ["summon"], + description: "Makes the bot join the voice channel.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const { channel } = message.member.voice; + if (!channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.Connect)) return message.channel.send(`I don't have perm \`CONNECT\` in ${channel.name} to join voice!`); + if (!channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.Speak)) return message.channel.send(`I don't have perm \`SPEAK\` in ${channel.name} to join voice!`); + + const clientVoice = message.guild.members.me.voice.channel; + const memberVoice = message.member.voice.channel; + + if (clientVoice) { + if (clientVoice !== memberVoice) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`You must be in the same channel as ${message.client.user}`); + + return msg.edit({ content: ' ', embeds: [embed] }); + } else { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`I'm already on your voice channel`); + + return msg.edit({ content: ' ', embeds: [embed] }); + } + } else { + if (memberVoice) { + client.distube.voices.join(memberVoice) + .then(voice => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔊 | **Joined:** \`${memberVoice.name}\``) + + msg.edit({ content: ' ', embeds: [embed] }); + }) + .catch(error => { + console.log(e); + }) + + + } else { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`You must be in a voice channel!`); + + return msg.edit({ content: ' ', embeds: [embed] }); + } + } + } +} \ No newline at end of file diff --git a/src/commands/music/leave.js b/src/commands/music/leave.js new file mode 100644 index 0000000..34e3e34 --- /dev/null +++ b/src/commands/music/leave.js @@ -0,0 +1,39 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "leave", + aliases: ["lev", "stop", "dc"], + description: "Makes the bot leave the voice channel.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + const queue = client.distube.getQueue(message); + + if (!queue) return msg.edit(`❌ **| There is nothing in the queue right now!**`) + const clientVoice = message.guild.members.me.voice.channel; + const memberVoice = message.member.voice.channel; + + if (clientVoice === memberVoice) { + if (queue) { + client.distube.stop(message); + client.distube.voices.leave(message.guild); + } else { + client.distube.voices.leave(message.guild); + } + + const embed = new EmbedBuilder() + .setDescription(`🏃‍♂️ **| Left: |** \`${memberVoice.name}\``) + .setColor(EMBED_COLORS.DEFAULT) + + msg.edit({ content: ' ', embeds : [embed] }); + + } + + } +} + + diff --git a/src/commands/music/loop.js b/src/commands/music/loop.js new file mode 100644 index 0000000..fb1eb32 --- /dev/null +++ b/src/commands/music/loop.js @@ -0,0 +1,38 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "loop", + aliases: ["repeat"], + description: "loop the song currently playing.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + if (queue.repeatMode === 0) { + client.distube.setRepeatMode(message, 1); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔁 | **Song is loop:** \`Current\``) + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.setRepeatMode(message, 0); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔁 | **Song is unloop:** \`Current\``) + + msg.edit({ content: ' ', embeds: [embed] }); + } + } +} + + diff --git a/src/commands/music/loopqueue.js b/src/commands/music/loopqueue.js new file mode 100644 index 0000000..5749fe6 --- /dev/null +++ b/src/commands/music/loopqueue.js @@ -0,0 +1,37 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "loopqueue", + aliases: ["lq", "loopall"], + description: "loop the song in queue playing.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + if (queue.repeatMode === 2) { + client.distube.setRepeatMode(message, 0); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔁 | **Song is unloop:** \`All\``) + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.setRepeatMode(message, 2); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔁 | **Song is loop:** \`All\``) + + msg.edit({ content: ' ', embeds: [embed] }); + } + } +} + diff --git a/src/commands/music/lyrics.js b/src/commands/music/lyrics.js new file mode 100644 index 0000000..1bff9a4 --- /dev/null +++ b/src/commands/music/lyrics.js @@ -0,0 +1,54 @@ +const lyricsfinder = require('lyrics-finder'); +const { EmbedBuilder } = require('discord.js'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "lyrics", + aliases: ["lys"], + description: "Display lyrics of a song", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **| Searching for lyrics...**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| ❌ **| There is nothing in the queue right now!****`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + let song = args.join(" "); + let CurrentSong = queue.songs[0]; + if (!song && CurrentSong) song = CurrentSong.name; + + let lyrics = null; + + try { + lyrics = await lyricsfinder(song, ""); + if (!lyrics) msg.edit("❌ **| Couldn't find any lyrics for that song!**"); + } catch (err) { + console.log(err); + msg.edit("❌ **| Couldn't find any lyrics for that song!**"); + } + let lyricsEmbed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setTitle(`Lyrics`) + .setDescription(`**${song}**\n${lyrics}`) + .setFooter({ text: `Requested by ${message.author.username}`}) + .setTimestamp(); + + if (lyrics.length > 3000) { + lyricsEmbed.setDescription("❌ **| Lyrics too long to display!**"); + } + + msg.edit({ content: ' ', embeds: [lyricsEmbed] }) + .then(n => { + var total = queue.songs[0].duration * 2000; + var current = queue.currentTime * 2000; + let time = total - current; + setTimeout(() => { msg.delete(); }, time); + }); + } +}; + diff --git a/src/commands/music/nowplaying.js b/src/commands/music/nowplaying.js new file mode 100644 index 0000000..50926a7 --- /dev/null +++ b/src/commands/music/nowplaying.js @@ -0,0 +1,41 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "nowplaying", + aliases: ["np", "now"], + description: "Displays the current song playing.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send('⏳ **Processing.....**'); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + const uni = `${queue.songs[0].playing ? '⏸️ |' : '🔴 |'}`; + const part = Math.floor((queue.currentTime / queue.songs[0].duration) * 30); + + const embed = new EmbedBuilder() + .setAuthor({ name: queue.songs[0].playing ? 'Song Pause...' : 'Now Playing...', iconURL: "https://cdn.discordapp.com/emojis/741605543046807626.gif"}) + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`**[${queue.songs[0].name}](${queue.songs[0].url})**`) + .setThumbnail(`${queue.songs[0].thumbnail}`) + .addFields({ name: 'Uploader:', value: `[${queue.songs[0].uploader.name}](${queue.songs[0].uploader.url})`, inline: true }) + .addFields({ name: 'Requester:', value: `${queue.songs[0].user}`, inline: true }) + .addFields({ name: 'Volume:', value: `${queue.volume}%`, inline: true }) + .addFields({ name: 'Views', value: `${queue.songs[0].views}`, inline: true }) + .addFields({ name: 'Likes:', value: `${queue.songs[0].likes}`, inline: true }) + .addFields({ name: 'Filters:', value: `${queue.filters.names.join(', ') || "Normal"}`, inline: true }) + .addFields({ name: `Current Duration: \`[${queue.formattedCurrentTime} / ${queue.songs[0].formattedDuration}]\``, value: `\`\`\`${uni} ${'─'.repeat(part) + '🎶' + '─'.repeat(30 - part)}\`\`\``, inline: false }) + .setTimestamp() + + msg.edit({ content: ' ', embeds: [embed] }); + } +} + + diff --git a/src/commands/music/pause.js b/src/commands/music/pause.js new file mode 100644 index 0000000..f59135d --- /dev/null +++ b/src/commands/music/pause.js @@ -0,0 +1,35 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "pause", + aliases: ["pa"], + description: "Pauses the current song.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send('⏳ **Processing.....**'); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`There is nothing in the queue right now!`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("You need to be in a same/voice channel.") + + if (queue.paused) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | **Song has been:** \`Paused\``); + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.pause(message); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | **Song has been:** \`Paused\``); + + msg.edit({ content: ' ', embeds: [embed] }); + } + } +} \ No newline at end of file diff --git a/src/commands/music/play.js b/src/commands/music/play.js new file mode 100644 index 0000000..01b5eaa --- /dev/null +++ b/src/commands/music/play.js @@ -0,0 +1,32 @@ +const { PermissionsBitField } = require("discord.js"); + +module.exports = { + config: { + name: "play", + aliases: ["pplay", "p"], + description: "Plays a song from the source.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + message.channel.send(`⏳ **Processing:** \`${args.join(" ")}\``).then(msg => { + setTimeout(() => msg.delete(), 5000) + }) + + const { channel } = message.member.voice; + if (!channel) return message.reply("❌ **| You need to be in voice channel.") + if (!channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.Connect)) return message.channel.send(`I don't have perm \`CONNECT\` in ${channel.name} to join voice!`); + if (!channel.permissionsFor(message.guild.members.me).has(PermissionsBitField.Flags.Speak)) return message.channel.send(`I don't have perm \`SPEAK\` in ${channel.name} to join voice!`); + + const string = args.join(" "); + if (!string) return message.channel.send("Please provide a song name or link."); + + const options = { + member: message.member, + textChannel: message.channel, + message + } + + await client.distube.play(message.member.voice.channel, string, options); + } +} \ No newline at end of file diff --git a/src/commands/music/playskip.js b/src/commands/music/playskip.js new file mode 100644 index 0000000..ceaa2ae --- /dev/null +++ b/src/commands/music/playskip.js @@ -0,0 +1,37 @@ +const { PermissionsBitField } = require("discord.js"); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "playskip", + description: "Reproduce una canción.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + message.channel.send(`⏳ **| Processing.....** \`${args.join(" ")}\``).then(msg => { + setTimeout(() => msg.delete(), 5000) + }) + + const { channel } = message.member.voice; + if (!channel) return message.channel.send("❌ **| You need to be in voice channel.") + if (!message.guild.members.cache.get(client.user.id).permissionsIn(channel).has(PermissionsBitField.Flags.Connect)) return message.channel.send(`I don't have perm \`CONNECT\` in ${channel.name} to join voice!`); + if (!message.guild.members.cache.get(client.user.id).permissionsIn(channel).has(PermissionsBitField.Flags.Speak)) return message.channel.send(`I don't have perm \`SPEAK\` in ${channel.name} to join voice!`); + + const string = args.join(" "); + if (!string) { + return message.channel.send("Please provide a song name or link."); + } + + const options = { + member: message.member, + textChannel: message.channel, + message, + skip: true + } + + await client.distube.play(message.member.voice.channel, string, options); + } +} + + diff --git a/src/commands/music/previous.js b/src/commands/music/previous.js new file mode 100644 index 0000000..a8c3fe9 --- /dev/null +++ b/src/commands/music/previous.js @@ -0,0 +1,36 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "previous", + aliases: ["prev"], + description: "Plays the previous song in the queue.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("Processing....."); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in voice channel.") + + if (queue.previousSongs.length == 0) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("🚨 | **There are no** `Previous` **songs**") + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.previous(message) + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("⏮ | **Song has been:** `Previous`") + + msg.edit({ content: ' ', embeds: [embed] }); + } + } +} \ No newline at end of file diff --git a/src/commands/music/queue.js b/src/commands/music/queue.js new file mode 100644 index 0000000..44e3ff1 --- /dev/null +++ b/src/commands/music/queue.js @@ -0,0 +1,55 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config.js"); +const { QueuePage } = require('../../structures/PageQueue.js'); + +module.exports = { + config: { + name: "queue", + aliases: ["q", "que"], + description: "Diplay the queue", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const queue = client.distube.getQueue(message); + if (!queue) message.channel.send(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return message.channel.send("❌ **| You need to be in a same/voice channel.**") + + const pagesNum = Math.ceil(queue.songs.length / 10); + if(pagesNum === 0) pagesNum = 1; + + const qduration = queue.formattedDuration; + + const songStrings = []; + for (let i = 1; i < queue.songs.length; i++) { + const song = queue.songs[i]; + songStrings.push( + `**${i}.** [${song.name}](${song.url}) \`[${song.formattedDuration}]\` • ${song.user} + `); + } + + const pages = []; + for (let i = 0; i < pagesNum; i++) { + const str = songStrings.slice(i * 10, i * 10 + 10).join(''); + const embed = new EmbedBuilder() + .setAuthor({ name: `Queue - ${message.guild.name}`, iconURL: message.guild.iconURL({ dynamic: true })}) + .setThumbnail(queue.songs[0].thumbnail) + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`**Currently Playing:**\n**[${queue.songs[0].name}](${queue.songs[0].url})** \`[${queue.songs[0].formattedDuration}]\` • ${queue.songs[0].user}\n\n**Rest of queue**${str == '' ? ' Nothing' : '\n' + str }`) + .setFooter({ text: `Page • ${i + 1}/${pagesNum} | ${queue.songs.length} • Songs | ${queue.formattedDuration} • Total duration`}); + pages.push(embed); + } + + if (!args[0]) { + if (pages.length == pagesNum && queue.songs.length > 10) QueuePage(client, message, pages, 60000, queue.songs.length, qduration); + else return message.channel.send({ embeds: [pages[0]] }); + } + else { + if (isNaN(args[0])) return message.channel.send('Page must be a number.'); + if (args[0] > pagesNum) return message.channel.send(`There are only ${pagesNum} pages available.`); + const pageNum = args[0] == 0 ? 1 : args[0] - 1; + return message.channel.send({ embeds: [pages[pageNum]] }); + } + } +} \ No newline at end of file diff --git a/src/commands/music/replay.js b/src/commands/music/replay.js new file mode 100644 index 0000000..f16d3d3 --- /dev/null +++ b/src/commands/music/replay.js @@ -0,0 +1,31 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "replay", + aliases: [], + description: "Replays the current song.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ |There is nothing in the queue right now!`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + await queue.seek(0) + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("🔁 **| Song has been:** `Replay`") + + msg.edit({ content: ' ', embeds: [embed] }); + + } +} + + diff --git a/src/commands/music/resume.js b/src/commands/music/resume.js new file mode 100644 index 0000000..6a117b9 --- /dev/null +++ b/src/commands/music/resume.js @@ -0,0 +1,38 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "resume", + aliases: ["re"], + description: "Resumes the music", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + if (queue.paused) { + await client.distube.resume(message); + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | **Song has been:** \`Resumed\``); + + msg.edit({ embeds: [embed] }); + } else { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏯ | **Queue has been:** \`Resumed\``); + + msg.edit({ embeds: [embed] }); + } + } +} + + diff --git a/src/commands/music/shuffle.js b/src/commands/music/shuffle.js new file mode 100644 index 0000000..c1df252 --- /dev/null +++ b/src/commands/music/shuffle.js @@ -0,0 +1,29 @@ +const { EmbedBuilder } = require('discord.js'); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "shuffle", + aliases: ["mix"], + description: "Shuffles the current queue.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + await client.distube.shuffle(message); + + let embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔀 | **Song has been:** \`Shuffle\``); + + msg.edit({ content: ' ', embeds: [embed] }); + } +}; + diff --git a/src/commands/music/skip.js b/src/commands/music/skip.js new file mode 100644 index 0000000..34a4ce2 --- /dev/null +++ b/src/commands/music/skip.js @@ -0,0 +1,38 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "skip", + aliases: ["s"], + description: "Skips the current song.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + if (queue.songs.length === 1 && queue.autoplay === false) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("🚨 **| There are no** `Songs` **in queue**") + + msg.edit({ content: ' ', embeds: [embed] }); + } else { + client.distube.skip(message) + .then(song => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("⏭ **| Song has been:** `Skipped`") + + msg.edit({ content: ' ', embeds: [embed] }); + }); + } + } +} + diff --git a/src/commands/music/skipto.js b/src/commands/music/skipto.js new file mode 100644 index 0000000..892aba7 --- /dev/null +++ b/src/commands/music/skipto.js @@ -0,0 +1,39 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "skipto", + aliases: ["st"], + description: "Skip to a song in the queue.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + if (isNaN(args[0])) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`**Please enter a valid number!**`); + + return msg.edit({ content: ' ', embeds: [embed] }); + } + + await client.distube.jump(message, parseInt(args[0])) + .then(queue => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`⏭ **| Skipto:** ${args[0]}`) + + msg.edit({ content: ' ', embeds: [embed] }); + }); + } +} + + diff --git a/src/commands/music/volume.js b/src/commands/music/volume.js new file mode 100644 index 0000000..f2fa466 --- /dev/null +++ b/src/commands/music/volume.js @@ -0,0 +1,51 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "volume", + aliases: ["vol", "v"], + description: "Changes the volume of the music playing.", + accessableby: "Member", + category: "music", + }, + run: async (client, message, args) => { + const msg = await message.channel.send("⏳ **Processing.....**"); + + const queue = client.distube.getQueue(message); + if (!queue) msg.edit(`❌ **| There is nothing in the queue right now!**`) + const { channel } = message.member.voice; + if (!channel || message.member.voice.channel !== message.guild.members.me.voice.channel) return msg.edit("❌ **| You need to be in a same/voice channel.**") + + const volume = parseInt(args[0]); + + if (!volume) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`Current **volume** : \`${queue.volume}\`%`) + + return msg.edit({ content: ' ', embeds: [embed] }); + } + + if (isNaN(volume)) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`**Please enter a valid number**`); + + return msg.edit({ content: ' ', embeds: [embed] }); + } + + if (Number(volume) < 1 || Number(volume) > 100) return msg.edit(`**Please provide a number between 1 and 100**`) + + client.distube.setVolume(message, volume); + + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`🔊 | **Change volume to:** \`${args[0]}\`%`) + + msg.edit({ content: ' ', embeds: [embed] }); + + } +} + + diff --git a/src/commands/owner/stopbot.js b/src/commands/owner/stopbot.js new file mode 100644 index 0000000..82e64eb --- /dev/null +++ b/src/commands/owner/stopbot.js @@ -0,0 +1,30 @@ +const chalk = require('chalk'); +const { EmbedBuilder } = require('discord.js'); +const { EMBED_COLORS } = require('../../../settings/config'); +const Logger = require('../../helpers/Logger'); + + +module.exports = { + config: { + name: "stopbot", + description: "shuts down the client!", + category: "owner", + accessableby: "Owner", + aliases: ["sbot"] + }, + run: async (client, message, args) => { + if(message.author.id != client.owner){ + return message.reply({embeds: [new EmbedBuilder().setTitle('ERROR') .setDescription("This command is only for bot owners") .setColor(EMBED_COLORS.ERROR)]}) + } + const restart = new EmbedBuilder() + .setDescription(`**${message.guild.members.me.displayName} has been**: \`Shutting down...\``) + .setColor(EMBED_COLORS.DEFAULT); + + await message.reply({ embeds: [restart] }); + Logger.warn(chalk.yellow(`[BOT] Restarting...`)); + + process.exit(); + +} +}; + diff --git a/src/commands/utilities/filterlist.js b/src/commands/utilities/filterlist.js new file mode 100644 index 0000000..67331c1 --- /dev/null +++ b/src/commands/utilities/filterlist.js @@ -0,0 +1,42 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require('../../../settings/config'); + +module.exports = { + config: { + name: "filterlist", + aliases: ["fl"], + usage: "(command)", + category: "utilities", + description: "Displays all filters that the bot has.", + accessableby: "Members" + }, + run: async (client, message) => { + const msg = await message.channel.send("Processing..."); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setAuthor({ name: `Filter List`, iconURL: message.guild.iconURL({ dynamic: true })}) + .setDescription(`**Displays all filters that the bot has.**`) + .setThumbnail(client.user.displayAvatarURL({ dynamic: true, size: 2048 })) + .addFields({ name: '** **', value: `\`3d\``, inline: true }) + .addFields({ name: '** **', value: `\`bassboost\``, inline: true }) + .addFields({ name: '** **', value: `\`echo\``, inline: true }) + .addFields({ name: '** **', value: `\`karaoke\``, inline: true }) + .addFields({ name: '** **', value: `\`nightcore\``, inline: true }) + .addFields({ name: '** **', value: `\`vaporwave\``, inline: true }) + .addFields({ name: '** **', value: `\`flanger\``, inline: true }) + .addFields({ name: '** **', value: `\`gate\``, inline: true }) + .addFields({ name: '** **', value: `\`haas\``, inline: true }) + .addFields({ name: '** **', value: `\`reverse\``, inline: true }) + .addFields({ name: '** **', value: `\`surround\``, inline: true }) + .addFields({ name: '** **', value: `\`mcompand\``, inline: true }) + .addFields({ name: '** **', value: `\`phaser\``, inline: true }) + .addFields({ name: '** **', value: `\`tremolo\``, inline: true }) + .addFields({ name: '** **', value: `\`earwax\``, inline: true }) + .setFooter({ text: `Example: ${client.prefix}filter bassboost` }) + .setTimestamp() + + msg.edit({ content: ' ', embeds: [embed] }) + } +}; // testing version + + diff --git a/src/commands/utilities/help.js b/src/commands/utilities/help.js new file mode 100644 index 0000000..57ed69c --- /dev/null +++ b/src/commands/utilities/help.js @@ -0,0 +1,73 @@ +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const { readdirSync } = require("fs"); +const { stripIndents } = require("common-tags"); +const config = require("../../../settings/config"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "help", + aliases: ["h", "halp", "commands", "ayuda"], + usage: "(command)", + category: "utilities", + description: "Show all the commands that the bot has.", + accessableby: "Members" + }, + run: async (client, message, args) => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setAuthor({ name: `${message.guild.members.me.displayName} Help Command!`, iconURL: message.guild.iconURL({ dynamic: true })}) + .setThumbnail(client.user.displayAvatarURL({ dynamic: true, size: 2048 })); + + if(!args[0]) { + const categories = readdirSync("./src/commands") + + embed.setDescription(`The bot prefix is: **${client.prefix}**`) + embed.setFooter({ text: `© ${message.guild.members.me.displayName} | Total Commands: ${client.commands.size}`, iconURL: client.user.displayAvatarURL({ dynamic: true })}); + + categories.forEach(category => { + const dir = client.commands.filter(c => c.config.category === category) + const capitalise = category.slice(0, 1).toUpperCase() + category.slice(1) + try { + embed.addFields({ name: `❯ ${capitalise} [${dir.size}]:`, value: dir.map(c => `\`${c.config.name}\``).join(" "), inline: false }) + } catch(e) { + client.logger.log(e) + } + }) + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setLabel("Support") + .setURL(config.LINKS.SUPPORT_SERVER) + .setEmoji("🎫") + .setStyle(ButtonStyle.Link), + new ButtonBuilder() + .setLabel("Invite") + .setURL(`https://discord.com/api/oauth2/authorize?client_id=${config.BOT_ID}&permissions=8&scope=bot%20applications.commands`) + .setEmoji('🔗') + .setStyle(ButtonStyle.Link) + ) + + return message.channel.send({ embeds: [embed], components: [row] }); + } else { + let command = client.commands.get(client.aliases.get(args[0].toLowerCase()) || args[0].toLowerCase()) + if(!command) return message.channel.send({ embeds: [embed.setTitle("Invalid Command.").setDescription(`Do \`${client.prefix}help\` for the list of the commands.`)] }) + command = command.config + + return message.reply({ embeds: [ + new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(stripIndents`The client's prefix is: \`${client.prefix}\`\n + + **Command:** ${command.name.slice(0, 1).toUpperCase() + command.name.slice(1)} + **Description:** ${command.description || "No Description provided."} + **Usage:** ${command.usage ? `\`${client.prefix}${command.name} ${command.usage}\`` : "No Usage"} + **Accessible by:** ${command.accessableby || "Members"} + **Aliases:** ${command.aliases ? command.aliases.join(", ") : "None."}`) + + ] }) + } + } +} + diff --git a/src/commands/utilities/invite.js b/src/commands/utilities/invite.js new file mode 100644 index 0000000..a7b1b26 --- /dev/null +++ b/src/commands/utilities/invite.js @@ -0,0 +1,44 @@ +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const { EMBED_COLORS, LINKS } = require("../../../settings/config"); + +module.exports = { + config: { + name: "invite", + aliases: ["invitar", "invitacion"], + category: "utilities", + description: "Invite the Bot to your server.", + accessableby: "Members" + }, + run: async (client, message, args) => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setAuthor({ name: `💡 › Invite ${message.guild.members.me.displayName}`}) + .setDescription(`\n**⭐ ›** **[Invite](https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands)**\n`) + .setTimestamp() + .setFooter({ text: `Requested by ${message.author.tag}`, iconURL: message.author.displayAvatarURL()}); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setLabel("Invite") + .setURL(`https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands`) + .setEmoji("🔗") + .setStyle(ButtonStyle.Link), + new ButtonBuilder() + .setLabel("Support") + .setURL(LINKS.SUPPORT_SERVER) + .setEmoji("🎫") + .setStyle(ButtonStyle.Link), + new ButtonBuilder() + .setLabel('INVITE CUCHUS') + .setEmoji('⭐') + .setURL('https://discord.com/api/oauth2/authorize?client_id=892993411169267722&scope=bot+applications.commands&permissions=1374891928950') + .setStyle(ButtonStyle.Link), + ) + + + message.channel.send({ embeds: [embed], components: [row] }); + } +} + + diff --git a/src/commands/utilities/ping.js b/src/commands/utilities/ping.js new file mode 100644 index 0000000..bf61491 --- /dev/null +++ b/src/commands/utilities/ping.js @@ -0,0 +1,73 @@ +const { EmbedBuilder} = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + + +module.exports = { + config: { + name: "ping", + aliases: [], + category: "utilities", + description: "pong!", + accessableby: "Members" + }, + run: async (client, message, args) => { + + let msg = await message.channel.send({ + embeds: [ + new EmbedBuilder() + .setDescription("🏓 | **Fetching ping...**") + .setColor(EMBED_COLORS.DEFAULT), + ], + }); + + let zap = "⚡"; + let green = "🟢"; + let red = "🔴"; + let yellow = "🟡"; + + var botState = zap; + var apiState = zap; + + let apiPing = message.client.ws.ping; + let botPing = Math.floor(msg.createdAt - message.createdAt); + + if (apiPing >= 40 && apiPing < 200) { + apiState = green; + } else if (apiPing >= 200 && apiPing < 400) { + apiState = yellow; + } else if (apiPing >= 400) { + apiState = red; + } + + if (botPing >= 40 && botPing < 200) { + botState = green; + } else if (botPing >= 200 && botPing < 400) { + botState = yellow; + } else if (botPing >= 400) { + botState = red; + } + + msg.delete(); + message.reply({ + embeds: [ + new EmbedBuilder() + .setTitle("🏓 | Pong!") + .addFields( + { + name: "API Latency", + value: `\`\`\`yml\n${apiState} | ${apiPing}ms\`\`\``, + inline: true, + }, + { + name: "Bot Latency", + value: `\`\`\`yml\n${botState} | ${botPing}ms\`\`\``, + inline: true, + } + ) + .setColor(EMBED_COLORS.DEFAULT) + .setFooter({ text: `Requested by ${message.author.tag}}`,}), + ], + }); + }, +} + diff --git a/src/events/client/disconnect.js b/src/events/client/disconnect.js new file mode 100644 index 0000000..952da61 --- /dev/null +++ b/src/events/client/disconnect.js @@ -0,0 +1,7 @@ +const chalk = require("chalk") + +module.exports = client => { + client.logger.log(`[${client.user.username}] || Disconnected at ${new Date()}.`) +} + + diff --git a/src/events/client/ready.js b/src/events/client/ready.js new file mode 100644 index 0000000..dcaf7a9 --- /dev/null +++ b/src/events/client/ready.js @@ -0,0 +1,42 @@ +const figlet = require('figlet'); +const chalk = require('chalk'); +const delay = require("delay"); + + +module.exports = async (client) => { + try { + figlet(client.user.tag, function(err, data) { + if (err) { + client.logger.error('Something went wrong...', err); + return; + } + + console.log(chalk.yellow(data)); + }); + + let guilds = client.guilds.cache.size; + let members = client.guilds.cache.reduce((a, b) => a + b.memberCount, 0); + let channels = client.channels.cache.size; + // Precense + const activities = [ + `${client.prefix}help | ${guilds} Servers`, + `${client.prefix}play | ${members} users`, + `${client.prefix}stop | ${channels} channels`, + `${guilds} Servers | ${members} users ` + ] + setInterval(() => { + client.user.setPresence({ + activities: [{ name: `${activities[Math.floor(Math.random() * activities.length)]}`, type: 3 }], + status: 'online', + }); +}, 13000) + +client.logger.success(chalk.green("BOT ONLINE")) +} catch (error) { + client.logger.error(error) + process.exit(); + } + +} + + diff --git a/src/events/client/reconnecting.js b/src/events/client/reconnecting.js new file mode 100644 index 0000000..04725da --- /dev/null +++ b/src/events/client/reconnecting.js @@ -0,0 +1,7 @@ +const chalk = require("chalk"); + +module.exports = client => { + client.logger.warn(chalk.yellow(`[${client.user.username}] || Reconnceting at ${new Date()}.`)); +} + + diff --git a/src/events/client/shardDisconnect.js b/src/events/client/shardDisconnect.js new file mode 100644 index 0000000..d8e38c0 --- /dev/null +++ b/src/events/client/shardDisconnect.js @@ -0,0 +1,5 @@ +module.exports = (client, event, id) => { + client.logger.error(`[Shard #${id}] Disconnected`) +} + + diff --git a/src/events/client/shardError.js b/src/events/client/shardError.js new file mode 100644 index 0000000..119dad6 --- /dev/null +++ b/src/events/client/shardError.js @@ -0,0 +1,6 @@ +const chalk = require("chalk"); + +module.exports = (client, error, id) => { + client.logger.error(chalk.red(`[Shard #${id}] Errored`)) +} + diff --git a/src/events/client/shardReady.js b/src/events/client/shardReady.js new file mode 100644 index 0000000..dd0e38d --- /dev/null +++ b/src/events/client/shardReady.js @@ -0,0 +1,8 @@ +const delay = require("delay"); +const chalk = require("chalk") + +module.exports = async (client, id) => { + await delay(2000); + client.logger.success(chalk.green(`[Shard #${id}] Ready`)) +} + diff --git a/src/events/client/shardReconnecting.js b/src/events/client/shardReconnecting.js new file mode 100644 index 0000000..d38642a --- /dev/null +++ b/src/events/client/shardReconnecting.js @@ -0,0 +1,7 @@ +const chalk = require("chalk"); + + +module.exports = (client, id) => { + client.logger.warn(chalk.yellow(`[Shard #${id}] Reconnecting...`)) +} + diff --git a/src/events/client/shardResume.js b/src/events/client/shardResume.js new file mode 100644 index 0000000..e5620b8 --- /dev/null +++ b/src/events/client/shardResume.js @@ -0,0 +1,4 @@ +module.exports = (client, id, replayedEvents) => { + client.logger.log(`[SHARD INFORMATION] || Shard #${id} Resumed`) +} + diff --git a/src/events/client/voiceStateUpdate.js b/src/events/client/voiceStateUpdate.js new file mode 100644 index 0000000..94c1990 --- /dev/null +++ b/src/events/client/voiceStateUpdate.js @@ -0,0 +1,40 @@ +module.exports = async (client, oldState, newState) => { + if ( + (!oldState.streaming && newState.streaming) || + (oldState.streaming && !newState.streaming) || + (!oldState.serverDeaf && newState.serverDeaf) || + (oldState.serverDeaf && !newState.serverDeaf) || + (!oldState.serverMute && newState.serverMute) || + (oldState.serverMute && !newState.serverMute) || + (!oldState.selfDeaf && newState.selfDeaf) || + (oldState.selfDeaf && !newState.selfDeaf) || + (!oldState.selfMute && newState.selfMute) || + (oldState.selfMute && !newState.selfMute) || + (!oldState.selfVideo && newState.selfVideo) || + (oldState.selfVideo && !newState.selfVideo) + ) + if (!oldState.channelId && newState.channelId) { + if(newState.channel.type == "GUILD_STAGE_VOICE" && newState.guild.members.me.voice.suppress){ + try{ + await newState.guild.members.me.voice.setSuppressed(false); + }catch (e){ + client.logger.error(String(e).grey) + } + } + return + } + if (oldState.channelId && !newState.channelId) { + return + } + if (oldState.channelId && newState.channelId) { + if(newState.channel.type == "GUILD_STAGE_VOICE" && newState.guild.members.me.voice.suppress){ + try{ + await newState.guild.members.me.voice.setSuppressed(false); + }catch (e){ + client.logger.error(String(e).grey) + } + } + return; + } +} + diff --git a/src/events/distube/addList.js b/src/events/distube/addList.js new file mode 100644 index 0000000..839c0a0 --- /dev/null +++ b/src/events/distube/addList.js @@ -0,0 +1,11 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, queue, playlist) => { + const embed = new EmbedBuilder() + .setDescription(`**Queued • [${playlist.name}](${playlist.url})** \`${queue.formattedDuration}\` (${playlist.songs.length} tracks) • ${playlist.user}`) + .setColor(EMBED_COLORS.DEFAULT) + + queue.textChannel.send({ embeds: [embed] }) +} + diff --git a/src/events/distube/addSong.js b/src/events/distube/addSong.js new file mode 100644 index 0000000..01fc9ad --- /dev/null +++ b/src/events/distube/addSong.js @@ -0,0 +1,11 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, queue, song) => { + let embed = new EmbedBuilder() + .setDescription(`**ADDED • [${song.name}](${song.url})** \`${song.formattedDuration}\` • ${song.user}`) + .setColor(EMBED_COLORS.DEFAULT) + + queue.textChannel.send({ content: ' ', embeds: [embed] }) +} + diff --git a/src/events/distube/empty.js b/src/events/distube/empty.js new file mode 100644 index 0000000..42d0d13 --- /dev/null +++ b/src/events/distube/empty.js @@ -0,0 +1,11 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, queue) => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`❌ **| Empty channel!**`) + + queue.textChannel.send({ embeds: [embed] }) +} + diff --git a/src/events/distube/finish.js b/src/events/distube/finish.js new file mode 100644 index 0000000..54d3bc6 --- /dev/null +++ b/src/events/distube/finish.js @@ -0,0 +1,11 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, queue) => { + const embed = new EmbedBuilder() + .setDescription(`🎵 **| Song Ended! **\n` ) + .setColor(EMBED_COLORS.DEFAULT) + + queue.textChannel.send({ embeds: [embed] }) +} + diff --git a/src/events/distube/playSong.js b/src/events/distube/playSong.js new file mode 100644 index 0000000..d359f3f --- /dev/null +++ b/src/events/distube/playSong.js @@ -0,0 +1,175 @@ +const { EmbedBuilder, ActionRowBuilder, ButtonBuilder} = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); +const buttons =require("../../../settings/buttons") + +module.exports = async (client, queue, track) => { + var newQueue = client.distube.getQueue(queue.id) + var data = disspace(newQueue, track) + + const nowplay = await queue.textChannel.send(data) + + const filter = (message) => { + if (message.guild.members.me.voice.channel && message.guild.members.me.voice.channelId === message.member.voice.channelId) return true; + else { + message.reply({ content: "You need to be in a same/voice channel.", ephemeral: true }); + } + }; + const collector = nowplay.createMessageComponentCollector({ filter, time: 120000 }); + + collector.on('collect', async (message) => { + const id = message.customId; + const queue = client.distube.getQueue(message.guild.id); + if (id === "pause") { + if (!queue) { + collector.stop(); + } + if (queue.paused) { + await client.distube.resume(message.guild.id); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`\`⏯\` | **Song has been:** \`Resumed\``); + + message.reply({ embeds: [embed], ephemeral: true }); + } else { + await client.distube.pause(message.guild.id); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`\`⏯\` | **Song has been:** \`Paused\``); + + message.reply({ embeds: [embed], ephemeral: true }); + } + } else if (id === "skip") { + if (!queue) { + collector.stop(); + } + if (queue.songs.length === 1 && queue.autoplay === false) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("\`🚨\` | **There are no** `Songs` **in queue**") + + message.reply({ embeds: [embed], ephemeral: true }); + } else { + await client.distube.skip(message) + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("\`⏭\` | **Song has been:** `Skipped`") + + nowplay.edit({ components: [] }); + message.reply({ embeds: [embed], ephemeral: true }); + } + } else if (id === "stop") { + if (!queue) { + collector.stop(); + } + + await client.distube.stop(message.guild.id); + + const embed = new EmbedBuilder() + .setDescription(`\`🚫\` | **Song has been:** | \`Stopped\``) + .setColor(EMBED_COLORS.DEFAULT); + + await nowplay.edit({ components: [] }); + message.reply({ embeds: [embed], ephemeral: true }); + } else if (id === "loop") { + if (!queue) { + collector.stop(); + } + if (queue.repeatMode === 0) { + client.distube.setRepeatMode(message.guild.id, 1); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`\`🔁\` | **Song is loop:** \`Current\``) + + message.reply({ embeds: [embed], ephemeral: true }); + } else { + client.distube.setRepeatMode(message.guild.id, 0); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`\`🔁\` | **Song is unloop:** \`Current\``) + + message.reply({ embeds: [embed], ephemeral: true }); + } + } else if (id === "previous") { + if (!queue) { + collector.stop(); + } + if (queue.previousSongs.length == 0) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("\`🚨\` | **There are no** `Previous` **songs**") + + message.reply({ embeds: [embed], ephemeral: true }); + } else { + await client.distube.previous(message) + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setDescription("\`⏮\` | **Song has been:** `Previous`") + + nowplay.edit({ components: [] }); + message.reply({ embeds: [embed], ephemeral: true }); + } + } + }); + collector.on('end', async (collected, reason) => { + if (reason === "time") { + nowplay.edit({ components: [] }); + } + }); +} + +function disspace(nowQueue, nowTrack) { + const embeded = new EmbedBuilder() + .setAuthor({ name: `Starting Playing...`, iconURL: 'https://cdn.discordapp.com/emojis/741605543046807626.gif' }) + .setThumbnail(nowTrack.thumbnail) + .setColor(EMBED_COLORS.DEFAULT) + .setDescription(`**[${nowTrack.name}](${nowTrack.url})**`) + .addFields({ name: `Uploader:`, value: `**[${nowTrack.uploader.name}](${nowTrack.uploader.url})**`, inline: true }) + .addFields({ name: `Requester:`, value: `${nowTrack.user}`, inline: true }) + .addFields({ name: `Current Volume:`, value: `${nowQueue.volume}%`, inline: true }) + .addFields({ name: `Filters:`, value: `${nowQueue.filters.names.join(", ") || "Normal"}`, inline: true }) + .addFields({ name: `Autoplay:`, value: `${nowQueue.autoplay ? "Activated" : "Not Active"}`, inline: true }) + .addFields({ name: `Total Duration:`, value: `${nowQueue.formattedDuration}`, inline: true }) + .addFields({ name: `Current Duration: \`[0:00 / ${nowTrack.formattedDuration}]\``, value:`\`\`\`🔴 | 🎶──────────────────────────────\`\`\``, inline: false }) + .setTimestamp() + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setCustomId("pause") + .setLabel(buttons.PLAYING.pause.label) + .setEmoji(buttons.PLAYING.pause.emoji) + .setStyle(buttons.PLAYING.pause.style) + ) + .addComponents( + new ButtonBuilder() + .setCustomId("previous") + .setLabel(buttons.PLAYING.previous.label) + .setEmoji(buttons.PLAYING.previous.emoji) + .setStyle(buttons.PLAYING.previous.style) + ) + .addComponents( + new ButtonBuilder() + .setCustomId("stop") + .setLabel(buttons.PLAYING.stop.label) + .setEmoji(buttons.PLAYING.stop.emoji) + .setStyle(buttons.PLAYING.stop.style) + ) + .addComponents( + new ButtonBuilder() + .setCustomId("skip") + .setLabel(buttons.PLAYING.skip.label) + .setEmoji(buttons.PLAYING.skip.emoji) + .setStyle(buttons.PLAYING.skip.style) + ) + .addComponents( + new ButtonBuilder() + .setCustomId("loop") + .setLabel(buttons.PLAYING.loop.label) + .setEmoji(buttons.PLAYING.loop.emoji) + .setStyle(buttons.PLAYING.loop.style) + ) + return { + embeds: [embeded], + components: [row] + } +} \ No newline at end of file diff --git a/src/events/distube/searchCancel.js b/src/events/distube/searchCancel.js new file mode 100644 index 0000000..f88767d --- /dev/null +++ b/src/events/distube/searchCancel.js @@ -0,0 +1,4 @@ +module.exports = async (client, message, query) => { + message.channel.send(`❌ **| No Response.**`); +} + diff --git a/src/events/distube/searchDone.js b/src/events/distube/searchDone.js new file mode 100644 index 0000000..4fb502f --- /dev/null +++ b/src/events/distube/searchDone.js @@ -0,0 +1,4 @@ +module.exports = async (client, answer, query, queue) => { + +} + diff --git a/src/events/distube/searchInvalidAnswer.js b/src/events/distube/searchInvalidAnswer.js new file mode 100644 index 0000000..eb0f619 --- /dev/null +++ b/src/events/distube/searchInvalidAnswer.js @@ -0,0 +1,4 @@ +module.exports = async (client, answer, query, queue) => { + +} + diff --git a/src/events/distube/searchNoResult.js b/src/events/distube/searchNoResult.js new file mode 100644 index 0000000..ab04ca4 --- /dev/null +++ b/src/events/distube/searchNoResult.js @@ -0,0 +1,11 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, query, queue) => { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.ERROR) + .setDescription(`❌ **| No result found for** ${query}**!**`) + + queue.textChannel.send({ embeds: [embed] }) +} + diff --git a/src/events/distube/searchResult.js b/src/events/distube/searchResult.js new file mode 100644 index 0000000..b7ac176 --- /dev/null +++ b/src/events/distube/searchResult.js @@ -0,0 +1,14 @@ +const { EmbedBuilder } = require("discord.js"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, message, result, query) => { + const i = 0 + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setTitle(`Song Selection...`) + .setDescription(`${result.map(song => `**(${++i}.) [${song.name}](${song.url})** - \`${song.formattedDuration}\``).join("\n")}`) + .setFooter({ text: `Please select a song in 30 seconds.` }); + + message.channel.send({ embeds: [embed] }); +} + diff --git a/src/events/guild/guildCreate.js b/src/events/guild/guildCreate.js new file mode 100644 index 0000000..3ade2f4 --- /dev/null +++ b/src/events/guild/guildCreate.js @@ -0,0 +1,46 @@ +const { EmbedBuilder } = require("discord.js"); +const { getSettings: registerGuild } = require("../../Database/schemas/Guild"); +const { EMBED_COLORS } = require("../../../settings/config"); + +module.exports = async (client, guild) => { + if (!guild.available) return; + if (!guild.members.cache.has(guild.ownerId)) await guild.fetchOwner({ cache: true }).catch(() => {}); + client.logger.log(`Guild Joined: ${guild.name} Members: ${guild.memberCount}`); + await registerGuild(guild); + + if (!client.joinLeaveWebhook) return; + + const embed = new EmbedBuilder() + .setTitle("New Server | Discord Music Bot") + .setThumbnail(guild.iconURL()) + .setColor(EMBED_COLORS.DEFAULT) + .addFields( + { + name: "Guild Name", + value: guild.name, + inline: false, + }, + { + name: "ID", + value: `\`${guild.id}\``, + inline: false, + }, + { + name: "Owner", + value: `${client.users.cache.get(guild.ownerId).tag} [\`${guild.ownerId}\`]`, + inline: false, + }, + { + name: "Members", + value: `\`\`\`yaml\n${guild.memberCount}\`\`\``, + inline: false, + } + ) + .setFooter({ text: `Guild #${client.guilds.cache.size}` }); + + client.joinLeaveWebhook.send({ + username: "New Server", + avatarURL: client.user.displayAvatarURL(), + embeds: [embed], + }); +}; diff --git a/src/events/guild/guildDelete.js b/src/events/guild/guildDelete.js new file mode 100644 index 0000000..d4935f2 --- /dev/null +++ b/src/events/guild/guildDelete.js @@ -0,0 +1,56 @@ +const { EmbedBuilder } = require("discord.js"); +const { getSettings } = require("../../Database/schemas/Guild"); + +module.exports = async (client, guild) => { + if (!guild.available) return; + client.logger.log(`Guild Left: ${guild.name} Members: ${guild.memberCount}`); + + const settings = await getSettings(guild); + settings.data.leftAt = new Date(); + await settings.save(); + + if (!client.joinLeaveWebhook) return; + + let ownerTag; + const ownerId = guild.ownerId || settings.data.owner; + try { + const owner = await client.users.fetch(ownerId); + ownerTag = owner.tag; + } catch (err) { + ownerTag = "Deleted User"; + } + + const embed = new EmbedBuilder() + .setTitle("Guild Left") + .setThumbnail(guild.iconURL()) + .setColor(client.config.EMBED_COLORS.ERROR) + .addFields( + { + name: "Guild Name", + value: guild.name || "NA", + inline: false, + }, + { + name: "ID", + value: `\`${guild.id}\``, + inline: false, + }, + { + name: "Owner", + value: `${ownerTag} [\`${ownerId}\`]`, + inline: false, + }, + { + name: "Members", + value: `\`\`\`yaml\n${guild.memberCount}\`\`\``, + inline: false, + } + ) + .setFooter({ text: `Guild #${client.guilds.cache.size}` }); + + client.joinLeaveWebhook.send({ + username: "Server | Leave", + avatarURL: client.user.displayAvatarURL(), + embeds: [embed], + }); +}; diff --git a/src/events/guild/messageCreate.js b/src/events/guild/messageCreate.js new file mode 100644 index 0000000..8452276 --- /dev/null +++ b/src/events/guild/messageCreate.js @@ -0,0 +1,61 @@ +const { PermissionsBitField, EmbedBuilder, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require("discord.js"); +const { link } = require("fs"); +const { EMBED_COLORS, LINKS } = require("../../../settings/config"); + +module.exports = async (client, message) => { + if(message.author.bot || message.channel.type === "dm") return; + + const PREFIX = client.prefix; + + const mention = new RegExp(`^<@!?${client.user.id}>( |)$`); + if (message.content.match(mention)) { + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.DEFAULT) + .setTitle(`Hi! I'm ${message.guild.members.me.displayName}`) + .setDescription(`__**MY PREFIX:**__ \`${PREFIX}\``) + .setFooter({ text: `© ${message.guild.members.me.displayName} | By: NoBody#9666`, iconURL: client.user.displayAvatarURL({ dynamic: true })}) + .setThumbnail(client.user.displayAvatarURL()); + + const row = new ActionRowBuilder() + .addComponents( + new ButtonBuilder() + .setLabel("Invite") + .setURL(`https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands`) + .setEmoji("🔗") + .setStyle(ButtonStyle.Link), + new ButtonBuilder() + .setLabel("Support") + .setURL(LINKS.SUPPORT_SERVER) + .setEmoji("🎫") + .setStyle(ButtonStyle.Link) + ) + + + message.channel.send({ embeds: [embed], components: [row] }); + }; + const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + const prefixRegex = new RegExp(`^(<@!?${client.user.id}>|${escapeRegex(PREFIX)})\\s*`); + if (!prefixRegex.test(message.content)) return; + const [ matchedPrefix ] = message.content.match(prefixRegex); + const args = message.content.slice(matchedPrefix.length).trim().split(/ +/g); + const cmd = args.shift().toLowerCase(); + const command = client.commands.get(cmd) || client.commands.get(client.aliases.get(cmd)); + if(!command) return; + + if(!message.guild.members.me.permissions.has(PermissionsBitField.Flags.SendMessages)) return await message.author.dmChannel.send({ content: `❌ | I don't have perm **\`SEND_MESSAGES\`** permission in <#${message.channelId}> to execute command!` }).catch(() => {}); + if(!message.guild.members.me.permissions.has(PermissionsBitField.Flags.EmbedLinks)) return await message.channel.send({ content: `❌ | I don't have perm **\`EMBED_LINKS\`** to execute command!` }).catch(() => {}); + + client.logger.log(`[COMMAND: ${command.config.name}] Executed by ${message.author.tag}`); + + try { + command.run(client, message, args); + } catch (error) { + client.logger.error(error); + const embed = new EmbedBuilder() + .setColor(EMBED_COLORS.ERROR) + .setDescription("❌ **| There was an error executing that command.**"); + + return message.channel.send({ embeds: [embed] }); + } +} + diff --git a/src/handlers/loadCommands.js b/src/handlers/loadCommands.js new file mode 100644 index 0000000..392c4fb --- /dev/null +++ b/src/handlers/loadCommands.js @@ -0,0 +1,20 @@ +const { readdirSync } = require("fs") +const delay = require('delay'); +const {log, success} = require("../helpers/Logger"); +const chalk = require('chalk'); + +module.exports = async (client) => { + log('[LOADING] Commands...'); + const load = dirs => { + const commands = readdirSync(`./src/commands/${dirs}/`).filter(d => d.endsWith('.js')); + for (let file of commands) { + let pull = require(`./../commands/${dirs}/${file}`); + client.commands.set(pull.config.name, pull); + if (pull.config.aliases) pull.config.aliases.forEach(a => client.aliases.set(a, pull.config.name)); + }; + }; + + ["music", "filters", "utilities", "owner"].forEach(x => load(x)); + await delay(4000); + success(chalk.green(`[BOT] Commands Loaded`)); +}; \ No newline at end of file diff --git a/src/handlers/loadDistube.js b/src/handlers/loadDistube.js new file mode 100644 index 0000000..92d02cc --- /dev/null +++ b/src/handlers/loadDistube.js @@ -0,0 +1,21 @@ +const { readdirSync } = require("fs"); +const delay = require("delay"); +const Logger = require("../helpers/Logger"); +const chalk = require('chalk'); + +module.exports = async (client) => { + Logger.log('[LOADING] Distube...'); + try { + readdirSync("./src/events/distube").forEach(file => { + + const event = require(`../events/distube/${file}`); + let eventName = file.split(".")[0]; + client.distube.on(eventName, event.bind(null, client)); + }); + } catch (e) { + Logger.error(e); + } + await delay(4000); + Logger.success(chalk.green(`[BOT] Distube Loaded`)); +}; + diff --git a/src/handlers/loadEvents.js b/src/handlers/loadEvents.js new file mode 100644 index 0000000..4f43b11 --- /dev/null +++ b/src/handlers/loadEvents.js @@ -0,0 +1,19 @@ +const { readdirSync } = require("fs") +const delay = require('delay'); +const Logger = require("../helpers/Logger"); +const chalk = require('chalk'); + +module.exports = async (client, message) => { + Logger.log('[LOADING] Global Events...'); + const load = dirs => { + const events = readdirSync(`./src/events/${dirs}/`).filter(d => d.endsWith('.js')); + for (let file of events) { + const evt = require(`./../events/${dirs}/${file}`); + let eName = file.split('.')[0]; + client.on(eName, evt.bind(null, client)); + }; + }; + ["client", "guild"].forEach(x => load(x)); + await delay(4000); + Logger.success(chalk.green(`[BOT] Global Events Loaded`)); +}; \ No newline at end of file diff --git a/src/helpers/Logger.js b/src/helpers/Logger.js new file mode 100644 index 0000000..025ecd0 --- /dev/null +++ b/src/helpers/Logger.js @@ -0,0 +1,93 @@ +const config = require("../../settings/config"); +const { EmbedBuilder, WebhookClient } = require("discord.js"); +const pino = require("pino"); +const { LINKS } = require("../../settings/config"); + + const webhookLogger = LINKS.ERROR_LOGS ? new WebhookClient({ url: LINKS.ERROR_LOGS }) : undefined; + +const pinoLogger = pino.default( + { + level: "debug", + }, + pino.multistream([ + { + level: "info", + stream: pino.transport({ + target: "pino-pretty", + options: { + colorize: true, + translateTime: "SYS:yyyy-mm-dd HH:MM:ss", + ignore: "pid,hostname", + singleLine: false, + hideObject: true, + customColors: "info:blue,warn:yellow,error:red", + }, + }), + }, + { + level: "debug", + stream: pino.destination({ + dest: `${process.cwd()}/logs/BotLogs-[${String(new Date).split(" ", 4)}].log`, + sync: true, + }), + }, + ]) +); + +function sendWebhook(content, err) { + if (!content && !err) return; + const errString = err?.stack || err; + + const embed = new EmbedBuilder().setColor(config.EMBED_COLORS.ERROR).setAuthor({ name: err?.name || "Error" }); + + if (errString) + embed.setDescription( + "```js\n" + (errString.length > 4096 ? `${errString.substr(0, 4000)}...` : errString) + "\n```" + ); + + embed.addFields({ name: "Description", value: content || err?.message || "NA" }); + webhookLogger.send({ username: "ERROR LOGS", embeds: [embed] }).catch((ex) => {}); +} + +module.exports = class Logger { + /** + * @param {string} content + */ + static success(content) { + pinoLogger.info(content); + } + + /** + * @param {string} content + */ + static log(content) { + pinoLogger.info(content); + } + + /** + * @param {string} content + */ + static warn(content) { + pinoLogger.warn(content); + } + + /** + * @param {string} content + * @param {object} ex + */ + static error(content, ex) { + if (ex) { + pinoLogger.error(ex, `${content}: ${ex?.message}`); + } else { + pinoLogger.error(content); + } + if (webhookLogger) sendWebhook(content, ex); + } + + /** + * @param {string} content + */ + static debug(content) { + pinoLogger.debug(content); + } +}; diff --git a/src/structures/pagequeue.js b/src/structures/pagequeue.js new file mode 100644 index 0000000..d08de73 --- /dev/null +++ b/src/structures/pagequeue.js @@ -0,0 +1,41 @@ +const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js') + +module.exports = async (client, message, pages, timeout, queueLength, queueDuration) => { + if (!message && !message.channel) throw new Error('Channel is inaccessible.'); + if (!pages) throw new Error('Pages are not given.'); + + const row1 = new ButtonBuilder() + .setCustomId('back') + .setLabel('⬅') + .setStyle(ButtonStyle.Secondary) + const row2 = new ButtonBuilder() + .setCustomId('next') + .setLabel('➡') + .setStyle(ButtonStyle.Secondary) + const row = new ActionRowBuilder() + .addComponents(row1, row2) + + let page = 0; + const curPage = await message.channel.send({ embeds: [pages[page].setFooter({ text: `Page • ${page + 1}/${pages.length} | ${queueLength} • Songs | ${queueDuration} • Total duration`})], components: [row], allowedMentions: { repliedUser: false } }); + if(pages.length == 0) return; + + const filter = (interaction) => interaction.user.id === message.author.id ? true : false && interaction.deferUpdate(); + const collector = await curPage.createMessageComponentCollector({ filter, time: timeout }); + + collector.on('collect', async (interaction) => { + if(!interaction.deferred) await interaction.deferUpdate(); + if (interaction.customId === 'back') { + page = page > 0 ? --page : pages.length - 1; + } else if (interaction.customId === 'next') { + page = page + 1 < pages.length ? ++page : 0; + } + curPage.edit({ embeds: [pages[page].setFooter({ text: `Page • ${page + 1}/${pages.length} | ${queueLength} • Songs | ${queueDuration} • Total duration`})], components: [row] }) + }); + collector.on('end', () => { + const disabled = new ActionRowBuilder() + .addComponents(row1.setDisabled(true), row2.setDisabled(true)) + curPage.edit({ embeds: [pages[page].setFooter({ text: `Page • ${page + 1}/${pages.length} | ${queueLength} • Songs | ${queueDuration} • Total duration`})], components: [disabled] }) + }); + return curPage; +}; +