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;
+};
+