diff --git a/.env_example b/.env_example
index 2b0eb6eba..536bae34f 100644
--- a/.env_example
+++ b/.env_example
@@ -1,119 +1,102 @@
-# This is your bot's configuration file, control your bot's environment here. Every value must use a string ("")
+# This is your bot's configuration file, control your bot's environment here. Every value must contains a string ("")
+# Note: if you're looking for the dev options, please go to the dev.env file
#==============================================================================
-# What is your Discord bot's token?
+# OPTIONAL = This value is optional, and can be left blank.
+# IMPORTANT = It is recommended that you pay attention to the value.
+# MULTIPLE - This value can be multiple string, each value splitted with comma or semi-colon. You can use single-quote (') to escape whether you have any comma or semicolon in the value.
+
+#==============================================================================
+# IMPORTANT - What is your Discord bot's token?
# Example: DISCORD_TOKEN="NTE5NjQ2MjIxNTU2Nzc2OTcw.XAcEQQ.0gjhNbGeWBsKP6FVuIyZWlG2cMd"
DISCORD_TOKEN=""
#==============================================================================
-# What should be the main prefix of your bot?
+# IMPORTANT - What should be the main prefix of your bot?
# Example: PREFIX="!"
# Default: !
MAIN_PREFIX=""
#==============================================================================
-# What should be the alternative prefixes of your bot?
-# Example: PREFIX=["?", "{mention}"]
+# OPTIONAL, MULTIPLE - What should be the alternative prefixes of your bot?
+# Example: PREFIX="?, {mention}"
# Formats: {mention} = @bot mention
# Default: {mention}
-ALT_PREFIX=[""]
+ALT_PREFIX="{mention}"
#==============================================================================
-# What should be your bot's embed color code? (hex)
-# Example: EMBED_COLOR="3CAAFF"
-# Default: 3CAAFF
+# OPTIONAL - What should be your bot's embed color code? (hex)
+# Example: EMBED_COLOR="22C9FF"
+# Default: 22C9FF
EMBED_COLOR=""
#==============================================================================
-# What should be the language of your bot?
+# OPTIONAL - What should be the language of your bot?
# Example: LOCALE="en"
# Available: en, es, id
# Default: en
LOCALE=""
#==============================================================================
-# Activity list
-# Example: '["Hello!"]'
+# OPTIONAL, MULTIPLE - Activity list, what text should be appear on your bot's status?
+# Example: ACTIVITIES="Hello!"
# Formats: {prefix} = bot prefix, {userCount} = user amount, {textChannelsCount} = text channel amount, {serverCount} = server amount, {playingCount} = amount of server playing music using the bot, {username} = bot username
-ACTIVITIES='["My default prefix is {prefix}", "music with {userCount} users", "{textChannelsCount} text channels in {serverCount} guilds", "Hello there, my name is {username}"]'
+ACTIVITIES="My default prefix is {prefix}, music with {userCount} users, {textChannelsCount} text channels in {serverCount} guilds, 'Hello there, my name is {username}'"
#==============================================================================
-# Activity type list.
+# OPTIONAL, MULTIPLE - Activity type list.
# The order of this value is the same order as ACTIVITIES.
# For example, first value of ACTIVITIES will use first value of this.
-# Example: '["PLAYING", "COMPETING"]'
+# Example: ACTIVITY_TYPES="PLAYING, COMPETING"
# Available: PLAYING, WATCHING, LISTENING, COMPETING
-ACTIVITY_TYPES='["PLAYING", "LISTENING", "WATCHING", "PLAYING", "COMPETING"]'
-
-#==============================================================================
-# OPTIONAL - What is the owner's ID of the bot?
-# Example: OWNERS=["390045370240991234"]
-OWNERS=[""]
-
-#==============================================================================
-# OPTIONAL - What is your server's ID?
-# Example: DEV_GUILD=["332877090003091456"]
-DEV_GUILD=[""]
+ACTIVITY_TYPES="PLAYING, LISTENING, WATCHING, PLAYING, COMPETING"
#==============================================================================
-# In which mode do you want to activate your bot?
-# Example: NODE_ENV="production"
-# Available: production, development
-# Default: production
-NODE_ENV=""
+# OPTIONAL, MULTIPLE - What is your server's ID?
+# Example: MAIN_GUILD="972407605295198258"
+MAIN_GUILD=""
#==============================================================================
-# Which youtube downloader do you want to use? Note: if you use play-dl, it will support a few sites.
-# Example: STREAM_STRATEGY="youtube-dl"
-# Available: play-dl, youtube-dl
-# Default: youtube-dl
+# OPTIONAL - Which youtube downloader do you want to use?
+# For more information, see: https://github.com/Clytage/rawon/wiki/Stream-Strategy
+# Example: STREAM_STRATEGY="yt-dlp"
+# Available: play-dl, yt-dlp
+# Default: yt-dlp
STREAM_STRATEGY=""
#==============================================================================
-# Do you want to enable slash command support?
+# OPTIONAL - Do you want to enable slash command support?
# Example: ENABLE_SLASH_COMMAND="yes"
# Default: yes
ENABLE_SLASH_COMMAND=""
#==============================================================================
-# Which music selection type do you want to use?
+# OPTIONAL - Which music selection type do you want to use?
# Example: MUSIC_SELECTION_TYPE="selectmenu"
-# Available: message (just like in previous version) or selectmenu (uses discord selection menu)
+# Available: message (just like in previous version), selectmenu (uses discord selection menu)
# Default: message
MUSIC_SELECTION_TYPE=""
#==============================================================================
-# Do you want to enable the 24/7 command?
+# IMPORTANT - Do you want to enable the 24/7 command?
# Example: ENABLE_24_7_COMMAND="no"
# Default: no
ENABLE_24_7_COMMAND=""
#==============================================================================
-# Do you want to make your bot not leave the voice channel after playing a song?
+# IMPORTANT - Do you want to make your bot not leaving the voice channel after playing a song?
# Example: STAY_IN_VC_AFTER_FINISHED="no"
# Default: no
STAY_IN_VC_AFTER_FINISHED=""
#==============================================================================
-# What is your server's DJ role name?
-# Example: DJ_ROLE_NAME="DJ"
-# Default: DJ
-DJ_ROLE_NAME=""
-
-#==============================================================================
-# What is your server's Muted role name?
-# Example: MUTE_ROLE_NAME="Muted"
-# Default: Muted
-MUTE_ROLE_NAME=""
-
-#==============================================================================
-# What should be your bot's emoji for every success sentence?
+# OPTIONAL - What should be your bot's emoji for every success sentence?
# Example: YES_EMOJI="✅"
# Default: ✅
YES_EMOJI=""
#==============================================================================
-# What should be your bot's emoji for every failed sentence?
+# OPTIONAL - What should be your bot's emoji for every failed sentence?
# Example: NO_EMOJI="❌"
# Default: ❌
NO_EMOJI=""
diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index ffe4ffd77..000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,5 +0,0 @@
-# TypeScript build output
-dist/
-
-# Start file
-index.js
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 44261fdff..e4b01b94a 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,2 +1,2 @@
-patreon: mzrtamp
-custom: ["https://karyakarsa.com/mozartrafi"]
+patreon: clytage
+custom: ["https://paypal.me/clytage", "https://karyakarsa.com/clytage"]
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index d8a2c11cc..d36c64d4b 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,7 +1,7 @@
name: Feature Request
title: "[Features]
"
description: Suggest an idea for this project
-labels: [enhancement]
+labels: []
body:
- type: textarea
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
deleted file mode 100644
index b54b88050..000000000
--- a/.github/dependabot.yml
+++ /dev/null
@@ -1,29 +0,0 @@
-updates:
- - package-ecosystem: npm
- directory: /
- labels:
- - dependencies
- open-pull-requests-limit: 99
- schedule:
- interval: daily
- time: "06:00"
- timezone: Asia/Jakarta
- target-branch: main
- commit-message:
- include: scope
- prefix: chore
- - package-ecosystem: github-actions
- directory: /
- labels:
- - gh-actions
- - dependencies
- open-pull-requests-limit: 99
- schedule:
- interval: daily
- time: "06:00"
- timezone: Asia/Jakarta
- target-branch: main
- commit-message:
- include: scope
- prefix: ci
-version: 2
diff --git a/.github/images/info.png b/.github/images/info.png
deleted file mode 100644
index e61e1fad5..000000000
Binary files a/.github/images/info.png and /dev/null differ
diff --git a/.github/images/question_mark.png b/.github/images/question_mark.png
deleted file mode 100644
index 5252a757a..000000000
Binary files a/.github/images/question_mark.png and /dev/null differ
diff --git a/.github/images/rawon.png b/.github/images/rawon.png
deleted file mode 100644
index de100182f..000000000
Binary files a/.github/images/rawon.png and /dev/null differ
diff --git a/.github/renovate.json b/.github/renovate.json
new file mode 100644
index 000000000..6a78efbdf
--- /dev/null
+++ b/.github/renovate.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": ["github>clytage/project-template:clytage-renovate"]
+}
diff --git a/.github/workflows/test.yml b/.github/workflows/setup.yml
similarity index 65%
rename from .github/workflows/test.yml
rename to .github/workflows/setup.yml
index aa60ff3e7..ddeed3e97 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/setup.yml
@@ -1,4 +1,4 @@
-name: Lint code & compile test
+name: Lint code and compile setup script
on:
push:
@@ -16,14 +16,14 @@ jobs:
node-version: [">=16.6.0 <17.x"]
steps:
- name: Checkout repository
- uses: actions/checkout@v2.4.0
-
+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
+
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2.5.1
+ uses: actions/setup-node@17f8bd926464a1afa4c6a11669539e9c1ba77048 # tag=v3.2.0
with:
node-version: ${{ matrix.node-version }}
check-latest: true
-
+
- name: Install dependencies
run: npm ci
@@ -38,22 +38,16 @@ jobs:
node-version: [">=16.6.0 <17.x"]
steps:
- name: Checkout repository
- uses: actions/checkout@v2.4.0
+ uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2.5.1
+ uses: actions/setup-node@17f8bd926464a1afa4c6a11669539e9c1ba77048 # tag=v3.2.0
with:
node-version: ${{ matrix.node-version }}
check-latest: true
-
- - name: Install typescript
- run: npm i --save-dev typescript
-
- - name: Delete node modules folder
- run: rm -rf node_modules
- name: Install dependencies
run: npm ci
- - name: Test compile
- run: npm run tscompile && rm -rf dist
+ - name: Compile test
+ run: npm run compile && rm -rf dist
diff --git a/.gitignore b/.gitignore
index e5fafe878..e40fc1d89 100644
--- a/.gitignore
+++ b/.gitignore
@@ -43,9 +43,6 @@ jspm_packages/
# TypeScript cache
*.tsbuildinfo
-# TypeScript build output
-dist/
-
# Optional npm cache directory
.npm
@@ -69,8 +66,8 @@ dist/
# dotenv environment variables file
.env
-.env
-.prod.env
+.env.test
+dev.env
# parcel-bundler cache (https://parceljs.org/)
.cache
@@ -102,3 +99,7 @@ dist
# TernJS port file
.tern-port
+
+# Rawon cache directories and files
+data.json
+scripts/
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 000000000..2fa6f28c5
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+./.node-version
diff --git a/.swcrc b/.swcrc
new file mode 100644
index 000000000..dc76be63b
--- /dev/null
+++ b/.swcrc
@@ -0,0 +1,13 @@
+{
+ "jsc": {
+ "parser": {
+ "syntax": "typescript",
+ "tsx": false,
+ "decorators": true
+ },
+ "target": "es2021"
+ },
+ "module": {
+ "type": "es6"
+ }
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 29ec6117f..a6b031e4d 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,8 @@
{
+ "files.eol": "\n",
"typescript.tsdk": "node_modules/typescript/lib",
+ "typescript.preferences.importModuleSpecifierEnding": "js",
"eslint.packageManager": "npm",
"npm.packageManager": "npm",
- "files.eol": "\n",
"liveshare.languages.allowGuestCommandControl": true
}
diff --git a/DISCLAIMERS.md b/DISCLAIMERS.md
new file mode 100644
index 000000000..694cf0bd0
--- /dev/null
+++ b/DISCLAIMERS.md
@@ -0,0 +1,10 @@
+# Disclaimers
+List of disclaimers.
+
+## Copyright, DMCA, and/or Intellectual Properties
+1. Any intellectual properties used, played, or displayed by the bot is not owned by us, the maintainer of the bot, or any of the bot's contributors. This includes, but is not limited to, the audio, video and image files displayed or used in the bot's commands.
+2. As railway stated in their legal fair-use page (refer to https://railway.app/legal/fair-use), they won't allow any kind of Hosting/Distribution of DMCA Protected Content. That includes hosting a discord music bot that plays music/video under a copyright license. **Deploy to Railway at your own risk.**
+
+## Code modifications
+1. The bot is open source and can be modified and redistributed under the [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause) license.
+2. As written in the license, we are not responsible for any damages or losses when you are attempting to modify the code and redistribute or use it.
diff --git a/LICENSE b/LICENSE
index fa094f16b..c0a508c78 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
BSD 3-Clause License
-Copyright (c) 2022, RB Project
+Copyright (c) 2022, Clytage Development
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
index 2df465ea1..5a7d54fdf 100644
--- a/README.md
+++ b/README.md
@@ -1,24 +1,19 @@
-
-
-
-
# Rawon
-> A dedicated open-source music and moderation Discord bot. Easy to use, and with no coding required.
+> A simple powerful Discord music bot built to fulfill your production desires. Easy to use, with no coding required.
-
+
## Features
- Interaction support.
-- Basic music commands.
-- Basic moderation commands.
- Configurable, and easy to use.
+- Basic music and moderation commands.
- A production-ready project, set up the bot without coding.
## General Setup
-1. Download and install [Node.js](https://nodejs.org) version `16.6.0` and [Python](https://python.org) version `3.6.0` or above
+1. Download and install [Node.js](https://nodejs.org) version `16.6.0` or higher
2. Open `.env_example` file and rename it to `.env`
3. Install required and optional dependencies
```sh
@@ -42,7 +37,7 @@ $ npm start
### Heroku
You can host this bot to make it stay online on Heroku.
-
+
### Glitch
You can use Glitch too for this project, featured with its code editor.
@@ -55,10 +50,29 @@ You can use Glitch too for this project, featured with its code editor.
6. After specifying `.env`, open **Tools** > **Terminal**
7. Type `refresh`, and track the process from **Logs**
-
+
+
+### Railway
+Railway provide $5 each month for you to use in free plan, it will stay online 24/7 as long as your usage does not exceed $5.
+
+**IMPORTANT:** Read [Disclaimers](./DISCLAIMERS.md) before deploying to Railway.
+
+
-## Project Maintainer
+## Project Contributors
+
+### Developers
- [@Mednoob](https://github.com/Mednoob)
- [@mzrtamp](https://github.com/mzrtamp)
+- [@noxzym](https://github.com/noxzym)
+
+### Translators
+- [Developers](#developers) (en, id)
+- [@21Z](https://github.com/21Z) (en)
+- [@lxndr-rl](https://github.com/lxndr-rl) (es)
+
+## Disclaimers
+Disclaimers are listed on the [DISCLAIMERS.md](./DISCLAIMERS.md) file.
-> © 2022 RB Project
+> © 2022 Clytage Development
diff --git a/app.json b/app.json
index c3895c6de..ef0fdd2b8 100644
--- a/app.json
+++ b/app.json
@@ -1,7 +1,7 @@
{
"name": "Rawon",
- "description": "A dedicated open-sourced Discord bot with many features of utilization. Easy to use, and with no coding required.",
- "logo": "https://raw.githubusercontent.com/mzrtamp/rawon/main/.github/images/rawon.png",
+ "description": "A simple powerful Discord music bot built to fulfill your production desires. Easy to use, with no coding required.",
+ "logo": "https://api.clytage.org/assets/images/rawon.png",
"env": {
"DISCORD_TOKEN": {
"description": "What is your Discord bot's token? | Example: NTE5NjQ2MjIxNTU2Nzc2OTcw.XAcEQQ.0gjhNbGeWBsKP6FVuIyZWlG2cMd",
@@ -13,49 +13,38 @@
"value": "!"
},
"ALT_PREFIX": {
- "description": "What should be the alternative prefixes of your bot? | Example: [\"?\", \"{mention}\"] | Formats: {mention} = bot mention",
+ "description": "What should be the alternative prefixes of your bot? | Example: \"?, {mention}\" | Formats: {mention} = @bot mention",
"required": false,
- "value": "[\"{mention}\"]"
+ "value": "{mention}"
},
"EMBED_COLOR": {
- "description": "What should be your bot's embed color code? (hex) | Example: 3CAAFF",
+ "description": "What should be your bot's embed color code? (hex) | Example: 22C9FF",
"required": false,
- "value": "3CAAFF"
+ "value": "22C9FF"
},
"LOCALE": {
- "description": "What should be the language of your bot? Example: en | Available: en, es, id",
+ "description": "What should be the language of your bot? | Example: en | Available: en, es, id",
"required": false,
"value": "en"
},
"ACTIVITIES": {
- "description": "Activity list | Example: [\"Hello!\"]",
+ "description": "Activity list, what text should be appear on your bot's status? | Example: \"Hello world!, My prefix is {prefix}\" | Formats: {prefix} = bot prefix, {userCount} = user amount, {textChannelsCount} = text channel amount, {serverCount} = server amount, {playingCount} = amount of server playing music using the bot, {username} = bot username",
"required": false,
- "value": "[\"My default prefix is {prefix}\", \"music with {userCount} users\", \"{textChannelsCount} text channels in {serverCount} guilds\", \"Hello there, my name is {username}\"]"
+ "value": "My default prefix is {prefix}, music with {userCount} users, {textChannelsCount} text channels in {serverCount} guilds, 'Hello there, my name is {username}'"
},
"ACTIVITY_TYPES": {
- "description": "Activity type list. The order of this value is the same as ACTIVITIES. For example, first value of ACTIVITIES will use first value of this | Example: [\"PLAYING\", \"COMPETING\"]",
+ "description": "Activity type list. The order of this value is the same as ACTIVITIES. For example, first value of ACTIVITIES will use first value of this. | Example: \"PLAYING, COMPETING\" | Available: PLAYING, WATCHING, LISTENING, COMPETING",
"required": false,
- "value": "[\"PLAYING\", \"LISTENING\", \"WATCHING\", \"PLAYING\", \"COMPETING\"]"
+ "value": "PLAYING, LISTENING, WATCHING, PLAYING, COMPETING"
},
- "OWNERS": {
- "description": "What is the owner's ID of the bot? | Example: [\"319872685897416725\", \"390045370240991234\"]",
- "required": false,
- "value": "[\"\"]"
- },
- "DEV_GUILD": {
- "description": "What is your server's ID? | Example: [\"332877090003091456\"]",
- "required": false,
- "value": "[\"\"]"
- },
- "NODE_ENV": {
- "description": "In which mode do you want to activate your bot? | Example: production | Available: production, development",
- "required": false,
- "value": "production"
+ "MAIN_GUILD": {
+ "description": "What is your server's ID? | Example: \"972407605295198258, 972407605295198258\"",
+ "required": false
},
"STREAM_STRATEGY": {
- "description": "Which youtube downloader do you want to use? Note: if you use play-dl, it will support a few sites. | Example: \"play-dl\" | Available: \"play-dl\", \"youtube-dl\"",
+ "description": "Which youtube downloader do you want to use? But if you use play-dl, it will support a few sites. | Example: play-dl | Available: play-dl, yt-dlp",
"required": false,
- "value": "youtube-dl"
+ "value": "yt-dlp"
},
"ENABLE_SLASH_COMMAND": {
"description": "Do you want to enable slash command support? | Example: yes",
@@ -63,7 +52,7 @@
"value": "yes"
},
"MUSIC_SELECTION_TYPE": {
- "description": "Which music selection type do you want to use? | Example: selectmenu | Available: message (just like in the previous version) or selectmenu (uses discord selection menu)",
+ "description": "Which music selection type do you want to use? | Example: selectmenu | Available: message (just like in the previous version), selectmenu (uses discord selection menu)",
"required": false,
"value": "message"
},
@@ -73,20 +62,10 @@
"value": "no"
},
"STAY_IN_VC_AFTER_FINISHED": {
- "description": "Do you want to make your bot not leave the voice channel after playing a song? | Example: no",
+ "description": "Do you want to make your bot not leaving the voice channel after playing a song? | Example: no",
"required": false,
"value": "no"
},
- "DJ_ROLE_NAME": {
- "description": "What is your server's DJ role name? | Example: DJ",
- "required": false,
- "value": "DJ"
- },
- "MUTE_ROLE_NAME": {
- "description": "What is your server's Muted role name? | Example: Muted",
- "required": false,
- "value": "Muted"
- },
"YES_EMOJI": {
"description": "What should be your bot's emoji for every success sentence? | Example: ✅",
"required": false,
@@ -98,8 +77,8 @@
"value": "❌"
}
},
- "repository": "https://github.com/mzrtamp/rawon",
- "website": "https://rawon.tiramitzu.me",
+ "repository": "https://github.com/Clytage/rawon",
+ "website": "https://rawon.clytage.org",
"formation": {
"worker": {
"quantity": 1,
diff --git a/dev.env_example b/dev.env_example
new file mode 100644
index 000000000..eb5404b94
--- /dev/null
+++ b/dev.env_example
@@ -0,0 +1,30 @@
+# This is the configuration file for dev options. All options here are optional.
+# Intended to be used for developers who want to extend their experience with the bot.
+# If you're just a regular user (not a developer), you probably don't need to edit this file.
+
+#==============================================================================
+# MULTIPLE - What are the IDs of the bot developers?
+# Example: DEVS="390045370240991234, 366169273485361153"
+DEVS=""
+
+#==============================================================================
+# In which mode do you want to activate your bot?
+# Example: NODE_ENV="production"
+# Available: production, development
+# Default: production
+NODE_ENV=""
+
+#==============================================================================
+# Do you want to enable Debug Mode?
+# This mode will print all information (such as raw event data, queue changes, etc) on the console.
+# Example: DEBUG_MODE="no"
+# Default: no
+DEBUG_MODE=""
+
+#==============================================================================
+# Do you want to enable REPL feature?
+# You can evaluate code from the console using this feature.
+# REPL included with "shardManager" variable containing the ShardManager of the bot.
+# Example: REPL="no"
+# Default: no
+REPL=""
diff --git a/index.js b/index.js
index f952a3e0f..a56b346cd 100644
--- a/index.js
+++ b/index.js
@@ -1,7 +1,9 @@
-const { execSync } = require("child_process");
-const { existsSync, rmSync } = require("fs");
-const { resolve } = require("path");
-const { Server } = require("https");
+import { downloadExecutable } from "./yt-dlp-utils";
+import { execSync } from "child_process";
+import { existsSync, rmSync } from "fs";
+import { resolve } from "path";
+import { Server } from "https";
+import module from "module";
const isGlitch = (
process.env.PROJECT_DOMAIN !== undefined &&
@@ -51,7 +53,9 @@ function npmInstall(deleteDir = false, forceInstall = false, additionalArgs = []
const modulesPath = resolve(process.cwd(), "node_modules");
if (existsSync(modulesPath)) {
- rmSync(modulesPath, { recursive: true });
+ rmSync(modulesPath, {
+ recursive: true
+ });
}
}
@@ -95,6 +99,8 @@ if (isGitHub) {
console.warn("[WARN] Running this bot using GitHub is not recommended.");
}
+const require = module.createRequire(import.meta.url);
+
if (!isGlitch) {
try {
require("ffmpeg-static");
@@ -116,38 +122,16 @@ if (isGlitch || isReplit) {
console.info("[INFO] Compiled.");
}
-(async () => {
- const streamStrategy = process.env.STREAM_STRATEGY;
- const isUnix = ["aix", "android", "darwin", "freebsd", "linux", "openbsd", "sunos"].includes(process.platform.toLowerCase());
- process.env.YOUTUBE_DL_HOST = "https://api.github.com/repos/yt-dlp/yt-dlp/releases?per_page=1";
- process.env.YOUTUBE_DL_FILENAME = "yt-dlp";
-
- if (streamStrategy !== "play-dl") {
- try {
- require("youtube-dl-exec");
- } catch {
- console.info("[INFO] Installing youtube-dl-exec...");
- npmInstall(false, false, ["youtube-dl-exec"]);
- console.info("[INFO] Youtube-dl-exec has been installed.");
- }
-
- const ytdlBinaryDir = resolve(__dirname, "node_modules", "youtube-dl-exec", "bin")
- if (!existsSync(resolve(ytdlBinaryDir, isUnix ? "yt-dlp" : "yt-dlp.exe"))) {
- console.info("[INFO] Yt-dlp couldn't be found, trying to download...");
- if (existsSync(resolve(ytdlBinaryDir, isUnix ? "youtube-dl" : "youtube-dl.exe"))) rmSync(resolve(ytdlBinaryDir, isUnix ? "youtube-dl" : "youtube-dl.exe"));
- await require("youtube-dl-exec/scripts/postinstall");
- console.info("[INFO] Yt-dlp has been downloaded.");
- }
- }
- if (streamStrategy === "play-dl") {
- try {
- require("play-dl");
- } catch {
- console.info("[INFO] Installing play-dl...");
- npmInstall(false, false, ["play-dl"]);
- console.info("[INFO] Play-dl has been installed.");
- }
+const streamStrategy = process.env.STREAM_STRATEGY;
+if (streamStrategy !== "play-dl") await downloadExecutable();
+if (streamStrategy === "play-dl") {
+ try {
+ require("play-dl");
+ } catch {
+ console.info("[INFO] Installing play-dl...");
+ npmInstall(false, false, ["play-dl"]);
+ console.info("[INFO] Play-dl has been installed.");
}
- console.info("[INFO] Starting the bot...");
- require("./dist/index.js");
-})();
+}
+console.info("[INFO] Starting the bot...");
+import("./dist/index.js");
diff --git a/lang/en.json b/lang/en.json
index e38a44ffe..3c13e5da4 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1,307 +1,359 @@
{
- "commands": {
- "developers": {
- "categoryName": "DEVELOPER",
- "eval": {
- "description": "Evaluate to the bot",
- "usage": "{prefix}eval ",
- "noCode": "No code was provided.",
- "outputString": "Output",
- "errorString": "Error"
- }
- },
- "general": {
- "categoryName": "GENERAL",
- "about": {
- "description": "Show the bot's information",
- "osUptimeString": "OS Uptime",
- "processUptimeString": "Process Uptime",
- "botUptimeString": "Bot Uptime",
- "nodeVersionString": "Node.js version",
- "discordJSVersionString": "Discord.js version",
- "ffmpegVersionString": "FFmpeg version",
- "botVersionString": "Bot version",
- "sourceCodeString": "Source code",
- "aboutFooter": "{botname} - Bot Information"
- },
- "help": {
- "description": "Shows the command list or information for a specific command",
- "slashDescription": "Command name to view a specific information about the command",
- "usage": "{prefix}help [command]",
- "authorString": "{username} - Command List",
- "footerString": "{prefix}help to get more information on a specific command",
- "noCommand": "Couldn't find any matching command name",
- "commandSelectionString": "Please select the command",
- "noCommanSuggest": "Couldn't find matching command name. Did you mean this?",
- "commandDetailTitle": "{username} - Information about {command} command",
- "nameString": "Name",
- "descriptionString": "Description",
- "aliasesString": "Aliases",
- "usageString": "Usage",
- "commandUsageFooter": "<> = required | [] = optional {devOnly}"
- },
- "invite": {
- "description": "Get the invite link for the bot",
- "inviteTitle": "{bot} - Invite Link",
- "clickURL": "**[Click here]({url})** to invite this bot to your server."
- },
- "ping": {
- "description": "Shows the current ping of the bot",
- "footerString": "Latency of: {user}"
- }
- },
- "moderation": {
- "categoryName": "MODERATION",
- "common": {
- "noUserSpecified": "Please specify someone.",
- "noReasonString": "[Not specified]",
- "reasonString": "**Reason**"
- },
- "ban": {
- "description": "Ban someone from the server",
- "slashMemberIDDescription": "Who do you like to ban?",
- "slashReasonDescription": "Ban reason",
- "usage": "{prefix}ban <@mention | id> [reason]",
- "userNoPermission": "Sorry, but you don't have **`BAN MEMBERS`** permission to use this command.",
- "botNoPermission": "Sorry, but I don't have **`BAN MEMBERS`** permission.",
- "userNoBannable": "Sorry, but I can't **`BAN`** that member.",
- "userBanned": "You have been **`BANNED`** from **{guildName}**",
- "bannedByString": "Banned by: {author}",
- "banFail": "Unable to **`BAN`** member, because: `{message}`",
- "banSuccess": "**{user}** has been **`BANNED`** from the server."
- },
- "kick": {
- "description": "Kick someone from the server",
- "slashMemberDescription": "Who do you like to kick?",
- "slashReasonDescription": "Kick reason",
- "usage": "{prefix}kick <@mention | id> [reason]",
- "userNoPermission": "Sorry, but you don't have **`KICK MEMBERS`** permission to use this command.",
- "botNoPermission": "Sorry, but I don't have **`KICK MEMBERS`** permission.",
- "userNoKickable": "Sorry, but I can't **`KICK`** that member.",
- "userKicked": "You have been **`KICKED`** from **{guildName}**",
- "kickedByString": "Kicked by: {author}",
- "kickFail": "Unable to **`KICK`** member, because: `{message}`",
- "kickSuccess": "**{user}** has been **`KICKED`** from the server."
- },
- "mute": {
- "description": "Mute someone on the server",
- "slashMemberDescription": "Who do you like to mute?",
- "slashReasonDescription": "Mute reason",
- "usage": "{prefix}mute <@mention | id> [reason]",
- "userNoPermission": "Sorry, but you don't have **`MANAGE ROLES`** permission to use this command.",
- "botNoPermission": "Sorry, but I don't have **`MANAGE ROLES`** permission.",
- "cantMuteOwner": "You can't mute the server owner!",
- "unableToCreateMuteRole": "Unable to create mute role",
- "alreadyMuted": "That member is already **`MUTED`**",
- "userMuted": "You have been **`MUTED`** on **{guildName}**",
- "mutedByString": "Muted by: {author}",
- "muteFail": "Unable to **`MUTE`** member, because: `{message}`",
- "muteSuccess": "**{user}** has been **`MUTED`** on the server."
- },
- "purge": {
- "description": "Delete messages",
- "slashAmountDescription": "Amount of messages to delete",
- "usage": "{prefix}purge ",
- "userNoPermission": "Sorry, but you don't have **`MANAGE MESSAGES`** permission to use this command.",
- "botNoPermission": "Sorry, but I don't have **`MANAGE MESSAGES`** permission.",
- "invalidAmount": "Please specify a valid number of messages to delete.",
- "purgeFail": "Unable to **`PURGE`** messages, because: `{message}`",
- "purgeSuccess": "**{amount}** messages have been **`PURGED`**"
- },
- "unban": {
- "description": "Un-ban someone from the server",
- "slashMemberDescription": "Who do you like to un-ban?",
- "slashReasonDescription": "Un-ban reason",
- "usage": "{prefix}unban [reason]",
- "alreadyUnban": "That user is not **`BANNED`**",
- "unbanFail": "Unable to **`UN-BAN`** member, because: `{message}`",
- "ubanSuccess": "**{user}** has been **`UN-BANNED`** from the server."
- },
- "unmute": {
- "description": "Unmute someone on the server",
- "slashMemberDescription": "Who do you like to unmute?",
- "slashReasonDescription": "Unmute reason",
- "usage": "{prefix}unmute <@mention | id> [reason]",
- "unableToCreateMuteRole": "Unable to create mute role",
- "noMuted": "That member is not **`MUTED`**",
- "userUnmuted": "You have been **`UN-MUTED`** on **{guildName}**",
- "unmutedByString": "Un-muted by: {author}",
- "unmuteFail": "Unable to **`UN-MUTE`** member, because: `{message}`",
- "unmuteSuccess": "**{user}** has been **`UN-MUTED`** on the server."
- },
- "warn": {
- "description": "Warn member on the server",
- "slashMemberDescription": "Who do you like to warn?",
- "slashReasonDescription": "Warn reason",
- "usage": "{prefix}warn <@mention | id> [reason]",
- "userNoPermission": "Sorry, but you don't have **`MANAGE SERVER`** permission to use this command.",
- "noDM": "Unable to create a DM with that user, but I'll keep warn 'em.",
- "userWarned": "You have been **`WARNED`** on **{guildName}**",
- "warnedByString": "Warned by: {author}",
- "warnSuccess": "**{user}** has been **`WARNED`** on the server."
- }
- },
- "music": {
- "categoryName": "MUSIC",
- "lyrics": {
- "description": "Show the lyrics from the song",
- "slashDescription": "Song to search",
- "usage": "{prefix}lyrics [song]",
- "noQuery": "There is nothing playing or no arguments provided.",
- "apiError": "The API could not find the song **{song}**, because: `{message}`"
- },
- "nowplaying": {
- "description": "Show the media player status",
- "emptyQueue": "Queue is empty",
- "disableButton": "After 30 seconds, the buttons will no longer active."
- },
- "pause": {
- "description": "Pause the music player",
- "alreadyPause": "The music player is already paused.",
- "pauseMessage": "The music player has been paused."
- },
- "play": {
- "description": "Play some music",
- "slashQueryDescription": "Query to search",
- "usage": "{prefix}play ",
- "alreadyPlaying": "The music player is already playing to **`{voiceChannel}`** voice channel.",
- "noSongData": "That URL doesn't have any song data."
- },
- "queue": {
- "description": "Show the queue list"
- },
- "remove": {
- "description": "Remove song(s) from the queue",
- "slashPositionsDescription": "Position of the songs to remove separated by comma or space",
- "usage": "{prefix}remove ",
- "noPermission": "You don't have permission to use this command.",
- "noPositions": "Please specify the song positions to remove.",
- "songsRemoved": "Removed {removed} songs from the queue.",
- "songSkip": "One of the removed song is the now-playing song, song skipped."
- },
- "repeat": {
- "description": "Repeat current music or the queue",
- "slashQueue": "Set repeat mode to **`QUEUE`**",
- "slashSong": "Set repeat mode to **`SONG`**",
- "slashDisable": "Disable repeat mode",
- "usage": "{prefix}repeat <{options}>",
- "actualMode": "Current repeat mode is **`{mode}`**",
- "newMode": "The repeat mode has been set to **`{mode}`**"
- },
- "resume": {
- "description": "Resume the music player",
- "alreadyResume": "The music player is not paused.",
- "resumeMessage": "The music player has been resumed."
- },
- "search": {
- "description": "Play some music using provided query",
- "slashDescription": "Search the specified music",
- "slashQueryDescription": "Query to search",
- "slashSourceDescription": "Where the music should be taken?",
- "usage": "{prefix}search [source]",
- "noQuery": "Please provide some query to search.",
- "noTracks": "I can't obtain any search results.",
- "queueEmbed": "Please select some music, you can choose more than one using blank space or {separator}.\n",
- "trackSelectionMessage": "Music Selection",
- "cancelMessage": "Type {cancel} or c to cancel music selection.",
- "noSelection": "No or invalid value entered, music selection canceled.",
- "canceledMessage": "Music selection canceled.",
- "interactionContent": "Please select some music",
- "interactionPlaceholder": "Please select some music"
- },
- "shuffle": {
- "description": "Set mode for shuffle feature",
- "actualState": "Shuffle mode is **`{state}`**",
- "newState": "Shuffle mode is now set to **`{state}`**"
- },
- "skip": {
- "description": "Skip the music",
- "voteResultMessage": "{length}/{required} voted to skip the current song",
- "skipMessage": "Skipped **{song}**"
- },
- "skipTo": {
- "description": "Skip to specific position in the queue",
- "slashFirstDescription": "Rewind to the first song in the queue",
- "slashLastDescription": "Skip to the last song in the queue",
- "slashSpecificDescription": "Skip to a specific position in the queue",
- "slashPositionDescription": "Song position in the queue",
- "usage": "{prefix}skipto <{options} | number>",
- "noPermission": "You don't have permission to use this comamnd.",
- "noSongPosition": "Unable to find song in that position.",
- "cantPlay": "You can't skip to current music.",
- "skipMessage": "Skipped to **{song}**"
- },
- "stayInQueue": {
- "description": "Makes the bot stay in the voice channel when the queue has ended",
- "slashDescription": "Turns mode for stay-in-voice feature",
- "247Disabled": "Stay-in-voice command is disabled.",
- "actualState": "Stay-in-voice is **`{state}`**",
- "newState": "Stay-in-voice is now set to **`{state}`**"
- },
- "stop": {
- "description": "Stop the music player",
- "stoppedMessage": "The music player has been stopped."
- },
- "volume": {
- "description": "Change the media player volume",
- "slashDescription": "New volume",
- "usage": "{prefix}volume [new volume]",
- "currentVolume": "The current volume is **`{volume}`**",
- "changeVolume": "To change the volume, provide volume number when using this command.",
- "plsPause": "Please pause the music instead of setting the volume to **`{volume}`**",
- "volumeLimit": "I can't set the volume above **`{maxVol}`**",
- "newVolume": "Volume has been set to **`{volume}`**"
- }
- }
- },
- "utils": {
- "musicDecorator": {
- "noQueue": "There is nothing playing.",
- "noInVC": "Sorry, but you need to be in a voice channel to do that.",
- "validVCJoinable": "Sorry, but I can't **`CONNECT`** to your voice channel, make sure I have the proper permissions.",
- "validVCPermission": "Sorry, but I can't **`SPEAK`** in this voice channel, make sure I have the proper permissions.",
- "sameVC": "You need to be in the same voice channel as mine."
- },
- "generalHandler": {
- "handleVideoInitial": "Added {length} songs to the queue\n\n",
- "errorJoining": "Error while joining the voice channel, because: `{message}`",
- "queueEnded": "Queue has ended, use **`{usage}`** to play more music.",
- "leftVC": "Left from the voice channel because I've been inactive for too long.",
- "startPlaying": "Started playing **{song}**",
- "stopPlaying": "Stopped playing **{song}**",
- "errorPlaying": "An error occurred while trying to play music, because: `{message}`"
- },
- "cooldownMessage": "{author}, please wait **`{timeleft}`** of cooldown time."
- },
- "events": {
- "channelUpdate": {
- "reconfigureConnection": "Voice channel region changed. Re-configuring connection...",
- "connectionReconfigured": "Connection successfully re-configured.",
- "unableReconfigureConnection": "Unable to re-configure connection, the queue has been deleted."
- },
- "createInteraction": {
- "message1": "Sorry, but that interaction is only for <@{user}> and the server staff.",
- "message2": "Sorry, but that interaction is only for <@{user}>"
- },
- "createMessage": "Hi {author}, my prefix is **`{prefix}`**",
- "voiceStateUpdate": {
- "disconnectFromVCMessage": "Disconnected from the voice channel, the queue has been deleted.",
- "reconfigureConnection": "Moved to a voice channel with a different region. Re-configuring connection...",
- "connectionReconfigured": "Connection successfully re-configured.",
- "unableReconfigureConnection": "Unable to re-configure connection, the queue has been deleted.",
- "joiningAsSpeaker": "Moved to the stage channel, trying to join as Speaker...",
- "unableJoinStageMessage": "Unable to join as Speaker, the queue has been deleted.",
- "joinStageMessage": "Successfully joined to the stage channel as Speaker.",
- "deleteQueue": "**`{duration}`** has been passed and there's no one who joined the voice channel, the queue has been deleted.",
- "deleteQueueFooter": "Queue Deleted",
- "pauseQueue": "Everyone has left from the voice channel. To save resources, the queue has been paused.\nIf no one joins the voice channel in the next **`{duration}`**, the queue will be deleted.",
- "pauseQueueFooter": "Queue Paused",
- "resumeQueue": "Someone has joined the voice channel.\nResuming **{song}**",
- "resumeQueueFooter": "Queue Resumed"
- }
- },
- "reusable": {
- "pageFooter": "Page {actual} of {total}",
- "invalidUsage": "Invalid usage, please use **`{prefix} {name}`** for more information."
- }
+ "commands": {
+ "developers": {
+ "categoryName": "DEVELOPER",
+ "eval": {
+ "description": "Evaluate to the bot",
+ "errorString": "Error",
+ "noCode": "No code was provided.",
+ "outputString": "Output",
+ "usage": "{prefix}eval "
+ }
+ },
+ "general": {
+ "about": {
+ "aboutFooter": "{botname} - Bot Information",
+ "botUptimeString": "Bot Uptime",
+ "botVersionString": "Bot version",
+ "description": "Show the bot's information",
+ "discordJSVersionString": "Discord.js version",
+ "ffmpegVersionString": "FFmpeg version",
+ "nodeVersionString": "Node.js version",
+ "osUptimeString": "OS Uptime",
+ "processUptimeString": "Process Uptime",
+ "sourceCodeString": "Source code"
+ },
+ "categoryName": "GENERAL",
+ "help": {
+ "aliasesString": "Aliases",
+ "authorString": "{username} - Command List",
+ "commandDetailTitle": "{username} - Information about {command} command",
+ "commandSelectionString": "Please select the command",
+ "commandUsageFooter": "<> = required | [] = optional {devOnly}",
+ "description": "Shows the command list or information for a specific command",
+ "descriptionString": "Description",
+ "footerString": "{prefix}help to get more information on a specific command",
+ "nameString": "Name",
+ "noCommanSuggest": "Couldn't find matching command name. Did you mean this?",
+ "noCommand": "Couldn't find any matching command name.",
+ "slashDescription": "Command name to view a specific information about the command",
+ "usage": "{prefix}help [command]",
+ "usageString": "Usage"
+ },
+ "invite": {
+ "clickURL": "**[Click here]({url})** to invite this bot to your server.",
+ "description": "Get the invite link for the bot",
+ "inviteTitle": "{bot} - Invite Link"
+ },
+ "ping": {
+ "description": "Shows the current ping of the bot",
+ "footerString": "Latency of: {user}"
+ }
+ },
+ "moderation": {
+ "ban": {
+ "banFail": "Unable to **`BAN`** member, because: `{message}`",
+ "banSuccess": "**{user}** has been **`BANNED`** from the server.",
+ "bannedByString": "Banned by: {author}",
+ "botNoPermission": "Sorry, but I don't have **`BAN MEMBERS`** permission.",
+ "description": "Ban someone from the server",
+ "slashMemberIDDescription": "Who do you like to ban?",
+ "slashReasonDescription": "Ban reason",
+ "usage": "{prefix}ban <@mention | id> [reason]",
+ "userBanned": "You have been **`BANNED`** from **{guildName}**",
+ "userNoBannable": "Sorry, but I can't **`BAN`** that member.",
+ "userNoPermission": "Sorry, but you don't have **`BAN MEMBERS`** permission to use this command."
+ },
+ "categoryName": "MODERATION",
+ "common": {
+ "noReasonString": "[Not specified]",
+ "noUserSpecified": "Please specify someone.",
+ "reasonString": "**Reason**"
+ },
+ "infractions": {
+ "description": "Show the infractions of a user",
+ "embedAuthorText": "{user} - Infractions",
+ "noInfractions": "No infractions.",
+ "slashMemberDescription": "Who do you like to see the infractions of?",
+ "usage": "{prefix}infractions [@mention | id]"
+ },
+ "kick": {
+ "botNoPermission": "Sorry, but I don't have **`KICK MEMBERS`** permission.",
+ "description": "Kick someone from the server",
+ "kickFail": "Unable to **`KICK`** member, because: `{message}`",
+ "kickSuccess": "**{user}** has been **`KICKED`** from the server.",
+ "kickedByString": "Kicked by: {author}",
+ "slashMemberDescription": "Who do you like to kick?",
+ "slashReasonDescription": "Kick reason",
+ "usage": "{prefix}kick <@mention | id> [reason]",
+ "userKicked": "You have been **`KICKED`** from **{guildName}**",
+ "userNoKickable": "Sorry, but I can't **`KICK`** that member.",
+ "userNoPermission": "Sorry, but you don't have **`KICK MEMBERS`** permission to use this command."
+ },
+ "modlogs": {
+ "channel": {
+ "current": "Current moderation logs channel: <#{channel}>",
+ "invalid": "Invalid channel, channel must be a text channel.",
+ "noChannel": "Moderation logs channel hasn't been set.",
+ "success": "Moderation logs channel has been set to <#{channel}>"
+ },
+ "description": "Change moderation logs feature settings",
+ "disable": "Moderation logs feature has been **`DISABLED`**",
+ "embedTitle": "Moderation Logs",
+ "enable": "Moderation logs feature has been **`ENABLED`**",
+ "newChannelText": "new channel",
+ "slashChannelDescription": "View or change the moderation logs channel",
+ "slashChannelNewChannelOption": "New channel for the moderation logs",
+ "slashDisableDescription": "Disable the moderation logs feature",
+ "slashEnableDescription": "Enable the moderation logs feature",
+ "usage": "{prefix}modlogs"
+ },
+ "mute": {
+ "alreadyMuted": "That member is already **`MUTED`**",
+ "botNoPermission": "Sorry, but I don't have **`MANAGE ROLES`** permission.",
+ "cantMuteOwner": "You can't **`MUTE`** the server owner.",
+ "description": "Mute someone on the server",
+ "muteFail": "Unable to **`MUTE`** member, because: `{message}`",
+ "muteSuccess": "**{user}** has been **`MUTED`** on the server.",
+ "mutedByString": "Muted by: {author}",
+ "noRole": "Mute role hasn't been set, please set it with `{prefix}setmute`",
+ "slashMemberDescription": "Who do you like to mute?",
+ "slashReasonDescription": "Mute reason",
+ "usage": "{prefix}mute <@mention | id> [reason]",
+ "userMuted": "You have been **`MUTED`** on **{guildName}**",
+ "userNoPermission": "Sorry, but you don't have **`MANAGE ROLES`** permission to use this command."
+ },
+ "purge": {
+ "botNoPermission": "Sorry, but I don't have **`MANAGE MESSAGES`** permission.",
+ "description": "Delete messages",
+ "invalidAmount": "Please specify a valid number of messages to delete.",
+ "purgeFail": "Unable to **`PURGE`** messages, because: `{message}`",
+ "purgeSuccess": "{amount, plural, one {**`1`** message} other {**`#`** messages}} have been **`PURGED`**",
+ "slashAmountDescription": "Number of messages to delete",
+ "usage": "{prefix}purge ",
+ "userNoPermission": "Sorry, but you don't have **`MANAGE MESSAGES`** permission to use this command."
+ },
+ "setmute": {
+ "description": "Set the mute role",
+ "invalidRole": "Invalid role.",
+ "slashRoleDescription": "The role to be used for mute",
+ "success": "Mute role has been set to <@&{role}>",
+ "usage": "{prefix}setmute "
+ },
+ "unban": {
+ "alreadyUnban": "That user is not **`BANNED`**",
+ "description": "Un-ban someone from the server",
+ "slashMemberDescription": "Who do you like to un-ban?",
+ "slashReasonDescription": "Un-ban reason",
+ "ubanSuccess": "**{user}** has been **`UN-BANNED`** from the server.",
+ "unbanFail": "Unable to **`UN-BAN`** member, because: `{message}`",
+ "unbannedByString": "Un-banned by: {author}",
+ "usage": "{prefix}unban [reason]"
+ },
+ "unmute": {
+ "description": "Unmute someone on the server",
+ "noMuted": "That member is not **`MUTED`**",
+ "slashMemberDescription": "Who do you like to unmute?",
+ "slashReasonDescription": "Un-mute reason",
+ "unmuteFail": "Unable to **`UN-MUTE`** member, because: `{message}`",
+ "unmuteSuccess": "**{user}** has been **`UN-MUTED`** on the server.",
+ "unmutedByString": "Un-muted by: {author}",
+ "usage": "{prefix}unmute <@mention | id> [reason]",
+ "userUnmuted": "You have been **`UN-MUTED`** on **{guildName}**"
+ },
+ "warn": {
+ "description": "Warn member on the server",
+ "noDM": "Unable to create a DM with that user, but I'll keep warning 'em.",
+ "slashMemberDescription": "Who do you like to warn?",
+ "slashReasonDescription": "Warn reason",
+ "usage": "{prefix}warn <@mention | id> [reason]",
+ "userNoPermission": "Sorry, but you don't have **`MANAGE SERVER`** permission to use this command.",
+ "userWarned": "You have been **`WARNED`** on **{guildName}**",
+ "warnSuccess": "**{user}** has been **`WARNED`** on the server.",
+ "warnedByString": "Warned by: {author}"
+ }
+ },
+ "music": {
+ "categoryName": "MUSIC",
+ "dj": {
+ "description": "Change DJ feature settings",
+ "disable": "Disabled",
+ "disableText": "DJ feature has been **`DISABLED`**",
+ "embedTitle": "DJ feature",
+ "enable": "Enabled",
+ "enableText": "DJ feature has been **`ENABLED`**",
+ "newRoleText": "new role",
+ "role": {
+ "current": "Current DJ role: <@&{role}>",
+ "invalid": "Invalid role.",
+ "noRole": "DJ role hasn't been set, please set it with `{prefix}dj role`",
+ "success": "DJ role has been set to <@&{role}>"
+ },
+ "slashDisableDescription": "Disable the DJ feature",
+ "slashEnableDescription": "Enable the DJ feature",
+ "slashRoleDescription": "View or change the DJ role",
+ "slashRoleNewRoleOption": "New role for the DJ"
+ },
+ "lyrics": {
+ "apiError": "The API could not find the song **{song}**, because: `{message}`",
+ "description": "Show the lyrics from the song",
+ "noQuery": "There is nothing playing, or no arguments are provided.",
+ "slashDescription": "Song to search",
+ "usage": "{prefix}lyrics [song]"
+ },
+ "nowplaying": {
+ "description": "Show the media player status",
+ "disableButton": "Previous buttons is no longer active and removed.",
+ "emptyQueue": "Queue is empty."
+ },
+ "pause": {
+ "alreadyPause": "The music player is already paused.",
+ "description": "Pause the music player",
+ "pauseMessage": "The music player has been paused."
+ },
+ "play": {
+ "alreadyPlaying": "The music player is already playing to **`{voiceChannel}`** voice channel.",
+ "description": "Play some music",
+ "noSongData": "That URL doesn't have any song data.",
+ "slashQueryDescription": "Query to search",
+ "usage": "{prefix}play "
+ },
+ "queue": {
+ "description": "Show the queue list"
+ },
+ "remove": {
+ "description": "Remove song(s) from the queue",
+ "noPermission": "You don't have permission to use this command.",
+ "noPositions": "Please specify the song positions to remove.",
+ "slashPositionsDescription": "Position of the songs to remove separated by comma or space",
+ "songSkip": "The current song was removed, song skipped.\n\n",
+ "songsRemoved": "Removed {removed, plural, one {1 song} other {# songs}} from the queue",
+ "usage": "{prefix}remove "
+ },
+ "repeat": {
+ "actualMode": "Current repeat mode is **`{mode}`**",
+ "description": "Repeat current music or the queue",
+ "footer": "To change mode, see {prefix}help repeat",
+ "newMode": "The repeat mode has been set to **`{mode}`**",
+ "slashDisable": "Disable repeat mode",
+ "slashQueue": "Set repeat mode to **`QUEUE`**",
+ "slashSong": "Set repeat mode to **`SONG`**",
+ "usage": "'{prefix}'repeat <{options}>"
+ },
+ "resume": {
+ "alreadyResume": "The music player is not paused.",
+ "description": "Resume the music player",
+ "resumeMessage": "The music player has been resumed."
+ },
+ "search": {
+ "cancelMessage": "Type {cancel} or c to cancel music selection.",
+ "canceledMessage": "Music selection canceled.",
+ "description": "Play some music using provided query",
+ "interactionContent": "Please select some music",
+ "interactionPlaceholder": "Please select some music",
+ "noQuery": "Please provide some query to search.",
+ "noSelection": "No or invalid value entered, music selection canceled.",
+ "noTracks": "I can't obtain any search results.",
+ "queueEmbed": "Please select some music; you can choose more than one using blank space or {separator}.\n",
+ "slashDescription": "Search the specified music",
+ "slashQueryDescription": "Query to search",
+ "slashSourceDescription": "Where the music should be taken?",
+ "trackSelectionMessage": "Music Selection",
+ "usage": "{prefix}search [source]"
+ },
+ "shuffle": {
+ "actualState": "Current shuffle mode is **`{state}`**",
+ "description": "Set mode for shuffle feature",
+ "newState": "Shuffle mode is now set to **`{state}`**"
+ },
+ "skip": {
+ "description": "Skip the music",
+ "skipMessage": "Skipped **{song}**",
+ "voteResultMessage": "{length}/{required} voted to skip the current song"
+ },
+ "skipTo": {
+ "cantPlay": "You can't skip to current music.",
+ "description": "Skip to specific position in the queue",
+ "noPermission": "You don't have permission to use this command.",
+ "noSongPosition": "Unable to find a song in that position.",
+ "skipMessage": "Skipped to **{song}**",
+ "slashFirstDescription": "Rewind to the first song in the queue",
+ "slashLastDescription": "Skip to the last song in the queue",
+ "slashPositionDescription": "Song position in the queue",
+ "slashSpecificDescription": "Skip to a specific position in the queue",
+ "usage": "'{prefix}'skipto <{options} | number>"
+ },
+ "stayInQueue": {
+ "247Disabled": "Stay-in-voice command is disabled.",
+ "actualState": "Stay-in-voice is **`{state}`**",
+ "description": "Makes the bot stay in the voice channel when the queue has ended",
+ "newState": "Stay-in-voice is now set to **`{state}`**",
+ "slashDescription": "Turns mode for stay-in-voice feature"
+ },
+ "stop": {
+ "description": "Stop the music player",
+ "stoppedMessage": "The music player has been stopped."
+ },
+ "volume": {
+ "changeVolume": "To change the volume, provide volume number when using this command.",
+ "currentVolume": "The current volume is **`{volume}`**",
+ "description": "Change the media player volume",
+ "newVolume": "Volume has been set to **`{volume}`**",
+ "plsPause": "Please pause the music instead of setting the volume to **`{volume}`**",
+ "slashDescription": "New volume",
+ "usage": "{prefix}volume [new volume]",
+ "volumeLimit": "I can't set the volume above **`{maxVol}`**"
+ }
+ }
+ },
+ "events": {
+ "channelUpdate": {
+ "connectionReconfigured": "Connection successfully re-configured.",
+ "reconfigureConnection": "Voice channel region changed, re-configuring connection...",
+ "unableReconfigureConnection": "Unable to re-configure connection, the queue has been deleted."
+ },
+ "createInteraction": {
+ "message1": "Sorry, but that interaction is only for <@{user}> and the server staff.",
+ "message2": "Sorry, but that interaction is only for <@{user}>"
+ },
+ "createMessage": "Hi {author}, my prefix is **`{prefix}`**",
+ "voiceStateUpdate": {
+ "connectionReconfigured": "Connection successfully re-configured.",
+ "deleteQueue": "**`{duration}`** has been passed and there's no one who joined the voice channel, the queue has been deleted.",
+ "deleteQueueFooter": "Queue Deleted",
+ "disconnectFromVCMessage": "Disconnected from the voice channel, the queue has been deleted.",
+ "joinStageMessage": "Successfully joined the stage channel as Speaker.",
+ "joiningAsSpeaker": "Moved to the stage channel, trying to join as Speaker...",
+ "pauseQueue": "Everyone has left the voice channel. To save resources, the queue has been paused.\nIf no one joins the voice channel in the next **`{duration}`**, the queue will be deleted.",
+ "pauseQueueFooter": "Queue Paused",
+ "reconfigureConnection": "Moved to a voice channel with a different region, re-configuring connection...",
+ "resumeQueue": "Someone has joined the voice channel.\nResuming **{song}**",
+ "resumeQueueFooter": "Queue Resumed",
+ "unableJoinStageMessage": "Unable to join as Speaker, the queue has been deleted.",
+ "unableReconfigureConnection": "Unable to re-configure connection, the queue has been deleted."
+ }
+ },
+ "reusable": {
+ "invalidUsage": "Invalid usage, please use **`{prefix} {name}`** for more information.",
+ "pageFooter": "Page {actual} of {total}"
+ },
+ "utils": {
+ "cooldownMessage": "{author}, please wait **`{timeleft}`** of cooldown time.",
+ "generalHandler": {
+ "errorJoining": "Error while joining the voice channel, because: `{message}`",
+ "errorPlaying": "An error occurred while trying to play music, because: `{message}`",
+ "handleVideoInitial": "Added {length} songs to the queue",
+ "leftVC": "Left from the voice channel because I've been inactive for too long.",
+ "queueEnded": "Queue has ended, use **`{usage}`** to play more music.",
+ "startPlaying": "Started playing **{song}**",
+ "stopPlaying": "Stopped playing **{song}**"
+ },
+ "musicDecorator": {
+ "noInVC": "Sorry, but you need to be in a voice channel to do that.",
+ "noQueue": "There is nothing playing.",
+ "sameVC": "You need to be in the same voice channel as mine.",
+ "validVCJoinable": "Sorry, but I can't **`CONNECT`** to your voice channel, make sure I have the proper permissions.",
+ "validVCPermission": "Sorry, but I can't **`SPEAK`** in this voice channel; make sure I have the proper permissions."
+ }
+ }
}
diff --git a/lang/es.json b/lang/es.json
index 08c8316e7..c8fe41fed 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -1,298 +1,359 @@
{
- "commands": {
- "developers": {
- "categoryName": "REVELADOR",
- "eval": {
- "description": "Evaluar al bot",
- "usage": "{prefix}eval ",
- "noCode": "No se ingresó código.",
- "outputString": "Salida",
- "errorString": "Error"
- }
- },
- "general": {
- "categoryName": "GENERAL",
- "about": {
- "description": "Muestra la información del bot",
- "osUptimeString": "Tiempo de actividad del SO",
- "processUptimeString": "Tiempo de actividad del proceso",
- "botUptimeString": "Tiempo de actividad del bot",
- "nodeVersionString": "Versión de Node.js",
- "discordJSVersionString": "Versión de Discord.js",
- "ffmpegVersionString": "Versión de FFmpeg",
- "botVersionString": "Versión del bot",
- "sourceCodeString": "Código Fuente",
- "aboutFooter": "Información del bot {botname}"
- },
- "help": {
- "description": "Muestra la lista de comandos o la información de un comando específico",
- "slashDescription": "Nombre del comando para ver información específica acerca de dicho comando",
- "usage": "{prefix}help [comando]",
- "authorString": "Lista de comandos de {username}",
- "footerString": "{prefix}help para obtener más información de un comando específico",
- "noCommand": "No se puede encontrar el comando",
- "commandSelectionString": "Por favor selecciona un comando",
- "noCommanSuggest": "No se puede encontrar el comando. Quisiste decir este?",
- "commandDetailTitle": "{username} - Información del comando {command}",
- "nameString": "Nombre",
- "descriptionString": "Descripción",
- "aliasesString": "Alias",
- "usageString": "Uso",
- "commandUsageFooter": "<> = requerido | [] = opcional {devOnly}"
- },
- "invite": {
- "description": "Obtén el enlace de invitación para el bot",
- "inviteTitle": "{bot} - Enlace De Invitación",
- "clickURL": "**[Haga clic]({url})** aquí para invitar a este bot a su servidor."
- },
- "ping": {
- "description": "Muestra el ping actual del bot",
- "footerString": "Latencia de: {user}"
- }
- },
- "moderation": {
- "common": {
- "categoryName": "MODERACIÓN",
- "noUserSpecified": "Por favor especifica un usuario.",
- "noReasonString": "[No especificado]",
- "reasonString": "**Razón**"
- },
- "ban": {
- "description": "Banea a alguien en el servidor",
- "slashMemberIDDescription": "A quién quisieras banear?",
- "slashReasonDescription": "Razón del ban",
- "usage": "{prefix}ban <@mención | id> [razón]",
- "userNoPermission": "Lo siento, pero no tienes el permiso **`BAN MEMBERS`** para usar este comando.",
- "botNoPermission": "Lo siento, pero no tengo el permiso **`BAN MEMBERS`**.",
- "userNoBannable": "Lo siento, no puedo **`BANEAR`** a ese miembro.",
- "userBanned": "Haz sido **`BANEADO`** de **{guildName}**",
- "bannedByString": "Baneado por: {author}",
- "banFail": "No se pudo **`BANEAR`** al miembro, porque: `{message}`",
- "banSuccess": "**{user}** ha sido **`BANEADO`** del servidor."
- },
- "kick": {
- "description": "Expulsa a alguien del servidor",
- "slashMemberDescription": "A quién te quisieras expulsar?",
- "slashReasonDescription": "Razón de expulsión",
- "usage": "{prefix}kick <@mención | id> [razón]",
- "userNoPermission": "Lo siento, pero no tienes el permiso **`KICK MEMBERS`** para usar este comando.",
- "botNoPermission": "Lo siento, pero no tengo el permiso **`KICK MEMBERS`**.",
- "userNoKickable": "Lo siento, no puedo **`EXPULSAR`** a ese miembro.",
- "userKicked": "Haz sido **`EXPULSADO`** de **{guildName}**",
- "kickedByString": "Expulsado por: {author}",
- "kickFail": "No se pudo **`EXPULSAR`** al miembro, porque: `{message}`",
- "kickSuccess": "**{user}** ha sido **`EXPULSADO`** del servidor."
- },
- "mute": {
- "description": "Silencia a alguien en el servidor",
- "slashMemberDescription": "A quién quisieras silenciar?",
- "slashReasonDescription": "Razón de silencio",
- "unableToCreateMuteRole": "No se pudo crear el rol de Silenciado",
- "usage": "{prefix}mute <@mención | id> [razón]",
- "userNoPermission": "Lo siento, pero no tienes el permiso **`MANAGE ROLES`** para usar este comando.",
- "botNoPermission": "Lo siento, pero no tengo el permiso **`MANAGE ROLES`**",
- "alreadyMuted": "Ese miembro ya ha sido **`SILENCIADO`**",
- "userMuted": "Haz sido **`SILENCIADO`** en **{guildName}**",
- "mutedByString": "Silenciado por: {author}",
- "muteFail": "No se pudo **`SILENCIAR`** al miembro, porque: `{message}`",
- "muteSuccess": "**{user}** ha sido **`SILENCIADO`** en el servidor."
- },
- "purge": {
- "description": "Eliminar mensajes",
- "slashAmountDescription": "Cantidad de mensajes para eliminar",
- "usage": "{prefix}purge ",
- "userNoPermission": "Lo siento, pero no tienes el permiso **`MANAGE SERVER`** para usar este comando.",
- "botNoPermission": "Sorry, but I don't have **`MANAGE MESSAGES`** permission.",
- "invalidAmount": "Please specify a valid number of messages to delete.",
- "purgeFail": "Unable to **`PURGE`** messages, because: `{message}`",
- "purgeSuccess": "**{amount}** messages have been **`PURGED`**"
- },
- "unban": {
- "description": "Desbanea a alguien del servidor",
- "slashMemberDescription": "A quién quisieras desbanear?",
- "slashReasonDescription": "Razón de desbaneo",
- "usage": "{prefix}unban [razón]",
- "alreadyUnban": "Este usuario no está **`BANEADO`**",
- "unbanFail": "No se pudo **`DESBANEAR`** al miembro, porque: `{message}`",
- "ubanSuccess": "**{user}** ha sido **`DESBANEADO`** del servidor."
- },
- "unmute": {
- "description": "Desilenciar a alguien del servidor",
- "slashMemberDescription": "A quién quisieras desilenciar?",
- "slashReasonDescription": "Razón del desilencio",
- "unableToCreateMuteRole": "No se pudo crear el rol de Silenciado",
- "usage": "{prefix}unmute <@mención | id> [razón]",
- "noMuted": "Ese miembro no ha sido **`SILENCIADO`**",
- "userUnmuted": "Haz sido **`DESILENCIADO`** en **{guildName}**",
- "unmutedByString": "Desilenciado por: {author}",
- "unmuteFail": "No se pudo **`DESILENCIAR`** al miembro, porque: `{message}`",
- "unmuteSuccess": "**{user}** ha sido **`DESILENCIADO`** en el servidor."
- },
- "warn": {
- "description": "Advierte a un miembro en el servidor",
- "slashMemberDescription": "A quién quisieras advertir?",
- "slashReasonDescription": "Razón de advertencia",
- "usage": "{prefix}warn <@mención | id> [razón]",
- "userNoPermission": "Lo siento, pero no tienes el permiso **`MANAGE SERVER`** para usar este comando.",
- "noDM": "No se pudo enviar advertencia al DM del usuario, pero igual ha sido advertido.",
- "userWarned": "Haz sido **`ADVERTIDO`** en **{guildName}**",
- "warnedByString": "Advertido por: {author}",
- "warnSuccess": "**{user}** ha sido **`ADVERTIDO`** en el servidor."
- }
- },
- "music": {
- "lyrics": {
- "categoryName": "MÚSICA",
- "description": "Muestra la letra de una canción",
- "slashDescription": "Canción a buscar",
- "usage": "{prefix}lyrics [canción]",
- "noQuery": "No se está reproduciendo nada o no se ingresaron argumentos.",
- "apiError": "El API no pudo encontrar la canción **{song}**, porque: {message}"
- },
- "nowplaying": {
- "description": "Muestra la canción que se está reproduciendo",
- "emptyQueue": "La cola está vacía",
- "disableButton": "Después de 30 segundos, los botones se desactivarán."
- },
- "pause": {
- "description": "Pausa la reproducción de música",
- "alreadyPause": "El reproductor de música ya está en pausa.",
- "pauseMessage": "Se ha pausado el reproductor de música."
- },
- "play": {
- "description": "Reproduce algo de música",
- "slashQueryDescription": "Canción a reproducir",
- "usage": "{prefix}play ",
- "alreadyPlaying": "El reproductor de música ya está reproduciendo en el canal de voz **`{voiceChannel}`**.",
- "noSongData": "Este URL no tiene datos de canciones."
- },
- "queue": {
- "description": "Muestra la cola de reproducción"
- },
- "repeat": {
- "description": "Repite la canción actual o la cola completa",
- "slashQueue": "Establece el mode repetición a **`QUEUE`**",
- "slashSong": "Establece el mode repetición a **`ONE`**",
- "slashDisable": "Desactiva el modo repetición",
- "usage": "{prefix}repeat <{options}>",
- "actualMode": "El modo de repetición actual es **`{mode}`**",
- "newMode": "El modo de reproducción ha sido establecido a **`{mode}`**"
- },
- "resume": {
- "description": "Reanuda el reproductor de música",
- "alreadyResume": "El reproductor de música no está en pausa.",
- "resumeMessage": "El reproductor de música ha sido reanudado."
- },
- "search": {
- "description": "Reproduce alguna canción usando una fuente específica",
- "slashDescription": "Busca una canción específica",
- "slashQueryDescription": "Canción a buscar",
- "slashSourceDescription": "De donde debería tomar la canción?",
- "usage": "{prefix}search [fuente]",
- "noQuery": "Por favor ingresa alguna canción para buscar.",
- "noTracks": "No pude obtener resultados.",
- "queueEmbed": "Por favor selecciona la canción, puedes seleccionar más de una usando un espacio en blanco o {separator}.\n",
- "trackSelectionMessage": "Selección de canciones",
- "cancelMessage": "Escribe {cancel} o c para cancelar la selección de música.",
- "noSelection": "No se ingresó un valor o este fue inválido, búsqueda de canciones cancelada.",
- "canceledMessage": "Selección de canciones cancelada.",
- "interactionContent": "Por favor selecciona una canción",
- "interactionPlaceholder": "Por favor selecciona una canción"
- },
- "shuffle": {
- "description": "Aleatoriza la cola",
- "actualState": "El modo aleatorio está **`{state}`**",
- "newState": "El modo aleatorio se estableció ahora a **`{state}`**"
- },
- "skip": {
- "description": "Salta la canción actual",
- "voteMessage": "{actual}/{required} votos requeridos para saltar la canción",
- "voteResultMessage": "{length}/{required} han votado para saltar la canción",
- "skipMessage": "Se ha saltado **{song}**"
- },
- "skipTo": {
- "description": "Salta a una posición específica de la cola",
- "slashFirstDescription": "Regresa a la primera canción de la cola",
- "slashLastDescription": "Salta a la última canción de la cola",
- "slashSpecificDescription": "Salta a una posición específica en la cola",
- "slashPositionDescription": "Posición de la canción en la cola",
- "usage": "{prefix}skipto <{options} | número>",
- "noPermission": "No tienes permiso para usar este comando.",
- "noSongPosition": "No se pudo encontrar la canción en esta posición.",
- "cantPlay": "No puedes saltar la canción actual.",
- "skipMessage": "Se ha saltado a **{song}**"
- },
- "stayInQueue": {
- "description": "Haz que el bot permanezca en el canal de voz cuando la cola termine",
- "slashDescription": "Alterna el modo de la característica stay-in-voice",
- "247Disabled": "La característica Stay-in-voice está desactivada.",
- "actualState": "Stay-in-voice está **`{state}`**",
- "newState": "Stay-in-voice se estableció a **`{state}`**"
- },
- "stop": {
- "description": "Para el reproductor de música",
- "stoppedMessage": "El reproductor de música se ha detenido."
- },
- "volume": {
- "description": "Cambia el volúmen del reproductor de música",
- "slashDescription": "Nuevo volúmen",
- "usage": "{prefix}volume [volumen]",
- "currentVolume": "El volúmen actual es **`{volume}`**",
- "changeVolume": "Para cambiar el volúmen, ingresa un número usando este comando.",
- "plsPause": "Por favor pausa la música en lugar de establecer el volúmen en **`{volume}`**",
- "volumeLimit": "No puedo establecer el volúmen por encima de **`{maxVol}`**",
- "newVolume": "Volúmen establecido en **`{volume}`**"
- }
- }
- },
- "utils": {
- "musicDecorator": {
- "noQueue": "No se está reproduciendo nada.",
- "noInVC": "Lo siento, pero debes estar en un canal de voz para hacer eso.",
- "validVCJoinable": "Lo siento, pero no tengo el permiso **`CONNECT`** en tu servidor.",
- "validVCPermission": "Lo siento, pero no tengo el permiso **`SPEAK`** en tu servidor.",
- "sameVC": "Necesitas estar en el mismo canal de voz que yo."
- },
- "generalHandler": {
- "handleVideoInitial": "Se han añadido {length} canciones a la cola\n\n",
- "errorJoining": "Error al unirse al canal de voz, porque: {message}",
- "queueEnded": "La cola ha terminado, usa **`{usage}`** para reproducir más música.",
- "leftVC": "Dejando el canal de voz porque he estado inactivo mucho tiempo.",
- "startPlaying": "Se empezó a reproducir **{song}**",
- "stopPlaying": "Se detuvo la reproducción **{song}**",
- "errorPlaying": "Ocurrió un error cuando traté de reproducir música, porque: ${message}"
- },
- "cooldownMessage": "{author}, por favor espera **`{timeleft}`** para poder hacer eso."
- },
- "events": {
- "channelUpdate": {
- "reconfigureConnection": "Se ha cambiado la región del canal de voz. Reconfigurando conexión...",
- "connectionReconfigured": "La conexión se ha reconfigurado con éxito.",
- "unableReconfigureConnection": "No se pudo reconfigurar la conexión, la cola ha sido eliminada."
- },
- "createInteraction": {
- "message1": "Lo siento, pero esta interacción es solo para <@{user}> y el staff del servidor.",
- "message2": "Lo siento, pero esta interacción es solo para <@{user}>"
- },
- "createMessage": "Hola {author}, mi prefix es **`{prefix}`**",
- "voiceStateUpdate": {
- "connectionReconfigured": "La conexión se ha reconfigurado con éxito.",
- "disconnectFromVCMessage": "Desconectado del canal de voz, la cola ha sido eliminada.",
- "joiningAsSpeaker": "Movido a un canal de escenario, intentando unirse como Orador...",
- "unableJoinStageMessage": "No se pudo unir como orador, la cola ha sido eliminada.",
- "joinStageMessage": "Me uní al canal escenario con éxito como orador.",
- "deleteQueue": "Ha pasado **`{duration}`** y nadie se ha unido al canal de voz, la cola ha sido eliminada.",
- "deleteQueueFooter": "Cola eliminada",
- "pauseQueue": "Todos han dejado el canal de voz. Para ahorrar recursos, se ha pausado la cola.\nSi nadie se une al canal de voz en **`{duration}`**, la cola se eliminará.",
- "pauseQueueFooter": "Cola pausada",
- "reconfigureConnection": "He sido movido a un canal de voz en una región diferente. Reconfigurando conexión...",
- "resumeQueue": "Alguien se ha unido al canal de voz.\nReanudando **{song}**",
- "resumeQueueFooter": "Cola reanudada",
- "unableReconfigureConnection": "No se pudo reconfigurar la conexión, la cola ha sido eliminada."
- }
- },
- "reusable": {
- "pageFooter": "Página {actual} de {total}",
- "invalidUsage": "Uso inválido, por favor usa **`{prefix} {name}`** para más información."
- }
-}
\ No newline at end of file
+ "commands": {
+ "developers": {
+ "categoryName": "DESARROLLADOR",
+ "eval": {
+ "description": "Evaluar al bot",
+ "errorString": "Error",
+ "noCode": "No se ingresó código.",
+ "outputString": "Salida",
+ "usage": "{prefix}eval "
+ }
+ },
+ "general": {
+ "about": {
+ "aboutFooter": "Información del bot {botname}",
+ "botUptimeString": "Tiempo de actividad del bot",
+ "botVersionString": "Versión del bot",
+ "description": "Muestra la información del bot",
+ "discordJSVersionString": "Versión de Discord.js",
+ "ffmpegVersionString": "Versión de FFmpeg",
+ "nodeVersionString": "Versión de Node.js",
+ "osUptimeString": "Tiempo de actividad del S.O.",
+ "processUptimeString": "Tiempo de actividad del proceso",
+ "sourceCodeString": "Código Fuente"
+ },
+ "categoryName": "GENERAL",
+ "help": {
+ "aliasesString": "Alias",
+ "authorString": "Lista de comandos de {username}",
+ "commandDetailTitle": "{username} - Información del comando {command}",
+ "commandSelectionString": "Por favor selecciona un comando",
+ "commandUsageFooter": "<> = requerido | [] = opcional {devOnly}",
+ "description": "Muestra la lista de comandos o la información de un comando específico",
+ "descriptionString": "Descripción",
+ "footerString": "{prefix}help para obtener más información de un comando específico",
+ "nameString": "Nombre",
+ "noCommanSuggest": "No se puede encontrar el comando. Quisiste decir este?",
+ "noCommand": "No se puede encontrar el comando.",
+ "slashDescription": "Nombre del comando para ver información específica acerca de dicho comando",
+ "usage": "{prefix}help [comando]",
+ "usageString": "Uso"
+ },
+ "invite": {
+ "clickURL": "**[Haga click]({url})** aquí para invitar a este bot a su servidor.",
+ "description": "Obtén el enlace de invitación para el bot",
+ "inviteTitle": "{bot} - Enlace De Invitación"
+ },
+ "ping": {
+ "description": "Muestra el ping actual del bot",
+ "footerString": "Latencia de: {user}"
+ }
+ },
+ "moderation": {
+ "ban": {
+ "banFail": "No se pudo **`BANEAR`** al miembro, razón: `{message}`",
+ "banSuccess": "**{user}** ha sido **`BANEADO`** del servidor.",
+ "bannedByString": "Baneado por: {author}",
+ "botNoPermission": "Lo siento, pero no tengo el permiso **`BANEAR MIEMBROS`**.",
+ "description": "Banea a alguien en el servidor",
+ "slashMemberIDDescription": "¿A quién quisieras banear?",
+ "slashReasonDescription": "Razón del ban",
+ "usage": "{prefix}ban <@mención | id> [razón]",
+ "userBanned": "Haz sido **`BANEADO`** de **{guildName}**",
+ "userNoBannable": "Lo siento, no puedo **`BANEAR`** a ese miembro.",
+ "userNoPermission": "Lo siento, pero no tienes el permiso **`BANEAR MIEMBROS`** para usar este comando."
+ },
+ "categoryName": "MODERACIÓN",
+ "common": {
+ "noReasonString": "[No especificado]",
+ "noUserSpecified": "Por favor especifica un usuario.",
+ "reasonString": "**Razón**"
+ },
+ "infractions": {
+ "description": "Muestra las infracciones de un usuario",
+ "embedAuthorText": "{user} - Infracciones",
+ "noInfractions": "No hay infracciones.",
+ "slashMemberDescription": "¿De quién quisieras ver las infracciones?",
+ "usage": "{prefix}infractions [@mención | id]"
+ },
+ "kick": {
+ "botNoPermission": "Lo siento, pero no tengo el permiso **`EXPULSAR MIEMBROS`**.",
+ "description": "Expulsa a alguien del servidor",
+ "kickFail": "No se pudo **`EXPULSAR`** al miembro, razón: `{message}`",
+ "kickSuccess": "**{user}** ha sido **`EXPULSADO`** del servidor.",
+ "kickedByString": "Expulsado por: {author}",
+ "slashMemberDescription": "¿A quién quisieras expulsar?",
+ "slashReasonDescription": "Razón de expulsión",
+ "usage": "{prefix}kick <@mención | id> [razón]",
+ "userKicked": "Haz sido **`EXPULSADO`** de **{guildName}**",
+ "userNoKickable": "Lo siento, no puedo **`EXPULSAR`** a ese miembro.",
+ "userNoPermission": "Lo siento, pero no tienes el permiso **`EXPULSAR MIEMBROS`** para usar este comando."
+ },
+ "modlogs": {
+ "channel": {
+ "current": "Canal de registro de moderación actual: <#{channel}>",
+ "invalid": "Canal no válido, asegúrate que sea un canal de texto.",
+ "noChannel": "El canal de registro de moderación aún no ha sido establecido.",
+ "success": "El canal de registro de moderación ha sido establecido: <#{channel}>"
+ },
+ "description": "Cambia los ajustes del registro de moderación",
+ "disable": "Registro de moderación está **`DESACTIVADO`**",
+ "embedTitle": "Registro de Moderación",
+ "enable": "Registro de moderación está **`ACTIVADO`**",
+ "newChannelText": "Nuevo canal",
+ "slashChannelDescription": "Ver o cambiar el canal de registro de moderación",
+ "slashChannelNewChannelOption": "Nuevo canal para el registro de moderación",
+ "slashDisableDescription": "Desactiva el registro de moderación",
+ "slashEnableDescription": "Activa el registro de moderación",
+ "usage": "modlogs"
+ },
+ "mute": {
+ "alreadyMuted": "Ese miembro ya ha sido **`SILENCIADO`** previamente.",
+ "botNoPermission": "Lo siento, pero no tengo el permiso **`GESTIONAR ROLES`**",
+ "cantMuteOwner": "No puedes **`SILENCIAR`** al propietario del servidor.",
+ "description": "Silencia a alguien en el servidor",
+ "muteFail": "No se pudo **`SILENCIAR`** al miembro, razón: `{message}`",
+ "muteSuccess": "**{user}** ha sido **`SILENCIADO`** en el servidor.",
+ "mutedByString": "Silenciado por: {author}",
+ "noRole": "El rol para usuario silenciado no ha sido establecido, por favor usa `{prefix}setmute` para establecerlo.",
+ "slashMemberDescription": "¿A quién quisieras silenciar?",
+ "slashReasonDescription": "Razón de silencio",
+ "usage": "{prefix}mute <@mención | id> [razón]",
+ "userMuted": "Haz sido **`SILENCIADO`** en **{guildName}**",
+ "userNoPermission": "Lo siento, pero no tienes el permiso **`GESTIONAR ROLES`** para usar este comando."
+ },
+ "purge": {
+ "botNoPermission": "Lo siento, pero no tengo el permiso **`GESTIONAR SERVIDOR`** para usar este comando.",
+ "description": "Eliminar mensajes",
+ "invalidAmount": "Por favor, especifica un número válido de mensajes a borrar.",
+ "purgeFail": "No se pudo **`BORRAR`** mensajes, razón: `{message}`",
+ "purgeSuccess": "**`{amount}`** mensaje(s) han sido **`BORRADOS`**",
+ "slashAmountDescription": "Cantidad de mensajes a eliminar",
+ "usage": "{prefix}purge ",
+ "userNoPermission": "Lo siento, pero no tienes el permiso **`GESTIONAR SERVIDOR`** para usar este comando."
+ },
+ "setmute": {
+ "description": "Establece el rol de usuario silencio",
+ "invalidRole": "Rol no válido.",
+ "slashRoleDescription": "El rol a ser usado como usuario silenciado",
+ "success": "<@&{role}> ha sido establecido como rol de usuario silenciado.",
+ "usage": "{prefix}setmute "
+ },
+ "unban": {
+ "alreadyUnban": "Este usuario no está **`BANEADO`**",
+ "description": "Desbanea a alguien del servidor",
+ "slashMemberDescription": "¿A quién quisieras desbanear?",
+ "slashReasonDescription": "Razón de desbaneo",
+ "ubanSuccess": "**{user}** ha sido **`DESBANEADO`** del servidor.",
+ "unbanFail": "No se pudo **`DESBANEAR`** al miembro, razón: `{message}`",
+ "unbannedByString": "Desbaneado por: {author}",
+ "usage": "{prefix}unban [razón]"
+ },
+ "unmute": {
+ "description": "Desilenciar a alguien del servidor",
+ "noMuted": "Ese miembro no ha sido **`SILENCIADO`**",
+ "slashMemberDescription": "¿A quién quisieras desilenciar?",
+ "slashReasonDescription": "Razón del desilencio",
+ "unmuteFail": "No se pudo **`DESILENCIAR`** al miembro, razón: `{message}`",
+ "unmuteSuccess": "**{user}** ha sido **`DESILENCIADO`** en el servidor.",
+ "unmutedByString": "Desilenciado por: {author}",
+ "usage": "{prefix}unmute <@mención | id> [razón]",
+ "userUnmuted": "Haz sido **`DESILENCIADO`** en **{guildName}**"
+ },
+ "warn": {
+ "description": "Advierte a un miembro en el servidor",
+ "noDM": "No se pudo enviar advertencia al DM del usuario, pero igual ha sido advertido.",
+ "slashMemberDescription": "¿A quién quisieras advertir?",
+ "slashReasonDescription": "Razón de advertencia",
+ "usage": "{prefix}warn <@mención | id> [razón]",
+ "userNoPermission": "Lo siento, pero no tienes el permiso **`GESTIONAR SERVIDOR`** para usar este comando.",
+ "userWarned": "Haz sido **`ADVERTIDO`** en **{guildName}**",
+ "warnSuccess": "**{user}** ha sido **`ADVERTIDO`** en el servidor.",
+ "warnedByString": "Advertido por: {author}"
+ }
+ },
+ "music": {
+ "categoryName": "MÚSICA",
+ "dj": {
+ "description": "Cambia la configuración del DJ",
+ "disable": "Desactivado",
+ "disableText": "La función DJ ha sido **`DESACTIVADA`**",
+ "embedTitle": "DJ",
+ "enable": "Activado",
+ "enableText": "La función DJ ha sido **`ACTIVADA`**",
+ "newRoleText": "Nuevo rol",
+ "role": {
+ "current": "<@&{role}> es el rol DJ actualmente.",
+ "invalid": "Rol no válido.",
+ "noRole": "No hay rol DJ establecido actualmente, por favor usa `{prefix}dj role` para establecerlo.",
+ "success": "<@&{role}> ha sido establecido como rol DJ."
+ },
+ "slashDisableDescription": "Desactiva la función DJ",
+ "slashEnableDescription": "Activa la función DJ",
+ "slashRoleDescription": "Mira o cambia la configuración del rol DJ",
+ "slashRoleNewRoleOption": "Nuevo rol DJ"
+ },
+ "lyrics": {
+ "apiError": "El API no pudo encontrar la letra de la canción **{song}**, razón: {message}",
+ "description": "Muestra la letra de una canción",
+ "noQuery": "No se está reproduciendo nada o no se ingresaró ninguna canción a buscar.",
+ "slashDescription": "Canción a buscar",
+ "usage": "{prefix}lyrics [canción]"
+ },
+ "nowplaying": {
+ "description": "Muestra la canción que se está reproduciendo",
+ "disableButton": "Este botón ya no está activo y ha sido eliminado.",
+ "emptyQueue": "La cola está vacía."
+ },
+ "pause": {
+ "alreadyPause": "El reproductor de música ya está en pausa.",
+ "description": "Pausa la reproducción de música",
+ "pauseMessage": "Se ha pausado el reproductor de música."
+ },
+ "play": {
+ "alreadyPlaying": "El reproductor de música ya está reproduciendo en el canal de voz **`{voiceChannel}`**.",
+ "description": "Reproduce algo de música",
+ "noSongData": "Este URL no tiene datos de canciones.",
+ "slashQueryDescription": "Canción a reproducir",
+ "usage": "{prefix}play "
+ },
+ "queue": {
+ "description": "Muestra la cola de reproducción"
+ },
+ "remove": {
+ "description": "Quita canciones de la cola",
+ "noPermission": "No tienes permiso para usar este comando.",
+ "noPositions": "Por favor, especifica una posición válida.",
+ "slashPositionsDescription": "Posición de la cancion(es) a quitar, separadas por comas o espacios",
+ "songSkip": "La canción actual ha sido saltada.\n\n",
+ "songsRemoved": "Removida(s) {removed, plural, one {1 canción} other {# canciones}} de la cola",
+ "usage": "{prefix}remove "
+ },
+ "repeat": {
+ "actualMode": "El modo de repetición actual es **`{mode}`**",
+ "description": "Repite la canción actual o la cola completa",
+ "footer": "Para cambiar el modo, revisa '{prefix}help repeat'",
+ "newMode": "El modo de reproducción ha sido establecido a **`{mode}`**",
+ "slashDisable": "Desactiva el modo repetición",
+ "slashQueue": "Establece el mode repetición a **`COLA`**",
+ "slashSong": "Establece el mode repetición a **`UNA`**",
+ "usage": "{prefix}repeat <{options}>"
+ },
+ "resume": {
+ "alreadyResume": "El reproductor de música no está en pausa.",
+ "description": "Reanuda el reproductor de música",
+ "resumeMessage": "El reproductor de música ha sido reanudado."
+ },
+ "search": {
+ "cancelMessage": "Escribe {cancel} o c para cancelar la selección de música.",
+ "canceledMessage": "Selección de canciones cancelada.",
+ "description": "Reproduce alguna canción usando una fuente específica",
+ "interactionContent": "Por favor selecciona una canción",
+ "interactionPlaceholder": "Por favor selecciona una canción",
+ "noQuery": "Por favor ingresa alguna canción para buscar.",
+ "noSelection": "No se ingresó un valor o este fue inválido, búsqueda de canciones cancelada.",
+ "noTracks": "No pude obtener resultados.",
+ "queueEmbed": "Por favor selecciona la canción, puedes seleccionar más de una usando un espacio en blanco o {separator}.\n",
+ "slashDescription": "Busca una canción específica",
+ "slashQueryDescription": "Canción a buscar",
+ "slashSourceDescription": "¿De dónde debería tomar la canción?",
+ "trackSelectionMessage": "Selección de canciones",
+ "usage": "{prefix}search [fuente]"
+ },
+ "shuffle": {
+ "actualState": "El modo aleatorio está **`{state}`**",
+ "description": "Aleatoriza la cola",
+ "newState": "El modo aleatorio se estableció ahora a **`{state}`**"
+ },
+ "skip": {
+ "description": "Salta la canción actual",
+ "skipMessage": "Se ha saltado **{song}**",
+ "voteResultMessage": "{length}/{required} han votado para saltar la canción"
+ },
+ "skipTo": {
+ "cantPlay": "No puedes saltar la canción actual.",
+ "description": "Salta a una posición específica de la cola",
+ "noPermission": "No tienes permiso para usar este comando.",
+ "noSongPosition": "No se pudo encontrar la canción en esta posición.",
+ "skipMessage": "Se ha saltado a **{song}**",
+ "slashFirstDescription": "Regresa a la primera canción de la cola",
+ "slashLastDescription": "Salta a la última canción de la cola",
+ "slashPositionDescription": "Posición de la canción en la cola",
+ "slashSpecificDescription": "Salta a una posición específica en la cola",
+ "usage": "{prefix}skipto <{options} | número>"
+ },
+ "stayInQueue": {
+ "247Disabled": "La característica `Permanecer-Conectado` está desactivada.",
+ "actualState": "`Permanecer-Conectado` está **`{state}`**",
+ "description": "Haz que el bot permanezca en el canal de voz cuando la cola termine",
+ "newState": "`Permanecer-Conectado` se estableció **`{state}`**",
+ "slashDescription": "Alterna el modo de la característica `Permanecer-Conectado`"
+ },
+ "stop": {
+ "description": "Para el reproductor de música",
+ "stoppedMessage": "El reproductor de música se ha detenido."
+ },
+ "volume": {
+ "changeVolume": "Para cambiar el volúmen, ingresa un número usando este comando.",
+ "currentVolume": "El volúmen actual es **`{volume}`**",
+ "description": "Cambia el volúmen del reproductor de música",
+ "newVolume": "Volúmen establecido en **`{volume}`**",
+ "plsPause": "Por favor pausa la música en lugar de establecer el volúmen en **`{volume}`**",
+ "slashDescription": "Nuevo volúmen",
+ "usage": "{prefix}volume [volumen]",
+ "volumeLimit": "No puedo establecer el volúmen por encima de **`{maxVol}`**"
+ }
+ }
+ },
+ "events": {
+ "channelUpdate": {
+ "connectionReconfigured": "La conexión se ha reconfigurado con éxito.",
+ "reconfigureConnection": "Se ha cambiado la región del canal de voz, reconfigurando conexión...",
+ "unableReconfigureConnection": "No se pudo reconfigurar la conexión, la cola ha sido eliminada."
+ },
+ "createInteraction": {
+ "message1": "Lo siento, pero esta interacción es solo para <@{user}> y el staff del servidor.",
+ "message2": "Lo siento, pero esta interacción es solo para <@{user}>"
+ },
+ "createMessage": "Hola {author}, mi prefix es **`{prefix}`**",
+ "voiceStateUpdate": {
+ "connectionReconfigured": "La conexión se ha reconfigurado con éxito.",
+ "deleteQueue": "Ha pasado **`{duration}`** y nadie se ha unido al canal de voz, la cola ha sido eliminada.",
+ "deleteQueueFooter": "Cola eliminada",
+ "disconnectFromVCMessage": "Desconectado del canal de voz, la cola ha sido eliminada.",
+ "joinStageMessage": "Me uní al canal escenario con éxito como orador.",
+ "joiningAsSpeaker": "Movido a un canal de escenario, intentando unirse como Orador...",
+ "pauseQueue": "Todos han dejado el canal de voz. Para ahorrar recursos, se ha pausado la cola.\nSi nadie se une al canal de voz en **`{duration}`**, la cola se eliminará.",
+ "pauseQueueFooter": "Cola pausada",
+ "reconfigureConnection": "He sido movido a un canal de voz en una región diferente, reconfigurando conexión...",
+ "resumeQueue": "Alguien se ha unido al canal de voz.\nReanudando **{song}**",
+ "resumeQueueFooter": "Cola reanudada",
+ "unableJoinStageMessage": "No se pudo unir como orador, la cola ha sido eliminada.",
+ "unableReconfigureConnection": "No se pudo reconfigurar la conexión, la cola ha sido eliminada."
+ }
+ },
+ "reusable": {
+ "invalidUsage": "Uso inválido, por favor usa **`{prefix} {name}`** para más información.",
+ "pageFooter": "Página {actual} de {total}"
+ },
+ "utils": {
+ "cooldownMessage": "{author}, por favor espera **`{timeleft}`** para poder hacer eso.",
+ "generalHandler": {
+ "errorJoining": "Error al unirse al canal de voz, razón: {message}",
+ "errorPlaying": "Ocurrió un error al tratar de reproducir música, razón: ${message}",
+ "handleVideoInitial": "Se han añadido {length} canciones a la cola\n\n",
+ "leftVC": "Dejando el canal de voz porque he estado inactivo mucho tiempo.",
+ "queueEnded": "La cola ha terminado, usa **`{usage}`** para reproducir más música.",
+ "startPlaying": "Se empezó a reproducir **{song}**",
+ "stopPlaying": "Se detuvo la reproducción **{song}**"
+ },
+ "musicDecorator": {
+ "noInVC": "Lo siento, pero debes estar en un canal de voz para hacer eso.",
+ "noQueue": "No se está reproduciendo nada.",
+ "sameVC": "Necesitas estar en el mismo canal de voz que yo.",
+ "validVCJoinable": "Lo siento, pero no tengo el permiso **`CONECTAR`** en tu servidor.",
+ "validVCPermission": "Lo siento, pero no tengo el permiso **`HABLAR`** en tu servidor."
+ }
+ }
+}
diff --git a/lang/id.json b/lang/id.json
index d3ab598ad..cc9cfc44e 100644
--- a/lang/id.json
+++ b/lang/id.json
@@ -1,294 +1,358 @@
{
- "commands": {
- "developers": {
- "categoryName": "PENGEMBANG",
- "eval": {
- "description": "Evaluasi kode",
- "usage": "{prefix}eval ",
- "noCode": "Tidak ada kode yang diberikan.",
- "outputString": "Output",
- "errorString": "Error"
- }
- },
- "general": {
- "categoryName": "UMUM",
- "about": {
- "description": "Menampilkan informasi bot",
- "osUptimeString": "Uptime OS",
- "processUptimeString": "Uptime Process",
- "botUptimeString": "Uptime Bot",
- "nodeVersionString": "Versi Node.js",
- "discordJSVersionString": "Versi Discord.js",
- "ffmpegVersionString": "Versi FFmpeg",
- "botVersionString": "Versi Bot",
- "sourceCodeString": "Kode sumber",
- "aboutFooter": "{botname} - Informasi Bot"
- },
- "help": {
- "description": "Menampilkan daftar perintah atau informasi tentang perintah tertentu",
- "slashDescription": "Nama perintah untuk melihat informasi tentang perintah tertentu",
- "usage": "{prefix}help [nama perintah]",
- "authorString": "{username} - Daftar Perintah",
- "footerString": "{prefix}help untuk mendapatkan informasi tentang perintah tertentu",
- "noCommand": "Tidak dapat menemukan perintah dengan nama tersebut",
- "commandSelectionString": "Silahkan pilih perintah yang kamu tuju",
- "noCommanSuggest": "Tidak dapat menemukan perintah dengan nama tersebut. Mungkin maksudmu ini?",
- "commandDetailTitle": "{username} - Informasi tentang perintah {command}",
- "nameString": "Nama",
- "descriptionString": "Deskripsi",
- "aliasesString": "Alias",
- "usageString": "Penggunaan",
- "commandUsageFooter": "<> = dibutuhkan | [] = opsional {devOnly}"
- },
- "invite": {
- "description": "Dapatkan link invite untuk bot",
- "inviteTitle": "{bot} - Link invite",
- "clickURL": "**[Klik disini]({url})** untung meng-invite bot ini ke server anda."
- },
- "ping": {
- "description": "Menunjukkan ping bot",
- "footerString": "Latensi dari: {user}"
- }
- },
- "moderation": {
- "categoryName": "MODERASI",
- "common": {
- "noUserSpecified": "Mohon mention seseorang.",
- "noReasonString": "[Tidak disebutkan]",
- "reasonString": "**Alasan**"
- },
- "ban": {
- "description": "Ban seseorang dari server",
- "slashMemberIDDescription": "Siapa yang ingin anda ban?",
- "slashReasonDescription": "Alasan ban",
- "usage": "{prefix}ban <@mention | id> [alasan]",
- "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`BAN MEMBERS`** untuk menggunakan perintah ini.",
- "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`BAN MEMBERS`**.",
- "userNoBannable": "Mohon maaf, tetapi saya tidak dapat **`BAN`** kepada member tersebut.",
- "userBanned": "Anda telah di **`BAN`** dari **{guildName}**",
- "bannedByString": "Di ban oleh: {author}",
- "banFail": "Tidak dapat **`BAN`** member, dikarenakan: `{message}`",
- "banSuccess": "**{user}** telah di **`BAN`** dari server ini."
- },
- "kick": {
- "description": "Kick seseorang dari server",
- "slashMemberDescription": "Siapa yang ingin anda kick?",
- "slashReasonDescription": "Alasan kick",
- "usage": "{prefix}kick <@mention | id> [alasan]",
- "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`KICK MEMBERS`** untuk menggunakan perintah ini.",
- "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`KICK MEMBERS`**.",
- "userNoKickable": "Mohon maaf, tetapi saya tidak dapat **`KICK`** kepada member tersebut.",
- "userKicked": "Anda telah di **`KICK`** dari **{guildName}**",
- "kickedByString": "Di kick oleh: {author}",
- "kickFail": "Tidak dapat **`KICK`** member, dikarenakan: `{message}`",
- "kickSuccess": "**{user}** telah di **`KICK`** dari server ini."
- },
- "mute": {
- "description": "Mute seseorang di server",
- "slashMemberDescription": "Siapa yang ingin anda mute?",
- "slashReasonDescription": "Alasan mute",
- "usage": "{prefix}mute <@mention | id> [alasan]",
- "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE ROLES`** untuk menggunakan perintah ini.",
- "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`MANAGE ROLES`**.",
- "cantMuteOwner": "Anda tidak bisa mute owner server!",
- "unableToCreateMuteRole": "Tidak dapat membuat mute role",
- "alreadyMuted": "Member tersebut sedang di **`MUTE`**",
- "userMuted": "Anda telah di **`MUTE`** di **{guildName}**",
- "mutedByString": "Di mute oleh: {author}",
- "muteFail": "Tidak dapat **`MUTE`** member, dikarenakan: `{message}`",
- "muteSuccess": "**{user}** telah di **`MUTE`** di server ini."
- },
- "purge": {
- "description": "Hapus pesan",
- "slashAmountDescription": "Jumlah pesan yang ingin dihapus",
- "usage": "{prefix}purge ",
- "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE MESSAGES`** untuk menggunakan perintah ini.",
- "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`MANAGE MESSAGES`**.",
- "invalidAmount": "Mohon berikan jumlah yang benar.",
- "purgeFail": "Tidak dapat **`PURGE`** pesan, dikarenakan: `{message}`",
- "purgeSuccess": "**{amount}** pesan telah di **`PURGED`**"
- },
- "unban": {
- "description": "Unban seseorang dari server",
- "slashMemberDescription": "Siapa yang ingin anda un-ban?",
- "slashReasonDescription": "Alasan un-ban",
- "usage": "{prefix}unban [alasan]",
- "alreadyUnban": "Orang itu sedang tidak di **`BAN`**",
- "unbanFail": "Tidak dapat **`UN-BAN`** member, dikarenakan: `{message}`",
- "ubanSuccess": "**{user}** telah di **`UN-BAN`** dari server ini."
- },
- "unmute": {
- "description": "Unmute seseorang di server",
- "slashMemberDescription": "Siapa yang ingin anda un-mute?",
- "slashReasonDescription": "Alasan un-mute",
- "usage": "{prefix}unmute <@mention | id> [alasan]",
- "noMuted": "Member tersebut sedang tidak di **`MUTE`**",
- "userUnmuted": "Anda telah di **`UN-MUTE`** di **{guildName}**",
- "unmutedByString": "Di unmute oleh: {author}",
- "unmuteFail": "Tidak dapat **`UN-MUTE`** member, dikarenakan: `{message}`",
- "unmuteSuccess": "**{user}** telah di **`UN-MUTE`** di server ini."
- },
- "warn": {
- "description": "Warn seseorang di server",
- "slashMemberDescription": "Siapa yang ingin anda warn?",
- "slashReasonDescription": "Alasan warn",
- "usage": "{prefix}warn <@mention | id> [alasan]",
- "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE SERVER`** untuk menggunakan perintah ini.",
- "noDM": "Tidak dapat membuka DM dengan pengguna tersebut, tetapi akan tetap saya warn.",
- "userWarned": "Kamu telah di **`WARN`** di **{guildName}**",
- "warnedByString": "Di warn oleh: {author}",
- "warnSuccess": "**{user}** telah di **`WARN`** di server ini."
- }
- },
- "music": {
- "categoryName": "MUSIK",
- "lyrics": {
- "description": "Menampilkan lirik lagu",
- "slashDescription": "Judul lagu untuk dicari",
- "usage": "{prefix}lyrics [song]",
- "noQuery": "Tidak ada yang sedang dimainkan atau tidak ada argumen yang diberikan.",
- "apiError": "Tidak dapat menemukan lagu **{song}**, dikarenakan: `{message}`"
- },
- "nowplaying": {
- "description": "Menunjukkan status media player",
- "emptyQueue": "Antrian telah kosong",
- "disableButton": "Setelah 30 detik, tombol-tombol tidak akan aktif kembali."
- },
- "pause": {
- "description": "Menjeda media player",
- "alreadyPause": "Media player sedang dijeda.",
- "pauseMessage": "Media player telah dijeda."
- },
- "play": {
- "description": "Memainkan beberapa lagu",
- "slashQueryDescription": "Kata pencarian",
- "usage": "{prefix}play ",
- "alreadyPlaying": "Media player sedang memainkan lagu di channel **`{voiceChannel}`**.",
- "noSongData": "Link tersebut tidak memiliki data lagu."
- },
- "queue": {
- "description": "Menunjukkan daftar antrian"
- },
- "repeat": {
- "description": "Mengulang lagu yang sedang dimainkan atau setelahnya",
- "slashQueue": "Mengatur mode pengulangan ke **`QUEUE`**",
- "slashSong": "Mengatur mode pengulangan ke **`SONG`**",
- "slashDisable": "Mematikan mode pengulangan",
- "actualMode": "Mode pengulangan: **`{mode}`**",
- "newMode": "Mode pengulangan telah diatur ke **`{mode}`**"
- },
- "resume": {
- "description": "Melanjutkan media player",
- "alreadyResume": "Media player sedang tidak dijeda.",
- "resumeMessage": "Media player telah dilanjutkan."
- },
- "search": {
- "description": "Memainkan beberapa lagu dengan kata pencarian yang diberikan",
- "slashDescription": "Mencari lagu yang diberikan",
- "slashQueryDescription": "Kata pencarian",
- "slashSourceDescription": "Dari mana lagu harus di ambil?",
- "usage": "{prefix}search [sumber]",
- "noQuery": "Mohon berikan kata pencarian untuk dicari.",
- "noTracks": "Saya tidak dapat menemukan hasil pencarian.",
- "queueEmbed": "Silahkan pilih beberapa lagu, kamu bisa memilih lebih dari satu menggunakan spasi atau {separator}.\n",
- "trackSelectionMessage": "Pemilihan lagu",
- "cancelMessage": "Ketik {cancel} atau c untuk membatalkan pemilihan lagu.",
- "noSelection": "Angka yang diberikan tidak valid, pemilihan lagu dibatalkan.",
- "canceledMessage": "Pemilihan lagu dibatalkan.",
- "interactionContent": "Silahkan pilih beberapa lagu",
- "interactionPlaceholder": "Silahkan pilih beberapa lagu"
- },
- "shuffle": {
- "description": "Acak antrian",
- "actualState": "Mode acak: **`{state}`**",
- "newState": "Mode acak telah diatur ke **`{state}`**"
- },
- "skip": {
- "description": "Lewatkan lagu",
- "voteMessage": "{actual}/{required} telah vote untuk melewatkan lagu yang sedang dimainkan",
- "voteResultMessage": "{length}/{required} telah vote untuk melewatkan lagu yang sedang dimainkan",
- "skipMessage": "**{song}** dilewatkan"
- },
- "skipTo": {
- "description": "Lompat ke posisi tertentu pada antrian",
- "slashFirstDescription": "Mundur ke lagu pertama pada antrian",
- "slashLastDescription": "Lompat ke lagu terakhir pada antrian",
- "slashSpecificDescription": "Lompat ke posisi tertentu pada antrian",
- "slashPositionDescription": "Posisi lagu pada antrian",
- "usage": "{prefix}skipto <{options} | angka>",
- "noPermission": "Kamu tidak dapat menggunakan perintah ini.",
- "noSongPosition": "Tidak dapat mencari lagu pada posisi tersebut.",
- "cantPlay": "Tidak dapat melompat ke lagu yang sedang dimainkan.",
- "skipMessage": "Melompat ke lagu **{song}**"
- },
- "stayInQueue": {
- "description": "Membuat bot menetap di voice channel saat antrian lagu sudah berakhir",
- "slashDescription": "Mengganti mode fitur Stay-in-voice",
- "247Disabled": "Perintah Stay-in-voice dimatikan.",
- "actualState": "Stay-in-voice: **{state}**",
- "newState": "Stay-in-voice telah diatur ke **{state}**"
- },
- "stop": {
- "description": "Menghentikan media player",
- "stoppedMessage": "Media player telah dihentikan."
- },
- "volume": {
- "description": "Mengganti volume media player",
- "slashDescription": "Volume baru",
- "usage": "{prefix}volume [volume baru]",
- "currentVolume": "Volume saat ini adalah **`{volume}`**",
- "changeVolume": "Untuk mengganti volume, berikan angka volume baru saat menggunakan perintah ini.",
- "plsPause": "Mohon menjeda media player nya saja daripada mengatur volume ke **`{volume}`**",
- "volumeLimit": "Saya tidak dapat mengatur volume di atas **`{maxVol}`**",
- "newVolume": "Volume diatur ke **`{volume}`**"
- }
- }
- },
- "utils": {
- "musicDecorator": {
- "noQueue": "Antrian media player sedang kosong.",
- "noInVC": "Mohon maaf, tetapi anda harus berada di sebuah voice channel untuk melakukannya.",
- "validVCJoinable": "Mohon maaf, tetapi saya tidak dapat **`CONNECT`** ke voice channel anda, pastikan saya memiliki izin yang tepat.",
- "validVCPermission": "Mohon maaf, tetapi saya tidak dapat **`SPEAK`** di voice channel, pastikan saya memiliki izin yang tepat.",
- "sameVC": "Anda harus berada di voice channel yang sama dengan saya."
- },
- "generalHandler": {
- "handleVideoInitial": "{length} lagu telah ditambahkan ke antrian\n\n",
- "errorJoining": "Error saat memasuki voice channel, dikarenakan: `{message}`",
- "queueEnded": "Antrian sudah berakhir, gunakan **{usage}** untuk memainkan lagu lagi.",
- "leftVC": "Keluar dari voice channel karena tidak ada lagi aktivitas.",
- "startPlaying": "Mulai memainkan **{song}**",
- "stopPlaying": "Selesai memainkan **{song}**",
- "errorPlaying": "Sebuah error terjadi saat mencoba memainkan lagu, dikarenakan: `{message}`"
- },
- "cooldownMessage": "{author}, mohon tunggu selama **`{timeleft}`** detik."
- },
- "events": {
- "channelUpdate": {
- "reconfigureConnection": "Region voice channel telah diganti. Melakukan konfigurasi koneksi...",
- "connectionReconfigured": "Koneksi berhasil ter-konfigurasi.",
- "unableReconfigureConnection": "Tidak dapat melakukan konfigurasi koneksi, antrian telah dihapus."
- },
- "createInteraction": {
- "message1": "Mohon maaf, tetapi interaction tersebut hanya untuk <@{user}> dan staff server.",
- "message2": "Mohon maaf, tetapi interaction tersebut hanya untuk <@{user}>"
- },
- "createMessage": "Hai {author}, prefix-ku adalah **`{prefix}`**",
- "voiceStateUpdate": {
- "disconnectFromVCMessage": "Terputus dari voice channel, antrian telah dihapus.",
- "joiningAsSpeaker": "Dipindahkan ke stage channel, mencoba bergabung sebagai Speaker...",
- "unableJoinStageMessage": "Tidak dapat bergabung sebagai Speaker, antrian telah dihapus.",
- "joinStageMessage": "Berhasil bergabung ke stage channel sebagai Speaker.",
- "deleteQueue": "**`{duration}`** telah berlalu dan belum ada yang memasuki voice channel, antrian telah dihapus.",
- "deleteQueueFooter": "Antrian dihapus",
- "pauseQueue": "Semua orang telah keluar dari voice channel. Untuk menyimpan penggunaan, antrian telah dijeda.\nJika masih tidak ada yang memasuki voice channel dalam **`{duration}`**, antrian akan dihapus.",
- "pauseQueueFooter": "Antrian dijeda",
- "resumeQueue": "Seseorang telah memasuki voice channel.\nMelanjutkan **{song}**",
- "resumeQueueFooter": "Antrian dilanjutkan"
- }
- },
- "reusable": {
- "pageFooter": "Halaman {actual} dari {total}",
- "invalidUsage": "Penggunaan tidak valid, gunakan **`{prefix} {name}`** untuk informasi lebih lanjut."
- }
+ "commands": {
+ "developers": {
+ "categoryName": "PENGEMBANG",
+ "eval": {
+ "description": "Evaluasi kode",
+ "errorString": "Error",
+ "noCode": "Tidak ada kode yang diberikan.",
+ "outputString": "Output",
+ "usage": "{prefix}eval "
+ }
+ },
+ "general": {
+ "about": {
+ "aboutFooter": "{botname} - Informasi Bot",
+ "botUptimeString": "Uptime Bot",
+ "botVersionString": "Versi Bot",
+ "description": "Menampilkan informasi bot",
+ "discordJSVersionString": "Versi Discord.js",
+ "ffmpegVersionString": "Versi FFmpeg",
+ "nodeVersionString": "Versi Node.js",
+ "osUptimeString": "Uptime OS",
+ "processUptimeString": "Uptime Process",
+ "sourceCodeString": "Kode sumber"
+ },
+ "categoryName": "UMUM",
+ "help": {
+ "aliasesString": "Alias",
+ "authorString": "{username} - Daftar Perintah",
+ "commandDetailTitle": "{username} - Informasi tentang perintah {command}",
+ "commandSelectionString": "Silahkan pilih perintah yang kamu tuju",
+ "commandUsageFooter": "<> = dibutuhkan | [] = opsional {devOnly}",
+ "description": "Menampilkan daftar perintah atau informasi tentang perintah tertentu",
+ "descriptionString": "Deskripsi",
+ "footerString": "{prefix}help untuk mendapatkan informasi tentang perintah tertentu",
+ "nameString": "Nama",
+ "noCommanSuggest": "Tidak dapat menemukan perintah dengan nama tersebut. Mungkin maksudmu ini?",
+ "noCommand": "Tidak dapat menemukan perintah dengan nama tersebut.",
+ "slashDescription": "Nama perintah untuk melihat informasi tentang perintah tertentu",
+ "usage": "{prefix}help [nama perintah]",
+ "usageString": "Penggunaan"
+ },
+ "invite": {
+ "clickURL": "**[Klik disini]({url})** untung meng-invite bot ini ke server anda.",
+ "description": "Dapatkan link invite untuk bot",
+ "inviteTitle": "{bot} - Link invite"
+ },
+ "ping": {
+ "description": "Menunjukkan ping bot",
+ "footerString": "Latensi dari: {user}"
+ }
+ },
+ "moderation": {
+ "ban": {
+ "banFail": "Tidak dapat **`BAN`** member, dikarenakan: `{message}`",
+ "banSuccess": "**{user}** telah di **`BAN`** dari server ini.",
+ "bannedByString": "Di ban oleh: {author}",
+ "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`BAN MEMBERS`**.",
+ "description": "Ban seseorang dari server",
+ "slashMemberIDDescription": "Siapa yang ingin anda ban?",
+ "slashReasonDescription": "Alasan ban",
+ "usage": "{prefix}ban <@mention | id> [alasan]",
+ "userBanned": "Anda telah di **`BAN`** dari **{guildName}**",
+ "userNoBannable": "Mohon maaf, tetapi saya tidak dapat **`BAN`** kepada member tersebut.",
+ "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`BAN MEMBERS`** untuk menggunakan perintah ini."
+ },
+ "categoryName": "MODERASI",
+ "common": {
+ "noReasonString": "[Tidak disebutkan]",
+ "noUserSpecified": "Mohon mention seseorang.",
+ "reasonString": "**Alasan**"
+ },
+ "infractions": {
+ "description": "Menampilkan pelanggaran seorang member",
+ "embedAuthorText": "{user} - Pelanggaran",
+ "noInfractions": "Tidak ada pelanggaran.",
+ "slashMemberDescription": "Siapa yang ingin anda lihat?",
+ "usage": "{prefix}infractions <@mention | id>"
+ },
+ "kick": {
+ "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`KICK MEMBERS`**.",
+ "description": "Kick seseorang dari server",
+ "kickFail": "Tidak dapat **`KICK`** member, dikarenakan: `{message}`",
+ "kickSuccess": "**{user}** telah di **`KICK`** dari server ini.",
+ "kickedByString": "Di kick oleh: {author}",
+ "slashMemberDescription": "Siapa yang ingin anda kick?",
+ "slashReasonDescription": "Alasan kick",
+ "usage": "{prefix}kick <@mention | id> [alasan]",
+ "userKicked": "Anda telah di **`KICK`** dari **{guildName}**",
+ "userNoKickable": "Mohon maaf, tetapi saya tidak dapat **`KICK`** kepada member tersebut.",
+ "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`KICK MEMBERS`** untuk menggunakan perintah ini."
+ },
+ "modlogs": {
+ "channel": {
+ "current": "Channel moderation logs saat ini: <#{channel}>",
+ "invalid": "Channel tidak valid, channel harus berupa text channel.",
+ "noChannel": "Channel moderation logs belum ditentukan.",
+ "success": "Channel moderation logs telah diubah menjadi <#{channel}>."
+ },
+ "description": "Mengubah setelah fitur moderation logs",
+ "disable": "Fitur moderation logs telah di **`MATIKAN`**.",
+ "embedTitle": "Moderation Logs",
+ "enable": "Fitur moderation logs telah di **`NYALAKAN`**.",
+ "newChannelText": "channel baru",
+ "slashChannelDescription": "Lihat atau ubah channel moderation logs",
+ "slashChannelNewChannelOption": "Channel baru untuk moderation logs",
+ "slashDisableDescription": "Mematikan fitur moderation logs",
+ "slashEnableDescription": "Menyalakan fitur moderation logs",
+ "usage": "modlogs"
+ },
+ "mute": {
+ "alreadyMuted": "Member tersebut sedang di **`MUTE`**",
+ "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`MANAGE ROLES`**.",
+ "cantMuteOwner": "Anda tidak bisa **`MUTE`** owner server.",
+ "description": "Mute seseorang di server",
+ "muteFail": "Tidak dapat **`MUTE`** member, dikarenakan: `{message}`",
+ "muteSuccess": "**{user}** telah di **`MUTE`** di server ini.",
+ "mutedByString": "Di mute oleh: {author}",
+ "noRole": "Role untuk mute belum diatur, silahkan atur dengan perintah `{prefix}muterole`",
+ "slashMemberDescription": "Siapa yang ingin anda mute?",
+ "slashReasonDescription": "Alasan mute",
+ "usage": "{prefix}mute <@mention | id> [alasan]",
+ "userMuted": "Anda telah di **`MUTE`** di **{guildName}**",
+ "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE ROLES`** untuk menggunakan perintah ini."
+ },
+ "purge": {
+ "botNoPermission": "Mohon maaf, tetapi saya tidak memiliki izin **`MANAGE MESSAGES`**.",
+ "description": "Hapus pesan",
+ "invalidAmount": "Mohon berikan jumlah yang benar.",
+ "purgeFail": "Tidak dapat **`PURGE`** pesan, dikarenakan: `{message}`",
+ "purgeSuccess": "**`{amount}`** pesan telah di **`PURGE`**",
+ "slashAmountDescription": "Jumlah pesan yang ingin dihapus",
+ "usage": "{prefix}purge ",
+ "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE MESSAGES`** untuk menggunakan perintah ini."
+ },
+ "setmute": {
+ "description": "Mengatur role mute",
+ "invalidRole": "Role tidak valid.",
+ "slashRoleDescription": "Role yang akan digunakan untuk mute",
+ "success": "Role mute telah diubah menjadi <@&{role}>",
+ "usage": "{prefix}setmute "
+ },
+ "unban": {
+ "alreadyUnban": "Orang itu sedang tidak di **`BAN`**",
+ "description": "Unban seseorang dari server",
+ "slashMemberDescription": "Siapa yang ingin anda un-ban?",
+ "slashReasonDescription": "Alasan un-ban",
+ "ubanSuccess": "**{user}** telah di **`UN-BAN`** dari server ini.",
+ "unbanFail": "Tidak dapat **`UN-BAN`** member, dikarenakan: `{message}`",
+ "usage": "{prefix}unban [alasan]"
+ },
+ "unmute": {
+ "description": "Unmute seseorang di server",
+ "noMuted": "Member tersebut sedang tidak di **`MUTE`**",
+ "slashMemberDescription": "Siapa yang ingin anda un-mute?",
+ "slashReasonDescription": "Alasan un-mute",
+ "unmuteFail": "Tidak dapat **`UN-MUTE`** member, dikarenakan: `{message}`",
+ "unmuteSuccess": "**{user}** telah di **`UN-MUTE`** di server ini.",
+ "unmutedByString": "Di unmute oleh: {author}",
+ "usage": "{prefix}unmute <@mention | id> [alasan]",
+ "userUnmuted": "Anda telah di **`UN-MUTE`** di **{guildName}**"
+ },
+ "warn": {
+ "description": "Warn seseorang di server",
+ "noDM": "Tidak dapat membuka DM dengan pengguna tersebut, tetapi akan tetap saya warn.",
+ "slashMemberDescription": "Siapa yang ingin anda warn?",
+ "slashReasonDescription": "Alasan warn",
+ "usage": "{prefix}warn <@mention | id> [alasan]",
+ "userNoPermission": "Mohon maaf, tetapi anda tidak memiliki izin **`MANAGE SERVER`** untuk menggunakan perintah ini.",
+ "userWarned": "Kamu telah di **`WARN`** di **{guildName}**",
+ "warnSuccess": "**{user}** telah di **`WARN`** di server ini.",
+ "warnedByString": "Di warn oleh: {author}"
+ }
+ },
+ "music": {
+ "categoryName": "MUSIK",
+ "dj": {
+ "description": "Mengubah pengaturan fitur DJ",
+ "disable": "Disabled",
+ "disableText": "Fitur DJ telah di **`MATIKAN`**",
+ "embedTitle": "Fitur DJ",
+ "enable": "Enabled",
+ "enableText": "Fitur DJ telah di **`NYALAKAN`**",
+ "newRoleText": "role baru",
+ "role": {
+ "current": "Role DJ saat ini: <@&{role}>",
+ "invalid": "Role tidak valid.",
+ "noRole": "Role DJ belum ditentukan, silahkan atur dengan perintah `{prefix}dj role`",
+ "success": "Role DJ telah diubah menjadi <@&{role}>"
+ },
+ "slashDisableDescription": "Mematikan fitur DJ",
+ "slashEnableDescription": "Menyalakan fitur DJ",
+ "slashRoleDescription": "Lihat atau ubah role DJ",
+ "slashRoleNewRoleOption": "Role baru untuk DJ"
+ },
+ "lyrics": {
+ "apiError": "Tidak dapat menemukan lagu **{song}**, dikarenakan: `{message}`",
+ "description": "Menampilkan lirik lagu",
+ "noQuery": "Tidak ada yang sedang dimainkan atau tidak ada argumen yang diberikan.",
+ "slashDescription": "Judul lagu untuk dicari",
+ "usage": "{prefix}lyrics [song]"
+ },
+ "nowplaying": {
+ "description": "Menunjukkan status media player",
+ "disableButton": "Tombol-tombol ini sudah tidak lagi aktif dan terhapus.",
+ "emptyQueue": "Antrian sedang kosong."
+ },
+ "pause": {
+ "alreadyPause": "Media player sedang dijeda.",
+ "description": "Menjeda media player",
+ "pauseMessage": "Media player telah dijeda."
+ },
+ "play": {
+ "alreadyPlaying": "Media player sedang memainkan lagu di channel **`{voiceChannel}`**.",
+ "description": "Memainkan beberapa lagu",
+ "noSongData": "Link tersebut tidak memiliki data lagu.",
+ "slashQueryDescription": "Kata pencarian",
+ "usage": "{prefix}play "
+ },
+ "queue": {
+ "description": "Menunjukkan daftar antrian"
+ },
+ "remove": {
+ "description": "Hapus lagu dari antrian",
+ "noPermission": "Anda tidak memiliki izin untuk menggunakan command ini.",
+ "noPositions": "Mohon berikan posisi lagu yang ingin dihapus.",
+ "slashPositionsDescription": "Posisi lagu yang ingin dihapus (dipisahkan dengan koma atau spasi)",
+ "songSkip": "Lagu yang sedang dimainkan ikut terhapus, melewatkan lagu.",
+ "songsRemoved": "{removed} lagu dihapus dari antrian\n\n",
+ "usage": "{prefix}remove "
+ },
+ "repeat": {
+ "actualMode": "Mode pengulangan: **`{mode}`**",
+ "description": "Mengulang lagu yang sedang dimainkan atau setelahnya",
+ "footer": "Untuk mengubah mode, lihat {prefix}help repeat",
+ "newMode": "Mode pengulangan telah diatur ke **`{mode}`**",
+ "slashDisable": "Mematikan mode pengulangan",
+ "slashQueue": "Mengatur mode pengulangan ke **`QUEUE`**",
+ "slashSong": "Mengatur mode pengulangan ke **`SONG`**",
+ "usage": "{prefix}repeat <{opsi}>"
+ },
+ "resume": {
+ "alreadyResume": "Media player sedang tidak dijeda.",
+ "description": "Melanjutkan media player",
+ "resumeMessage": "Media player telah dilanjutkan."
+ },
+ "search": {
+ "cancelMessage": "Ketik {cancel} atau c untuk membatalkan pemilihan lagu.",
+ "canceledMessage": "Pemilihan lagu dibatalkan.",
+ "description": "Memainkan beberapa lagu dengan kata pencarian yang diberikan",
+ "interactionContent": "Silahkan pilih beberapa lagu",
+ "interactionPlaceholder": "Silahkan pilih beberapa lagu",
+ "noQuery": "Mohon berikan kata pencarian untuk dicari.",
+ "noSelection": "Angka yang diberikan tidak valid, pemilihan lagu dibatalkan.",
+ "noTracks": "Saya tidak dapat menemukan hasil pencarian.",
+ "queueEmbed": "Silahkan pilih beberapa lagu, kamu bisa memilih lebih dari satu menggunakan spasi atau {separator}.\n",
+ "slashDescription": "Mencari lagu yang diberikan",
+ "slashQueryDescription": "Kata pencarian",
+ "slashSourceDescription": "Dari mana lagu harus di ambil?",
+ "trackSelectionMessage": "Pemilihan lagu",
+ "usage": "{prefix}search [sumber]"
+ },
+ "shuffle": {
+ "actualState": "Mode acak saat ini adalah **`{state}`**",
+ "description": "Acak antrian",
+ "newState": "Mode acak telah diatur ke **`{state}`**"
+ },
+ "skip": {
+ "description": "Lewatkan lagu",
+ "skipMessage": "**{song}** dilewatkan",
+ "voteResultMessage": "{length}/{required} telah vote untuk melewatkan lagu yang sedang dimainkan"
+ },
+ "skipTo": {
+ "cantPlay": "Tidak dapat melompat ke lagu yang sedang dimainkan.",
+ "description": "Lompat ke posisi tertentu pada antrian",
+ "noPermission": "Kamu tidak dapat menggunakan perintah ini.",
+ "noSongPosition": "Tidak dapat mencari lagu pada posisi tersebut.",
+ "skipMessage": "Melompat ke lagu **{song}**",
+ "slashFirstDescription": "Mundur ke lagu pertama pada antrian",
+ "slashLastDescription": "Lompat ke lagu terakhir pada antrian",
+ "slashPositionDescription": "Posisi lagu pada antrian",
+ "slashSpecificDescription": "Lompat ke posisi tertentu pada antrian",
+ "usage": "{prefix}skipto <{options} | angka>"
+ },
+ "stayInQueue": {
+ "247Disabled": "Perintah Stay-in-voice dimatikan.",
+ "actualState": "Stay-in-voice: **{state}**",
+ "description": "Membuat bot menetap di voice channel saat antrian lagu sudah berakhir",
+ "newState": "Stay-in-voice telah diatur ke **{state}**",
+ "slashDescription": "Mengganti mode fitur Stay-in-voice"
+ },
+ "stop": {
+ "description": "Menghentikan media player",
+ "stoppedMessage": "Media player telah dihentikan."
+ },
+ "volume": {
+ "changeVolume": "Untuk mengganti volume, berikan angka volume baru saat menggunakan perintah ini.",
+ "currentVolume": "Volume saat ini adalah **`{volume}`**",
+ "description": "Mengganti volume media player",
+ "newVolume": "Volume diatur ke **`{volume}`**",
+ "plsPause": "Mohon menjeda media player nya saja daripada mengatur volume ke **`{volume}`**",
+ "slashDescription": "Volume baru",
+ "usage": "{prefix}volume [volume baru]",
+ "volumeLimit": "Saya tidak dapat mengatur volume di atas **`{maxVol}`**"
+ }
+ }
+ },
+ "events": {
+ "channelUpdate": {
+ "connectionReconfigured": "Koneksi berhasil ter-konfigurasi.",
+ "reconfigureConnection": "Region voice channel telah diganti, melakukan konfigurasi koneksi...",
+ "unableReconfigureConnection": "Tidak dapat melakukan konfigurasi koneksi, antrian telah dihapus."
+ },
+ "createInteraction": {
+ "message1": "Mohon maaf, tetapi interaction tersebut hanya untuk <@{user}> dan staff server.",
+ "message2": "Mohon maaf, tetapi interaction tersebut hanya untuk <@{user}>"
+ },
+ "createMessage": "Hai {author}, prefix-ku adalah **`{prefix}`**",
+ "voiceStateUpdate": {
+ "connectionReconfigured": "Koneksi berhasil ter-konfigurasi.",
+ "deleteQueue": "**`{duration}`** telah berlalu dan belum ada yang memasuki voice channel, antrian telah dihapus.",
+ "deleteQueueFooter": "Antrian dihapus",
+ "disconnectFromVCMessage": "Terputus dari voice channel, antrian telah dihapus.",
+ "joinStageMessage": "Berhasil bergabung ke stage channel sebagai Speaker.",
+ "joiningAsSpeaker": "Dipindahkan ke stage channel, mencoba bergabung sebagai Speaker...",
+ "pauseQueue": "Semua orang telah keluar dari voice channel. Untuk menyimpan penggunaan, antrian telah dijeda.\nJika masih tidak ada yang memasuki voice channel dalam **`{duration}`**, antrian akan dihapus.",
+ "pauseQueueFooter": "Antrian dijeda",
+ "reconfigureConnection": "Dipindahkan ke voice channel dengan region yang berbeda, melakukan konfigurasi koneksi...",
+ "resumeQueue": "Seseorang telah memasuki voice channel.\nMelanjutkan **{song}**",
+ "resumeQueueFooter": "Antrian dilanjutkan",
+ "unableJoinStageMessage": "Tidak dapat bergabung sebagai Speaker, antrian telah dihapus.",
+ "unableReconfigureConnection": "Tidak dapat melakukan konfigurasi koneksi, antrian telah dihapus."
+ }
+ },
+ "reusable": {
+ "invalidUsage": "Penggunaan tidak valid, gunakan **`{prefix} {name}`** untuk informasi lebih lanjut.",
+ "pageFooter": "Halaman {actual} dari {total}"
+ },
+ "utils": {
+ "cooldownMessage": "{author}, mohon tunggu selama **`{timeleft}`** detik.",
+ "generalHandler": {
+ "errorJoining": "Error saat memasuki voice channel, dikarenakan: `{message}`",
+ "errorPlaying": "Sebuah error terjadi saat mencoba memainkan lagu, dikarenakan: `{message}`",
+ "handleVideoInitial": "{length} lagu telah ditambahkan ke antrian\n\n",
+ "leftVC": "Keluar dari voice channel karena tidak ada lagi aktivitas.",
+ "queueEnded": "Antrian sudah berakhir, gunakan **{usage}** untuk memainkan lagu lagi.",
+ "startPlaying": "Mulai memainkan **{song}**",
+ "stopPlaying": "Selesai memainkan **{song}**"
+ },
+ "musicDecorator": {
+ "noInVC": "Mohon maaf, tetapi anda harus berada di sebuah voice channel untuk melakukannya.",
+ "noQueue": "Antrian media player sedang kosong.",
+ "sameVC": "Anda harus berada di voice channel yang sama dengan saya.",
+ "validVCJoinable": "Mohon maaf, tetapi saya tidak dapat **`CONNECT`** ke voice channel anda, pastikan saya memiliki izin yang tepat.",
+ "validVCPermission": "Mohon maaf, tetapi saya tidak dapat **`SPEAK`** di voice channel, pastikan saya memiliki izin yang tepat."
+ }
+ }
}
diff --git a/logs/.gitkeep b/logs/.gitkeep
deleted file mode 100644
index e69de29bb..000000000
diff --git a/package-lock.json b/package-lock.json
index b4ebbeaef..315dce4a8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,4330 +1,4479 @@
{
- "name": "rawon",
- "version": "2.4.0",
- "lockfileVersion": 2,
- "requires": true,
- "packages": {
- "": {
- "name": "rawon",
- "version": "2.4.0",
- "license": "BSD-3-Clause",
- "dependencies": {
- "@discordjs/voice": "^0.8.0",
- "date-fns": "^2.28.0",
- "discord.js": "^13.6.0",
- "dotenv": "^16.0.0",
- "got": "^11.8.3",
- "i18n": "0.14.1",
- "opusscript": "^0.0.8",
- "prism-media": "^1.3.2",
- "soundcloud.ts": "^0.4.1",
- "sucrase": "^3.20.3",
- "tslib": "^2.3.1",
- "tweetnacl": "^1.0.3",
- "youtubei": "^0.0.1-rc.28"
- },
- "devDependencies": {
- "@types/i18n": "^0.13.2",
- "@types/node": "^17.0.15",
- "@typescript-eslint/eslint-plugin": "^5.10.2",
- "@typescript-eslint/parser": "^5.10.2",
- "@zhycorp/eslint-config": "^7.1.0",
- "eslint": "^8.8.0",
- "typescript": "^4.5.5"
- },
- "engines": {
- "node": ">=16.6.0"
- },
- "optionalDependencies": {
- "play-dl": "^1.8.1",
- "youtube-dl-exec": "^2.0.2"
- }
- },
- "node_modules/@discordjs/builders": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz",
- "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==",
- "dependencies": {
- "@sindresorhus/is": "^4.2.0",
- "discord-api-types": "^0.26.0",
- "ts-mixer": "^6.0.0",
- "tslib": "^2.3.1",
- "zod": "^3.11.6"
- },
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@discordjs/collection": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz",
- "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw==",
- "engines": {
- "node": ">=16.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@discordjs/voice": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.8.0.tgz",
- "integrity": "sha512-o0JfVLMs3eLjUzPf6oxMydEeum40I7xzfUc66SLN+RrKpSAsTbngf5qnCF53nm+KDNSvrwg1AZqNm4LEAdxJIA==",
- "dependencies": {
- "@types/ws": "^8.2.0",
- "discord-api-types": "^0.26.1",
- "prism-media": "^1.3.2",
- "tiny-typed-emitter": "^2.1.0",
- "tslib": "^2.3.1",
- "ws": "^8.4.2"
- },
- "engines": {
- "node": ">=16.9.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
- "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.2.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
- "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
- "dev": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "node_modules/@messageformat/core": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.0.0.tgz",
- "integrity": "sha512-mzMCyADGweNmnMwV/xjKxtXtkXJNVcK5ATOHx4Q0GVr2Z3++in1VfrB/y6jM43nleK27tFO0Y/9pds5vxWqDvQ==",
- "dependencies": {
- "@messageformat/date-skeleton": "^1.0.0",
- "@messageformat/number-skeleton": "^1.0.0",
- "@messageformat/parser": "^5.0.0",
- "@messageformat/runtime": "^3.0.0",
- "make-plural": "^6.2.1",
- "safe-identifier": "^0.4.1"
- }
- },
- "node_modules/@messageformat/core/node_modules/make-plural": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz",
- "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA=="
- },
- "node_modules/@messageformat/date-skeleton": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.0.tgz",
- "integrity": "sha512-vvj5Sd3VyXUHGbYpiFsPsSQ8pkdUM9vrR/NUbyP6ga3UqJH4p9eCwzfwaCAZatZMYMTyiKG/8QbUyGKHeTZ5kw=="
- },
- "node_modules/@messageformat/number-skeleton": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.0.0.tgz",
- "integrity": "sha512-Pe1HX/VG0q7tclM/ri85I4FKYd7Uc3gluSZbRaK1+jcXdT9Biw2hLAKyMsiz2tM6zLiK1xX+K0NMDO4RIstQig=="
- },
- "node_modules/@messageformat/parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.0.0.tgz",
- "integrity": "sha512-WiDKhi8F0zQaFU8cXgqq69eYFarCnTVxKcvhAONufKf0oUxbqLMW6JX6rV4Hqh+BEQWGyKKKHY4g1XA6bCLylA==",
- "dependencies": {
- "moo": "^0.5.1"
- }
- },
- "node_modules/@messageformat/runtime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.0.tgz",
- "integrity": "sha512-boV0oH8jnJM/qoynQKnIbnKK5M7JPpKM0y9QUB9nQMMt16qSlgi5FfUo8usgoq6wEYqxDmIqtUfBewcj2VP+yQ==",
- "dependencies": {
- "make-plural": "^6.2.1"
- }
- },
- "node_modules/@messageformat/runtime/node_modules/make-plural": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz",
- "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA=="
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@sapphire/async-queue": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz",
- "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ==",
- "engines": {
- "node": ">=v14.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/@sindresorhus/is": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.3.0.tgz",
- "integrity": "sha512-wwOvh0eO3PiTEivGJWiZ+b946SlMSb4pe+y+Ur/4S87cwo09pYi+FWHHnbrM3W9W7cBYKDqQXcrFYjYUCOJUEQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@types/cacheable-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
- "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
- "dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
- "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
- },
- "node_modules/@types/i18n": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.2.tgz",
- "integrity": "sha512-FdzABEs0NNi99xN+FgWAAeCenaNo+5jolCxr2RhQrySinNPH8rkgjbw6OMGW9+HSgnGeuI7C6y2lC83m6JN3bg==",
- "dev": true
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
- "dev": true
- },
- "node_modules/@types/keyv": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz",
- "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "17.0.15",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz",
- "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA=="
- },
- "node_modules/@types/node-fetch": {
- "version": "2.5.12",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz",
- "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==",
- "dependencies": {
- "@types/node": "*",
- "form-data": "^3.0.0"
- }
- },
- "node_modules/@types/node-fetch/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/@types/responselike": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
- "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/ws": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
- "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz",
- "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/type-utils": "5.10.2",
- "@typescript-eslint/utils": "5.10.2",
- "debug": "^4.3.2",
- "functional-red-black-tree": "^1.0.1",
- "ignore": "^5.1.8",
- "regexpp": "^3.2.0",
- "semver": "^7.3.5",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz",
- "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/typescript-estree": "5.10.2",
- "debug": "^4.3.2"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz",
- "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/visitor-keys": "5.10.2"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz",
- "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/utils": "5.10.2",
- "debug": "^4.3.2",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz",
- "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz",
- "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/visitor-keys": "5.10.2",
- "debug": "^4.3.2",
- "globby": "^11.0.4",
- "is-glob": "^4.0.3",
- "semver": "^7.3.5",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz",
- "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==",
- "dev": true,
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/typescript-estree": "5.10.2",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^3.0.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz",
- "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "5.10.2",
- "eslint-visitor-keys": "^3.0.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@zhycorp/eslint-config": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@zhycorp/eslint-config/-/eslint-config-7.1.0.tgz",
- "integrity": "sha512-KtiTkDduw8l0ctbEp+bzXISLyRmiGvCblgl7lhW0L0pjw2kXmKar03cVH+v8ULLICw6vTSCn6k0O3jp+8zgwbg==",
- "dev": true,
- "dependencies": {
- "strip-json-comments": "^3.1.1"
- },
- "peerDependencies": {
- "@types/node": "^17.0.9",
- "@typescript-eslint/eslint-plugin": ">=5.10.0",
- "@typescript-eslint/parser": ">=5.10.0",
- "eslint": ">=8.7.0",
- "typescript": ">=3.3.1 <4.6.0"
- },
- "peerDependenciesMeta": {
- "@typescript-eslint/eslint-plugin": {
- "optional": true
- },
- "@typescript-eslint/parser": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/acorn": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
- "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "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/boolean": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz",
- "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w=="
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "engines": {
- "node": ">=10.6.0"
- }
- },
- "node_modules/cacheable-request": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
- "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "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/clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "dependencies": {
- "mimic-response": "^1.0.0"
- }
- },
- "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==",
- "dev": true,
- "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==",
- "dev": true
- },
- "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/commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "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==",
- "devOptional": true,
- "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==",
- "optional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/date-fns": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
- "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/discord-api-types": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
- "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/discord.js": {
- "version": "13.6.0",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz",
- "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==",
- "dependencies": {
- "@discordjs/builders": "^0.11.0",
- "@discordjs/collection": "^0.4.0",
- "@sapphire/async-queue": "^1.1.9",
- "@types/node-fetch": "^2.5.12",
- "@types/ws": "^8.2.2",
- "discord-api-types": "^0.26.0",
- "form-data": "^4.0.0",
- "node-fetch": "^2.6.1",
- "ws": "^8.4.0"
- },
- "engines": {
- "node": ">=16.6.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/dotenv": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz",
- "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==",
- "engines": {
- "node": ">=12"
- }
- },
- "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/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
- "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
- "dev": true,
- "dependencies": {
- "@eslint/eslintrc": "^1.0.5",
- "@humanwhocodes/config-array": "^0.9.2",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.0",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.2.0",
- "espree": "^9.3.0",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^6.0.1",
- "globals": "^13.6.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "regexpp": "^3.2.0",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
- }
- },
- "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
- "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
- "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/eslint/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/espree": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
- "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.7.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^3.1.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "optional": true,
- "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/execa/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==",
- "optional": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "node_modules/fast-printf": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz",
- "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==",
- "dependencies": {
- "boolean": "^3.1.4"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
- "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
- "dev": true
- },
- "node_modules/follow-redirects": {
- "version": "1.14.7",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
- "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/got": {
- "version": "11.8.3",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz",
- "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "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==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
- },
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "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==",
- "optional": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/i18n": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.14.1.tgz",
- "integrity": "sha512-Mu7JS17Fv52jwBJ6q7ssIBlYi+ARkeBTehTV/brlVH0x5u6YzsK8l9fANE8CqUjVBoSEdVa+2vYPB0RF/QF58g==",
- "dependencies": {
- "@messageformat/core": "^3.0.0",
- "debug": "^4.3.3",
- "fast-printf": "^1.6.9",
- "make-plural": "^7.0.0",
- "math-interval-parser": "^2.0.1",
- "mustache": "^4.2.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/mashpie"
- }
- },
- "node_modules/ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "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/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "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==",
- "optional": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-unix": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-unix/-/is-unix-2.0.1.tgz",
- "integrity": "sha512-RyKp5JtlRnfOvnKtfBMPLw9ocqDe1NlPQ8Bt+geVzKGfMnLGj8z/Y2HOmk/aMf47P4EbrEt9dN6YGTT1fx4mZA==",
- "optional": true,
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "devOptional": true
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "node_modules/keyv": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz",
- "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "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==",
- "dev": true
- },
- "node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-plural": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.0.0.tgz",
- "integrity": "sha512-OTuzMnuhrc7G3LJU5upkhKy7EIAq/dRqANqTUh0B8au7jM5mXq9kVdla3sn3g2GCRIxgooCDQtSJ3s1fAjasbQ=="
- },
- "node_modules/math-interval-parser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
- "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "optional": true
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "dependencies": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "dependencies": {
- "mime-db": "1.51.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==",
- "optional": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "optional": true,
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/moo": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
- "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w=="
- },
- "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/mustache": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
- "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
- "bin": {
- "mustache": "bin/mustache"
- }
- },
- "node_modules/mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "dependencies": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "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/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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==",
- "optional": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "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==",
- "optional": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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==",
- "devOptional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pirates": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
- "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/play-audio": {
- "version": "0.4.9",
- "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.4.9.tgz",
- "integrity": "sha512-An88OAvbCcFZH00n9eq6+t2LmJUPJgBCz8ycKXdvUWQz3GcZ3U4o1ZsSHfVFIuoiKuovX+ue5gKNcfSs4ophew==",
- "optional": true
- },
- "node_modules/play-dl": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.8.1.tgz",
- "integrity": "sha512-lUoxDJlPmZhcUv0LW1xg/uoQx0uxdGLppSDr8xM/oasfC/FUadA98JQzJMB6stri1ReFF96ftPQP+ZqhpVBVdQ==",
- "optional": true,
- "dependencies": {
- "play-audio": "^0.4.3"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prism-media": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz",
- "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==",
- "peerDependencies": {
- "@discordjs/opus": "^0.5.0",
- "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/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==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "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/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- }
- },
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/responselike": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
- "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "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": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-identifier": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
- "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w=="
- },
- "node_modules/semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "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==",
- "devOptional": true,
- "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==",
- "devOptional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
- "optional": true
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/soundcloud.ts": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.5.tgz",
- "integrity": "sha512-WAQN687lCs7ig4xciXaNSX3iZ5+XWM5l00jQx3edVsw8ySjPyIymHuSKeHZJBrpKCZbPnnvzEWaBYDK7+eYDCw==",
- "dependencies": {
- "axios": "^0.21.1"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "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==",
- "optional": true,
- "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==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/sucrase": {
- "version": "3.20.3",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.20.3.tgz",
- "integrity": "sha512-azqwq0/Bs6RzLAdb4dXxsCgMtAaD2hzmUr4UhSfsxO46JFPAwMnnb441B/qsudZiS6Ylea3JXZe3Q497lsgXzQ==",
- "dependencies": {
- "commander": "^4.0.0",
- "glob": "7.1.6",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "bin": {
- "sucrase": "bin/sucrase",
- "sucrase-node": "bin/sucrase-node"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/sucrase/node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "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==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true
- },
- "node_modules/thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "dependencies": {
- "any-promise": "^1.0.0"
- }
- },
- "node_modules/thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
- "dependencies": {
- "thenify": ">= 3.1.0 < 4"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "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/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "node_modules/ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
- },
- "node_modules/ts-mixer": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz",
- "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ=="
- },
- "node_modules/tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "node_modules/tsutils": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
- "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
- "dev": true,
- "dependencies": {
- "tslib": "^1.8.1"
- },
- "engines": {
- "node": ">= 6"
- },
- "peerDependencies": {
- "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- }
- },
- "node_modules/tsutils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/typescript": {
- "version": "4.5.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
- "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
- "node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "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==",
- "devOptional": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "node_modules/ws": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
- "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
- "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==",
- "dev": true
- },
- "node_modules/youtube-dl-exec": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/youtube-dl-exec/-/youtube-dl-exec-2.0.2.tgz",
- "integrity": "sha512-sRRjq+eifuqloLMb3OWdpIMZzeYf19iv+4ZFICZYPOeZR2AkawOOve9uCUtmRa1gc6pFBkh4+MMgPiIJUwk+Sg==",
- "hasInstallScript": true,
- "optional": true,
- "dependencies": {
- "dargs": "~7.0.0",
- "execa": "~5.1.0",
- "is-unix": "~2.0.1",
- "mkdirp": "~1.0.4",
- "node-fetch": "~2.6.5"
- },
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/youtubei": {
- "version": "0.0.1-rc.28",
- "resolved": "https://registry.npmjs.org/youtubei/-/youtubei-0.0.1-rc.28.tgz",
- "integrity": "sha512-oWR1hK0C/TN7i34MrMAT/MGfTjP52LYuP13VD2rhxTO6Ia+jRw+bI+/gn65h6qxSxg7QC8LleSiNGWwEWkw4FA=="
- },
- "node_modules/zod": {
- "version": "3.11.6",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz",
- "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg==",
- "funding": {
- "url": "https://github.com/sponsors/colinhacks"
- }
- }
- },
- "dependencies": {
- "@discordjs/builders": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.11.0.tgz",
- "integrity": "sha512-ZTB8yJdJKrKlq44dpWkNUrAtEJEq0gqpb7ASdv4vmq6/mZal5kOv312hQ56I/vxwMre+VIkoHquNUAfnTbiYtg==",
- "requires": {
- "@sindresorhus/is": "^4.2.0",
- "discord-api-types": "^0.26.0",
- "ts-mixer": "^6.0.0",
- "tslib": "^2.3.1",
- "zod": "^3.11.6"
- }
- },
- "@discordjs/collection": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.4.0.tgz",
- "integrity": "sha512-zmjq+l/rV35kE6zRrwe8BHqV78JvIh2ybJeZavBi5NySjWXqN3hmmAKg7kYMMXSeiWtSsMoZ/+MQi0DiQWy2lw=="
- },
- "@discordjs/voice": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.8.0.tgz",
- "integrity": "sha512-o0JfVLMs3eLjUzPf6oxMydEeum40I7xzfUc66SLN+RrKpSAsTbngf5qnCF53nm+KDNSvrwg1AZqNm4LEAdxJIA==",
- "requires": {
- "@types/ws": "^8.2.0",
- "discord-api-types": "^0.26.1",
- "prism-media": "^1.3.2",
- "tiny-typed-emitter": "^2.1.0",
- "tslib": "^2.3.1",
- "ws": "^8.4.2"
- }
- },
- "@eslint/eslintrc": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
- "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.2.0",
- "globals": "^13.9.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "dependencies": {
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- }
- }
- },
- "@humanwhocodes/config-array": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
- "integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
- "dev": true,
- "requires": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.4"
- }
- },
- "@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "@messageformat/core": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.0.0.tgz",
- "integrity": "sha512-mzMCyADGweNmnMwV/xjKxtXtkXJNVcK5ATOHx4Q0GVr2Z3++in1VfrB/y6jM43nleK27tFO0Y/9pds5vxWqDvQ==",
- "requires": {
- "@messageformat/date-skeleton": "^1.0.0",
- "@messageformat/number-skeleton": "^1.0.0",
- "@messageformat/parser": "^5.0.0",
- "@messageformat/runtime": "^3.0.0",
- "make-plural": "^6.2.1",
- "safe-identifier": "^0.4.1"
- },
- "dependencies": {
- "make-plural": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz",
- "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA=="
- }
- }
- },
- "@messageformat/date-skeleton": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.0.tgz",
- "integrity": "sha512-vvj5Sd3VyXUHGbYpiFsPsSQ8pkdUM9vrR/NUbyP6ga3UqJH4p9eCwzfwaCAZatZMYMTyiKG/8QbUyGKHeTZ5kw=="
- },
- "@messageformat/number-skeleton": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.0.0.tgz",
- "integrity": "sha512-Pe1HX/VG0q7tclM/ri85I4FKYd7Uc3gluSZbRaK1+jcXdT9Biw2hLAKyMsiz2tM6zLiK1xX+K0NMDO4RIstQig=="
- },
- "@messageformat/parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.0.0.tgz",
- "integrity": "sha512-WiDKhi8F0zQaFU8cXgqq69eYFarCnTVxKcvhAONufKf0oUxbqLMW6JX6rV4Hqh+BEQWGyKKKHY4g1XA6bCLylA==",
- "requires": {
- "moo": "^0.5.1"
- }
- },
- "@messageformat/runtime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.0.tgz",
- "integrity": "sha512-boV0oH8jnJM/qoynQKnIbnKK5M7JPpKM0y9QUB9nQMMt16qSlgi5FfUo8usgoq6wEYqxDmIqtUfBewcj2VP+yQ==",
- "requires": {
- "make-plural": "^6.2.1"
- },
- "dependencies": {
- "make-plural": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-6.2.2.tgz",
- "integrity": "sha512-8iTuFioatnTTmb/YJjywkVIHLjcwkFD9Ms0JpxjEm9Mo8eQYkh1z+55dwv4yc1jQ8ftVBxWQbihvZL1DfzGGWA=="
- }
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- }
- },
- "@sapphire/async-queue": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.1.9.tgz",
- "integrity": "sha512-CbXaGwwlEMq+l1TRu01FJCvySJ1CEFKFclHT48nIfNeZXaAAmmwwy7scUKmYHPUa3GhoMp6Qr1B3eAJux6XgOQ=="
- },
- "@sindresorhus/is": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.3.0.tgz",
- "integrity": "sha512-wwOvh0eO3PiTEivGJWiZ+b946SlMSb4pe+y+Ur/4S87cwo09pYi+FWHHnbrM3W9W7cBYKDqQXcrFYjYUCOJUEQ=="
- },
- "@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "requires": {
- "defer-to-connect": "^2.0.0"
- }
- },
- "@types/cacheable-request": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
- "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
- "requires": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "*",
- "@types/node": "*",
- "@types/responselike": "*"
- }
- },
- "@types/http-cache-semantics": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
- "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
- },
- "@types/i18n": {
- "version": "0.13.2",
- "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.2.tgz",
- "integrity": "sha512-FdzABEs0NNi99xN+FgWAAeCenaNo+5jolCxr2RhQrySinNPH8rkgjbw6OMGW9+HSgnGeuI7C6y2lC83m6JN3bg==",
- "dev": true
- },
- "@types/json-schema": {
- "version": "7.0.9",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
- "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
- "dev": true
- },
- "@types/keyv": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.3.tgz",
- "integrity": "sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "17.0.15",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.15.tgz",
- "integrity": "sha512-zWt4SDDv1S9WRBNxLFxFRHxdD9tvH8f5/kg5/IaLFdnSNXsDY4eL3Q3XXN+VxUnWIhyVFDwcsmAprvwXoM/ClA=="
- },
- "@types/node-fetch": {
- "version": "2.5.12",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz",
- "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==",
- "requires": {
- "@types/node": "*",
- "form-data": "^3.0.0"
- },
- "dependencies": {
- "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"
- }
- }
- }
- },
- "@types/responselike": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
- "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/ws": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz",
- "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz",
- "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/type-utils": "5.10.2",
- "@typescript-eslint/utils": "5.10.2",
- "debug": "^4.3.2",
- "functional-red-black-tree": "^1.0.1",
- "ignore": "^5.1.8",
- "regexpp": "^3.2.0",
- "semver": "^7.3.5",
- "tsutils": "^3.21.0"
- }
- },
- "@typescript-eslint/parser": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz",
- "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==",
- "dev": true,
- "requires": {
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/typescript-estree": "5.10.2",
- "debug": "^4.3.2"
- }
- },
- "@typescript-eslint/scope-manager": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz",
- "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/visitor-keys": "5.10.2"
- }
- },
- "@typescript-eslint/type-utils": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz",
- "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==",
- "dev": true,
- "requires": {
- "@typescript-eslint/utils": "5.10.2",
- "debug": "^4.3.2",
- "tsutils": "^3.21.0"
- }
- },
- "@typescript-eslint/types": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz",
- "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz",
- "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/visitor-keys": "5.10.2",
- "debug": "^4.3.2",
- "globby": "^11.0.4",
- "is-glob": "^4.0.3",
- "semver": "^7.3.5",
- "tsutils": "^3.21.0"
- }
- },
- "@typescript-eslint/utils": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz",
- "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==",
- "dev": true,
- "requires": {
- "@types/json-schema": "^7.0.9",
- "@typescript-eslint/scope-manager": "5.10.2",
- "@typescript-eslint/types": "5.10.2",
- "@typescript-eslint/typescript-estree": "5.10.2",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^3.0.0"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "5.10.2",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz",
- "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "5.10.2",
- "eslint-visitor-keys": "^3.0.0"
- }
- },
- "@zhycorp/eslint-config": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@zhycorp/eslint-config/-/eslint-config-7.1.0.tgz",
- "integrity": "sha512-KtiTkDduw8l0ctbEp+bzXISLyRmiGvCblgl7lhW0L0pjw2kXmKar03cVH+v8ULLICw6vTSCn6k0O3jp+8zgwbg==",
- "dev": true,
- "requires": {
- "strip-json-comments": "^3.1.1"
- }
- },
- "acorn": {
- "version": "8.7.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
- "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "requires": {}
- },
- "ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "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=="
- },
- "boolean": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.1.4.tgz",
- "integrity": "sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w=="
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="
- },
- "cacheable-request": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
- "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "requires": {
- "mimic-response": "^1.0.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==",
- "dev": true,
- "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==",
- "dev": true
- },
- "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"
- }
- },
- "commander": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
- "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "devOptional": true,
- "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==",
- "optional": true
- },
- "date-fns": {
- "version": "2.28.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
- "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
- },
- "debug": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
- "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
- "requires": {
- "ms": "2.1.2"
- }
- },
- "decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "requires": {
- "mimic-response": "^3.1.0"
- },
- "dependencies": {
- "mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
- }
- }
- },
- "deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "discord-api-types": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.26.1.tgz",
- "integrity": "sha512-T5PdMQ+Y1MEECYMV5wmyi9VEYPagEDEi4S0amgsszpWY0VB9JJ/hEvM6BgLhbdnKky4gfmZEXtEEtojN8ZKJQQ=="
- },
- "discord.js": {
- "version": "13.6.0",
- "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.6.0.tgz",
- "integrity": "sha512-tXNR8zgsEPxPBvGk3AQjJ9ljIIC6/LOPjzKwpwz8Y1Q2X66Vi3ZqFgRHYwnHKC0jC0F+l4LzxlhmOJsBZDNg9g==",
- "requires": {
- "@discordjs/builders": "^0.11.0",
- "@discordjs/collection": "^0.4.0",
- "@sapphire/async-queue": "^1.1.9",
- "@types/node-fetch": "^2.5.12",
- "@types/ws": "^8.2.2",
- "discord-api-types": "^0.26.0",
- "form-data": "^4.0.0",
- "node-fetch": "^2.6.1",
- "ws": "^8.4.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dotenv": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.0.tgz",
- "integrity": "sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q=="
- },
- "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"
- }
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
- "eslint": {
- "version": "8.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz",
- "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==",
- "dev": true,
- "requires": {
- "@eslint/eslintrc": "^1.0.5",
- "@humanwhocodes/config-array": "^0.9.2",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.1.0",
- "eslint-utils": "^3.0.0",
- "eslint-visitor-keys": "^3.2.0",
- "espree": "^9.3.0",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^6.0.1",
- "globals": "^13.6.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "regexpp": "^3.2.0",
- "strip-ansi": "^6.0.1",
- "strip-json-comments": "^3.1.0",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "eslint-scope": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz",
- "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- }
- },
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "dependencies": {
- "eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true
- }
- }
- },
- "eslint-visitor-keys": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz",
- "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==",
- "dev": true
- },
- "espree": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz",
- "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==",
- "dev": true,
- "requires": {
- "acorn": "^8.7.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^3.1.0"
- }
- },
- "esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "requires": {
- "estraverse": "^5.2.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
- }
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "optional": true,
- "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"
- },
- "dependencies": {
- "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==",
- "optional": true
- }
- }
- },
- "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==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.11",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
- "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "dependencies": {
- "glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fast-printf": {
- "version": "1.6.9",
- "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz",
- "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==",
- "requires": {
- "boolean": "^3.1.4"
- }
- },
- "fastq": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
- "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "requires": {
- "flat-cache": "^3.0.4"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "requires": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- }
- },
- "flatted": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
- "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
- "dev": true
- },
- "follow-redirects": {
- "version": "1.14.7",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz",
- "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ=="
- },
- "form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "glob": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
- "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
- "globals": {
- "version": "13.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
- "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- }
- },
- "got": {
- "version": "11.8.3",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz",
- "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==",
- "requires": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
- },
- "http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
- "requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
- }
- },
- "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==",
- "optional": true
- },
- "i18n": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.14.1.tgz",
- "integrity": "sha512-Mu7JS17Fv52jwBJ6q7ssIBlYi+ARkeBTehTV/brlVH0x5u6YzsK8l9fANE8CqUjVBoSEdVa+2vYPB0RF/QF58g==",
- "requires": {
- "@messageformat/core": "^3.0.0",
- "debug": "^4.3.3",
- "fast-printf": "^1.6.9",
- "make-plural": "^7.0.0",
- "math-interval-parser": "^2.0.1",
- "mustache": "^4.2.0"
- }
- },
- "ignore": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
- "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "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=="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "optional": true
- },
- "is-unix": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-unix/-/is-unix-2.0.1.tgz",
- "integrity": "sha512-RyKp5JtlRnfOvnKtfBMPLw9ocqDe1NlPQ8Bt+geVzKGfMnLGj8z/Y2HOmk/aMf47P4EbrEt9dN6YGTT1fx4mZA==",
- "optional": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "devOptional": true
- },
- "js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "requires": {
- "argparse": "^2.0.1"
- }
- },
- "json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "keyv": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.5.tgz",
- "integrity": "sha512-531pkGLqV3BMg0eDqqJFI0R1mkK1Nm5xIP2mM6keP5P8WfFtCkg2IOwplTUmlGoTgIg9yQYZ/kdihhz89XH3vA==",
- "requires": {
- "json-buffer": "3.0.1"
- }
- },
- "levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- }
- },
- "lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "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==",
- "dev": true
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
- },
- "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==",
- "dev": true,
- "requires": {
- "yallist": "^4.0.0"
- }
- },
- "make-plural": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.0.0.tgz",
- "integrity": "sha512-OTuzMnuhrc7G3LJU5upkhKy7EIAq/dRqANqTUh0B8au7jM5mXq9kVdla3sn3g2GCRIxgooCDQtSJ3s1fAjasbQ=="
- },
- "math-interval-parser": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
- "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA=="
- },
- "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==",
- "optional": true
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
- "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.2.3"
- }
- },
- "mime-db": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz",
- "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g=="
- },
- "mime-types": {
- "version": "2.1.34",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz",
- "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==",
- "requires": {
- "mime-db": "1.51.0"
- }
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "optional": true
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "optional": true
- },
- "moo": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
- "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w=="
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "mustache": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
- "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
- },
- "mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
- "requires": {
- "any-promise": "^1.0.0",
- "object-assign": "^4.0.1",
- "thenify-all": "^1.0.0"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "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"
- }
- },
- "normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
- },
- "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==",
- "optional": true,
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "optional": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "requires": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- }
- },
- "opusscript": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz",
- "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ=="
- },
- "p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "devOptional": true
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true
- },
- "picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true
- },
- "pirates": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
- "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw=="
- },
- "play-audio": {
- "version": "0.4.9",
- "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.4.9.tgz",
- "integrity": "sha512-An88OAvbCcFZH00n9eq6+t2LmJUPJgBCz8ycKXdvUWQz3GcZ3U4o1ZsSHfVFIuoiKuovX+ue5gKNcfSs4ophew==",
- "optional": true
- },
- "play-dl": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.8.1.tgz",
- "integrity": "sha512-lUoxDJlPmZhcUv0LW1xg/uoQx0uxdGLppSDr8xM/oasfC/FUadA98JQzJMB6stri1ReFF96ftPQP+ZqhpVBVdQ==",
- "optional": true,
- "requires": {
- "play-audio": "^0.4.3"
- }
- },
- "prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
- },
- "prism-media": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz",
- "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==",
- "requires": {}
- },
- "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==",
- "dev": true
- },
- "queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
- },
- "quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
- },
- "regexpp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
- "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
- "dev": true
- },
- "resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "responselike": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
- "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
- "requires": {
- "lowercase-keys": "^2.0.0"
- }
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "requires": {
- "queue-microtask": "^1.2.2"
- }
- },
- "safe-identifier": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
- "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w=="
- },
- "semver": {
- "version": "7.3.5",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
- "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
- "dev": true,
- "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==",
- "devOptional": true,
- "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==",
- "devOptional": true
- },
- "signal-exit": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz",
- "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==",
- "optional": true
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true
- },
- "soundcloud.ts": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.5.tgz",
- "integrity": "sha512-WAQN687lCs7ig4xciXaNSX3iZ5+XWM5l00jQx3edVsw8ySjPyIymHuSKeHZJBrpKCZbPnnvzEWaBYDK7+eYDCw==",
- "requires": {
- "axios": "^0.21.1"
- }
- },
- "strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.1"
- }
- },
- "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==",
- "optional": true
- },
- "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==",
- "dev": true
- },
- "sucrase": {
- "version": "3.20.3",
- "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.20.3.tgz",
- "integrity": "sha512-azqwq0/Bs6RzLAdb4dXxsCgMtAaD2hzmUr4UhSfsxO46JFPAwMnnb441B/qsudZiS6Ylea3JXZe3Q497lsgXzQ==",
- "requires": {
- "commander": "^4.0.0",
- "glob": "7.1.6",
- "lines-and-columns": "^1.1.6",
- "mz": "^2.7.0",
- "pirates": "^4.0.1",
- "ts-interface-checker": "^0.1.9"
- },
- "dependencies": {
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
- },
- "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==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true
- },
- "thenify": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
- "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
- "requires": {
- "any-promise": "^1.0.0"
- }
- },
- "thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
- "requires": {
- "thenify": ">= 3.1.0 < 4"
- }
- },
- "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=="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
- },
- "ts-interface-checker": {
- "version": "0.1.13",
- "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
- "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="
- },
- "ts-mixer": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.0.tgz",
- "integrity": "sha512-nXIb1fvdY5CBSrDIblLn73NW0qRDk5yJ0Sk1qPBF560OdJfQp9jhl+0tzcY09OZ9U+6GpeoI9RjwoIKFIoB9MQ=="
- },
- "tslib": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
- "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
- },
- "tsutils": {
- "version": "3.21.0",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
- "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
- "dev": true,
- "requires": {
- "tslib": "^1.8.1"
- },
- "dependencies": {
- "tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- }
- }
- },
- "tweetnacl": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
- "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
- },
- "type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "requires": {
- "prelude-ls": "^1.2.1"
- }
- },
- "type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
- },
- "typescript": {
- "version": "4.5.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz",
- "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==",
- "dev": true
- },
- "uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true
- },
- "webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
- },
- "whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
- "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==",
- "devOptional": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "ws": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz",
- "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==",
- "requires": {}
- },
- "yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "youtube-dl-exec": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/youtube-dl-exec/-/youtube-dl-exec-2.0.2.tgz",
- "integrity": "sha512-sRRjq+eifuqloLMb3OWdpIMZzeYf19iv+4ZFICZYPOeZR2AkawOOve9uCUtmRa1gc6pFBkh4+MMgPiIJUwk+Sg==",
- "optional": true,
- "requires": {
- "dargs": "~7.0.0",
- "execa": "~5.1.0",
- "is-unix": "~2.0.1",
- "mkdirp": "~1.0.4",
- "node-fetch": "~2.6.5"
- }
- },
- "youtubei": {
- "version": "0.0.1-rc.28",
- "resolved": "https://registry.npmjs.org/youtubei/-/youtubei-0.0.1-rc.28.tgz",
- "integrity": "sha512-oWR1hK0C/TN7i34MrMAT/MGfTjP52LYuP13VD2rhxTO6Ia+jRw+bI+/gn65h6qxSxg7QC8LleSiNGWwEWkw4FA=="
- },
- "zod": {
- "version": "3.11.6",
- "resolved": "https://registry.npmjs.org/zod/-/zod-3.11.6.tgz",
- "integrity": "sha512-daZ80A81I3/9lIydI44motWe6n59kRBfNzTuS2bfzVh1nAXi667TOTWWtatxyG+fwgNUiagSj/CWZwRRbevJIg=="
- }
- }
+ "name": "rawon",
+ "version": "3.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "rawon",
+ "version": "3.0.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@discordjs/voice": "0.9.0",
+ "@swc/cli": "0.1.57",
+ "@swc/core": "1.2.194",
+ "date-fns": "2.28.0",
+ "discord.js": "13.7.0",
+ "dotenv": "16.0.1",
+ "got": "12.1.0",
+ "i18n": "0.15.0",
+ "opusscript": "0.0.8",
+ "prism-media": "1.3.2",
+ "soundcloud.ts": "0.4.6",
+ "tslib": "2.4.0",
+ "tweetnacl": "1.0.3",
+ "youtubei": "0.0.1-rc.35"
+ },
+ "devDependencies": {
+ "@clytage-pkg/eslint-config": "1.1.0",
+ "@types/i18n": "0.13.2",
+ "@types/node": "17.0.33",
+ "@typescript-eslint/eslint-plugin": "5.26.0",
+ "@typescript-eslint/parser": "5.26.0",
+ "eslint": "8.16.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "prettier": "^2.6.2",
+ "rimraf": "^3.0.2",
+ "typescript": "4.7.2"
+ },
+ "engines": {
+ "node": ">=16.6.0",
+ "npm": ">=7.0.0"
+ },
+ "optionalDependencies": {
+ "play-dl": "^1.9.4"
+ }
+ },
+ "node_modules/@clytage-pkg/eslint-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@clytage-pkg/eslint-config/-/eslint-config-1.1.0.tgz",
+ "integrity": "sha512-44ak3+VCpSiPqBYqthVYfCkkd7L+lPV2v/C3DuXx6dQeVqh0mP3t4bCTqiX3LoRtI0MMiHd0QpxNUq1FqaQbbg==",
+ "dev": true,
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": ">=5.26.0",
+ "@typescript-eslint/parser": ">=5.26.0",
+ "eslint": ">=8.16.0",
+ "typescript": ">=3.3.1 <4.7.3"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "@typescript-eslint/parser": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@discordjs/builders": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.13.0.tgz",
+ "integrity": "sha512-4L9y26KRNNU8Y7J78SRUN1Uhava9D8jfit/YqEaKi8gQRc7PdqKqk2poybo6RXaiyt/BgKYPfcjxT7WvzGfYCA==",
+ "dependencies": {
+ "@sapphire/shapeshift": "^2.0.0",
+ "@sindresorhus/is": "^4.6.0",
+ "discord-api-types": "^0.31.1",
+ "fast-deep-equal": "^3.1.3",
+ "ts-mixer": "^6.0.1",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/builders/node_modules/discord-api-types": {
+ "version": "0.31.2",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.31.2.tgz",
+ "integrity": "sha512-gpzXTvFVg7AjKVVJFH0oJGC0q0tO34iJGSHZNz9u3aqLxlD6LfxEs9wWVVikJqn9gra940oUTaPFizCkRDcEiA=="
+ },
+ "node_modules/@discordjs/collection": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.6.0.tgz",
+ "integrity": "sha512-Ieaetb36l0nmAS5X9Upqk4W7euAO6FdXPxn3I8vBAKEcoIzEZI1mcVcPfCfagGJZSgBKpENnAnKkP4GAn+MV8w==",
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@discordjs/voice": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.9.0.tgz",
+ "integrity": "sha512-fSAYtPCEfIyG56hC2cRJuyfvQGr+aawSssLCqYg70vZ51dKO4spEKOB8V6vNMP5HnEplbhmxkB3YbshFKtnCQQ==",
+ "dependencies": {
+ "@types/ws": "^8.5.3",
+ "discord-api-types": "^0.29.0",
+ "prism-media": "^1.3.2",
+ "tiny-typed-emitter": "^2.1.0",
+ "tslib": "^2.3.1",
+ "ws": "^8.5.0"
+ },
+ "engines": {
+ "node": ">=16.9.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@messageformat/core": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.0.1.tgz",
+ "integrity": "sha512-yxj2+0e46hcZqJfNf0ZYbC2q6WlcGoh4g11mCyRtTueR0AD8F9z4JMYAS1aOiFG8Vl1LZg/h5hZHKmWTAyZq8g==",
+ "dependencies": {
+ "@messageformat/date-skeleton": "^1.0.0",
+ "@messageformat/number-skeleton": "^1.0.0",
+ "@messageformat/parser": "^5.0.0",
+ "@messageformat/runtime": "^3.0.1",
+ "make-plural": "^7.0.0",
+ "safe-identifier": "^0.4.1"
+ }
+ },
+ "node_modules/@messageformat/date-skeleton": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.0.tgz",
+ "integrity": "sha512-vvj5Sd3VyXUHGbYpiFsPsSQ8pkdUM9vrR/NUbyP6ga3UqJH4p9eCwzfwaCAZatZMYMTyiKG/8QbUyGKHeTZ5kw=="
+ },
+ "node_modules/@messageformat/number-skeleton": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.0.0.tgz",
+ "integrity": "sha512-Pe1HX/VG0q7tclM/ri85I4FKYd7Uc3gluSZbRaK1+jcXdT9Biw2hLAKyMsiz2tM6zLiK1xX+K0NMDO4RIstQig=="
+ },
+ "node_modules/@messageformat/parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.0.0.tgz",
+ "integrity": "sha512-WiDKhi8F0zQaFU8cXgqq69eYFarCnTVxKcvhAONufKf0oUxbqLMW6JX6rV4Hqh+BEQWGyKKKHY4g1XA6bCLylA==",
+ "dependencies": {
+ "moo": "^0.5.1"
+ }
+ },
+ "node_modules/@messageformat/runtime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz",
+ "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==",
+ "dependencies": {
+ "make-plural": "^7.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@sapphire/async-queue": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
+ "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==",
+ "engines": {
+ "node": ">=v14.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@sapphire/shapeshift": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-2.2.0.tgz",
+ "integrity": "sha512-UEnKgMlQyI0yY/q+lCMX0VJft9y86IsesgbIQj6e62FBYSaMVr+IaMNpi4z45Q14VnuMACbK0yrbHISNqgUYcQ==",
+ "engines": {
+ "node": ">=v15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@swc/cli": {
+ "version": "0.1.57",
+ "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.57.tgz",
+ "integrity": "sha512-HxM8TqYHhAg+zp7+RdTU69bnkl4MWdt1ygyp6BDIPjTiaJVH6Dizn2ezbgDS8mnFZI1FyhKvxU/bbaUs8XhzQg==",
+ "dependencies": {
+ "commander": "^7.1.0",
+ "fast-glob": "^3.2.5",
+ "slash": "3.0.0",
+ "source-map": "^0.7.3"
+ },
+ "bin": {
+ "spack": "bin/spack.js",
+ "swc": "bin/swc.js"
+ },
+ "engines": {
+ "node": ">= 12.13"
+ },
+ "peerDependencies": {
+ "@swc/core": "^1.2.66",
+ "chokidar": "^3.5.1"
+ },
+ "peerDependenciesMeta": {
+ "chokidar": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@swc/core": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.194.tgz",
+ "integrity": "sha512-+Jg3qxad32CqnFmw4pqwm/5JCVWGkoM8P5pqPlyj5sokHFUJluMkCeaikuvIZhJCabR9q84lEnXlIjMu42ZfKA==",
+ "bin": {
+ "swcx": "run_swcx.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/swc"
+ },
+ "optionalDependencies": {
+ "@swc/core-android-arm-eabi": "1.2.194",
+ "@swc/core-android-arm64": "1.2.194",
+ "@swc/core-darwin-arm64": "1.2.194",
+ "@swc/core-darwin-x64": "1.2.194",
+ "@swc/core-freebsd-x64": "1.2.194",
+ "@swc/core-linux-arm-gnueabihf": "1.2.194",
+ "@swc/core-linux-arm64-gnu": "1.2.194",
+ "@swc/core-linux-arm64-musl": "1.2.194",
+ "@swc/core-linux-x64-gnu": "1.2.194",
+ "@swc/core-linux-x64-musl": "1.2.194",
+ "@swc/core-win32-arm64-msvc": "1.2.194",
+ "@swc/core-win32-ia32-msvc": "1.2.194",
+ "@swc/core-win32-x64-msvc": "1.2.194"
+ }
+ },
+ "node_modules/@swc/core-android-arm-eabi": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.194.tgz",
+ "integrity": "sha512-Hv/k9KN2Aab8jO/SmSlzKpzS941IXfdr9XEQRl/rc5Nj4neVW8AWS4+AJnl4u7MiJrfM0No6ZRQx32Ke+APmLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-android-arm64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.194.tgz",
+ "integrity": "sha512-/r2iah0khiv3xUbOT6upf1fdeGdKrVa8sghyTI0jPRpQ5GKD01nuEq+FlmieTwkQ0pQbgVKun0zyriAOXjLqWA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-arm64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.194.tgz",
+ "integrity": "sha512-pLsxgi985iSu+wqskJAO+kr0QwNqYQSyfdQEjCtWi5oYp3wIBPHLccIPVcIUfD6YAqXdqnQJg9RtA4scpdrQNg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-darwin-x64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.194.tgz",
+ "integrity": "sha512-WLFhotRbGqMKg9HwB0RF0Ycz6B6uSMEHcblAdBhiyL4fIp+CMUhkvC8jTs0xij/yJj96B6Xf9UH/Q5MFUQrJEw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-freebsd-x64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.194.tgz",
+ "integrity": "sha512-UNG8G5TlYWvfyB7+Fc1h5hoSwEY1LLLth7V8DFMljd0dm2hcSpukuWaQk/GE3EANCE40nq3y4THEAlSu4lauSg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm-gnueabihf": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.194.tgz",
+ "integrity": "sha512-mbk4MMgBf9BWFV0yqvReT29xZ6N6CLNgiG2UFnmXkLrrEBrAz5c3W8so5VqdyK52yWMS5Vs0a6VOvlimh057KA==",
+ "cpu": [
+ "arm"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-gnu": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.194.tgz",
+ "integrity": "sha512-vdr2zUJnd67oQfXn1Ix0ueND+iEnCTwA4dobT4s0KsZCusJKuJlkm97p7rgk3Cxn2sHm/8BBQX4KpdXwNEL3Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-arm64-musl": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.194.tgz",
+ "integrity": "sha512-wocEG55mu/KAFs1B9l1E0FbfU9nKaY3ULuT/isELHqDNZB23nNFRa+ymez/NqBhqVPhX4B0L+7j2r4tipXiI2A==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-gnu": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.194.tgz",
+ "integrity": "sha512-PA7kudCtpGy1m40LKTeIsSse0zkmMyHthYjfn7q8pUWlo2b9o9RxO5zsnLxLsgATsoPwfMmVl9m3+1xSkxJp+g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-linux-x64-musl": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.194.tgz",
+ "integrity": "sha512-2CdLXLpdKqtZmFgcEOyw9Gu/24ku5/4NabSdYg58XGarrPS96lQk80rzaMYxs6AzfsfhHGmsp3se07jnLwSlXQ==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-arm64-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.194.tgz",
+ "integrity": "sha512-7NpBJ1fgeP8Y2H0aCTZR8nx0BEHXdSuFwBAwKrb4kaP0d2qVAVIv/rOk7L/MwsuXmlsISQ13JnUtQYjYPGJsUg==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-ia32-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.194.tgz",
+ "integrity": "sha512-1TP+kS32uFSgBHOJGmLNfxcqU7e85FZZTKAVAQgEPmHH0lJ/9BcViMDhMOdnyEWjIluD5aj6WdPdeAz1YlXDng==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@swc/core-win32-x64-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.194.tgz",
+ "integrity": "sha512-c3tiShCGY03XbJqXpliHRHMBBB/KGWS1kcbKn2GhaZN4fY8UgD5kZk3XJDwDJ6oqwlgkBdWXRAgD5Td2aAKMRg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+ "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "dependencies": {
+ "defer-to-connect": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ }
+ },
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
+ "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "*",
+ "@types/node": "*",
+ "@types/responselike": "*"
+ }
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+ },
+ "node_modules/@types/i18n": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.2.tgz",
+ "integrity": "sha512-FdzABEs0NNi99xN+FgWAAeCenaNo+5jolCxr2RhQrySinNPH8rkgjbw6OMGW9+HSgnGeuI7C6y2lC83m6JN3bg==",
+ "dev": true
+ },
+ "node_modules/@types/json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz",
+ "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ=="
+ },
+ "node_modules/@types/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==",
+ "dependencies": {
+ "@types/node": "*",
+ "form-data": "^3.0.0"
+ }
+ },
+ "node_modules/@types/node-fetch/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/@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "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/@typescript-eslint/eslint-plugin": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz",
+ "integrity": "sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/type-utils": "5.26.0",
+ "@typescript-eslint/utils": "5.26.0",
+ "debug": "^4.3.4",
+ "functional-red-black-tree": "^1.0.1",
+ "ignore": "^5.2.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.26.0.tgz",
+ "integrity": "sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/typescript-estree": "5.26.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz",
+ "integrity": "sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/visitor-keys": "5.26.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz",
+ "integrity": "sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "5.26.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.26.0.tgz",
+ "integrity": "sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz",
+ "integrity": "sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/visitor-keys": "5.26.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.26.0.tgz",
+ "integrity": "sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/typescript-estree": "5.26.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz",
+ "integrity": "sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.26.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
+ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
+ },
+ "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/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==",
+ "dev": true
+ },
+ "node_modules/boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
+ "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A==",
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+ "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cacheable-request/node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/compress-brotli": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
+ "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
+ "dependencies": {
+ "@types/json-buffer": "~3.0.0",
+ "json-buffer": "~3.0.1"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/date-fns": {
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+ "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw==",
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "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/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/discord-api-types": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.29.0.tgz",
+ "integrity": "sha512-Ekq1ICNpOTVajXKZguNFrsDeTmam+ZeA38txsNLZnANdXUjU6QBPIZLUQTC6MzigFGb0Tt8vk4xLnXmzv0shNg=="
+ },
+ "node_modules/discord.js": {
+ "version": "13.7.0",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.7.0.tgz",
+ "integrity": "sha512-iV/An3FEB/CiBGdjWHRtgskM4UuWPq5vjhjKsrQhdVU16dbKrBxA+eIV2HWA07B3tXUGM6eco1wkr42gxxV1BA==",
+ "dependencies": {
+ "@discordjs/builders": "^0.13.0",
+ "@discordjs/collection": "^0.6.0",
+ "@sapphire/async-queue": "^1.3.1",
+ "@types/node-fetch": "^2.6.1",
+ "@types/ws": "^8.5.3",
+ "discord-api-types": "^0.30.0",
+ "form-data": "^4.0.0",
+ "node-fetch": "^2.6.1",
+ "ws": "^8.6.0"
+ },
+ "engines": {
+ "node": ">=16.6.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/discord.js/node_modules/discord-api-types": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.30.0.tgz",
+ "integrity": "sha512-wYst0jrT8EJs2tVlwUTQ2xT0oWMjUrRMpFTkNY3NMleWyQNHgWaKhqFfxdLPdC2im9IuR5EsxcEgjhf/npeftw=="
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+ "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
+ "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
+ "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/fast-printf": {
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz",
+ "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==",
+ "dependencies": {
+ "boolean": "^3.1.4"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
+ "node_modules/fluent-ffmpeg": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz",
+ "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
+ "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data-encoder": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz",
+ "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg=="
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "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": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+ "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/got": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz",
+ "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==",
+ "dependencies": {
+ "@sindresorhus/is": "^4.6.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "@types/cacheable-request": "^6.0.2",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^6.0.4",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "1.7.1",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ },
+ "node_modules/http2-wrapper": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz",
+ "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==",
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/i18n": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.0.tgz",
+ "integrity": "sha512-TUOkuFbl8Y/q7zF0tHdtpk1/TtxH0T+Drp2NFrHhmN1Qs0Sob9/0uVLS2BPVkEXNh2jZrimOiFJk+tkaOumzog==",
+ "dependencies": {
+ "@messageformat/core": "^3.0.0",
+ "debug": "^4.3.3",
+ "fast-printf": "^1.6.9",
+ "make-plural": "^7.0.0",
+ "math-interval-parser": "^2.0.1",
+ "mustache": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mashpie"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/keyv": {
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.9.tgz",
+ "integrity": "sha512-vqRBrN4xQHud7UMAGzGGFbt96MtGB9pb0OOg8Dhtq5RtiswCb1pCFq878iqC4hdeOP6eDPnCoFxA+2TXx427Ow==",
+ "dependencies": {
+ "compress-brotli": "^1.3.8",
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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/lowercase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/make-plural": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.1.0.tgz",
+ "integrity": "sha512-PKkwVlAxYVo98NrbclaQIT4F5Oy+X58PZM5r2IwUSCe3syya6PXkIRCn2XCdz7p58Scgpp50PBeHmepXVDG3hg=="
+ },
+ "node_modules/math-interval-parser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
+ "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "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-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moo": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
+ "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w=="
+ },
+ "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/mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+ "bin": {
+ "mustache": "bin/mustache"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "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/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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/p-cancelable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
+ "engines": {
+ "node": ">=12.20"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/play-audio": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz",
+ "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==",
+ "optional": true
+ },
+ "node_modules/play-dl": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.4.tgz",
+ "integrity": "sha512-/NiD3rpZw/5zbtUhF87AQEmHYLBD5QhtCD/9c3b47xvZMxCO3eHLEN5G1h/b/lC1lCp+xj5BpdYefOrIbDhBUQ==",
+ "optional": true,
+ "dependencies": {
+ "play-audio": "^0.5.2"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
+ "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/prism-media": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz",
+ "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==",
+ "peerDependencies": {
+ "@discordjs/opus": "^0.5.0",
+ "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/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==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "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/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
+ "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+ "dependencies": {
+ "lowercase-keys": "^2.0.0"
+ }
+ },
+ "node_modules/responselike/node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "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": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-identifier": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
+ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w=="
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/soundcloud.ts": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.6.tgz",
+ "integrity": "sha512-h0Y0n7J/Ubzhnr5497/Co3k3ZB0h6bB6n2x5PhNNX2E/+lizMPu9VGYSGcgZROihZxGUQ1711iGlFVnHFeOvng==",
+ "dependencies": {
+ "audioconcat": "^0.1.4",
+ "axios": "^0.21.1"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "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/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "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/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz",
+ "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "node_modules/ws": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz",
+ "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==",
+ "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==",
+ "dev": true
+ },
+ "node_modules/youtubei": {
+ "version": "0.0.1-rc.35",
+ "resolved": "https://registry.npmjs.org/youtubei/-/youtubei-0.0.1-rc.35.tgz",
+ "integrity": "sha512-OXq3/7s6rhT0ejwbQm5r3uW0qCs6PUhboMFy3ZdUx4JdSY2WDr44DOdKtzPh4D8prHhqB/Q2NZMyEiFNHZFPlA=="
+ }
+ },
+ "dependencies": {
+ "@clytage-pkg/eslint-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@clytage-pkg/eslint-config/-/eslint-config-1.1.0.tgz",
+ "integrity": "sha512-44ak3+VCpSiPqBYqthVYfCkkd7L+lPV2v/C3DuXx6dQeVqh0mP3t4bCTqiX3LoRtI0MMiHd0QpxNUq1FqaQbbg==",
+ "dev": true,
+ "requires": {}
+ },
+ "@discordjs/builders": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.13.0.tgz",
+ "integrity": "sha512-4L9y26KRNNU8Y7J78SRUN1Uhava9D8jfit/YqEaKi8gQRc7PdqKqk2poybo6RXaiyt/BgKYPfcjxT7WvzGfYCA==",
+ "requires": {
+ "@sapphire/shapeshift": "^2.0.0",
+ "@sindresorhus/is": "^4.6.0",
+ "discord-api-types": "^0.31.1",
+ "fast-deep-equal": "^3.1.3",
+ "ts-mixer": "^6.0.1",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "discord-api-types": {
+ "version": "0.31.2",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.31.2.tgz",
+ "integrity": "sha512-gpzXTvFVg7AjKVVJFH0oJGC0q0tO34iJGSHZNz9u3aqLxlD6LfxEs9wWVVikJqn9gra940oUTaPFizCkRDcEiA=="
+ }
+ }
+ },
+ "@discordjs/collection": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.6.0.tgz",
+ "integrity": "sha512-Ieaetb36l0nmAS5X9Upqk4W7euAO6FdXPxn3I8vBAKEcoIzEZI1mcVcPfCfagGJZSgBKpENnAnKkP4GAn+MV8w=="
+ },
+ "@discordjs/voice": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.9.0.tgz",
+ "integrity": "sha512-fSAYtPCEfIyG56hC2cRJuyfvQGr+aawSssLCqYg70vZ51dKO4spEKOB8V6vNMP5HnEplbhmxkB3YbshFKtnCQQ==",
+ "requires": {
+ "@types/ws": "^8.5.3",
+ "discord-api-types": "^0.29.0",
+ "prism-media": "^1.3.2",
+ "tiny-typed-emitter": "^2.1.0",
+ "tslib": "^2.3.1",
+ "ws": "^8.5.0"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
+ "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.2",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@messageformat/core": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@messageformat/core/-/core-3.0.1.tgz",
+ "integrity": "sha512-yxj2+0e46hcZqJfNf0ZYbC2q6WlcGoh4g11mCyRtTueR0AD8F9z4JMYAS1aOiFG8Vl1LZg/h5hZHKmWTAyZq8g==",
+ "requires": {
+ "@messageformat/date-skeleton": "^1.0.0",
+ "@messageformat/number-skeleton": "^1.0.0",
+ "@messageformat/parser": "^5.0.0",
+ "@messageformat/runtime": "^3.0.1",
+ "make-plural": "^7.0.0",
+ "safe-identifier": "^0.4.1"
+ }
+ },
+ "@messageformat/date-skeleton": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/date-skeleton/-/date-skeleton-1.0.0.tgz",
+ "integrity": "sha512-vvj5Sd3VyXUHGbYpiFsPsSQ8pkdUM9vrR/NUbyP6ga3UqJH4p9eCwzfwaCAZatZMYMTyiKG/8QbUyGKHeTZ5kw=="
+ },
+ "@messageformat/number-skeleton": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/number-skeleton/-/number-skeleton-1.0.0.tgz",
+ "integrity": "sha512-Pe1HX/VG0q7tclM/ri85I4FKYd7Uc3gluSZbRaK1+jcXdT9Biw2hLAKyMsiz2tM6zLiK1xX+K0NMDO4RIstQig=="
+ },
+ "@messageformat/parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.0.0.tgz",
+ "integrity": "sha512-WiDKhi8F0zQaFU8cXgqq69eYFarCnTVxKcvhAONufKf0oUxbqLMW6JX6rV4Hqh+BEQWGyKKKHY4g1XA6bCLylA==",
+ "requires": {
+ "moo": "^0.5.1"
+ }
+ },
+ "@messageformat/runtime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@messageformat/runtime/-/runtime-3.0.1.tgz",
+ "integrity": "sha512-6RU5ol2lDtO8bD9Yxe6CZkl0DArdv0qkuoZC+ZwowU+cdRlVE1157wjCmlA5Rsf1Xc/brACnsZa5PZpEDfTFFg==",
+ "requires": {
+ "make-plural": "^7.0.0"
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@sapphire/async-queue": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz",
+ "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g=="
+ },
+ "@sapphire/shapeshift": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-2.2.0.tgz",
+ "integrity": "sha512-UEnKgMlQyI0yY/q+lCMX0VJft9y86IsesgbIQj6e62FBYSaMVr+IaMNpi4z45Q14VnuMACbK0yrbHISNqgUYcQ=="
+ },
+ "@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="
+ },
+ "@swc/cli": {
+ "version": "0.1.57",
+ "resolved": "https://registry.npmjs.org/@swc/cli/-/cli-0.1.57.tgz",
+ "integrity": "sha512-HxM8TqYHhAg+zp7+RdTU69bnkl4MWdt1ygyp6BDIPjTiaJVH6Dizn2ezbgDS8mnFZI1FyhKvxU/bbaUs8XhzQg==",
+ "requires": {
+ "commander": "^7.1.0",
+ "fast-glob": "^3.2.5",
+ "slash": "3.0.0",
+ "source-map": "^0.7.3"
+ }
+ },
+ "@swc/core": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.2.194.tgz",
+ "integrity": "sha512-+Jg3qxad32CqnFmw4pqwm/5JCVWGkoM8P5pqPlyj5sokHFUJluMkCeaikuvIZhJCabR9q84lEnXlIjMu42ZfKA==",
+ "requires": {
+ "@swc/core-android-arm-eabi": "1.2.194",
+ "@swc/core-android-arm64": "1.2.194",
+ "@swc/core-darwin-arm64": "1.2.194",
+ "@swc/core-darwin-x64": "1.2.194",
+ "@swc/core-freebsd-x64": "1.2.194",
+ "@swc/core-linux-arm-gnueabihf": "1.2.194",
+ "@swc/core-linux-arm64-gnu": "1.2.194",
+ "@swc/core-linux-arm64-musl": "1.2.194",
+ "@swc/core-linux-x64-gnu": "1.2.194",
+ "@swc/core-linux-x64-musl": "1.2.194",
+ "@swc/core-win32-arm64-msvc": "1.2.194",
+ "@swc/core-win32-ia32-msvc": "1.2.194",
+ "@swc/core-win32-x64-msvc": "1.2.194"
+ }
+ },
+ "@swc/core-android-arm-eabi": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.194.tgz",
+ "integrity": "sha512-Hv/k9KN2Aab8jO/SmSlzKpzS941IXfdr9XEQRl/rc5Nj4neVW8AWS4+AJnl4u7MiJrfM0No6ZRQx32Ke+APmLQ==",
+ "optional": true
+ },
+ "@swc/core-android-arm64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-android-arm64/-/core-android-arm64-1.2.194.tgz",
+ "integrity": "sha512-/r2iah0khiv3xUbOT6upf1fdeGdKrVa8sghyTI0jPRpQ5GKD01nuEq+FlmieTwkQ0pQbgVKun0zyriAOXjLqWA==",
+ "optional": true
+ },
+ "@swc/core-darwin-arm64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.194.tgz",
+ "integrity": "sha512-pLsxgi985iSu+wqskJAO+kr0QwNqYQSyfdQEjCtWi5oYp3wIBPHLccIPVcIUfD6YAqXdqnQJg9RtA4scpdrQNg==",
+ "optional": true
+ },
+ "@swc/core-darwin-x64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.2.194.tgz",
+ "integrity": "sha512-WLFhotRbGqMKg9HwB0RF0Ycz6B6uSMEHcblAdBhiyL4fIp+CMUhkvC8jTs0xij/yJj96B6Xf9UH/Q5MFUQrJEw==",
+ "optional": true
+ },
+ "@swc/core-freebsd-x64": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.194.tgz",
+ "integrity": "sha512-UNG8G5TlYWvfyB7+Fc1h5hoSwEY1LLLth7V8DFMljd0dm2hcSpukuWaQk/GE3EANCE40nq3y4THEAlSu4lauSg==",
+ "optional": true
+ },
+ "@swc/core-linux-arm-gnueabihf": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.194.tgz",
+ "integrity": "sha512-mbk4MMgBf9BWFV0yqvReT29xZ6N6CLNgiG2UFnmXkLrrEBrAz5c3W8so5VqdyK52yWMS5Vs0a6VOvlimh057KA==",
+ "optional": true
+ },
+ "@swc/core-linux-arm64-gnu": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.194.tgz",
+ "integrity": "sha512-vdr2zUJnd67oQfXn1Ix0ueND+iEnCTwA4dobT4s0KsZCusJKuJlkm97p7rgk3Cxn2sHm/8BBQX4KpdXwNEL3Tw==",
+ "optional": true
+ },
+ "@swc/core-linux-arm64-musl": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.194.tgz",
+ "integrity": "sha512-wocEG55mu/KAFs1B9l1E0FbfU9nKaY3ULuT/isELHqDNZB23nNFRa+ymez/NqBhqVPhX4B0L+7j2r4tipXiI2A==",
+ "optional": true
+ },
+ "@swc/core-linux-x64-gnu": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.194.tgz",
+ "integrity": "sha512-PA7kudCtpGy1m40LKTeIsSse0zkmMyHthYjfn7q8pUWlo2b9o9RxO5zsnLxLsgATsoPwfMmVl9m3+1xSkxJp+g==",
+ "optional": true
+ },
+ "@swc/core-linux-x64-musl": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.194.tgz",
+ "integrity": "sha512-2CdLXLpdKqtZmFgcEOyw9Gu/24ku5/4NabSdYg58XGarrPS96lQk80rzaMYxs6AzfsfhHGmsp3se07jnLwSlXQ==",
+ "optional": true
+ },
+ "@swc/core-win32-arm64-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.194.tgz",
+ "integrity": "sha512-7NpBJ1fgeP8Y2H0aCTZR8nx0BEHXdSuFwBAwKrb4kaP0d2qVAVIv/rOk7L/MwsuXmlsISQ13JnUtQYjYPGJsUg==",
+ "optional": true
+ },
+ "@swc/core-win32-ia32-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.194.tgz",
+ "integrity": "sha512-1TP+kS32uFSgBHOJGmLNfxcqU7e85FZZTKAVAQgEPmHH0lJ/9BcViMDhMOdnyEWjIluD5aj6WdPdeAz1YlXDng==",
+ "optional": true
+ },
+ "@swc/core-win32-x64-msvc": {
+ "version": "1.2.194",
+ "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.194.tgz",
+ "integrity": "sha512-c3tiShCGY03XbJqXpliHRHMBBB/KGWS1kcbKn2GhaZN4fY8UgD5kZk3XJDwDJ6oqwlgkBdWXRAgD5Td2aAKMRg==",
+ "optional": true
+ },
+ "@szmarczak/http-timer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
+ "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "requires": {
+ "defer-to-connect": "^2.0.1"
+ }
+ },
+ "@types/cacheable-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz",
+ "integrity": "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==",
+ "requires": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "*",
+ "@types/node": "*",
+ "@types/responselike": "*"
+ }
+ },
+ "@types/http-cache-semantics": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+ },
+ "@types/i18n": {
+ "version": "0.13.2",
+ "resolved": "https://registry.npmjs.org/@types/i18n/-/i18n-0.13.2.tgz",
+ "integrity": "sha512-FdzABEs0NNi99xN+FgWAAeCenaNo+5jolCxr2RhQrySinNPH8rkgjbw6OMGW9+HSgnGeuI7C6y2lC83m6JN3bg==",
+ "dev": true
+ },
+ "@types/json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/node": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.33.tgz",
+ "integrity": "sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ=="
+ },
+ "@types/node-fetch": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz",
+ "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==",
+ "requires": {
+ "@types/node": "*",
+ "form-data": "^3.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@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": "*"
+ }
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz",
+ "integrity": "sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/type-utils": "5.26.0",
+ "@typescript-eslint/utils": "5.26.0",
+ "debug": "^4.3.4",
+ "functional-red-black-tree": "^1.0.1",
+ "ignore": "^5.2.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.26.0.tgz",
+ "integrity": "sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/typescript-estree": "5.26.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz",
+ "integrity": "sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/visitor-keys": "5.26.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz",
+ "integrity": "sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/utils": "5.26.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.26.0.tgz",
+ "integrity": "sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz",
+ "integrity": "sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/visitor-keys": "5.26.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.26.0.tgz",
+ "integrity": "sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@typescript-eslint/scope-manager": "5.26.0",
+ "@typescript-eslint/types": "5.26.0",
+ "@typescript-eslint/typescript-estree": "5.26.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz",
+ "integrity": "sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.26.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "acorn": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
+ "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "async": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
+ "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "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==",
+ "dev": true
+ },
+ "boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "cacheable-lookup": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.0.4.tgz",
+ "integrity": "sha512-mbcDEZCkv2CZF4G01kr8eBd/5agkt9oCqz75tJMSIsquvRZ2sL6Hi5zGVKi/0OSC9oO1GHfJ2AV0ZIOY9vye0A=="
+ },
+ "cacheable-request": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+ "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+ }
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "requires": {
+ "mimic-response": "^1.0.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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
+ },
+ "compress-brotli": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz",
+ "integrity": "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==",
+ "requires": {
+ "@types/json-buffer": "~3.0.0",
+ "json-buffer": "~3.0.1"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "date-fns": {
+ "version": "2.28.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz",
+ "integrity": "sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw=="
+ },
+ "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"
+ }
+ },
+ "decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "requires": {
+ "mimic-response": "^3.1.0"
+ },
+ "dependencies": {
+ "mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+ }
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "discord-api-types": {
+ "version": "0.29.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.29.0.tgz",
+ "integrity": "sha512-Ekq1ICNpOTVajXKZguNFrsDeTmam+ZeA38txsNLZnANdXUjU6QBPIZLUQTC6MzigFGb0Tt8vk4xLnXmzv0shNg=="
+ },
+ "discord.js": {
+ "version": "13.7.0",
+ "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.7.0.tgz",
+ "integrity": "sha512-iV/An3FEB/CiBGdjWHRtgskM4UuWPq5vjhjKsrQhdVU16dbKrBxA+eIV2HWA07B3tXUGM6eco1wkr42gxxV1BA==",
+ "requires": {
+ "@discordjs/builders": "^0.13.0",
+ "@discordjs/collection": "^0.6.0",
+ "@sapphire/async-queue": "^1.3.1",
+ "@types/node-fetch": "^2.6.1",
+ "@types/ws": "^8.5.3",
+ "discord-api-types": "^0.30.0",
+ "form-data": "^4.0.0",
+ "node-fetch": "^2.6.1",
+ "ws": "^8.6.0"
+ },
+ "dependencies": {
+ "discord-api-types": {
+ "version": "0.30.0",
+ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.30.0.tgz",
+ "integrity": "sha512-wYst0jrT8EJs2tVlwUTQ2xT0oWMjUrRMpFTkNY3NMleWyQNHgWaKhqFfxdLPdC2im9IuR5EsxcEgjhf/npeftw=="
+ }
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dotenv": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+ "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
+ },
+ "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"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.16.0.tgz",
+ "integrity": "sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.3.0",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.2",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.15.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
+ "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
+ "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
+ "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.7.1",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "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-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fast-printf": {
+ "version": "1.6.9",
+ "resolved": "https://registry.npmjs.org/fast-printf/-/fast-printf-1.6.9.tgz",
+ "integrity": "sha512-FChq8hbz65WMj4rstcQsFB0O7Cy++nmbNfLYnD9cYv2cRn8EG6k/MGn9kO/tjO66t09DLDugj3yL+V2o6Qftrg==",
+ "requires": {
+ "boolean": "^3.1.4"
+ }
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
+ "fluent-ffmpeg": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz",
+ "integrity": "sha1-yVLeIkD4EuvaCqgAbXd27irPfXQ=",
+ "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.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.0.tgz",
+ "integrity": "sha512-aExlJShTV4qOUOL7yF1U5tvLCB0xQuudbf6toyYA0E/acBNw71mvjFTnLaRp50aQaYocMR0a/RMMBIHeZnGyjQ=="
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "form-data-encoder": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz",
+ "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
+ "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": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
+ "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "got": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz",
+ "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==",
+ "requires": {
+ "@sindresorhus/is": "^4.6.0",
+ "@szmarczak/http-timer": "^5.0.1",
+ "@types/cacheable-request": "^6.0.2",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^6.0.4",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "form-data-encoder": "1.7.1",
+ "get-stream": "^6.0.1",
+ "http2-wrapper": "^2.1.10",
+ "lowercase-keys": "^3.0.0",
+ "p-cancelable": "^3.0.0",
+ "responselike": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ },
+ "http2-wrapper": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz",
+ "integrity": "sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ==",
+ "requires": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.2.0"
+ }
+ },
+ "i18n": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/i18n/-/i18n-0.15.0.tgz",
+ "integrity": "sha512-TUOkuFbl8Y/q7zF0tHdtpk1/TtxH0T+Drp2NFrHhmN1Qs0Sob9/0uVLS2BPVkEXNh2jZrimOiFJk+tkaOumzog==",
+ "requires": {
+ "@messageformat/core": "^3.0.0",
+ "debug": "^4.3.3",
+ "fast-printf": "^1.6.9",
+ "make-plural": "^7.0.0",
+ "math-interval-parser": "^2.0.1",
+ "mustache": "^4.2.0"
+ }
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "keyv": {
+ "version": "4.2.9",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.2.9.tgz",
+ "integrity": "sha512-vqRBrN4xQHud7UMAGzGGFbt96MtGB9pb0OOg8Dhtq5RtiswCb1pCFq878iqC4hdeOP6eDPnCoFxA+2TXx427Ow==",
+ "requires": {
+ "compress-brotli": "^1.3.8",
+ "json-buffer": "3.0.1"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "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=="
+ },
+ "lowercase-keys": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
+ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-plural": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/make-plural/-/make-plural-7.1.0.tgz",
+ "integrity": "sha512-PKkwVlAxYVo98NrbclaQIT4F5Oy+X58PZM5r2IwUSCe3syya6PXkIRCn2XCdz7p58Scgpp50PBeHmepXVDG3hg=="
+ },
+ "math-interval-parser": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/math-interval-parser/-/math-interval-parser-2.0.1.tgz",
+ "integrity": "sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA=="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "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-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "moo": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
+ "integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w=="
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "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"
+ }
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "opusscript": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/opusscript/-/opusscript-0.0.8.tgz",
+ "integrity": "sha512-VSTi1aWFuCkRCVq+tx/BQ5q9fMnQ9pVZ3JU4UHKqTkf0ED3fKEPdr+gKAAl3IA2hj9rrP6iyq3hlcJq3HELtNQ=="
+ },
+ "p-cancelable": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
+ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ },
+ "play-audio": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/play-audio/-/play-audio-0.5.2.tgz",
+ "integrity": "sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==",
+ "optional": true
+ },
+ "play-dl": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/play-dl/-/play-dl-1.9.4.tgz",
+ "integrity": "sha512-/NiD3rpZw/5zbtUhF87AQEmHYLBD5QhtCD/9c3b47xvZMxCO3eHLEN5G1h/b/lC1lCp+xj5BpdYefOrIbDhBUQ==",
+ "optional": true,
+ "requires": {
+ "play-audio": "^0.5.2"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
+ "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "prism-media": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.2.tgz",
+ "integrity": "sha512-L6UsGHcT6i4wrQhFF1aPK+MNYgjRqR2tUoIqEY+CG1NqVkMjPRKzS37j9f8GiYPlD6wG9ruBj+q5Ax+bH8Ik1g==",
+ "requires": {}
+ },
+ "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==",
+ "dev": true
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
+ "quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "responselike": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
+ "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+ "requires": {
+ "lowercase-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+ }
+ }
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "safe-identifier": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
+ "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w=="
+ },
+ "semver": {
+ "version": "7.3.7",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+ "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ },
+ "soundcloud.ts": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.6.tgz",
+ "integrity": "sha512-h0Y0n7J/Ubzhnr5497/Co3k3ZB0h6bB6n2x5PhNNX2E/+lizMPu9VGYSGcgZROihZxGUQ1711iGlFVnHFeOvng==",
+ "requires": {
+ "audioconcat": "^0.1.4",
+ "axios": "^0.21.1"
+ }
+ },
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "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=="
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+ },
+ "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=="
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
+ "tweetnacl": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz",
+ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "typescript": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.2.tgz",
+ "integrity": "sha512-Mamb1iX2FDUpcTRzltPxgWMKy3fhg0TN378ylbktPGPK/99KbDtMQ4W1hwgsbPAsG3a0xKa1vmw4VKZQbkvz5A==",
+ "dev": true
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "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==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "ws": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz",
+ "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==",
+ "requires": {}
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "youtubei": {
+ "version": "0.0.1-rc.35",
+ "resolved": "https://registry.npmjs.org/youtubei/-/youtubei-0.0.1-rc.35.tgz",
+ "integrity": "sha512-OXq3/7s6rhT0ejwbQm5r3uW0qCs6PUhboMFy3ZdUx4JdSY2WDr44DOdKtzPh4D8prHhqB/Q2NZMyEiFNHZFPlA=="
+ }
+ }
}
diff --git a/package.json b/package.json
index a4322eb3d..0e75f9f2a 100644
--- a/package.json
+++ b/package.json
@@ -1,58 +1,87 @@
{
- "name": "rawon",
- "version": "2.4.0",
- "private": true,
- "description": "A dedicated open-sourced Discord bot with many features of utilization. Easy to use, and with no coding required.",
- "repository": "https://github.com/mzrtamp/rawon",
- "license": "BSD-3-Clause",
- "author": "mzrtamp ",
- "main": "index.js",
- "scripts": {
- "build": "npm run lint && npm run compile",
- "compile": "npx sucrase src -d dist --transforms typescript,imports",
- "tscompile": "tsc --build tsconfig.json",
- "lint": "eslint . --ext .ts",
- "lint:fix": "eslint . --ext .ts --fix",
- "start": "node -r dotenv/config ."
- },
- "eslintConfig": {
- "parserOptions": {
- "project": "./tsconfig.json"
- },
- "extends": "@zhycorp/eslint-config/typescript",
- "rules": {
- "@typescript-eslint/no-extra-parens": "off"
- }
- },
- "dependencies": {
- "@discordjs/voice": "^0.8.0",
- "date-fns": "^2.28.0",
- "discord.js": "^13.6.0",
- "dotenv": "^16.0.0",
- "got": "^11.8.3",
- "i18n": "0.14.1",
- "opusscript": "^0.0.8",
- "prism-media": "^1.3.2",
- "soundcloud.ts": "^0.4.1",
- "sucrase": "^3.20.3",
- "tslib": "^2.3.1",
- "tweetnacl": "^1.0.3",
- "youtubei": "^0.0.1-rc.28"
- },
- "devDependencies": {
- "@types/i18n": "^0.13.2",
- "@types/node": "^17.0.15",
- "@typescript-eslint/eslint-plugin": "^5.10.2",
- "@typescript-eslint/parser": "^5.10.2",
- "@zhycorp/eslint-config": "^7.1.0",
- "eslint": "^8.8.0",
- "typescript": "^4.5.5"
- },
- "engines": {
- "node": ">=16.6.0"
- },
- "optionalDependencies": {
- "play-dl": "^1.8.1",
- "youtube-dl-exec": "^2.0.2"
- }
+ "name": "rawon",
+ "version": "3.0.0",
+ "description": "A simple powerful Discord music bot built to fulfill your production desires. Easy to use, with no coding required.",
+ "main": "index.js",
+ "type": "module",
+ "scripts": {
+ "build": "npm run lint && npm run compile",
+ "compile": "npx swc src -d dist",
+ "tscompile": "tsc --build tsconfig.json",
+ "lint": "eslint . --ignore-path .gitignore --ext .ts",
+ "lint:fix": "eslint . --ignore-path .gitignore --ext .ts --fix",
+ "pretty": "prettier --check src/**/*.ts",
+ "pretty:write": "prettier --write src/**/*.ts",
+ "start": "node --es-module-specifier-resolution=node -r dotenv/config .",
+ "start:dev": "rimraf ./dist && npm run compile && npm start"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/Clytage/rawon.git"
+ },
+ "author": "Clytage ",
+ "license": "BSD-3-Clause",
+ "bugs": {
+ "url": "https://github.com/Clytage/rawon/issues"
+ },
+ "homepage": "https://github.com/Clytage/rawon#readme",
+ "engines": {
+ "node": ">=16.6.0",
+ "npm": ">=7.0.0"
+ },
+ "eslintConfig": {
+ "extends": [
+ "@clytage-pkg/eslint-config/typescript",
+ "prettier"
+ ],
+ "plugins": [
+ "prettier"
+ ],
+ "ignorePatterns": [
+ "dist/*",
+ "index.js",
+ "yt-dlp-utils/"
+ ],
+ "rules": {
+ "@typescript-eslint/no-extra-parens": "off"
+ }
+ },
+ "prettier": {
+ "tabWidth": 4,
+ "trailingComma": "none",
+ "arrowParens": "avoid",
+ "printWidth": 120
+ },
+ "dependencies": {
+ "@discordjs/voice": "0.9.0",
+ "@swc/cli": "0.1.57",
+ "@swc/core": "1.2.194",
+ "date-fns": "2.28.0",
+ "discord.js": "13.7.0",
+ "dotenv": "16.0.1",
+ "got": "12.1.0",
+ "i18n": "0.15.0",
+ "opusscript": "0.0.8",
+ "prism-media": "1.3.2",
+ "soundcloud.ts": "0.4.6",
+ "tslib": "2.4.0",
+ "tweetnacl": "1.0.3",
+ "youtubei": "0.0.1-rc.35"
+ },
+ "devDependencies": {
+ "@clytage-pkg/eslint-config": "1.1.0",
+ "@types/i18n": "0.13.2",
+ "@types/node": "17.0.33",
+ "@typescript-eslint/eslint-plugin": "5.26.0",
+ "@typescript-eslint/parser": "5.26.0",
+ "eslint": "8.16.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-prettier": "^4.0.0",
+ "prettier": "^2.6.2",
+ "rimraf": "^3.0.2",
+ "typescript": "4.7.2"
+ },
+ "optionalDependencies": {
+ "play-dl": "^1.9.4"
+ }
}
diff --git a/src/bot.ts b/src/bot.ts
index 74e79f54d..09a0bc54a 100644
--- a/src/bot.ts
+++ b/src/bot.ts
@@ -1,21 +1,22 @@
-import { NoStackError } from "./utils/NoStackError";
-import { clientOptions } from "./config";
+import { NoStackError } from "./utils/structures/NoStackError";
import { Rawon } from "./structures/Rawon";
+import { clientOptions } from "./config";
const client = new Rawon(clientOptions);
-process.on("exit", code => {
- client.logger.info(`NodeJS process exited with code ${code}`);
-});
-process.on("uncaughtException", err => {
- client.logger.error("UNCAUGHT_EXCEPTION:", err);
- client.logger.warn("Uncaught Exception detected, trying to restart...");
- process.exit(1);
-});
-process.on("unhandledRejection", reason => {
- client.logger.error("UNHANDLED_REJECTION:", (reason as Error).stack ? reason : new NoStackError(reason as string));
-});
-process.on("warning", (...args) => client.logger.warn(...args));
+process
+ .on("exit", code => client.logger.info(`NodeJS process exited with code ${code}`))
+ .on("unhandledRejection", reason =>
+ client.logger.error(
+ "UNHANDLED_REJECTION:",
+ (reason as Error).stack ? reason : new NoStackError(reason as string)
+ )
+ )
+ .on("warning", (...args) => client.logger.warn(...args))
+ .on("uncaughtException", err => {
+ client.logger.error("UNCAUGHT_EXCEPTION:", err);
+ client.logger.warn("Uncaught Exception detected, trying to restart...");
+ process.exit(1);
+ });
-client.build()
- .catch(e => client.logger.error("PROMISE_ERR:", e));
+client.build().catch(e => client.logger.error("PROMISE_ERR:", e));
diff --git a/src/commands/developers/EvalCommand.ts b/src/commands/developers/EvalCommand.ts
index b5379b8cf..863273406 100644
--- a/src/commands/developers/EvalCommand.ts
+++ b/src/commands/developers/EvalCommand.ts
@@ -1,63 +1,51 @@
-/* eslint-disable @typescript-eslint/no-unused-vars, no-eval */
+/* eslint-disable @typescript-eslint/no-unused-vars, no-eval, prefer-named-capture-group */
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
import { inspect } from "util";
+@Command({
+ aliases: ["evaluate", "ev", "js-exec"],
+ cooldown: 0,
+ description: i18n.__("commands.developers.eval.description"),
+ devOnly: true,
+ name: "eval",
+ usage: i18n.__("commands.developers.eval.usage")
+})
export class EvalCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["evaluate", "ev", "js-exec"],
- cooldown: 0,
- description: i18n.__("commands.developers.eval.description"),
- devOnly: true,
- name: "eval",
- usage: i18n.__("commands.developers.eval.usage")
- });
- }
-
public async execute(ctx: CommandContext): Promise {
const msg = ctx;
const client = this.client;
- const embed = createEmbed("info")
- .addField("Input", `\`\`\`js\n${ctx.args.join(" ")}\`\`\``);
+ const code = ctx.args
+ .join(" ")
+ .replace(/^\s*\n?(```(?:[^\s]+\n)?(.*?)```|.*)$/s, (_, a: string, b) => (a.startsWith("```") ? b : a));
+ const embed = createEmbed("info").addField("Input", `\`\`\`js\n${code}\`\`\``);
try {
- let code = ctx.args.join(" ");
- if (!code) return await ctx.send({ embeds: [createEmbed("error", i18n.__("commands.developers.eval.noCode"), true)] });
- let evaled;
- if (code.includes("--silent") && code.includes("--async")) {
- code = code.replace("--async", "").replace("--silent", "");
- await eval(`(async () => {
- ${code}
- })()`);
- return;
- } else if (code.includes("--async")) {
- code = code.replace("--async", "");
- evaled = await eval(`(async () => {
- ${code}
- })()`);
- } else if (code.includes("--silent")) {
- code = code.replace("--silent", "");
- await eval(code);
- return;
- } else {
- evaled = await eval(code);
- }
- if (typeof evaled !== "string") {
- evaled = inspect(evaled, {
- depth: 0
+ if (!code) {
+ return await ctx.send({
+ embeds: [createEmbed("error", i18n.__("commands.developers.eval.noCode"), true)]
});
}
- const output = this.clean(evaled);
- if (output.length > 1024) {
- const hastebin = await this.hastebin(output);
- embed.addField(i18n.__("commands.developers.eval.outputString"), `${hastebin}.js`);
- } else { embed.addField(i18n.__("commands.developers.eval.outputString"), `\`\`\`js\n${output}\`\`\``); }
+ const isAsync = /.* --async( +)?(--silent)?$/.test(code);
+ const isSilent = /.* --silent( +)?(--async)?$/.test(code);
+ const toExecute =
+ isAsync || isSilent ? code.replace(/--(async|silent)( +)?(--(silent|async))?$/, "") : code;
+ const evaled = inspect(await eval(isAsync ? `(async () => {\n${toExecute}\n})()` : toExecute), {
+ depth: 0
+ });
+
+ if (isSilent) return;
+
+ const cleaned = this.clean(evaled);
+ const output = cleaned.length > 1024 ? `${await this.hastebin(cleaned)}.js` : `\`\`\`js\n${cleaned}\`\`\``;
+
+ embed.addField(i18n.__("commands.developers.eval.outputString"), output);
ctx.send({
askDeletion: {
reference: ctx.author.id
@@ -65,11 +53,11 @@ export class EvalCommand extends BaseCommand {
embeds: [embed]
}).catch(e => this.client.logger.error("PROMISE_ERR:", e));
} catch (e) {
- const error = this.clean(e as string);
- if (error.length > 1024) {
- const hastebin = await this.hastebin(error);
- embed.addField(i18n.__("commands.developers.eval.errorString"), `${hastebin}.js`);
- } else { embed.setColor("RED").addField("Error", `\`\`\`js\n${error}\`\`\``); }
+ const cleaned = this.clean(String(e));
+ const isTooLong = cleaned.length > 1024;
+ const error = isTooLong ? `${await this.hastebin(cleaned)}.js` : `\`\`\`js\n${cleaned}\`\`\``;
+
+ embed.setColor("RED").addField(i18n.__("commands.developers.eval.errorString"), error);
ctx.send({
askDeletion: {
reference: ctx.author.id
@@ -81,20 +69,19 @@ export class EvalCommand extends BaseCommand {
// eslint-disable-next-line class-methods-use-this
private clean(text: string): string {
- if (typeof text === "string") {
- return text
- .replace(new RegExp(process.env.DISCORD_TOKEN!, "g"), "[REDACTED]")
- .replace(/`/g, `\`${String.fromCharCode(8203)}`)
- .replace(/@/g, `@${String.fromCharCode(8203)}`);
- }
- return text;
+ return text
+ .replace(new RegExp(process.env.DISCORD_TOKEN!, "g"), "[REDACTED]")
+ .replace(/`/g, `\`${String.fromCharCode(8203)}`)
+ .replace(/@/g, `@${String.fromCharCode(8203)}`);
}
private async hastebin(text: string): Promise {
- const result = await this.client.request.post("https://bin.tiramitzu.me/documents", {
- body: text
- }).json<{ key: string }>();
+ const result = await this.client.request
+ .post("https://bin.clytage.org/documents", {
+ body: text
+ })
+ .json<{ key: string }>();
- return `https://bin.tiramitzu.me/${result.key}`;
+ return `https://bin.clytage.org/${result.key}`;
}
}
diff --git a/src/commands/developers/category.meta.ts b/src/commands/developers/category.meta.ts
index a07d333d2..a9e82d76e 100644
--- a/src/commands/developers/category.meta.ts
+++ b/src/commands/developers/category.meta.ts
@@ -5,4 +5,4 @@ const category = {
hide: false
};
-export = category;
+export default category;
diff --git a/src/commands/general/AboutCommand.ts b/src/commands/general/AboutCommand.ts
index b39b05cd7..928657012 100644
--- a/src/commands/general/AboutCommand.ts
+++ b/src/commands/general/AboutCommand.ts
@@ -1,26 +1,26 @@
import { CommandContext } from "../../structures/CommandContext";
-import { version as BotVersion } from "../../../package.json";
-import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { formatMS } from "../../utils/formatMS";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { createTable } from "../../utils/functions/createTable";
+import { BaseCommand } from "../../structures/BaseCommand";
+import { formatMS } from "../../utils/functions/formatMS";
+import { Command } from "../../utils/decorators/Command";
+import rawonData from "../../../package.json";
import i18n from "../../config";
import { version as DJSVersion } from "discord.js";
import { uptime } from "os";
-export class AboutCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["information", "info", "botinfo", "stats"],
- description: i18n.__("commands.general.about.description"),
- name: "about",
- slash: {
- options: []
- },
- usage: "{prefix}about"
- });
- }
+const { version: BotVersion } = rawonData;
+@Command({
+ aliases: ["information", "info", "botinfo", "stats"],
+ description: i18n.__("commands.general.about.description"),
+ name: "about",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}about"
+})
+export class AboutCommand extends BaseCommand {
public execute(ctx: CommandContext): void {
const values = [
[i18n.__("commands.general.about.osUptimeString"), formatMS(uptime() * 1000)],
@@ -32,21 +32,20 @@ export class AboutCommand extends BaseCommand {
[i18n.__("commands.general.about.ffmpegVersionString"), this.client.utils.getFFmpegVersion()],
[i18n.__("commands.general.about.botVersionString"), BotVersion],
[""],
- [i18n.__("commands.general.about.sourceCodeString"), "https://github.com/mzrtamp/rawon"]
+ [i18n.__("commands.general.about.sourceCodeString"), "https://github.com/Clytage/rawon"]
];
const value = createTable(values);
- void ctx.reply({
- embeds: [
- createEmbed("info", `
-\`\`\`asciidoc
-${value}
-\`\`\`
- `)
- .setAuthor({
- name: i18n.__mf("commands.general.about.aboutFooter", { botname: this.client.user?.username ?? "Unknown" })
+ void ctx
+ .reply({
+ embeds: [
+ createEmbed("info", `\`\`\`asciidoc\n${value}\n\`\`\``).setAuthor({
+ name: i18n.__mf("commands.general.about.aboutFooter", {
+ botname: this.client.user?.username ?? "Unknown"
+ })
})
- ]
- }).catch(e => this.client.logger.error("ABOUT_CMD_ERR:", e));
+ ]
+ })
+ .catch(e => this.client.logger.error("ABOUT_CMD_ERR:", e));
}
}
diff --git a/src/commands/general/HelpCommand.ts b/src/commands/general/HelpCommand.ts
index 00cd25b1b..6d4bb513f 100644
--- a/src/commands/general/HelpCommand.ts
+++ b/src/commands/general/HelpCommand.ts
@@ -1,76 +1,92 @@
/* eslint-disable @typescript-eslint/no-non-null-asserted-optional-chain, @typescript-eslint/no-unnecessary-condition */
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
-import { Message, MessageActionRow, MessageSelectMenu, MessageSelectOptionData, SelectMenuInteraction } from "discord.js";
+import {
+ Message,
+ MessageActionRow,
+ MessageSelectMenu,
+ MessageSelectOptionData,
+ SelectMenuInteraction
+} from "discord.js";
+@Command({
+ aliases: ["h", "command", "commands", "cmd", "cmds"],
+ description: i18n.__("commands.general.help.description"),
+ name: "help",
+ slash: {
+ options: [
+ {
+ type: "STRING",
+ name: "command",
+ description: i18n.__("commands.general.help.slashDescription")
+ }
+ ]
+ },
+ usage: i18n.__("commands.general.help.usage")
+})
export class HelpCommand extends BaseCommand {
private readonly listEmbed = createEmbed("info")
.setAuthor({
- name: i18n.__mf("commands.general.help.authorString", { username: this.client.user!.username }),
+ name: i18n.__mf("commands.general.help.authorString", {
+ username: this.client.user!.username
+ }),
iconURL: this.client.user?.displayAvatarURL()!
})
.setFooter({
- text: i18n.__mf("commands.general.help.footerString", { prefix: this.client.config.mainPrefix }),
- iconURL: "https://raw.githubusercontent.com/mzrtamp/rawon/main/.github/images/info.png"
+ text: i18n.__mf("commands.general.help.footerString", {
+ prefix: this.client.config.mainPrefix
+ }),
+ iconURL: "https://api.clytage.org/assets/images/information.png"
});
- private readonly infoEmbed = createEmbed("info")
- .setThumbnail("https://raw.githubusercontent.com/mzrtamp/rawon/main/.github/images/question_mark.png");
-
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["h", "command", "commands", "cmd", "cmds"],
- description: i18n.__("commands.general.help.description"),
- name: "help",
- slash: {
- options: [
- {
- type: "STRING",
- name: "command",
- description: i18n.__("commands.general.help.slashDescription")
- }
- ]
- },
- usage: i18n.__("commands.general.help.usage")
- });
- }
+ private readonly infoEmbed = createEmbed("info").setThumbnail(
+ "https://api.clytage.org/assets/images/question_mark.png"
+ );
public async execute(ctx: CommandContext): Promise {
if (ctx.isInteraction() && !ctx.deferred) await ctx.deferReply();
this.infoEmbed.fields = [];
- const val = ctx.args[0] ?? ctx.options?.getString("command") ?? (ctx.additionalArgs.get("values") ? (ctx.additionalArgs.get("values") as string[])[0] : null);
- const command = this.client.commands.get(val) ?? this.client.commands.get(this.client.commands.aliases.get(val)!);
+ const val =
+ ctx.args[0] ??
+ ctx.options?.getString("command") ??
+ (ctx.additionalArgs.get("values") ? (ctx.additionalArgs.get("values") as string[])[0] : null);
+ const command =
+ this.client.commands.get(val) ?? this.client.commands.get(this.client.commands.aliases.get(val)!);
if (!val) {
- const embed = this.listEmbed
- .setThumbnail(ctx.guild!.iconURL({ dynamic: true, format: "png", size: 2048 })!);
+ const embed = this.listEmbed.setThumbnail(
+ ctx.guild!.iconURL({ dynamic: true, format: "png", size: 1024 })!
+ );
+
this.listEmbed.fields = [];
- for (const category of [...this.client.commands.categories.values()]) {
- const isDev = this.client.config.owners.includes(ctx.author.id);
- const cmds = category.cmds.filter(c => isDev ? true : !c.meta.devOnly).map(c => `\`${c.meta.name}\``);
+ for (const category of this.client.commands.categories.values()) {
+ const isDev = this.client.config.devs.includes(ctx.author.id);
+ const cmds = category.cmds.filter(c => (isDev ? true : !c.meta.devOnly)).map(c => `\`${c.meta.name}\``);
if (cmds.length === 0) continue;
if (category.hide && !isDev) continue;
embed.addField(`**${category.name}**`, cmds.join(", "));
}
- ctx.send({ embeds: [embed] }, "editReply").catch(e => {
- this.client.logger.error("PROMISE_ERR:", e);
- });
+
+ ctx.send({ embeds: [embed] }, "editReply").catch(e => this.client.logger.error("PROMISE_ERR:", e));
return;
}
if (!command) {
const matching = this.generateSelectMenu(val, ctx.author.id);
if (!matching.length) {
- return ctx.send({
- embeds: [
- createEmbed("error", i18n.__("commands.general.help.noCommand"), true)
- ]
- }, "editReply");
+ return ctx.send(
+ {
+ embeds: [createEmbed("error", i18n.__("commands.general.help.noCommand"), true)]
+ },
+ "editReply"
+ );
}
- return ctx.send({
- components: [
- new MessageActionRow()
- .addComponents(
+
+ return ctx.send(
+ {
+ components: [
+ new MessageActionRow().addComponents(
new MessageSelectMenu()
.setMinValues(1)
.setMaxValues(1)
@@ -78,14 +94,18 @@ export class HelpCommand extends BaseCommand {
.addOptions(matching)
.setPlaceholder(i18n.__("commands.general.help.commandSelectionString"))
)
- ],
- embeds: [createEmbed("error", i18n.__("commands.general.help.noCommanSuggest"), true)]
- }, "editReply");
+ ],
+ embeds: [createEmbed("error", i18n.__("commands.general.help.noCommanSuggest"), true)]
+ },
+ "editReply"
+ );
}
// Disable selection menu
if (ctx.isSelectMenu()) {
const channel = ctx.channel;
- const msg = await channel!.messages.fetch((ctx.context as SelectMenuInteraction).message.id).catch(() => undefined);
+ const msg = await channel!.messages
+ .fetch((ctx.context as SelectMenuInteraction).message.id)
+ .catch(() => undefined);
if (msg !== undefined) {
const selection = msg.components[0].components.find(x => x.type === "SELECT_MENU");
selection!.setDisabled(true);
@@ -93,39 +113,63 @@ export class HelpCommand extends BaseCommand {
}
}
// Return information embed
- return ctx.send({
- embeds: [
- this.infoEmbed
- .setAuthor({
- name: i18n.__mf("commands.general.help.commandDetailTitle", { username: this.client.user!.username, command: command.meta.name }),
- iconURL: this.client.user?.displayAvatarURL()!
- })
- .addField(i18n.__("commands.general.help.nameString"), `**\`${command.meta.name}\`**`, false)
- .addField(i18n.__("commands.general.help.descriptionString"), `${command.meta.description!}`, true)
- .addField(i18n.__("commands.general.help.aliasesString"), Number(command.meta.aliases?.length) > 0 ? command.meta.aliases?.map(c => `**\`${c}\`**`).join(", ")! : "None.", false)
- .addField(i18n.__("commands.general.help.usageString"), `**\`${command.meta.usage!.replace(/{prefix}/g, this.client.config.mainPrefix)}\`**`, true)
- .setFooter({
- text: i18n.__mf("commands.general.help.commandUsageFooter", { devOnly: command.meta.devOnly ? "(developer-only command)" : "" }),
- iconURL: "https://raw.githubusercontent.com/mzrtamp/rawon/.github/images/info.png"
- })
- ]
- }, "editReply");
+ return ctx.send(
+ {
+ embeds: [
+ this.infoEmbed
+ .setAuthor({
+ name: i18n.__mf("commands.general.help.commandDetailTitle", {
+ username: this.client.user!.username,
+ command: command.meta.name
+ }),
+ iconURL: this.client.user?.displayAvatarURL()!
+ })
+ .addField(i18n.__("commands.general.help.nameString"), `**\`${command.meta.name}\`**`, false)
+ .addField(
+ i18n.__("commands.general.help.descriptionString"),
+ `${command.meta.description!}`,
+ true
+ )
+ .addField(
+ i18n.__("commands.general.help.aliasesString"),
+ Number(command.meta.aliases?.length) > 0
+ ? command.meta.aliases?.map(c => `**\`${c}\`**`).join(", ")!
+ : "None.",
+ false
+ )
+ .addField(
+ i18n.__("commands.general.help.usageString"),
+ `**\`${command.meta.usage!.replace(/{prefix}/g, this.client.config.mainPrefix)}\`**`,
+ true
+ )
+ .setFooter({
+ text: i18n.__mf("commands.general.help.commandUsageFooter", {
+ devOnly: command.meta.devOnly ? "(developer-only command)" : ""
+ }),
+ iconURL: "https://api.clytage.org/assets/images/information.png"
+ })
+ ]
+ },
+ "editReply"
+ );
}
private generateSelectMenu(cmd: string, author: string): MessageSelectOptionData[] {
const emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟"];
- const matching = [...this.client.commands.values()].filter(x => {
- const isDev = this.client.config.owners.includes(author);
- if (isDev) return x.meta.name.includes(cmd);
- return x.meta.name.includes(cmd) && !x.meta.devOnly;
- }).slice(0, 10).map((x, i) => (
- {
+ const matching = [...this.client.commands.values()]
+ .filter(x => {
+ const isDev = this.client.config.devs.includes(author);
+ if (isDev) return x.meta.name.includes(cmd);
+ return x.meta.name.includes(cmd) && !x.meta.devOnly;
+ })
+ .slice(0, 10)
+ .map((x, i) => ({
label: x.meta.name,
emoji: emojis[i],
- description: x.meta.description!.length > 47 ? `${x.meta.description!.substr(0, 47)}...` : x.meta.description!,
+ description:
+ x.meta.description!.length > 47 ? `${x.meta.description!.slice(0, 47)}...` : x.meta.description!,
value: x.meta.name
- }
- ));
+ }));
return matching;
}
}
diff --git a/src/commands/general/InviteCommand.ts b/src/commands/general/InviteCommand.ts
index e49e61826..3889ee493 100644
--- a/src/commands/general/InviteCommand.ts
+++ b/src/commands/general/InviteCommand.ts
@@ -1,22 +1,20 @@
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Permissions } from "discord.js";
+@Command({
+ aliases: ["inv"],
+ description: i18n.__("commands.general.invite.description"),
+ name: "invite",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}invite"
+})
export class InviteCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["inv"],
- description: i18n.__("commands.general.invite.description"),
- name: "invite",
- slash: {
- options: []
- },
- usage: "{prefix}invite"
- });
- }
-
public async execute(ctx: CommandContext): Promise {
const invite = this.client.generateInvite({
permissions: [
@@ -37,11 +35,22 @@ export class InviteCommand extends BaseCommand {
],
scopes: ["bot", "applications.commands"]
});
- await ctx.send({
- embeds: [createEmbed("info", i18n.__mf("commands.general.invite.clickURL", { url: invite })).setAuthor({
- name: i18n.__mf("commands.general.invite.inviteTitle", { bot: this.client.user?.username }),
- iconURL: this.client.user!.displayAvatarURL()
- })]
- }).catch(e => this.client.logger.error("PLAY_CMD_ERR:", e));
+ await ctx
+ .send({
+ embeds: [
+ createEmbed(
+ "info",
+ i18n.__mf("commands.general.invite.clickURL", {
+ url: invite
+ })
+ ).setAuthor({
+ name: i18n.__mf("commands.general.invite.inviteTitle", {
+ bot: this.client.user?.username
+ }),
+ iconURL: this.client.user!.displayAvatarURL()
+ })
+ ]
+ })
+ .catch(e => this.client.logger.error("PLAY_CMD_ERR:", e));
}
}
diff --git a/src/commands/general/PingCommand.ts b/src/commands/general/PingCommand.ts
index 1b466ad0a..4f71b292b 100644
--- a/src/commands/general/PingCommand.ts
+++ b/src/commands/general/PingCommand.ts
@@ -1,22 +1,20 @@
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { ColorResolvable } from "discord.js";
+@Command({
+ aliases: ["pang", "pung", "peng", "pong"],
+ description: i18n.__("commands.general.ping.description"),
+ name: "ping",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}ping"
+})
export class PingCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["pang", "pung", "peng", "pong"],
- description: i18n.__("commands.general.ping.description"),
- name: "ping",
- slash: {
- options: []
- },
- usage: "{prefix}ping"
- });
- }
-
public async execute(ctx: CommandContext): Promise {
if (ctx.isInteraction() && !ctx.deferred) await ctx.deferReply();
const before = Date.now();
@@ -30,19 +28,23 @@ export class PingCommand extends BaseCommand {
name: "🏓 PONG",
iconURL: this.client.user!.displayAvatarURL()
})
- .addFields({
- name: "📶 **|** API",
- value: `**\`${latency}\`** ms`,
- inline: true
- }, {
- name: "🌐 **|** WebSocket",
- value: `**\`${wsLatency}\`** ms`,
- inline: true
- }, {
- name: "🔊 **|** Voice",
- value: `**\`${vcLatency}\`** ms`,
- inline: true
- })
+ .addFields(
+ {
+ name: "📶 **|** API",
+ value: `**\`${latency}\`** ms`,
+ inline: true
+ },
+ {
+ name: "🌐 **|** WebSocket",
+ value: `**\`${wsLatency}\`** ms`,
+ inline: true
+ },
+ {
+ name: "🔊 **|** Voice",
+ value: `**\`${vcLatency}\`** ms`,
+ inline: true
+ }
+ )
.setFooter({
text: i18n.__mf("commands.general.ping.footerString", { user: this.client.user!.tag }),
iconURL: this.client.user!.displayAvatarURL()
diff --git a/src/commands/general/category.meta.ts b/src/commands/general/category.meta.ts
index 798caec9e..1cfe71208 100644
--- a/src/commands/general/category.meta.ts
+++ b/src/commands/general/category.meta.ts
@@ -5,4 +5,4 @@ const category = {
hide: false
};
-export = category;
+export default category;
diff --git a/src/commands/moderation/BanCommand.ts b/src/commands/moderation/BanCommand.ts
index 04dac4387..c3e8d8a0f 100644
--- a/src/commands/moderation/BanCommand.ts
+++ b/src/commands/moderation/BanCommand.ts
@@ -1,56 +1,78 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class BanCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- contextUser: "Ban Member",
- description: i18n.__("commands.moderation.ban.description"),
- name: "ban",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.ban.slashMemberIDDescription"),
- name: "memberid",
- required: true,
- type: "STRING"
- },
- {
- description: i18n.__("commands.moderation.ban.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ contextUser: "Ban Member",
+ description: i18n.__("commands.moderation.ban.description"),
+ name: "ban",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.ban.slashMemberIDDescription"),
+ name: "memberid",
+ required: true,
+ type: "STRING"
},
- usage: i18n.__("commands.moderation.ban.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("BAN_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.ban.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("BAN_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.ban.botNoPermission"), true)] });
+ {
+ description: i18n.__("commands.moderation.ban.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.ban.usage")
+})
+export class BanCommand extends BaseCommand {
+ @memberReqPerms(["BAN_MEMBERS"], i18n.__("commands.moderation.ban.userNoPermission"))
+ @botReqPerms(["BAN_MEMBERS"], i18n.__("commands.moderation.ban.botNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ if (!ctx.guild) return;
- const memberId = ctx.args.shift()?.replace(/[^0-9]/g, "") ?? ctx.options?.getUser("user")?.id ?? ctx.options?.getString("memberid");
+ const memberId =
+ ctx.args.shift()?.replace(/[^0-9]/g, "") ??
+ ctx.options?.getUser("user")?.id ??
+ ctx.options?.getString("memberid");
const user = await this.client.users.fetch(memberId!, { force: false }).catch(() => undefined);
const resolved = ctx.guild.members.resolve(user!);
- if (!user) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
- if (!resolved?.bannable) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.ban.userNoBannable"), true)] });
+ if (!user) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
+ if (!resolved?.bannable) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.ban.userNoBannable"), true)]
+ });
+ }
+
+ const reason =
+ ctx.options?.getString("reason") ??
+ (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
- const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
if (ctx.guild.members.cache.has(user.id)) {
const dm = await user.createDM().catch(() => undefined);
if (dm) {
await dm.send({
embeds: [
- createEmbed("error", i18n.__mf("commands.moderation.ban.userBanned", { guildName: ctx.guild.name }))
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.ban.userBanned", {
+ guildName: ctx.guild.name
+ })
+ )
+ .setThumbnail(ctx.guild.iconURL({ dynamic: true, format: "png", size: 1024 })!)
.addField(i18n.__("commands.moderation.common.reasonString"), reason)
.setFooter({
- text: i18n.__mf("commands.moderation.ban.bannedByString", { guildName: ctx.author.tag }),
+ text: i18n.__mf("commands.moderation.ban.bannedByString", {
+ author: ctx.author.tag
+ }),
iconURL: ctx.author.displayAvatarURL({ dynamic: true })
})
.setTimestamp(Date.now())
@@ -59,11 +81,21 @@ export class BanCommand extends BaseCommand {
}
}
- const ban = await ctx.guild.members.ban(user, {
- reason
- }).catch(err => new Error(err as string | undefined));
- if (ban instanceof Error) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.moderation.ban.banFail", { message: ban.message }), true)] });
+ const ban = await ctx.guild.members
+ .ban(user, {
+ reason
+ })
+ .catch(err => new Error(err as string | undefined));
+ if (ban instanceof Error) {
+ return ctx.reply({
+ embeds: [
+ createEmbed("error", i18n.__mf("commands.moderation.ban.banFail", { message: ban.message }), true)
+ ]
+ });
+ }
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.ban.banSuccess", { user: user.tag }), true)] });
+ return ctx.reply({
+ embeds: [createEmbed("success", i18n.__mf("commands.moderation.ban.banSuccess", { user: user.tag }), true)]
+ });
}
}
diff --git a/src/commands/moderation/InfractionsCommand.ts b/src/commands/moderation/InfractionsCommand.ts
new file mode 100644
index 000000000..b4df04423
--- /dev/null
+++ b/src/commands/moderation/InfractionsCommand.ts
@@ -0,0 +1,93 @@
+import { ButtonPagination } from "../../utils/structures/ButtonPagination";
+import { memberReqPerms } from "../../utils/decorators/CommonUtil";
+import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
+import { formatTime } from "../../utils/functions/formatMS";
+import { BaseCommand } from "../../structures/BaseCommand";
+import { Command } from "../../utils/decorators/Command";
+import { chunk } from "../../utils/functions/chunk";
+import i18n from "../../config";
+
+@Command({
+ contextUser: "Show user infractions",
+ description: i18n.__("commands.moderation.infractions.description"),
+ name: "infractions",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.infractions.slashMemberDescription"),
+ name: "member",
+ required: false,
+ type: "USER"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.infractions.usage")
+})
+export class InfractionsCommand extends BaseCommand {
+ @memberReqPerms(["MANAGE_GUILD"], i18n.__("commands.moderation.warn.userNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ const user =
+ ctx.guild?.members.resolve(ctx.args.shift()?.replace(/[^0-9]/g, "") ?? "")?.user ??
+ ctx.options?.getUser("member", false) ??
+ ctx.author;
+ const embed = createEmbed("info").setAuthor({
+ name: i18n.__mf("commands.moderation.infractions.embedAuthorText", {
+ user: user.tag
+ })
+ });
+ let infractions: { on: number; reason: string | null }[];
+
+ try {
+ infractions = this.client.data.data![ctx.guild!.id].infractions[user.id];
+ if (!(infractions as typeof infractions | undefined)) throw new Error();
+ } catch {
+ infractions = [];
+ }
+
+ if (!infractions.length) {
+ await ctx.reply({
+ embeds: [embed.setDescription(i18n.__("commands.moderation.infractions.noInfractions"))]
+ });
+ return;
+ }
+
+ const pages = await Promise.all(
+ chunk(infractions, 10).map(async (s, n) => {
+ const infracts = await Promise.all(
+ s.map(
+ (inf, i) =>
+ `${n * 10 + (i + 1)}. ${formatTime(inf.on)} - ${
+ inf.reason ?? i18n.__("commands.moderation.common.noReasonString")
+ }`
+ )
+ );
+
+ return infracts.join("\n");
+ })
+ );
+ const msg = await ctx.reply({
+ embeds: [
+ embed.setDescription(pages[0]).setFooter({
+ text: i18n.__mf("reusable.pageFooter", {
+ actual: 1,
+ total: pages.length
+ })
+ })
+ ]
+ });
+
+ return new ButtonPagination(msg, {
+ author: ctx.author.id,
+ edit: (i, e, p) =>
+ e.setDescription(p).setFooter({
+ text: i18n.__mf("reusable.pageFooter", {
+ actual: i + 1,
+ total: pages.length
+ })
+ }),
+ embed,
+ pages
+ }).start();
+ }
+}
diff --git a/src/commands/moderation/KickCommand.ts b/src/commands/moderation/KickCommand.ts
index 8d0111bba..c51765385 100644
--- a/src/commands/moderation/KickCommand.ts
+++ b/src/commands/moderation/KickCommand.ts
@@ -1,54 +1,73 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class KickCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- contextUser: "Kick Member",
- description: i18n.__("commands.moderation.kick.description"),
- name: "kick",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.kick.slashMemberDescription"),
- name: "member",
- required: true,
- type: "USER"
- },
- {
- description: i18n.__("commands.moderation.kick.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ contextUser: "Kick Member",
+ description: i18n.__("commands.moderation.kick.description"),
+ name: "kick",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.kick.slashMemberDescription"),
+ name: "member",
+ required: true,
+ type: "USER"
},
- usage: i18n.__("commands.moderation.kick.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("KICK_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.kick.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("KICK_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.kick.botNoPermission"), true)] });
+ {
+ description: i18n.__("commands.moderation.kick.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.kick.usage")
+})
+export class KickCommand extends BaseCommand {
+ @memberReqPerms(["KICK_MEMBERS"], i18n.__("commands.moderation.kick.userNoPermission"))
+ @botReqPerms(["KICK_MEMBERS"], i18n.__("commands.moderation.kick.botNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ if (!ctx.guild) return;
- const memberId = ctx.args.shift()?.replace(/[^0-9]/g, "") ?? ctx.options?.getUser("user")?.id ?? ctx.options?.getUser("member")?.id;
+ const memberId =
+ ctx.args.shift()?.replace(/[^0-9]/g, "") ??
+ ctx.options?.getUser("user")?.id ??
+ ctx.options?.getUser("member")?.id;
const member = ctx.guild.members.resolve(memberId!);
- if (!member) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
- if (!member.kickable) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.kick.userNoKickable"), true)] });
+ if (!member) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
+ if (!member.kickable) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.kick.userNoKickable"), true)]
+ });
+ }
- const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
+ const reason =
+ ctx.options?.getString("reason") ??
+ (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
const dm = await member.user.createDM().catch(() => undefined);
if (dm) {
await dm.send({
embeds: [
- createEmbed("error", i18n.__mf("commands.moderation.kick.userKicked", { guildName: ctx.guild.name }))
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.kick.userKicked", { guildName: ctx.guild.name })
+ )
+ .setThumbnail(ctx.guild.iconURL({ dynamic: true, format: "png", size: 1024 })!)
.addField(i18n.__("commands.moderation.common.reasonString"), reason)
.setFooter({
- text: i18n.__mf("commands.moderation.kick.kickedByString", { author: ctx.author.tag }),
+ text: i18n.__mf("commands.moderation.kick.kickedByString", {
+ author: ctx.author.tag
+ }),
iconURL: ctx.author.displayAvatarURL({ dynamic: true })
})
.setTimestamp(Date.now())
@@ -57,8 +76,25 @@ export class KickCommand extends BaseCommand {
}
const kick = await member.kick(reason).catch(err => new Error(err as string | undefined));
- if (kick instanceof Error) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.moderation.kick.kickFail", { message: kick.message }), true)] });
+ if (kick instanceof Error)
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.kick.kickFail", { message: kick.message }),
+ true
+ )
+ ]
+ });
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.kick.kickSuccess", { user: member.user.tag }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ i18n.__mf("commands.moderation.kick.kickSuccess", { user: member.user.tag }),
+ true
+ )
+ ]
+ });
}
}
diff --git a/src/commands/moderation/ModLogsCommand.ts b/src/commands/moderation/ModLogsCommand.ts
new file mode 100644
index 000000000..950d35015
--- /dev/null
+++ b/src/commands/moderation/ModLogsCommand.ts
@@ -0,0 +1,177 @@
+import { memberReqPerms } from "../../utils/decorators/CommonUtil";
+import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
+import { BaseCommand } from "../../structures/BaseCommand";
+import { Command } from "../../utils/decorators/Command";
+import i18n from "../../config";
+
+@Command({
+ aliases: ["modlog", "moderationlogs", "moderationlog"],
+ description: i18n.__("commands.moderation.modlogs.description"),
+ name: "modlogs",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.modlogs.slashChannelDescription"),
+ name: "channel",
+ options: [
+ {
+ description: i18n.__("commands.moderation.modlogs.slashChannelNewChannelOption"),
+ name: "newchannel",
+ required: false,
+ type: "CHANNEL"
+ }
+ ],
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.moderation.modlogs.slashEnableDescription"),
+ name: "enable",
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.moderation.modlogs.slashDisableDescription"),
+ name: "disable",
+ type: "SUB_COMMAND"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.modlogs.usage")
+})
+export class ModLogsCommand extends BaseCommand {
+ private readonly options: Record = {
+ channel: async ctx => {
+ const newCh = ctx.options?.getChannel("newchannel")?.id ?? ctx.args.shift()?.replace(/[^0-9]/g, "");
+
+ if (!newCh) {
+ let ch: string | null;
+
+ try {
+ ch = this.client.data.data?.[ctx.guild?.id ?? ""]?.modLog?.channel ?? null;
+ if (!ch) throw new Error("");
+ } catch {
+ ch = null;
+ }
+
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ ch
+ ? i18n.__mf("commands.moderation.modlogs.channel.current", { channel: ch })
+ : i18n.__("commands.moderation.modlogs.channel.noChannel")
+ )
+ ]
+ });
+ }
+
+ const ch = await ctx.guild?.channels.fetch(newCh).catch(() => undefined);
+ if (!ch?.isText()) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.modlogs.channel.invalid"))]
+ });
+ }
+
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ infractions: guildData?.infractions ?? {},
+ modLog: {
+ channel: newCh,
+ enable: guildData?.modLog?.enable ?? false
+ }
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ i18n.__mf("commands.moderation.modlogs.channel.success", { channel: newCh }),
+ true
+ )
+ ]
+ });
+ },
+ default: ctx =>
+ ctx.reply({
+ embeds: [
+ createEmbed("info")
+ .setAuthor(i18n.__("commands.moderation.modlogs.embedTitle"))
+ .addField(
+ `${this.client.config.mainPrefix}modlogs enable`,
+ i18n.__("commands.moderation.modlogs.slashEnableDescription")
+ )
+ .addField(
+ `${this.client.config.mainPrefix}modlogs disable`,
+ i18n.__("commands.moderation.modlogs.slashDisableDescription")
+ )
+ .addField(
+ `${this.client.config.mainPrefix}modlogs channel [${i18n.__(
+ "commands.moderation.modlogs.newChannelText"
+ )}]`,
+ i18n.__("commands.moderation.modlogs.slashChannelDescription")
+ )
+ ]
+ }),
+ disable: async ctx => {
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ infractions: guildData?.infractions ?? {},
+ modLog: {
+ channel: guildData?.modLog?.channel ?? null,
+ enable: false
+ }
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [createEmbed("success", i18n.__("commands.moderation.modlogs.disable"), true)]
+ });
+ },
+ enable: async ctx => {
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ infractions: guildData?.infractions ?? {},
+ modLog: {
+ channel: guildData?.modLog?.channel ?? null,
+ enable: true
+ }
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [createEmbed("success", i18n.__("commands.moderation.modlogs.enable"), true)]
+ });
+ }
+ };
+
+ @memberReqPerms(["MANAGE_GUILD"], i18n.__("commands.moderation.warn.userNoPermission"))
+ public execute(ctx: CommandContext): void {
+ const subname = ctx.options?.getSubcommand() ?? ctx.args.shift();
+ let sub = this.options[subname!] as BaseCommand["execute"] | undefined;
+
+ if (!sub) sub = this.options.default;
+ sub(ctx);
+ }
+}
diff --git a/src/commands/moderation/MuteCommand.ts b/src/commands/moderation/MuteCommand.ts
index 62f34c4c7..f25dff52d 100644
--- a/src/commands/moderation/MuteCommand.ts
+++ b/src/commands/moderation/MuteCommand.ts
@@ -1,59 +1,108 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class MuteCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- contextUser: "Mute Member",
- description: i18n.__("commands.moderation.mute.description"),
- name: "mute",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.mute.slashMemberDescription"),
- name: "member",
- required: true,
- type: "USER"
- },
- {
- description: i18n.__("commands.moderation.mute.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ contextUser: "Mute Member",
+ description: i18n.__("commands.moderation.mute.description"),
+ name: "mute",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.mute.slashMemberDescription"),
+ name: "member",
+ required: true,
+ type: "USER"
},
- usage: i18n.__("commands.moderation.mute.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("MANAGE_ROLES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("MANAGE_ROLES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.botNoPermission"), true)] });
+ {
+ description: i18n.__("commands.moderation.mute.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.mute.usage")
+})
+export class MuteCommand extends BaseCommand {
+ @memberReqPerms(["MANAGE_ROLES"], i18n.__("commands.moderation.mute.userNoPermission"))
+ @botReqPerms(["MANAGE_ROLES"], i18n.__("commands.moderation.mute.botNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ if (!ctx.guild) return;
- const memberId = ctx.args.shift()?.replace(/[^0-9]/g, "") ?? ctx.options?.getUser("user")?.id ?? ctx.options?.getUser("member")?.id;
+ const memberId =
+ ctx.args.shift()?.replace(/[^0-9]/g, "") ??
+ ctx.options?.getUser("user")?.id ??
+ ctx.options?.getUser("member")?.id;
const member = ctx.guild.members.resolve(memberId!);
- if (!member) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
- if (ctx.guild.ownerId === member.id) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.mute.cantMuteOwner"))] });
+ if (!member) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
+ if (ctx.guild.ownerId === member.id) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.cantMuteOwner"), true)]
+ });
+ }
- const muteRole = await this.client.utils.fetchMuteRole(ctx.guild).catch(() => null);
- if (!muteRole) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.mute.unableToCreateMuteRole"))] });
- if (member.roles.cache.has(muteRole.id)) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.mute.alreadyMuted"))] });
+ const muteRole = await this.client.utils.fetchMuteRole(ctx.guild);
+ if (!muteRole) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("commands.moderation.mute.noRole", {
+ prefix: this.client.config.mainPrefix
+ })
+ )
+ ]
+ });
+ }
+ if (member.roles.cache.has(muteRole.id)) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.alreadyMuted"), true)]
+ });
+ }
+
+ const reason =
+ ctx.options?.getString("reason") ??
+ (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
+
+ const mute = await member.roles.add(muteRole, reason).catch(err => new Error(err as string | undefined));
+ if (mute instanceof Error)
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.mute.muteFail", { message: mute.message }),
+ true
+ )
+ ]
+ });
- const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
const dm = await member.user.createDM().catch(() => undefined);
if (dm) {
await dm.send({
embeds: [
- createEmbed("error", i18n.__("commands.moderation.mute.userMuted"))
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.mute.userMuted", {
+ guildName: ctx.guild.name
+ })
+ )
.setColor("LIGHT_GREY")
+ .setThumbnail(ctx.guild.iconURL({ dynamic: true, format: "png", size: 1024 })!)
.addField(i18n.__("commands.moderation.common.reasonString"), reason)
.setFooter({
- text: i18n.__mf("commands.moderation.mute.mutedByString", { author: ctx.author.tag }),
+ text: i18n.__mf("commands.moderation.mute.mutedByString", {
+ author: ctx.author.tag
+ }),
iconURL: ctx.author.displayAvatarURL({ dynamic: true })
})
.setTimestamp(Date.now())
@@ -61,9 +110,14 @@ export class MuteCommand extends BaseCommand {
});
}
- const mute = await member.roles.add(muteRole, reason).catch(err => new Error(err as string | undefined));
- if (mute instanceof Error) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.moderation.mute.muteFail", { message: mute.message }), true)] });
-
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.mute.muteSuccess", { user: member.user.tag }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ i18n.__mf("commands.moderation.mute.muteSuccess", { user: member.user.tag }),
+ true
+ )
+ ]
+ });
}
}
diff --git a/src/commands/moderation/PurgeCommand.ts b/src/commands/moderation/PurgeCommand.ts
index a3365d531..cc9061a9b 100644
--- a/src/commands/moderation/PurgeCommand.ts
+++ b/src/commands/moderation/PurgeCommand.ts
@@ -1,39 +1,64 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { TextChannel, Message } from "discord.js";
+@Command({
+ description: i18n.__("commands.moderation.purge.description"),
+ name: "purge",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.purge.slashAmountDescription"),
+ name: "amount",
+ required: true,
+ type: "NUMBER"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.purge.usage")
+})
export class PurgeCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.moderation.purge.description"),
- name: "purge",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.purge.slashAmountDescription"),
- name: "amount",
- required: true,
- type: "NUMBER"
- }
- ]
- },
- usage: i18n.__("commands.moderation.purge.usage")
- });
- }
-
+ @memberReqPerms(["MANAGE_MESSAGES"], i18n.__("commands.moderation.purge.userNoPermission"))
+ @botReqPerms(["MANAGE_MESSAGES"], i18n.__("commands.moderation.purge.botNoPermission"))
public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("MANAGE_MESSAGES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.purge.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("MANAGE_MESSAGES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.purge.botNoPermission"), true)] });
-
const amount = Number(ctx.options?.getString("amount") ?? ctx.args.shift());
- if (isNaN(amount)) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.purge.invalidAmount"))] });
+ if (isNaN(amount)) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.purge.invalidAmount"))]
+ });
+ }
- const purge = await (ctx.channel as TextChannel).bulkDelete(amount + 1, true)
+ await (ctx.context as Message).delete();
+ const purge = await (ctx.channel as TextChannel)
+ .bulkDelete(amount, true)
.catch(err => new Error(err as string | undefined));
- if (purge instanceof Error) return ctx.reply({ embeds: [createEmbed("warn", i18n.__mf("commands.moderation.purge.purgeFail", { message: purge.message }), true)] });
+ if (purge instanceof Error) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("commands.moderation.purge.purgeFail", {
+ message: purge.message
+ }),
+ true
+ )
+ ]
+ });
+ }
- return ctx.reply({ embeds: [createEmbed("success", `🧹 **|** ${i18n.__mf("commands.moderation.purge.purgeSuccess", { amount: purge.size })}`)] });
+ await ctx
+ .reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `🧹 **|** ${i18n.__mf("commands.moderation.purge.purgeSuccess", { amount: purge.size })}`
+ )
+ ]
+ })
+ .then(msg => setTimeout(() => msg.delete(), 3500));
}
}
diff --git a/src/commands/moderation/SetMuteCommand.ts b/src/commands/moderation/SetMuteCommand.ts
new file mode 100644
index 000000000..9c7ad65dd
--- /dev/null
+++ b/src/commands/moderation/SetMuteCommand.ts
@@ -0,0 +1,52 @@
+import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
+import { BaseCommand } from "../../structures/BaseCommand";
+import { Command } from "../../utils/decorators/Command";
+import i18n from "../../config";
+
+@Command({
+ aliases: ["setmuterole"],
+ description: i18n.__("commands.moderation.setmute.description"),
+ name: "setmute",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.setmute.slashRoleDescription"),
+ name: "role",
+ type: "ROLE",
+ required: true
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.setmute.usage")
+})
+export class SetMuteCommand extends BaseCommand {
+ public async execute(ctx: CommandContext): Promise {
+ const id = ctx.options?.getRole("role", true).id ?? ctx.args[0].replace(/\D/g, "");
+ const role = await ctx.guild?.roles.fetch(id).catch(() => undefined);
+ if (!role) {
+ await ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.setmute.invalidRole"))]
+ });
+
+ return;
+ }
+
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ infractions: guildData?.infractions ?? {},
+ mute: role.id
+ }
+ };
+ });
+ await ctx.reply({
+ embeds: [createEmbed("success", i18n.__mf("commands.moderation.setmute.success", { role: role.id }))]
+ });
+ }
+}
diff --git a/src/commands/moderation/UnBanCommand.ts b/src/commands/moderation/UnBanCommand.ts
index d9b324acc..b291c3f57 100644
--- a/src/commands/moderation/UnBanCommand.ts
+++ b/src/commands/moderation/UnBanCommand.ts
@@ -1,49 +1,81 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class UnBanCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.moderation.unban.description"),
- name: "unban",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.unban.slashMemberDescription"),
- name: "memberid",
- required: true,
- type: "STRING"
- },
- {
- description: i18n.__("commands.moderation.unban.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ description: i18n.__("commands.moderation.unban.description"),
+ name: "unban",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.unban.slashMemberDescription"),
+ name: "memberid",
+ required: true,
+ type: "STRING"
},
- usage: i18n.__("commands.moderation.unban.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("BAN_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.ban.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("BAN_MEMBERS")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.ban.botNoPermission"), true)] });
+ {
+ description: i18n.__("commands.moderation.unban.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.unban.usage")
+})
+export class UnBanCommand extends BaseCommand {
+ @memberReqPerms(["BAN_MEMBERS"], i18n.__("commands.moderation.ban.userNoPermission"))
+ @botReqPerms(["BAN_MEMBERS"], i18n.__("commands.moderation.ban.botNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ if (!ctx.guild) return;
- const memberId = ctx.args.shift()?.replace(/[^0-9]/g, "") ?? ctx.options?.getUser("user")?.id ?? ctx.options?.getString("memberid");
+ const memberId =
+ ctx.args.shift()?.replace(/[^0-9]/g, "") ??
+ ctx.options?.getUser("user")?.id ??
+ ctx.options?.getString("memberid");
const user = await this.client.users.fetch(memberId!, { force: false }).catch(() => undefined);
const resolved = ctx.guild.bans.resolve(user?.id ?? "");
- if (!user) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
- if (!resolved) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.unban.alreadyUnban"))] });
+ if (!user) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
+ if (!resolved) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.unban.alreadyUnban"), true)]
+ });
+ }
- const unban = await ctx.guild.bans.remove(user.id, ctx.options?.getString("reason") ?? (ctx.args.length ? ctx.args.join(" ") : i18n.__("commands.moderation.common.noReasonString")))
+ const unban = await ctx.guild.bans
+ .remove(
+ user.id,
+ ctx.options?.getString("reason") ??
+ (ctx.args.length ? ctx.args.join(" ") : i18n.__("commands.moderation.common.noReasonString"))
+ )
.catch(err => new Error(err as string | undefined));
- if (unban instanceof Error) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.moderation.unban.unbanFail", { message: unban.message }), true)] });
+ if (unban instanceof Error) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.unban.unbanFail", {
+ message: unban.message
+ }),
+ true
+ )
+ ]
+ });
+ }
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.unban.ubanSuccess", { user: user.tag }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed("success", i18n.__mf("commands.moderation.unban.ubanSuccess", { user: user.tag }), true)
+ ]
+ });
}
}
diff --git a/src/commands/moderation/UnMuteCommand.ts b/src/commands/moderation/UnMuteCommand.ts
index 4daf97421..9ecc41114 100644
--- a/src/commands/moderation/UnMuteCommand.ts
+++ b/src/commands/moderation/UnMuteCommand.ts
@@ -1,54 +1,99 @@
+import { botReqPerms, memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class UnMuteCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- contextUser: "Un-mute Member",
- description: i18n.__("commands.moderation.unmute.description"),
- name: "unmute",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.unmute.slashMemberDescription"),
- name: "member",
- required: true,
- type: "USER"
- },
- {
- description: i18n.__("commands.moderation.unmute.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ contextUser: "Un-mute Member",
+ description: i18n.__("commands.moderation.unmute.description"),
+ name: "unmute",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.unmute.slashMemberDescription"),
+ name: "member",
+ required: true,
+ type: "USER"
},
- usage: i18n.__("commands.moderation.unmute.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("MANAGE_ROLES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.userNoPermission"), true)] });
- if (!ctx.guild?.me?.permissions.has("MANAGE_ROLES")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.mute.botNoPermission"), true)] });
+ {
+ description: i18n.__("commands.moderation.unmute.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.unmute.usage")
+})
+export class UnMuteCommand extends BaseCommand {
+ @memberReqPerms(["MANAGE_ROLES"], i18n.__("commands.moderation.mute.userNoPermission"))
+ @botReqPerms(["MANAGE_ROLES"], i18n.__("commands.moderation.mute.botNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ if (!ctx.guild) return;
- const memberId = ctx.args.shift()?.replace(/[^0-9]/g, "") ?? ctx.options?.getUser("user")?.id ?? ctx.options?.getUser("member")?.id;
+ const memberId =
+ ctx.args.shift()?.replace(/[^0-9]/g, "") ??
+ ctx.options?.getUser("user")?.id ??
+ ctx.options?.getUser("member")?.id;
const member = ctx.guild.members.resolve(memberId!);
- if (!member) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
+ if (!member) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
- const muteRole = await this.client.utils.fetchMuteRole(ctx.guild).catch(() => null);
- if (!muteRole) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.unmute.unableToCreateMuteRole"))] });
- if (!member.roles.cache.has(muteRole.id)) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.unmute.noMuted"))] });
+ const muteRole = await this.client.utils.fetchMuteRole(ctx.guild);
+ if (!muteRole) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("commands.moderation.mute.noRole", {
+ prefix: this.client.config.mainPrefix
+ })
+ )
+ ]
+ });
+ }
+ if (!member.roles.cache.has(muteRole.id)) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.moderation.unmute.noMuted"), true)]
+ });
+ }
+
+ const reason =
+ ctx.options?.getString("reason") ??
+ (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
+ const unmute = await member.roles.remove(muteRole, reason).catch(err => new Error(err as string | undefined));
+ if (unmute instanceof Error) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.moderation.unmute.unmuteFail", {
+ message: unmute.message
+ }),
+ true
+ )
+ ]
+ });
+ }
- const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
const dm = await member.user.createDM().catch(() => undefined);
if (dm) {
await dm.send({
embeds: [
- createEmbed("info", i18n.__mf("commands.moderation.unmute.userUnmuted", { guildName: ctx.guild.name }))
+ createEmbed(
+ "info",
+ i18n.__mf("commands.moderation.unmute.userUnmuted", {
+ guildName: ctx.guild.name
+ })
+ )
+ .setThumbnail(ctx.guild.iconURL({ dynamic: true, format: "png", size: 1024 })!)
.addField(i18n.__("commands.moderation.common.reasonString"), reason)
.setFooter({
text: i18n.__mf("commands.moderation.unmute.unmutedByString", { author: ctx.author.tag }),
@@ -59,9 +104,16 @@ export class UnMuteCommand extends BaseCommand {
});
}
- const unmute = await member.roles.remove(muteRole, reason).catch(err => new Error(err as string | undefined));
- if (unmute instanceof Error) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.moderation.unmute.unmuteFail", { message: unmute.message }), true)] });
-
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.unmute.unmuteSuccess", { user: member.user.tag }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ i18n.__mf("commands.moderation.unmute.unmuteSuccess", {
+ user: member.user.tag
+ }),
+ true
+ )
+ ]
+ });
}
}
diff --git a/src/commands/moderation/WarnCommand.ts b/src/commands/moderation/WarnCommand.ts
index 8da6c2f68..c1839a5b8 100644
--- a/src/commands/moderation/WarnCommand.ts
+++ b/src/commands/moderation/WarnCommand.ts
@@ -1,53 +1,108 @@
+import { memberReqPerms } from "../../utils/decorators/CommonUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
+import { GuildData } from "../../typings";
import i18n from "../../config";
import { Message } from "discord.js";
-export class WarnCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.moderation.warn.description"),
- name: "warn",
- slash: {
- options: [
- {
- description: i18n.__("commands.moderation.warn.slashMemberDescription"),
- name: "member",
- required: true,
- type: "USER"
- },
- {
- description: i18n.__("commands.moderation.warn.slashReasonDescription"),
- name: "reason",
- required: false,
- type: "STRING"
- }
- ]
+@Command({
+ description: i18n.__("commands.moderation.warn.description"),
+ name: "warn",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.moderation.warn.slashMemberDescription"),
+ name: "member",
+ required: true,
+ type: "USER"
},
- usage: i18n.__("commands.moderation.warn.usage")
- });
- }
-
- public async execute(ctx: CommandContext): Promise {
- if (!ctx.member?.permissions.has("MANAGE_GUILD")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.moderation.warn.userNoPermission"), true)] });
-
- const member = ctx.guild?.members.resolve(ctx.args.shift()?.replace(/[^0-9]/g, "") ?? "")?.user ?? ctx.options?.getUser("member", true);
- if (!member) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))] });
+ {
+ description: i18n.__("commands.moderation.warn.slashReasonDescription"),
+ name: "reason",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.moderation.warn.usage")
+})
+export class WarnCommand extends BaseCommand {
+ @memberReqPerms(["MANAGE_GUILD"], i18n.__("commands.moderation.warn.userNoPermission"))
+ public async execute(ctx: CommandContext): Promise {
+ const member =
+ ctx.guild?.members.resolve(ctx.args.shift()?.replace(/[^0-9]/g, "") ?? "")?.user ??
+ ctx.options?.getUser("member", true);
+ if (!member) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.common.noUserSpecified"))]
+ });
+ }
const dm = await member.createDM().catch(() => undefined);
- if (!dm) await ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.moderation.warn.noDM"))] });
+ if (!dm) {
+ await ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.moderation.warn.noDM"))]
+ });
+ }
- const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || i18n.__("commands.moderation.common.noReasonString"));
- const embed = createEmbed("warn", i18n.__mf("commands.moderation.warn.userWarned", { guildName: ctx.guild!.name }))
- .addField(i18n.__("commands.moderation.common.reasonString"), reason)
+ const time = Date.now();
+ const reason = ctx.options?.getString("reason") ?? (ctx.args.join(" ") || null);
+ const displayReason = reason ?? i18n.__("commands.moderation.common.noReasonString");
+ const embed = createEmbed(
+ "warn",
+ i18n.__mf("commands.moderation.warn.userWarned", {
+ guildName: ctx.guild!.name
+ })
+ )
+ .setThumbnail(ctx.guild!.iconURL({ dynamic: true, format: "png", size: 1024 })!)
+ .addField(i18n.__("commands.moderation.common.reasonString"), displayReason)
.setFooter({
- text: i18n.__("commands.moderation.warn.warnedByString"),
+ text: i18n.__mf("commands.moderation.warn.warnedByString", { author: ctx.author.tag }),
iconURL: ctx.author.displayAvatarURL({ dynamic: true })
})
- .setTimestamp(Date.now());
+ .setTimestamp(time);
await dm?.send({ embeds: [embed] });
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.moderation.warn.warnSuccess", { user: member.tag }), true)] });
+ await this.client.data.save(() => {
+ const prefGuildData = this.client.data.data?.[ctx.guild!.id];
+ const newData: Record = {
+ ...(this.client.data.data ?? {}),
+ [ctx.guild!.id]: {
+ infractions: {
+ ...(prefGuildData?.infractions ?? {}),
+ [member.id]: [
+ ...(prefGuildData?.infractions[member.id] ?? []),
+ {
+ on: time,
+ reason
+ }
+ ]
+ },
+ modLog: prefGuildData?.modLog ?? {
+ enable: false,
+ channel: null
+ }
+ }
+ };
+
+ return newData;
+ });
+
+ void this.client.modlogs
+ .handleWarn({
+ author: ctx.author,
+ guild: ctx.guild!,
+ reason,
+ user: member
+ })
+ .catch(() => null);
+
+ return ctx.reply({
+ embeds: [
+ createEmbed("success", i18n.__mf("commands.moderation.warn.warnSuccess", { user: member.tag }), true)
+ ]
+ });
}
}
diff --git a/src/commands/moderation/category.meta.ts b/src/commands/moderation/category.meta.ts
index 8e1568efb..27ffe7382 100644
--- a/src/commands/moderation/category.meta.ts
+++ b/src/commands/moderation/category.meta.ts
@@ -5,4 +5,4 @@ const category = {
hide: false
};
-export = category;
+export default category;
diff --git a/src/commands/music/DJCommand.ts b/src/commands/music/DJCommand.ts
new file mode 100644
index 000000000..597be4d3c
--- /dev/null
+++ b/src/commands/music/DJCommand.ts
@@ -0,0 +1,180 @@
+import { memberReqPerms } from "../../utils/decorators/CommonUtil";
+import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
+import { BaseCommand } from "../../structures/BaseCommand";
+import { Command } from "../../utils/decorators/Command";
+import i18n from "../../config";
+
+@Command({
+ description: i18n.__("commands.music.dj.description"),
+ name: "dj",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.dj.slashRoleDescription"),
+ name: "role",
+ options: [
+ {
+ description: i18n.__("commands.music.dj.slashRoleNewRoleOption"),
+ name: "newrole",
+ required: false,
+ type: "ROLE"
+ }
+ ],
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.music.dj.slashEnableDescription"),
+ name: "enable",
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.music.dj.slashDisableDescription"),
+ name: "disable",
+ type: "SUB_COMMAND"
+ }
+ ]
+ },
+ usage: "{prefix}dj"
+})
+export class DJCommand extends BaseCommand {
+ private readonly options: Record = {
+ default: ctx =>
+ ctx.reply({
+ embeds: [
+ createEmbed("info")
+ .setAuthor(i18n.__("commands.music.dj.embedTitle"))
+ .addField(
+ `${this.client.config.mainPrefix}dj enable`,
+ i18n.__("commands.music.dj.slashEnableDescription")
+ )
+ .addField(
+ `${this.client.config.mainPrefix}dj disable`,
+ i18n.__("commands.music.dj.slashDisableDescription")
+ )
+ .addField(
+ `${this.client.config.mainPrefix}dj role [${i18n.__("commands.music.dj.newRoleText")}]`,
+ i18n.__("commands.music.dj.slashRoleDescription")
+ )
+ ]
+ }),
+ disable: async ctx => {
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ dj: {
+ enable: false,
+ role: guildData?.dj?.role ?? null
+ },
+ infractions: guildData?.infractions ?? {}
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [createEmbed("success", i18n.__("commands.music.dj.disableText"), true)]
+ });
+ },
+ enable: async ctx => {
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ dj: {
+ enable: true,
+ role: guildData?.dj?.role ?? null
+ },
+ infractions: guildData?.infractions ?? {}
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [createEmbed("success", i18n.__("commands.music.dj.enableText"), true)]
+ });
+ },
+ role: async ctx => {
+ const newRole = ctx.options?.getRole("newrole")?.id ?? ctx.args.shift()?.replace(/[^0-9]/g, "");
+ const txt = this.client.data.data?.[ctx.guild?.id ?? ""]?.dj?.enable ? "enable" : "disable";
+ const footer = `${i18n.__("commands.music.dj.embedTitle")}: ${i18n.__(`commands.music.dj.${txt}`)}`;
+
+ if (!newRole) {
+ let role: string | null;
+
+ try {
+ role = this.client.data.data?.[ctx.guild?.id ?? ""]?.dj?.role ?? null;
+ if (!role) throw new Error("");
+ } catch {
+ role = null;
+ }
+
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ role
+ ? i18n.__mf("commands.music.dj.role.current", { role })
+ : i18n.__("commands.music.dj.role.noRole")
+ ).setFooter({
+ text: footer
+ })
+ ]
+ });
+ }
+
+ const role = await ctx.guild?.roles.fetch(newRole).catch(() => undefined);
+ if (!role) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.dj.role.invalid"), true)]
+ });
+ }
+
+ await this.client.data.save(() => {
+ const data = this.client.data.data;
+ const guildData = data?.[ctx.guild?.id ?? ""];
+
+ return {
+ ...(data ?? {}),
+ [ctx.guild!.id]: {
+ ...(guildData ?? {}),
+ dj: {
+ enable: guildData?.dj?.enable ?? false,
+ role: role.id
+ },
+ infractions: guildData?.infractions ?? {}
+ }
+ };
+ });
+
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ i18n.__mf("commands.music.dj.role.success", { role: newRole }),
+ true
+ ).setFooter({
+ text: footer
+ })
+ ]
+ });
+ }
+ };
+
+ @memberReqPerms(["MANAGE_GUILD"], i18n.__("commands.moderation.warn.userNoPermission"))
+ public execute(ctx: CommandContext): void {
+ const subname = ctx.options?.getSubcommand() ?? ctx.args.shift();
+ let sub = this.options[subname!] as BaseCommand["execute"] | undefined;
+
+ if (!sub) sub = this.options.default;
+ sub(ctx);
+ }
+}
diff --git a/src/commands/music/LyricsCommand.ts b/src/commands/music/LyricsCommand.ts
index 99e645d4a..89d14b5fb 100644
--- a/src/commands/music/LyricsCommand.ts
+++ b/src/commands/music/LyricsCommand.ts
@@ -1,57 +1,93 @@
+/* eslint-disable no-nested-ternary */
+import { ButtonPagination } from "../../utils/structures/ButtonPagination";
import { CommandContext } from "../../structures/CommandContext";
-import { ButtonPagination } from "../../utils/ButtonPagination";
-import { ILyricsAPIResult, IQueueSong } from "../../typings";
+import { createEmbed } from "../../utils/functions/createEmbed";
+import { LyricsAPIResult, QueueSong } from "../../typings";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { chunk } from "../../utils/chunk";
+import { Command } from "../../utils/decorators/Command";
+import { chunk } from "../../utils/functions/chunk";
import i18n from "../../config";
import { AudioPlayerPlayingState, AudioResource } from "@discordjs/voice";
import { Message } from "discord.js";
+@Command({
+ aliases: ["ly", "lyric"],
+ description: i18n.__("commands.music.lyrics.description"),
+ name: "lyrics",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.lyrics.slashDescription"),
+ name: "query",
+ type: "STRING",
+ required: false
+ }
+ ]
+ },
+ usage: i18n.__("commands.music.lyrics.usage")
+})
export class LyricsCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["ly", "lyric"],
- description: i18n.__("commands.music.lyrics.description"),
- name: "lyrics",
- slash: {
- options: [
- {
- description: i18n.__("commands.music.lyrics.slashDescription"),
- name: "query",
- type: "STRING",
- required: false
- }
- ]
- },
- usage: i18n.__("commands.music.lyrics.usage")
- });
- }
-
public execute(ctx: CommandContext): Promise | undefined {
- // eslint-disable-next-line no-nested-ternary
- const query = ctx.args.length >= 1 ? ctx.args.join(" ") : ctx.options?.getString("query") ? ctx.options.getString("query") : (((ctx.guild?.queue?.player?.state as AudioPlayerPlayingState).resource as AudioResource | undefined)?.metadata as IQueueSong | undefined)?.song.title;
- if (!query) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.lyrics.noQuery"), true)] });
+ const query =
+ ctx.args.length >= 1
+ ? ctx.args.join(" ")
+ : ctx.options?.getString("query")
+ ? ctx.options.getString("query")
+ : (
+ (
+ (ctx.guild?.queue?.player.state as AudioPlayerPlayingState).resource as
+ | AudioResource
+ | undefined
+ )?.metadata as QueueSong | undefined
+ )?.song.title;
+ if (!query) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.lyrics.noQuery"), true)]
+ });
+ }
this.getLyrics(ctx, query);
}
private getLyrics(ctx: CommandContext, song: string): void {
- const url = `https://api.lxndr.dev/lyrics/?song=${encodeURI(song)}&from=${encodeURI(this.client.user!.id)}`;
- this.client.request.get(url).json>()
+ const url = `https://api.lxndr.dev/lyrics?song=${encodeURI(song)}&from=DiscordRawon`;
+ this.client.request
+ .get(url)
+ .json>()
.then(async data => {
if ((data as { error: boolean }).error) {
- return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.music.lyrics.apiError", { song: `\`${song}\``, message: `\`${(data as { message?: string }).message!}\`` }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.music.lyrics.apiError", {
+ song: `\`${song}\``,
+ message: `\`${(data as { message?: string }).message!}\``
+ }),
+ true
+ )
+ ]
+ });
}
- const albumArt = data.album_art ?? "https://api.tiramitzu.me/assets/images/icon.png";
+ const albumArt = data.album_art ?? "https://api.clytage.org/assets/images/icon.png";
const pages: string[] = chunk(data.lyrics!, 2048);
- const embed = createEmbed("info", pages[0]).setAuthor({ name: data.song && data.artist ? `${data.song} - ${data.artist}` : song.toUpperCase() }).setThumbnail(albumArt);
+ const embed = createEmbed("info", pages[0])
+ .setAuthor({
+ name: data.song && data.artist ? `${data.song} - ${data.artist}` : song.toUpperCase()
+ })
+ .setThumbnail(albumArt);
const msg = await ctx.reply({ embeds: [embed] });
return new ButtonPagination(msg, {
author: ctx.author.id,
- edit: (i, e, p) => e.setDescription(p).setFooter({ text: i18n.__mf("reusable.pageFooter", { actual: i + 1, total: pages.length }) }),
+ edit: (i, e, p) =>
+ e.setDescription(p).setFooter({
+ text: i18n.__mf("reusable.pageFooter", {
+ actual: i + 1,
+ total: pages.length
+ })
+ }),
embed,
pages
}).start();
diff --git a/src/commands/music/NowPlayingCommand.ts b/src/commands/music/NowPlayingCommand.ts
index b9b3a1ea3..541d8ddb2 100644
--- a/src/commands/music/NowPlayingCommand.ts
+++ b/src/commands/music/NowPlayingCommand.ts
@@ -1,59 +1,58 @@
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { haveQueue } from "../../utils/decorators/MusicUtil";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { IQueueSong } from "../../typings";
+import { Command } from "../../utils/decorators/Command";
+import { QueueSong } from "../../typings";
import i18n from "../../config";
import { MessageActionRow, MessageButton, MessageEmbed } from "discord.js";
import { AudioPlayerState, AudioResource } from "@discordjs/voice";
+@Command({
+ aliases: ["np"],
+ description: i18n.__("commands.music.nowplaying.description"),
+ name: "nowplaying",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}nowplaying"
+})
export class NowPlayingCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["np"],
- description: i18n.__("commands.music.nowplaying.description"),
- name: "nowplaying",
- slash: {
- options: []
- },
- usage: "{prefix}nowplaying"
- });
- }
-
+ @haveQueue
public async execute(ctx: CommandContext): Promise {
- if (!haveQueue(ctx)) return;
-
function getEmbed(): MessageEmbed {
- const song = ((ctx.guild?.queue?.player?.state as (AudioPlayerState & {
- resource: AudioResource | undefined;
- }) | undefined)?.resource?.metadata as IQueueSong | undefined)?.song;
+ const song = (
+ (
+ ctx.guild?.queue?.player.state as
+ | (AudioPlayerState & {
+ resource: AudioResource | undefined;
+ })
+ | undefined
+ )?.resource?.metadata as QueueSong | undefined
+ )?.song;
- return createEmbed("info", `${ctx.guild?.queue?.playing ? "▶" : "⏸"} **|** ${song ? `**[${song.title}](${song.url})**` : i18n.__("commands.music.nowplaying.emptyQueue")}`).setThumbnail(song?.thumbnail ?? "https://api.tiramitzu.me/assets/images/icon.png");
+ return createEmbed(
+ "info",
+ `${ctx.guild?.queue?.playing ? "▶" : "⏸"} **|** ${
+ song ? `**[${song.title}](${song.url})**` : i18n.__("commands.music.nowplaying.emptyQueue")
+ }`
+ ).setThumbnail(song?.thumbnail ?? "https://api.clytage.org/assets/images/icon.png");
}
- const buttons = new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setCustomId("TOGGLE_STATE_BUTTON")
- .setLabel("Pause/Resume")
- .setStyle("PRIMARY")
- .setEmoji("⏯️"),
- new MessageButton()
- .setCustomId("SKIP_BUTTON")
- .setLabel("Skip")
- .setStyle("SECONDARY")
- .setEmoji("⏭"),
- new MessageButton()
- .setCustomId("STOP_BUTTON")
- .setLabel("Stop Player")
- .setStyle("DANGER")
- .setEmoji("⏹"),
- new MessageButton()
- .setCustomId("SHOW_QUEUE_BUTTON")
- .setLabel("Show Queue")
- .setStyle("SECONDARY")
- .setEmoji("#️⃣")
- );
+ const buttons = new MessageActionRow().addComponents(
+ new MessageButton()
+ .setCustomId("TOGGLE_STATE_BUTTON")
+ .setLabel("Pause/Resume")
+ .setStyle("PRIMARY")
+ .setEmoji("⏯️"),
+ new MessageButton().setCustomId("SKIP_BUTTON").setLabel("Skip").setStyle("SECONDARY").setEmoji("⏭"),
+ new MessageButton().setCustomId("STOP_BUTTON").setLabel("Stop Player").setStyle("DANGER").setEmoji("⏹"),
+ new MessageButton()
+ .setCustomId("SHOW_QUEUE_BUTTON")
+ .setLabel("Show Queue")
+ .setStyle("SECONDARY")
+ .setEmoji("#️⃣")
+ );
const msg = await ctx.reply({ embeds: [getEmbed()], components: [buttons] });
const collector = msg.createMessageComponentCollector({
@@ -61,44 +60,45 @@ export class NowPlayingCommand extends BaseCommand {
idle: 30000
});
- collector.on("collect", async i => {
- const newCtx = new CommandContext(i);
- let cmdName = "";
+ collector
+ .on("collect", async i => {
+ const newCtx = new CommandContext(i);
+ let cmdName = "";
- switch (i.customId) {
- case "TOGGLE_STATE_BUTTON": {
- cmdName = ctx.guild?.queue?.playing ? "pause" : "resume";
- break;
- }
+ switch (i.customId) {
+ case "TOGGLE_STATE_BUTTON": {
+ cmdName = ctx.guild?.queue?.playing ? "pause" : "resume";
+ break;
+ }
- case "SKIP_BUTTON": {
- cmdName = "skip";
- break;
- }
+ case "SKIP_BUTTON": {
+ cmdName = "skip";
+ break;
+ }
- case "SHOW_QUEUE_BUTTON": {
- cmdName = "queue";
- break;
- }
+ case "SHOW_QUEUE_BUTTON": {
+ cmdName = "queue";
+ break;
+ }
- case "STOP_BUTTON": {
- cmdName = "stop";
- break;
+ case "STOP_BUTTON": {
+ cmdName = "stop";
+ break;
+ }
}
- }
- await this.client.commands.get(cmdName)?.execute(newCtx);
+ await this.client.commands.get(cmdName)?.execute(newCtx);
- const embed = getEmbed();
+ const embed = getEmbed();
- await msg.edit({ embeds: [embed] });
- }).on("end", () => {
- const embed = getEmbed()
- .setFooter({ text: i18n.__("commands.music.nowplaying.disableButton") });
+ await msg.edit({ embeds: [embed] });
+ })
+ .on("end", () => {
+ const embed = getEmbed().setFooter({ text: i18n.__("commands.music.nowplaying.disableButton") });
- void msg.edit({
- embeds: [embed],
- components: []
+ void msg.edit({
+ embeds: [embed],
+ components: []
+ });
});
- });
}
}
diff --git a/src/commands/music/PauseCommand.ts b/src/commands/music/PauseCommand.ts
index 79c5735e9..2c2348c59 100644
--- a/src/commands/music/PauseCommand.ts
+++ b/src/commands/music/PauseCommand.ts
@@ -1,31 +1,34 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
+@Command({
+ description: i18n.__("commands.music.pause.description"),
+ name: "pause",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}pause"
+})
export class PauseCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.music.pause.description"),
- name: "pause",
- slash: {
- options: []
- },
- usage: "{prefix}pause"
- });
- }
-
+ @inVC
+ @haveQueue
+ @sameVC
public execute(ctx: CommandContext): Promise | undefined {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
-
- if (!ctx.guild?.queue?.playing) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.music.pause.alreadyPause"))] });
+ if (!ctx.guild?.queue?.playing) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.music.pause.alreadyPause"))]
+ });
+ }
ctx.guild.queue.playing = false;
- return ctx.reply({ embeds: [createEmbed("success", `⏸ **|** ${i18n.__("commands.music.pause.pauseMessage")}`)] });
+ return ctx.reply({
+ embeds: [createEmbed("success", `⏸ **|** ${i18n.__("commands.music.pause.pauseMessage")}`)]
+ });
}
}
diff --git a/src/commands/music/PlayCommand.ts b/src/commands/music/PlayCommand.ts
index b294ee6a7..cede5ea60 100644
--- a/src/commands/music/PlayCommand.ts
+++ b/src/commands/music/PlayCommand.ts
@@ -1,70 +1,101 @@
import { checkQuery, handleVideos, searchTrack } from "../../utils/handlers/GeneralUtil";
import { inVC, sameVC, validVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { ISong } from "../../typings";
+import { Command } from "../../utils/decorators/Command";
+import { Song } from "../../typings";
import i18n from "../../config";
import { Message } from "discord.js";
+@Command({
+ aliases: ["p", "add"],
+ description: i18n.__("commands.music.play.description"),
+ name: "play",
+ slash: {
+ description: i18n.__("commands.music.play.description"),
+ options: [
+ {
+ description: i18n.__("commands.music.play.slashQueryDescription"),
+ name: "query",
+ type: "STRING",
+ required: true
+ }
+ ]
+ },
+ usage: i18n.__("commands.music.play.usage")
+})
export class PlayCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["p", "add"],
- description: i18n.__("commands.music.play.description"),
- name: "play",
- slash: {
- description: i18n.__("commands.music.play.description"),
- options: [
- {
- description: i18n.__("commands.music.play.slashQueryDescription"),
- name: "query",
- type: "STRING",
- required: true
- }
- ]
- },
- usage: i18n.__("commands.music.play.usage")
- });
- }
-
+ @inVC
+ @validVC
+ @sameVC
public async execute(ctx: CommandContext): Promise {
- if (!inVC(ctx)) return;
- if (!validVC(ctx)) return;
- if (!sameVC(ctx)) return;
if (ctx.isInteraction() && !ctx.deferred) await ctx.deferReply();
const voiceChannel = ctx.member!.voice.channel!;
if (ctx.additionalArgs.get("fromSearch")) {
const tracks = ctx.additionalArgs.get("values");
- const toQueue: ISong[] = [];
+ const toQueue: Song[] = [];
+
for (const track of tracks) {
const song = await searchTrack(this.client, track as string).catch(() => null);
if (!song) continue;
+
toQueue.push(song.items[0]);
}
+
return handleVideos(this.client, ctx, toQueue, voiceChannel);
}
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
- const query = (ctx.args.join(" ") || ctx.options?.getString("query")) ?? (ctx.additionalArgs.get("values") ? ctx.additionalArgs.get("values")[0] : undefined) as string | undefined;
+
+ const query =
+ (ctx.args.join(" ") || ctx.options?.getString("query")) ??
+ (ctx.additionalArgs.get("values")
+ ? (ctx.additionalArgs.get("values") as (string | undefined)[])[0]
+ : undefined);
if (!query) {
return ctx.reply({
- embeds: [createEmbed("warn", i18n.__mf("reusable.invalidUsage", { prefix: `${this.client.config.mainPrefix}help`, name: `${this.meta.name}` }))]
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("reusable.invalidUsage", {
+ prefix: `${this.client.config.mainPrefix}help`,
+ name: `${this.meta.name}`
+ })
+ )
+ ]
});
}
- // eslint-disable-next-line prefer-named-capture-group
- const url = query.replace(/<(.+)>/g, "$1");
-
if (ctx.guild?.queue && voiceChannel.id !== ctx.guild.queue.connection?.joinConfig.channelId) {
- return ctx.reply({ embeds: [createEmbed("warn", i18n.__mf("commands.music.play.alreadyPlaying", { voiceChannel: ctx.guild.channels.cache.get((ctx.guild.queue.connection?.joinConfig as { channelId: string }).channelId)?.name ?? "#unknown-channel" }))] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("commands.music.play.alreadyPlaying", {
+ voiceChannel:
+ ctx.guild.channels.cache.get(
+ (ctx.guild.queue.connection?.joinConfig as { channelId: string }).channelId
+ )?.name ?? "#unknown-channel"
+ })
+ )
+ ]
+ });
}
- const queryCheck = checkQuery(url);
- const songs = await searchTrack(this.client, url).catch(() => undefined);
- if (!songs || songs.items.length <= 0) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.play.noSongData"), true)] });
+ const queryCheck = checkQuery(query);
+ const songs = await searchTrack(this.client, query).catch(() => undefined);
+ if (!songs || songs.items.length <= 0) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.play.noSongData"), true)]
+ });
+ }
- return handleVideos(this.client, ctx, queryCheck.type === "playlist" ? songs.items : [songs.items[0]], voiceChannel);
+ return handleVideos(
+ this.client,
+ ctx,
+ queryCheck.type === "playlist" ? songs.items : [songs.items[0]],
+ voiceChannel
+ );
}
}
diff --git a/src/commands/music/QueueCommand.ts b/src/commands/music/QueueCommand.ts
index 310dcadf4..b66bdfc7d 100644
--- a/src/commands/music/QueueCommand.ts
+++ b/src/commands/music/QueueCommand.ts
@@ -1,48 +1,57 @@
+import { ButtonPagination } from "../../utils/structures/ButtonPagination";
import { CommandContext } from "../../structures/CommandContext";
-import { ButtonPagination } from "../../utils/ButtonPagination";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { haveQueue } from "../../utils/decorators/MusicUtil";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { IQueueSong } from "../../typings";
-import { chunk } from "../../utils/chunk";
+import { Command } from "../../utils/decorators/Command";
+import { chunk } from "../../utils/functions/chunk";
+import { QueueSong } from "../../typings";
import i18n from "../../config";
import { AudioPlayerPlayingState } from "@discordjs/voice";
+@Command({
+ aliases: ["q"],
+ description: i18n.__("commands.music.queue.description"),
+ name: "queue",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}queue"
+})
export class QueueCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["q"],
- description: i18n.__("commands.music.queue.description"),
- name: "queue",
- slash: {
- options: []
- },
- usage: "{prefix}queue"
- });
- }
-
+ @haveQueue
public async execute(ctx: CommandContext): Promise {
- if (!haveQueue(ctx)) return;
-
- const np = (ctx.guild!.queue!.player!.state as AudioPlayerPlayingState).resource.metadata as IQueueSong;
+ const np = (ctx.guild!.queue!.player.state as AudioPlayerPlayingState).resource.metadata as QueueSong;
const full = ctx.guild!.queue!.songs.sortByIndex();
const songs = ctx.guild?.queue?.loopMode === "QUEUE" ? full : full.filter(val => val.index >= np.index);
- const pages = await Promise.all(chunk([...songs.values()], 10).map(async (s, n) => {
- const names = await Promise.all(s.map((song, i) => {
- const npKey = np.key;
- const addition = song.key === npKey ? "**" : "";
+ const pages = await Promise.all(
+ chunk([...songs.values()], 10).map(async (s, n) => {
+ const names = await Promise.all(
+ s.map((song, i) => {
+ const npKey = np.key;
+ const addition = song.key === npKey ? "**" : "";
- return `${addition}${(n * 10) + (i + 1)} - [${song.song.title}](${song.song.url})${addition}`;
- }));
+ return `${addition}${n * 10 + (i + 1)} - [${song.song.title}](${song.song.url})${addition}`;
+ })
+ );
- return names.join("\n");
- }));
- const embed = createEmbed("info", pages[0]);
+ return names.join("\n");
+ })
+ );
+ const embed = createEmbed("info", pages[0]).setThumbnail(
+ ctx.guild!.iconURL({ dynamic: true, format: "png", size: 1024 })!
+ );
const msg = await ctx.reply({ embeds: [embed] });
return new ButtonPagination(msg, {
author: ctx.author.id,
- edit: (i, e, p) => e.setDescription(p).setFooter({ text: i18n.__mf("reusable.pageFooter", { actual: i + 1, total: pages.length }) }),
+ edit: (i, e, p) =>
+ e.setDescription(p).setFooter({
+ text: i18n.__mf("reusable.pageFooter", {
+ actual: i + 1,
+ total: pages.length
+ })
+ }),
embed,
pages
}).start();
diff --git a/src/commands/music/RemoveCommand.ts b/src/commands/music/RemoveCommand.ts
index bdcffb52f..6c0de05d9 100644
--- a/src/commands/music/RemoveCommand.ts
+++ b/src/commands/music/RemoveCommand.ts
@@ -1,48 +1,53 @@
+import { parseHTMLElements } from "../../utils/functions/parseHTMLElements";
+import { ButtonPagination } from "../../utils/structures/ButtonPagination";
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
-import { parseHTMLElements } from "../../utils/parseHTMLElements";
import { CommandContext } from "../../structures/CommandContext";
-import { ButtonPagination } from "../../utils/ButtonPagination";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { IQueueSong } from "../../typings";
-import { chunk } from "../../utils/chunk";
+import { Command } from "../../utils/decorators/Command";
+import { chunk } from "../../utils/functions/chunk";
+import { QueueSong } from "../../typings";
import i18n from "../../config";
import { AudioPlayerState, AudioResource } from "@discordjs/voice";
import { Util } from "discord.js";
+@Command({
+ description: i18n.__("commands.music.remove.description"),
+ name: "remove",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.remove.slashPositionsDescription"),
+ name: "positions",
+ required: true,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.music.remove.usage")
+})
export class RemoveCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.music.remove.description"),
- name: "remove",
- slash: {
- options: [
- {
- description: i18n.__("commands.music.remove.slashPositionsDescription"),
- name: "positions",
- required: true,
- type: "STRING"
- }
- ]
- },
- usage: i18n.__("commands.music.remove.usage")
- });
- }
-
+ @inVC
+ @haveQueue
+ @sameVC
public async execute(ctx: CommandContext): Promise {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
-
const djRole = await this.client.utils.fetchDJRole(ctx.guild!);
- if (!ctx.member?.roles.cache.has(djRole.id) && !ctx.member?.permissions.has("MANAGE_GUILD")) {
- void ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.remove.noPermission"), true)] });
+ if (
+ this.client.data.data?.[ctx.guild!.id]?.dj?.enable &&
+ !ctx.member?.roles.cache.has(djRole?.id ?? "") &&
+ !ctx.member?.permissions.has("MANAGE_GUILD")
+ ) {
+ void ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.remove.noPermission"), true)]
+ });
return;
}
const positions = (ctx.options?.getString("positions") ?? ctx.args.join(" ")).split(/[, ]/).filter(Boolean);
if (!positions.length) {
- void ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.remove.noPositions"), true)] });
+ void ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.remove.noPositions"), true)]
+ });
return;
}
@@ -52,27 +57,52 @@ export class RemoveCommand extends BaseCommand {
ctx.guild!.queue!.songs.delete(song.key);
}
- const np = (ctx.guild?.queue?.player?.state as (AudioPlayerState & { resource: AudioResource | undefined }) | undefined)?.resource?.metadata as IQueueSong | undefined;
+ const np = (
+ ctx.guild?.queue?.player.state as (AudioPlayerState & { resource: AudioResource | undefined }) | undefined
+ )?.resource?.metadata as QueueSong | undefined;
const isSkip = songs.map(x => x.key).includes(np?.key ?? "");
if (isSkip) {
this.client.commands.get("skip")?.execute(ctx);
}
- const opening = `${i18n.__mf("commands.music.remove.songsRemoved", { removed: songs.length })}${isSkip ? i18n.__("commands.music.remove.songSkip") : ""}`;
- const pages = await Promise.all(chunk(songs, 10).map(async (v, i) => {
- const texts = await Promise.all(v.map((song, index) => `${(i * 10) + (index + 1)}.) ${Util.escapeMarkdown(parseHTMLElements(song.song.title))}`));
+ const opening = `${i18n.__mf("commands.music.remove.songsRemoved", {
+ removed: songs.length
+ })}`;
+ const pages = await Promise.all(
+ chunk(songs, 10).map(async (v, i) => {
+ const texts = await Promise.all(
+ v.map(
+ (song, index) =>
+ `${isSkip ? i18n.__("commands.music.remove.songSkip") : ""}${
+ i * 10 + (index + 1)
+ }.) ${Util.escapeMarkdown(parseHTMLElements(song.song.title))}`
+ )
+ );
- return texts.join("\n");
- }));
- const getText = (page: string): string => `\`\`\`\n${opening}\n\n${page}\`\`\``;
- const embed = createEmbed("info", getText(pages[0])).setFooter({ text: `• ${i18n.__mf("reusable.pageFooter", { actual: 1, total: pages.length })}` });
+ return texts.join("\n");
+ })
+ );
+ const getText = (page: string): string => `\`\`\`\n${page}\`\`\``;
+ const embed = createEmbed("info", getText(pages[0]))
+ .setAuthor(opening)
+ .setFooter({
+ text: `• ${i18n.__mf("reusable.pageFooter", {
+ actual: 1,
+ total: pages.length
+ })}`
+ });
const msg = await ctx.reply({ embeds: [embed] }).catch(() => undefined);
if (!msg) return;
void new ButtonPagination(msg, {
author: ctx.author.id,
edit: (i, e, p) => {
- e.setDescription(getText(p)).setFooter({ text: `• ${i18n.__mf("reusable.pageFooter", { actual: i + 1, total: pages.length })}` });
+ e.setDescription(getText(p)).setFooter({
+ text: `• ${i18n.__mf("reusable.pageFooter", {
+ actual: i + 1,
+ total: pages.length
+ })}`
+ });
},
embed,
pages
diff --git a/src/commands/music/RepeatCommand.ts b/src/commands/music/RepeatCommand.ts
index 950ecbe8a..5551f9e6b 100644
--- a/src/commands/music/RepeatCommand.ts
+++ b/src/commands/music/RepeatCommand.ts
@@ -1,45 +1,42 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import { LoopMode } from "../../typings";
import i18n from "../../config";
import { Message } from "discord.js";
-export class RepeatCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["loop", "music-repeat", "music-loop"],
- description: i18n.__("commands.music.repeat.description"),
- name: "repeat",
- slash: {
- options: [
- {
- description: i18n.__("commands.music.repeat.slashQueue"),
- name: "queue",
- type: "SUB_COMMAND"
- },
- {
- description: i18n.__("commands.music.repeat.slashQueue"),
- name: "song",
- type: "SUB_COMMAND"
- },
- {
- description: i18n.__("commands.music.repeat.slashDisable"),
- name: "disable",
- type: "SUB_COMMAND"
- }
- ]
+@Command({
+ aliases: ["loop", "music-repeat", "music-loop"],
+ description: i18n.__("commands.music.repeat.description"),
+ name: "repeat",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.repeat.slashQueue"),
+ name: "queue",
+ type: "SUB_COMMAND"
},
- usage: i18n.__("commands.music.repeat.usage", { options: "queue | one | disable" })
- });
- }
-
+ {
+ description: i18n.__("commands.music.repeat.slashQueue"),
+ name: "song",
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.music.repeat.slashDisable"),
+ name: "disable",
+ type: "SUB_COMMAND"
+ }
+ ]
+ },
+ usage: i18n.__mf("commands.music.repeat.usage", { options: "queue | one | disable" })
+})
+export class RepeatCommand extends BaseCommand {
+ @inVC
+ @haveQueue
+ @sameVC
public execute(ctx: CommandContext): Promise | undefined {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
-
const mode: Record = {
OFF: {
aliases: ["disable", "off", "0"],
@@ -50,18 +47,47 @@ export class RepeatCommand extends BaseCommand {
emoji: "🔁"
},
SONG: {
- aliases: ["one", "song", "this", "1"],
+ aliases: ["one", "song", "current", "this", "1"],
emoji: "🔂"
}
};
- const selection = ctx.options?.getSubcommand() ||
- ctx.args[0]
- ? Object.keys(mode).find(key => mode[key as LoopMode].aliases.includes(ctx.args[0] ?? ctx.options!.getSubcommand()))
- : undefined;
+ const selection =
+ ctx.options?.getSubcommand() || ctx.args[0]
+ ? Object.keys(mode).find(key =>
+ mode[key as LoopMode].aliases.includes(ctx.args[0] ?? ctx.options!.getSubcommand())
+ )
+ : undefined;
- if (!selection) return ctx.reply({ embeds: [createEmbed("info", `${mode[ctx.guild!.queue!.loopMode].emoji} **|** ${i18n.__mf("commands.music.repeat.actualMode", { mode: `\`${ctx.guild!.queue!.loopMode}\`` })}`)] });
+ if (!selection) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ `${mode[ctx.guild!.queue!.loopMode].emoji} **|** ${i18n.__mf(
+ "commands.music.repeat.actualMode",
+ {
+ mode: `\`${ctx.guild!.queue!.loopMode}\``
+ }
+ )}`
+ ).setFooter({
+ text: i18n.__mf("commands.music.repeat.footer", {
+ prefix: this.client.config.mainPrefix
+ })
+ })
+ ]
+ });
+ }
ctx.guild!.queue!.loopMode = selection as LoopMode;
- return ctx.reply({ embeds: [createEmbed("success", `${mode[ctx.guild!.queue!.loopMode].emoji} **|** ${i18n.__mf("commands.music.repeat.actualMode", { mode: `\`${ctx.guild!.queue!.loopMode}\`` })}`)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `${mode[ctx.guild!.queue!.loopMode].emoji} **|** ${i18n.__mf("commands.music.repeat.newMode", {
+ mode: `\`${ctx.guild!.queue!.loopMode}\``
+ })}`
+ )
+ ]
+ });
}
}
diff --git a/src/commands/music/ResumeCommand.ts b/src/commands/music/ResumeCommand.ts
index 1fb3c41db..ac61703e5 100644
--- a/src/commands/music/ResumeCommand.ts
+++ b/src/commands/music/ResumeCommand.ts
@@ -1,29 +1,33 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
+@Command({
+ description: i18n.__("commands.music.resume.description"),
+ name: "resume",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}resume"
+})
export class ResumeCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.music.resume.description"),
- name: "resume",
- slash: {
- options: []
- },
- usage: "{prefix}resume"
- });
- }
-
+ @inVC
+ @haveQueue
+ @sameVC
public execute(ctx: CommandContext): Promise | undefined {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
- if (ctx.guild?.queue?.playing) return ctx.reply({ embeds: [createEmbed("warn", i18n.__("commands.music.resume.alreadyResume"))] });
+ if (ctx.guild?.queue?.playing) {
+ return ctx.reply({
+ embeds: [createEmbed("warn", i18n.__("commands.music.resume.alreadyResume"))]
+ });
+ }
ctx.guild!.queue!.playing = true;
- return ctx.reply({ embeds: [createEmbed("success", `▶ **|** ${i18n.__("commands.music.resume.resumeMessage")}`)] });
+ return ctx.reply({
+ embeds: [createEmbed("success", `▶ **|** ${i18n.__("commands.music.resume.resumeMessage")}`)]
+ });
}
}
diff --git a/src/commands/music/SearchCommand.ts b/src/commands/music/SearchCommand.ts
index eb6001875..4a7020fbd 100644
--- a/src/commands/music/SearchCommand.ts
+++ b/src/commands/music/SearchCommand.ts
@@ -1,79 +1,94 @@
+import { parseHTMLElements } from "../../utils/functions/parseHTMLElements";
import { checkQuery, searchTrack } from "../../utils/handlers/GeneralUtil";
import { inVC, validVC, sameVC } from "../../utils/decorators/MusicUtil";
-import { parseHTMLElements } from "../../utils/parseHTMLElements";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { ISong } from "../../typings";
+import { Command } from "../../utils/decorators/Command";
+import { Song } from "../../typings";
import i18n from "../../config";
-import { CommandInteractionOptionResolver, Message, MessageActionRow, MessageSelectOptionData, MessageSelectMenu, SelectMenuInteraction, Util } from "discord.js";
+import {
+ CommandInteractionOptionResolver,
+ Message,
+ MessageActionRow,
+ MessageSelectOptionData,
+ MessageSelectMenu,
+ SelectMenuInteraction,
+ Util
+} from "discord.js";
-export class SearchCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["sc"],
- contextChat: "Add to queue",
- description: i18n.__("commands.music.search.description"),
- name: "search",
- slash: {
- description: i18n.__("commands.music.search.slashDescription"),
- options: [
+@Command({
+ aliases: ["sc"],
+ contextChat: "Add to queue",
+ description: i18n.__("commands.music.search.description"),
+ name: "search",
+ slash: {
+ description: i18n.__("commands.music.search.slashDescription"),
+ options: [
+ {
+ description: i18n.__("commands.music.search.slashQueryDescription"),
+ name: "query",
+ type: "STRING"
+ },
+ {
+ choices: [
{
- description: i18n.__("commands.music.search.slashQueryDescription"),
- name: "query",
- type: "STRING"
+ name: "YouTube",
+ value: "youtube"
},
{
- choices: [
- {
- name: "YouTube",
- value: "youtube"
- },
- {
- name: "SoundCloud",
- value: "soundcloud"
- }
- ],
- description: i18n.__("commands.music.search.slashSourceDescription"),
- name: "source",
- required: false,
- type: "STRING"
+ name: "SoundCloud",
+ value: "soundcloud"
}
- ]
- },
- usage: i18n.__("commands.music.search.usage")
- });
- }
-
+ ],
+ description: i18n.__("commands.music.search.slashSourceDescription"),
+ name: "source",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: i18n.__("commands.music.search.usage")
+})
+export class SearchCommand extends BaseCommand {
+ @inVC
+ @validVC
+ @sameVC
public async execute(ctx: CommandContext): Promise {
- if (!inVC(ctx)) return;
- if (!validVC(ctx)) return;
- if (!sameVC(ctx)) return;
if (ctx.isInteraction() && !ctx.deferred) await ctx.deferReply();
const values = ctx.additionalArgs.get("values");
if (values && ctx.isSelectMenu()) {
if (!ctx.deferred) await ctx.deferReply();
+
const newCtx = new CommandContext(ctx.context, []);
+
newCtx.additionalArgs.set("values", values);
newCtx.additionalArgs.set("fromSearch", true);
this.client.commands.get("play")!.execute(newCtx);
- const msg = await ctx.channel!.messages.fetch((ctx.context as SelectMenuInteraction).message.id).catch(() => undefined);
+
+ const msg = await ctx
+ .channel!.messages.fetch((ctx.context as SelectMenuInteraction).message.id)
+ .catch(() => undefined);
if (msg !== undefined) {
const selection = msg.components[0].components.find(x => x.type === "SELECT_MENU");
selection!.setDisabled(true);
await msg.edit({ components: [new MessageActionRow().addComponents(selection!)] });
}
+
return;
}
- const source = ctx.options?.getString("source") ?? (["youtube", "soundcloud"].includes(ctx.args.slice(-1)[0]?.toLowerCase()) ? ctx.args.pop()! : "youtube");
- const query = (ctx.args.join(" ") || ctx.options?.getString("query")) ?? (ctx.options as CommandInteractionOptionResolver<"present"> | null)?.getMessage("message")?.content;
+
+ const source =
+ ctx.options?.getString("source") ??
+ (["youtube", "soundcloud"].includes(ctx.args.slice(-1)[0]?.toLowerCase()) ? ctx.args.pop()! : "youtube");
+ const query =
+ (ctx.args.join(" ") || ctx.options?.getString("query")) ??
+ (ctx.options as CommandInteractionOptionResolver<"cached"> | null)?.getMessage("message")?.content;
if (!query) {
return ctx.send({
- embeds: [
- createEmbed("warn", i18n.__("commands.music.search.noQuery"))
- ]
+ embeds: [createEmbed("warn", i18n.__("commands.music.search.noQuery"))]
});
}
if (checkQuery(query).isURL) {
@@ -81,72 +96,101 @@ export class SearchCommand extends BaseCommand {
return this.client.commands.get("play")!.execute(newCtx);
}
- const tracks = await searchTrack(this.client, query, source as "soundcloud" | "youtube").then(x => ({ items: x.items.slice(0, 10), type: x.type })).catch(() => undefined);
- if (!tracks || tracks.items.length <= 0) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.search.noTracks"), true)] });
+ const tracks = await searchTrack(this.client, query, source as "soundcloud" | "youtube")
+ .then(x => ({ items: x.items.slice(0, 10), type: x.type }))
+ .catch(() => undefined);
+ if (!tracks || tracks.items.length <= 0) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.search.noTracks"), true)]
+ });
+ }
if (this.client.config.musicSelectionType === "selectmenu") {
return ctx.send({
content: i18n.__("commands.music.search.interactionContent"),
components: [
- new MessageActionRow()
- .addComponents(
- new MessageSelectMenu()
- .setMinValues(1)
- .setMaxValues(10)
- .setCustomId(Buffer.from(`${ctx.author.id}_${this.meta.name}`).toString("base64"))
- .addOptions(this.generateSelectMenu(tracks.items))
- .setPlaceholder(i18n.__("commands.music.search.interactionPlaceholder"))
- )
+ new MessageActionRow().addComponents(
+ new MessageSelectMenu()
+ .setMinValues(1)
+ .setMaxValues(10)
+ .setCustomId(Buffer.from(`${ctx.author.id}_${this.meta.name}`).toString("base64"))
+ .addOptions(this.generateSelectMenu(tracks.items))
+ .setPlaceholder(i18n.__("commands.music.search.interactionPlaceholder"))
+ )
]
});
}
const msg = await ctx.send({
embeds: [
- createEmbed("info", `${i18n.__mf("commands.music.search.queueEmbed", { separator: "`,`", example: "`1, 2, 3`" })}\`\`\`\n${tracks.items.map((x, i) => `${i + 1} - ${Util.escapeMarkdown(parseHTMLElements(x.title))}`).join("\n")}\`\`\``)
- .setAuthor({ name: i18n.__("commands.music.search.trackSelectionMessage"), iconURL: this.client.user?.displayAvatarURL() })
+ createEmbed(
+ "info",
+ `${i18n.__mf("commands.music.search.queueEmbed", {
+ separator: "`,`",
+ example: "`1, 2, 3`"
+ })}\`\`\`\n${tracks.items
+ .map((x, i) => `${i + 1} - ${Util.escapeMarkdown(parseHTMLElements(x.title))}`)
+ .join("\n")}\`\`\``
+ )
+ .setAuthor({
+ name: i18n.__("commands.music.search.trackSelectionMessage"),
+ iconURL: this.client.user?.displayAvatarURL()
+ })
.setFooter({ text: i18n.__mf("commands.music.search.cancelMessage", { cancel: "cancel", c: "c" }) })
]
});
- const respond = await msg.channel.awaitMessages({
- errors: ["time"],
- filter: m => {
- const nums = m.content.split(/, /).filter(x => Number(x) > 0 && Number(x) <= tracks.items.length);
+ const respond = await msg.channel
+ .awaitMessages({
+ errors: ["time"],
+ filter: m => {
+ const nums = m.content.split(/, /).filter(x => Number(x) > 0 && Number(x) <= tracks.items.length);
- return m.author.id === ctx.author.id && (["c", "cancel"].includes(m.content.toLowerCase()) || nums.length >= 1);
- },
- max: 1
- }).catch(() => undefined);
+ return (
+ m.author.id === ctx.author.id &&
+ (["c", "cancel"].includes(m.content.toLowerCase()) || nums.length >= 1)
+ );
+ },
+ max: 1
+ })
+ .catch(() => undefined);
if (!respond) {
msg.delete().catch(err => this.client.logger.error("SEARCH_SELECTION_DELETE_MSG_ERR:", err));
- return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.search.noSelection"), true)] });
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.search.noSelection"), true)]
+ });
}
if (["c", "cancel"].includes(respond.first()?.content.toLowerCase() ?? "")) {
msg.delete().catch(err => this.client.logger.error("SEARCH_SELECTION_DELETE_MSG_ERR:", err));
- return ctx.reply({ embeds: [createEmbed("info", i18n.__("commands.music.search.canceledMessage"), true)] });
+ return ctx.reply({
+ embeds: [createEmbed("info", i18n.__("commands.music.search.canceledMessage"), true)]
+ });
}
msg.delete().catch(err => this.client.logger.error("SEARCH_SELECTION_DELETE_MSG_ERR:", err));
- respond.first()?.delete().catch(err => this.client.logger.error("SEARCH_SELECTION_NUM_DELETE_MSG_ERR:", err));
+ respond
+ .first()
+ ?.delete()
+ .catch(err => this.client.logger.error("SEARCH_SELECTION_NUM_DELETE_MSG_ERR:", err));
- const songs = respond.first()!.content
- .split(/, /).filter(x => Number(x) > 0 && Number(x) <= tracks.items.length)
+ const songs = respond
+ .first()!
+ .content.split(/, /)
+ .filter(x => Number(x) > 0 && Number(x) <= tracks.items.length)
.sort((a, b) => Number(a) - Number(b));
const newCtx = new CommandContext(ctx.context, []);
+
newCtx.additionalArgs.set("values", [await Promise.all(songs.map(x => tracks.items[Number(x) - 1].url))]);
newCtx.additionalArgs.set("fromSearch", true);
this.client.commands.get("play")!.execute(newCtx);
}
// eslint-disable-next-line class-methods-use-this
- private generateSelectMenu(tracks: ISong[]): MessageSelectOptionData[] {
+ private generateSelectMenu(tracks: Song[]): MessageSelectOptionData[] {
const emojis = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣", "🔟"];
- return tracks.slice(0, 10).map((x, i) => (
- {
- label: x.title.length > 98 ? `${x.title.substr(0, 97)}...` : x.title,
- emoji: emojis[i],
- value: x.url
- }
- ));
+ return tracks.slice(0, 10).map((x, i) => ({
+ label: x.title.length > 98 ? `${x.title.slice(0, 97)}...` : x.title,
+ emoji: emojis[i],
+ value: x.url
+ }));
}
}
diff --git a/src/commands/music/ShuffleCommand.ts b/src/commands/music/ShuffleCommand.ts
index e82c51144..e6953f71e 100644
--- a/src/commands/music/ShuffleCommand.ts
+++ b/src/commands/music/ShuffleCommand.ts
@@ -1,51 +1,67 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
-export class ShuffleCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- description: i18n.__("commands.music.shuffle.description"),
- name: "shuffle",
- slash: {
- options: [
+@Command({
+ description: i18n.__("commands.music.shuffle.description"),
+ name: "shuffle",
+ slash: {
+ options: [
+ {
+ choices: [
+ {
+ name: "ENABLE",
+ value: "enable"
+ },
{
- choices: [
- {
- name: "ENABLE",
- value: "enable"
- },
- {
- name: "DISABLE",
- value: "disable"
- }
- ],
- description: i18n.__("commands.music.shuffle.description"),
- name: "state",
- required: false,
- type: "STRING"
+ name: "DISABLE",
+ value: "disable"
}
- ]
- },
- usage: "{prefix}shuffle [enable | disable]"
- });
- }
-
+ ],
+ description: i18n.__("commands.music.shuffle.description"),
+ name: "state",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: "{prefix}shuffle [enable | disable]"
+})
+export class ShuffleCommand extends BaseCommand {
+ @inVC
+ @haveQueue
+ @sameVC
public execute(ctx: CommandContext): void {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
- const newState = ctx.options?.getString("state") ?? ctx.args[0] as string | undefined;
+ const newState = ctx.options?.getString("state") ?? (ctx.args[0] as string | undefined);
if (!newState) {
- void ctx.reply({ embeds: [createEmbed("info", `🔀 **|** ${i18n.__mf("commands.music.shuffle.actualState", { state: `\`${ctx.guild?.queue?.shuffle ? "ENABLED" : "DISABLED"}\`` })}`)] });
+ void ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ `🔀 **|** ${i18n.__mf("commands.music.shuffle.actualState", {
+ state: `\`${ctx.guild?.queue?.shuffle ? "ENABLED" : "DISABLED"}\``
+ })}`
+ )
+ ]
+ });
return;
}
ctx.guild!.queue!.shuffle = newState === "enable";
const isShuffle = ctx.guild?.queue?.shuffle;
- void ctx.reply({ embeds: [createEmbed("success", `${isShuffle ? "🔀" : "▶"} **|** ${i18n.__mf("commands.music.shuffle.newState", { state: `\`${isShuffle ? "ENABLED" : "DISABLED"}\`` })}`)] });
+ void ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `${isShuffle ? "🔀" : "▶"} **|** ${i18n.__mf("commands.music.shuffle.newState", {
+ state: `\`${isShuffle ? "ENABLED" : "DISABLED"}\``
+ })}`
+ )
+ ]
+ });
}
}
diff --git a/src/commands/music/SkipCommand.ts b/src/commands/music/SkipCommand.ts
index 7f9709c49..2b184b4d1 100644
--- a/src/commands/music/SkipCommand.ts
+++ b/src/commands/music/SkipCommand.ts
@@ -1,55 +1,60 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
+import { OperationManager } from "../../utils/structures/OperationManager";
import { CommandContext } from "../../structures/CommandContext";
-import { OperationManager } from "../../utils/OperationManager";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
-import { IQueueSong } from "../../typings";
+import { Command } from "../../utils/decorators/Command";
+import { QueueSong } from "../../typings";
import i18n from "../../config";
import { AudioPlayerPlayingState } from "@discordjs/voice";
import { GuildMember } from "discord.js";
+@Command({
+ aliases: ["s"],
+ description: i18n.__("commands.music.skip.description"),
+ name: "skip",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}skip"
+})
export class SkipCommand extends BaseCommand {
private readonly manager = new OperationManager();
-
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["s"],
- description: i18n.__("commands.music.skip.description"),
- name: "skip",
- slash: {
- options: []
- },
- usage: "{prefix}skip"
- });
- }
-
+ @inVC
+ @haveQueue
+ @sameVC
public async execute(ctx: CommandContext): Promise {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
-
const djRole = await this.client.utils.fetchDJRole(ctx.guild!).catch(() => null);
- const song = (ctx.guild!.queue!.player!.state as AudioPlayerPlayingState).resource.metadata as IQueueSong;
+ const song = (ctx.guild!.queue!.player.state as AudioPlayerPlayingState).resource.metadata as QueueSong;
function ableToSkip(member: GuildMember): boolean {
- return member.roles.cache.has(djRole?.id ?? "") || member.permissions.has("MANAGE_GUILD") || song.requester.id === member.id;
+ return (
+ member.roles.cache.has(djRole?.id ?? "") ||
+ member.permissions.has("MANAGE_GUILD") ||
+ song.requester.id === member.id
+ );
}
if (!ableToSkip(ctx.member!)) {
const required = this.client.utils.requiredVoters(ctx.guild!.me!.voice.channel!.members.size);
if (ctx.guild?.queue?.skipVoters.includes(ctx.author.id)) {
- this.manager.add(() => {
+ await this.manager.add(() => {
ctx.guild!.queue!.skipVoters = ctx.guild!.queue!.skipVoters.filter(x => x !== ctx.author.id);
return undefined;
});
- await ctx.reply(i18n.__mf("commands.music.skip.voteResultMessage", { length: ctx.guild.queue.skipVoters.length, required }));
+ await ctx.reply(
+ i18n.__mf("commands.music.skip.voteResultMessage", {
+ length: ctx.guild.queue.skipVoters.length,
+ required
+ })
+ );
return;
}
- this.manager.add(() => {
+ await this.manager.add(() => {
ctx.guild?.queue?.skipVoters.push(ctx.author.id);
return undefined;
@@ -62,7 +67,18 @@ export class SkipCommand extends BaseCommand {
}
if (!ctx.guild?.queue?.playing) ctx.guild!.queue!.playing = true;
- ctx.guild?.queue?.player?.stop(true);
- void ctx.reply({ embeds: [createEmbed("success", `⏭ **|** ${i18n.__mf("commands.music.skip.skipMessage", { song: `[${song.song.title}](${song.song.url}})` })}`).setThumbnail(song.song.thumbnail)] }).catch(e => this.client.logger.error("SKIP_CMD_ERR:", e));
+ ctx.guild?.queue?.player.stop(true);
+ void ctx
+ .reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `⏭ **|** ${i18n.__mf("commands.music.skip.skipMessage", {
+ song: `[${song.song.title}](${song.song.url}})`
+ })}`
+ ).setThumbnail(song.song.thumbnail)
+ ]
+ })
+ .catch(e => this.client.logger.error("SKIP_CMD_ERR:", e));
}
}
diff --git a/src/commands/music/SkipToCommand.ts b/src/commands/music/SkipToCommand.ts
index 94c9ded0d..01103af00 100644
--- a/src/commands/music/SkipToCommand.ts
+++ b/src/commands/music/SkipToCommand.ts
@@ -1,65 +1,91 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
+import { Command } from "../../utils/decorators/Command";
import { play } from "../../utils/handlers/GeneralUtil";
-import { createEmbed } from "../../utils/createEmbed";
-import { IQueueSong } from "../../typings";
+import { QueueSong } from "../../typings";
import i18n from "../../config";
import { AudioPlayerPlayingState } from "@discordjs/voice";
import { Message } from "discord.js";
-export class SkipToCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["st"],
- description: i18n.__("commands.music.skipTo.description"),
- name: "skipto",
- slash: {
+@Command({
+ aliases: ["st"],
+ description: i18n.__("commands.music.skipTo.description"),
+ name: "skipto",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.skipTo.slashFirstDescription"),
+ name: "first",
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.music.skipTo.slashLastDescription"),
+ name: "last",
+ type: "SUB_COMMAND"
+ },
+ {
+ description: i18n.__("commands.music.skipTo.slashSpecificDescription"),
+ name: "specific",
options: [
{
- description: i18n.__("commands.music.skipTo.slashFirstDescription"),
- name: "first",
- type: "SUB_COMMAND"
- },
- {
- description: i18n.__("commands.music.skipTo.slashLastDescription"),
- name: "last",
- type: "SUB_COMMAND"
- },
- {
- description: i18n.__("commands.music.skipTo.slashSpecificDescription"),
- name: "specific",
- options: [
- {
- description: i18n.__("commands.music.skipTo.slashPositionDescription"),
- name: "position",
- required: true,
- type: "NUMBER"
- }
- ],
- type: "SUB_COMMAND"
+ description: i18n.__("commands.music.skipTo.slashPositionDescription"),
+ name: "position",
+ required: true,
+ type: "NUMBER"
}
- ]
- },
- usage: i18n.__("commands.music.skipTo.usage", { options: "first | last" })
- });
- }
-
+ ],
+ type: "SUB_COMMAND"
+ }
+ ]
+ },
+ usage: i18n.__mf("commands.music.skipTo.usage", { options: "first | last" })
+})
+export class SkipToCommand extends BaseCommand {
+ @inVC
+ @haveQueue
+ @sameVC
public async execute(ctx: CommandContext): Promise {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
-
const djRole = await this.client.utils.fetchDJRole(ctx.guild!);
- if (!ctx.member?.roles.cache.has(djRole.id) && !ctx.member?.permissions.has("MANAGE_GUILD")) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.noPermission"), true)] });
+ if (
+ this.client.data.data?.[ctx.guild!.id]?.dj?.enable &&
+ !ctx.member?.roles.cache.has(djRole?.id ?? "") &&
+ !ctx.member?.permissions.has("MANAGE_GUILD")
+ ) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.noPermission"), true)]
+ });
+ }
- const targetType = (ctx.args[0] as string | undefined) ?? ctx.options?.getSubcommand() ?? ctx.options?.getNumber("position");
- if (!targetType) return ctx.reply({ embeds: [createEmbed("warn", i18n.__mf("reusable.invalidUsage", { prefix: `${this.client.config.mainPrefix}help`, name: `${this.meta.name}` }))] });
+ const targetType =
+ (ctx.args[0] as string | undefined) ?? ctx.options?.getSubcommand() ?? ctx.options?.getNumber("position");
+ if (!targetType) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("reusable.invalidUsage", {
+ prefix: `${this.client.config.mainPrefix}help`,
+ name: `${this.meta.name}`
+ })
+ )
+ ]
+ });
+ }
const songs = [...ctx.guild!.queue!.songs.sortByIndex().values()];
- if (!["first", "last"].includes(String(targetType).toLowerCase()) && (!isNaN(Number(targetType)) && !songs[Number(targetType) - 1])) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.noSongPosition"), true)] });
+ if (
+ !["first", "last"].includes(String(targetType).toLowerCase()) &&
+ !isNaN(Number(targetType)) &&
+ !songs[Number(targetType) - 1]
+ ) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.noSongPosition"), true)]
+ });
+ }
- let song: IQueueSong;
+ let song: QueueSong;
if (String(targetType).toLowerCase() === "first") {
song = songs[0];
} else if (String(targetType).toLowerCase() === "last") {
@@ -68,10 +94,26 @@ export class SkipToCommand extends BaseCommand {
song = songs[Number(targetType) - 1];
}
- if (song.key === ((ctx.guild!.queue!.player!.state as AudioPlayerPlayingState).resource.metadata as IQueueSong).key) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.cantPlay"), true)] });
+ if (
+ song.key ===
+ ((ctx.guild!.queue!.player.state as AudioPlayerPlayingState).resource.metadata as QueueSong).key
+ ) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.skipTo.cantPlay"), true)]
+ });
+ }
- void play(this.client, ctx.guild!, song.key);
+ void play(ctx.guild!, song.key);
- return ctx.reply({ embeds: [createEmbed("success", `⏭ **|** ${i18n.__mf("commands.music.skipTo.skipMessage", { song: `[${song.song.title}](${song.song.url})` })}`).setThumbnail(song.song.thumbnail)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `⏭ **|** ${i18n.__mf("commands.music.skipTo.skipMessage", {
+ song: `[${song.song.title}](${song.song.url})`
+ })}`
+ ).setThumbnail(song.song.thumbnail)
+ ]
+ });
}
}
diff --git a/src/commands/music/StayInQueueCommand.ts b/src/commands/music/StayInQueueCommand.ts
index 0deb988e6..b1c368d77 100644
--- a/src/commands/music/StayInQueueCommand.ts
+++ b/src/commands/music/StayInQueueCommand.ts
@@ -1,52 +1,75 @@
import { haveQueue, inVC, sameVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
import { Message } from "discord.js";
-export class StayInQueueCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["stayinvc", "stay", "24/7"],
- description: i18n.__("commands.music.stayInQueue.description"),
- name: "stayinvoice",
- slash: {
- options: [
+@Command({
+ aliases: ["stayinvc", "stay", "24/7"],
+ description: i18n.__("commands.music.stayInQueue.description"),
+ name: "stayinvoice",
+ slash: {
+ options: [
+ {
+ choices: [
+ {
+ name: "ENABLE",
+ value: "enable"
+ },
{
- choices: [
- {
- name: "ENABLE",
- value: "enable"
- },
- {
- name: "DISABLE",
- value: "disable"
- }
- ],
- description: i18n.__("commands.music.stayInQueue.slashDescription"),
- name: "state",
- required: false,
- type: "STRING"
+ name: "DISABLE",
+ value: "disable"
}
- ]
- },
- usage: "{prefix}stayinvc [enable | disable]"
- });
- }
-
+ ],
+ description: i18n.__("commands.music.stayInQueue.slashDescription"),
+ name: "state",
+ required: false,
+ type: "STRING"
+ }
+ ]
+ },
+ usage: "{prefix}stayinvc [enable | disable]"
+})
+export class StayInQueueCommand extends BaseCommand {
+ @inVC
+ @haveQueue
+ @sameVC
public execute(ctx: CommandContext): Promise | undefined {
- if (!inVC(ctx)) return;
- if (!haveQueue(ctx)) return;
- if (!sameVC(ctx)) return;
- if (!this.client.config.is247Allowed) return ctx.reply({ embeds: [createEmbed("error", i18n.__("commands.music.stayInQueue.247Disabled"), true)] });
+ if (!this.client.config.is247Allowed) {
+ return ctx.reply({
+ embeds: [createEmbed("error", i18n.__("commands.music.stayInQueue.247Disabled"), true)]
+ });
+ }
- const newState = ctx.options?.getString("state") ?? ctx.args[0] as string | undefined;
+ const newState = ctx.options?.getString("state") ?? (ctx.args[0] as string | undefined);
- if (!newState) return ctx.reply({ embeds: [createEmbed("info", i18n.__mf("commands.music.stayInQueue.actualState", { state: `\`${ctx.guild?.queue?.stayInVC ? "ENABLED" : "DISABLED"}\`` }))] });
+ if (!newState) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ `🔊 **|** ${i18n.__mf("commands.music.stayInQueue.actualState", {
+ state: `\`${ctx.guild?.queue?.stayInVC ? "ENABLED" : "DISABLED"}\``
+ })}`
+ )
+ ]
+ });
+ }
ctx.guild!.queue!.stayInVC = newState === "enable";
- return ctx.reply({ embeds: [createEmbed("success", i18n.__mf("commands.music.stayInQueue.newState", { state: `\`${ctx.guild?.queue?.stayInVC ? "ENABLED" : "DISABLED"}\`` }), true)] });
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `🔊 **|** ${i18n.__mf("commands.music.stayInQueue.newState", {
+ state: `\`${ctx.guild?.queue?.stayInVC ? "ENABLED" : "DISABLED"}\``
+ })}`,
+ true
+ )
+ ]
+ });
}
}
diff --git a/src/commands/music/StopCommand.ts b/src/commands/music/StopCommand.ts
index 9ed3d818b..55cfabb78 100644
--- a/src/commands/music/StopCommand.ts
+++ b/src/commands/music/StopCommand.ts
@@ -1,30 +1,29 @@
import { inVC, sameVC, validVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
+@Command({
+ aliases: ["disconnect", "dc"],
+ description: i18n.__("commands.music.stop.description"),
+ name: "stop",
+ slash: {
+ options: []
+ },
+ usage: "{prefix}stop"
+})
export class StopCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["disconnect", "dc"],
- description: i18n.__("commands.music.stop.description"),
- name: "stop",
- slash: {
- options: []
- },
- usage: "{prefix}stop"
- });
- }
-
+ @inVC
+ @validVC
+ @sameVC
public execute(ctx: CommandContext): void {
- if (!inVC(ctx)) return;
- if (!validVC(ctx)) return;
- if (!sameVC(ctx)) return;
-
ctx.guild?.queue?.stop();
ctx.guild!.queue!.lastMusicMsg = null;
- ctx.reply({ embeds: [createEmbed("success", `⏹ **|** ${i18n.__("commands.music.stop.stoppedMessage")}`)] }).catch(e => this.client.logger.error("STOP_CMD_ERR:", e));
+ ctx.reply({
+ embeds: [createEmbed("success", `⏹ **|** ${i18n.__("commands.music.stop.stoppedMessage")}`)]
+ }).catch(e => this.client.logger.error("STOP_CMD_ERR:", e));
}
}
diff --git a/src/commands/music/VolumeCommand.ts b/src/commands/music/VolumeCommand.ts
index aa5e1fbe8..a4a5a3d3f 100644
--- a/src/commands/music/VolumeCommand.ts
+++ b/src/commands/music/VolumeCommand.ts
@@ -1,44 +1,83 @@
import { inVC, sameVC, validVC } from "../../utils/decorators/MusicUtil";
import { CommandContext } from "../../structures/CommandContext";
+import { createEmbed } from "../../utils/functions/createEmbed";
import { BaseCommand } from "../../structures/BaseCommand";
-import { createEmbed } from "../../utils/createEmbed";
+import { Command } from "../../utils/decorators/Command";
import i18n from "../../config";
-import { AudioPlayerPlayingState } from "@discordjs/voice";
import { Message } from "discord.js";
+@Command({
+ aliases: ["vol"],
+ description: i18n.__("commands.music.volume.description"),
+ name: "volume",
+ slash: {
+ options: [
+ {
+ description: i18n.__("commands.music.volume.slashDescription"),
+ name: "volume",
+ type: "NUMBER",
+ required: false
+ }
+ ]
+ },
+ usage: i18n.__("commands.music.volume.usage")
+})
export class VolumeCommand extends BaseCommand {
- public constructor(client: BaseCommand["client"]) {
- super(client, {
- aliases: ["vol"],
- description: i18n.__("commands.music.volume.description"),
- name: "volume",
- slash: {
- options: [
- {
- description: i18n.__("commands.music.volume.slashDescription"),
- name: "volume",
- type: "NUMBER",
- required: false
- }
- ]
- },
- usage: i18n.__("commands.music.volume.usage")
- });
- }
-
+ @inVC
+ @validVC
+ @sameVC
public execute(ctx: CommandContext): Promise | undefined {
- if (!inVC(ctx)) return;
- if (!validVC(ctx)) return;
- if (!sameVC(ctx)) return;
-
const volume = Number(ctx.args[0] ?? ctx.options?.getNumber("volume", false));
- const resVolume = (ctx.guild!.queue!.player!.state as AudioPlayerPlayingState).resource.volume!;
+ const current = ctx.guild!.queue!.volume;
- if (isNaN(volume)) return ctx.reply({ embeds: [createEmbed("info", `🔊 **|** ${i18n.__mf("commands.music.volume.currentVolume", { volume: `\`${resVolume.volume * 100}\`` })}`).setFooter({ text: i18n.__("commands.music.volume.changeVolume") })] });
- if (volume <= 0) return ctx.reply({ embeds: [createEmbed("warn", i18n.__mf("commands.music.volume.plsPause", { volume: `\`${volume}\`` }))] });
- if (volume > 100) return ctx.reply({ embeds: [createEmbed("error", i18n.__mf("commands.music.volume.volumeLimit", { maxVol: "`100`" }), true)] });
+ if (isNaN(volume)) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "info",
+ `🔊 **|** ${i18n.__mf("commands.music.volume.currentVolume", {
+ volume: `\`${current}\``
+ })}`
+ ).setFooter({ text: i18n.__("commands.music.volume.changeVolume") })
+ ]
+ });
+ }
+ if (volume <= 0) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "warn",
+ i18n.__mf("commands.music.volume.plsPause", {
+ volume: `\`${volume}\``
+ })
+ )
+ ]
+ });
+ }
+ if (volume > 100) {
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("commands.music.volume.volumeLimit", {
+ maxVol: "`100`"
+ }),
+ true
+ )
+ ]
+ });
+ }
- resVolume.setVolume(volume / 100);
- return ctx.reply({ embeds: [createEmbed("success", `🔊 **|** ${i18n.__mf("commands.music.volume.newVolume", { volume })}`)] });
+ ctx.guild!.queue!.volume = volume;
+ return ctx.reply({
+ embeds: [
+ createEmbed(
+ "success",
+ `🔊 **|** ${i18n.__mf("commands.music.volume.newVolume", {
+ volume
+ })}`
+ )
+ ]
+ });
}
}
diff --git a/src/commands/music/category.meta.ts b/src/commands/music/category.meta.ts
index f2d229351..433a93619 100644
--- a/src/commands/music/category.meta.ts
+++ b/src/commands/music/category.meta.ts
@@ -5,4 +5,4 @@ const category = {
hide: false
};
-export = category;
+export default category;
diff --git a/src/config.ts b/src/config.ts
deleted file mode 100644
index bd0b2d17b..000000000
--- a/src/config.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import { IpresenceData } from "./typings";
-import { ActivityType, ClientOptions, ClientPresenceStatus, Intents, Options, ShardingManagerMode, Sweepers } from "discord.js";
-import { join } from "path";
-import i18n from "i18n";
-
-export const clientOptions: ClientOptions = {
- allowedMentions: { parse: ["users"], repliedUser: true },
- intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, Intents.FLAGS.GUILD_VOICE_STATES, Intents.FLAGS.GUILD_BANS],
- makeCache: Options.cacheWithLimits({
- MessageManager: {
- maxSize: Infinity,
- sweepInterval: 300,
- sweepFilter: Sweepers.filterByLifetime({
- lifetime: 10800
- })
- },
- ThreadManager: {
- maxSize: Infinity,
- sweepInterval: 300,
- sweepFilter: Sweepers.filterByLifetime({
- lifetime: 10800,
- getComparisonTimestamp: e => e.archiveTimestamp!,
- excludeFromSweep: e => !e.archived
- })
- }
- }),
- retryLimit: 3
-};
-export const shardsCount: number | "auto" = "auto";
-export const shardingMode: ShardingManagerMode = "worker";
-export const embedColor = (process.env.EMBED_COLOR?.toUpperCase() ?? "") || "3CAAFF";
-export const lang = (process.env.LOCALE?.toLowerCase() ?? "") || "en";
-export const owners: string[] = JSON.parse(process.env.OWNERS ?? "[]");
-export const devGuild = JSON.parse(process.env.DEV_GUILD ?? "[]");
-export const isDev = process.env.NODE_ENV?.toLowerCase() === "development";
-export const isProd = !isDev;
-export const mainPrefix = isDev ? "d!" : process.env.MAIN_PREFIX! || "!";
-export const altPrefixes: string[] = (JSON.parse(process.env.ALT_PREFIX! || "[\"{mention}\"]") as string[]).filter((x, i, a) => a.indexOf(x) === i && x !== mainPrefix);
-export const enableSlashCommand = process.env.ENABLE_SLASH_COMMAND?.toLowerCase() !== "no";
-export const musicSelectionType = (process.env.MUSIC_SELECTION_TYPE?.toLowerCase() ?? "") || "message";
-export const is247Allowed = process.env.ENABLE_24_7_COMMAND?.toLowerCase() === "yes";
-export const stayInVCAfterFinished = process.env.STAY_IN_VC_AFTER_FINISHED?.toLowerCase() === "yes";
-export const djRoleName = process.env.DJ_ROLE_NAME! || "DJ";
-export const muteRoleName = process.env.MUTE_ROLE_NAME! || "Muted";
-export const yesEmoji = process.env.YES_EMOJI! || "✅";
-export const noEmoji = process.env.NO_EMOJI! || "❌";
-export const streamStrategy = process.env.STREAM_STRATEGY! || "youtube-dl";
-
-export const presenceData: IpresenceData = {
- activities: (JSON.parse(process.env.ACTIVITIES! || "[]") as string[]).map((x, i) => ({
- name: x,
- type: ((JSON.parse(process.env.ACTIVITY_TYPES! || "[]") as string[])[i]?.toUpperCase() || "PLAYING") as Exclude
- })),
- status: ["online"] as ClientPresenceStatus[],
- interval: 60000
-};
-
-i18n.configure({
- defaultLocale: "en",
- directory: join(process.cwd(), "lang"),
- locales: [
- "en",
- "es",
- "id"
- ],
- objectNotation: true
-});
-
-i18n.setLocale(lang);
-
-export default i18n;
diff --git a/src/config/env.ts b/src/config/env.ts
new file mode 100644
index 000000000..bacb7194a
--- /dev/null
+++ b/src/config/env.ts
@@ -0,0 +1,51 @@
+import { parseEnvValue } from "../utils/functions/parseEnvValue";
+import { PresenceData } from "../typings";
+import { ActivityType, ClientPresenceStatus } from "discord.js";
+import { existsSync, readFileSync } from "fs";
+import { resolve } from "path";
+import { parse } from "dotenv";
+
+// Parse the dev.env file
+const devEnvPath = resolve(process.cwd(), "dev.env");
+if (existsSync(devEnvPath)) {
+ const parsed = parse(readFileSync(devEnvPath));
+ for (const [k, v] of Object.entries(parsed)) {
+ process.env[k] = v;
+ }
+}
+
+// Boolean values
+export const stayInVCAfterFinished = process.env.STAY_IN_VC_AFTER_FINISHED?.toLowerCase() === "yes";
+export const enableSlashCommand = process.env.ENABLE_SLASH_COMMAND?.toLowerCase() !== "no";
+export const is247Allowed = process.env.ENABLE_24_7_COMMAND?.toLowerCase() === "yes";
+export const isDev = process.env.NODE_ENV?.toLowerCase() === "development";
+export const debugMode = process.env.DEBUG_MODE?.toLowerCase() === "yes";
+export const enableRepl = process.env.REPL?.toLowerCase() === "yes";
+export const isProd = !isDev;
+
+// String values
+export const musicSelectionType = (process.env.MUSIC_SELECTION_TYPE?.toLowerCase() ?? "") || "message";
+export const embedColor = (process.env.EMBED_COLOR?.toUpperCase() ?? "") || "22C9FF";
+export const streamStrategy = process.env.STREAM_STRATEGY! || "yt-dlp";
+export const mainPrefix = isDev ? "d!" : process.env.MAIN_PREFIX! || "!";
+export const lang = (process.env.LOCALE?.toLowerCase() ?? "") || "en";
+export const yesEmoji = process.env.YES_EMOJI! || "✅";
+export const noEmoji = process.env.NO_EMOJI! || "❌";
+
+// Multiple values
+export const altPrefixes: string[] = parseEnvValue(process.env.ALT_PREFIX! || "{mention}").filter(
+ (x, i, a) => a.indexOf(x) === i && x !== mainPrefix
+);
+export const devs: string[] = parseEnvValue(process.env.DEVS ?? "");
+export const mainGuild = parseEnvValue(process.env.MAIN_GUILD ?? "");
+export const presenceData: PresenceData = {
+ activities: parseEnvValue(process.env.ACTIVITIES ?? "").map((x, i) => ({
+ name: x,
+ type: (parseEnvValue(process.env.ACTIVITY_TYPES ?? "")[i]?.toUpperCase() || "PLAYING") as Exclude<
+ ActivityType,
+ "CUSTOM"
+ >
+ })),
+ status: ["online"] as ClientPresenceStatus[],
+ interval: 60000
+};
diff --git a/src/config/index.ts b/src/config/index.ts
new file mode 100644
index 000000000..96dd71c41
--- /dev/null
+++ b/src/config/index.ts
@@ -0,0 +1,48 @@
+import { lang } from "./env";
+import { ClientOptions, Intents, Options, ShardingManagerMode, Sweepers } from "discord.js";
+import { join } from "path";
+import i18n from "i18n";
+
+export const clientOptions: ClientOptions = {
+ allowedMentions: { parse: ["users"], repliedUser: true },
+ intents: [
+ Intents.FLAGS.GUILDS,
+ Intents.FLAGS.GUILD_MESSAGES,
+ Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS,
+ Intents.FLAGS.GUILD_VOICE_STATES,
+ Intents.FLAGS.GUILD_BANS
+ ],
+ makeCache: Options.cacheWithLimits({
+ MessageManager: {
+ maxSize: Infinity,
+ sweepInterval: 300,
+ sweepFilter: Sweepers.filterByLifetime({
+ lifetime: 10800
+ })
+ },
+ ThreadManager: {
+ maxSize: Infinity,
+ sweepInterval: 300,
+ sweepFilter: Sweepers.filterByLifetime({
+ lifetime: 10800,
+ getComparisonTimestamp: e => e.archiveTimestamp!,
+ excludeFromSweep: e => !e.archived
+ })
+ }
+ }),
+ retryLimit: 3
+};
+
+i18n.configure({
+ defaultLocale: "en",
+ directory: join(process.cwd(), "lang"),
+ locales: ["en", "es", "id"],
+ objectNotation: true
+});
+
+i18n.setLocale(lang);
+
+export const shardsCount: number | "auto" = "auto";
+export const shardingMode: ShardingManagerMode = "worker";
+export * from "./env";
+export default i18n;
diff --git a/src/events/ChannelUpdateEvent.ts b/src/events/ChannelUpdateEvent.ts
index d3b8238a1..4f04ef039 100644
--- a/src/events/ChannelUpdateEvent.ts
+++ b/src/events/ChannelUpdateEvent.ts
@@ -1,31 +1,54 @@
+import { createEmbed } from "../utils/functions/createEmbed";
import { BaseEvent } from "../structures/BaseEvent";
-import { createEmbed } from "../utils/createEmbed";
+import { Event } from "../utils/decorators/Event";
import { entersState, VoiceConnectionStatus } from "@discordjs/voice";
import { GuildChannel, VoiceChannel } from "discord.js";
import i18n from "i18n";
+@Event("channelUpdate")
export class ChannelUpdateEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "channelUpdate");
- }
-
public async execute(oldChannel: GuildChannel, newChannel: GuildChannel): Promise {
- if (!newChannel.guild.queue || newChannel.id !== newChannel.guild.queue.connection?.joinConfig.channelId || (oldChannel.type !== "GUILD_VOICE" && oldChannel.type !== "GUILD_STAGE_VOICE") || (newChannel.type !== "GUILD_VOICE" && newChannel.type !== "GUILD_STAGE_VOICE")) return;
+ this.client.debugLog.logData("info", "CHANNEL_UPDATE_EVENT", [
+ ["Channel", `${newChannel.name}(${newChannel.id})`],
+ ["Type", newChannel.type]
+ ]);
+
+ if (
+ !newChannel.guild.queue ||
+ newChannel.id !== newChannel.guild.queue.connection?.joinConfig.channelId ||
+ (oldChannel.type !== "GUILD_VOICE" && oldChannel.type !== "GUILD_STAGE_VOICE") ||
+ (newChannel.type !== "GUILD_VOICE" && newChannel.type !== "GUILD_STAGE_VOICE")
+ )
+ return;
if ((oldChannel as VoiceChannel).rtcRegion !== (newChannel as VoiceChannel).rtcRegion) {
const queue = newChannel.guild.queue;
- const msg = await queue.textChannel.send({ embeds: [createEmbed("info", i18n.__("events.channelUpdate.reconfigureConnection"))] });
+ const msg = await queue.textChannel.send({
+ embeds: [createEmbed("info", i18n.__("events.channelUpdate.reconfigureConnection"))]
+ });
queue.connection?.configureNetworking();
entersState(queue.connection!, VoiceConnectionStatus.Ready, 20000)
.then(() => {
- void msg.edit({ embeds: [createEmbed("success", i18n.__("events.channelUpdate.connectionReconfigured"), true)] });
+ void msg.edit({
+ embeds: [createEmbed("success", i18n.__("events.channelUpdate.connectionReconfigured"), true)]
+ });
})
.catch(() => {
queue.destroy();
- this.client.logger.info(`${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Unable to re-configure networking on ${newChannel.guild.name} voice channel, the queue was deleted.`);
- void msg.edit({ embeds: [createEmbed("error", i18n.__("events.channelUpdate.unableReconfigureConnection"), true)] });
+ this.client.logger.info(
+ `${
+ this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""
+ } Unable to re-configure network on ${
+ newChannel.guild.name
+ } voice channel, the queue was deleted.`
+ );
+ void msg.edit({
+ embeds: [
+ createEmbed("error", i18n.__("events.channelUpdate.unableReconfigureConnection"), true)
+ ]
+ });
});
}
}
diff --git a/src/events/DebugEvent.ts b/src/events/DebugEvent.ts
index 6018f0453..bb35d21b8 100644
--- a/src/events/DebugEvent.ts
+++ b/src/events/DebugEvent.ts
@@ -1,10 +1,8 @@
import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
+@Event("debug")
export class DebugEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "debug");
- }
-
public execute(message: string): void {
this.client.logger.debug(message);
}
diff --git a/src/events/ErrorEvent.ts b/src/events/ErrorEvent.ts
index f38f0f75f..208ce7f35 100644
--- a/src/events/ErrorEvent.ts
+++ b/src/events/ErrorEvent.ts
@@ -1,10 +1,8 @@
import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
+@Event("error")
export class ErrorEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "error");
- }
-
public execute(error: string): void {
this.client.logger.error("CLIENT_ERROR:", error);
}
diff --git a/src/events/GuildBanAddEvent.ts b/src/events/GuildBanAddEvent.ts
new file mode 100644
index 000000000..3f4fadd21
--- /dev/null
+++ b/src/events/GuildBanAddEvent.ts
@@ -0,0 +1,16 @@
+import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
+import { GuildBan } from "discord.js";
+
+@Event("guildBanAdd")
+export class GuildBanAddEvent extends BaseEvent {
+ public execute(ban: GuildBan): void {
+ this.client.debugLog.logData("info", "GUILD_BAN_ADD", [
+ ["User", `${ban.user.tag}(${ban.user.id})`],
+ ["Guild", `${ban.guild.name}(${ban.guild.id})`],
+ ["Reason", ban.reason ?? "[Not specified]"]
+ ]);
+
+ void this.client.modlogs.handleBanAdd({ ban });
+ }
+}
diff --git a/src/events/GuildBanRemoveEvent.ts b/src/events/GuildBanRemoveEvent.ts
new file mode 100644
index 000000000..385d20c97
--- /dev/null
+++ b/src/events/GuildBanRemoveEvent.ts
@@ -0,0 +1,16 @@
+import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
+import { GuildBan } from "discord.js";
+
+@Event("guildBanRemove")
+export class GuildBanRemoveEvent extends BaseEvent {
+ public execute(ban: GuildBan): void {
+ this.client.debugLog.logData("info", "GUILD_BAN_REMOVE", [
+ ["User", `${ban.user.tag}(${ban.user.id})`],
+ ["Guild", `${ban.guild.name}(${ban.guild.id})`],
+ ["Reason", ban.reason ?? "[Not specified]"]
+ ]);
+
+ void this.client.modlogs.handleBanRemove({ ban });
+ }
+}
diff --git a/src/events/InteractionCreateEvent.ts b/src/events/InteractionCreateEvent.ts
index 8aa6c1e09..943dadd9c 100644
--- a/src/events/InteractionCreateEvent.ts
+++ b/src/events/InteractionCreateEvent.ts
@@ -1,26 +1,49 @@
import { CommandContext } from "../structures/CommandContext";
+import { createEmbed } from "../utils/functions/createEmbed";
import { BaseEvent } from "../structures/BaseEvent";
-import { createEmbed } from "../utils/createEmbed";
+import { Event } from "../utils/decorators/Event";
import i18n from "../config";
-import { BitFieldResolvable, Interaction, Permissions, PermissionString } from "discord.js";
+import { BitFieldResolvable, Interaction, Permissions, PermissionString, TextChannel } from "discord.js";
+@Event("interactionCreate")
export class InteractionCreateEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "interactionCreate");
- }
-
public async execute(interaction: Interaction): Promise {
+ this.client.debugLog.logData("info", "INTERACTION_CREATE", [
+ ["Type", interaction.type],
+ ["Guild", interaction.inGuild() ? `${interaction.guild?.name ?? "[???]"}(${interaction.guildId})` : "DM"],
+ [
+ "Channel",
+ (interaction.channel?.type ?? "DM") === "DM"
+ ? "DM"
+ : `${(interaction.channel as TextChannel).name}(${(interaction.channel as TextChannel).id})`
+ ],
+ ["User", `${interaction.user.tag}(${interaction.user.id})`]
+ ]);
+
if (!interaction.inGuild() || !this.client.commands.isReady) return;
+
if (interaction.isButton()) {
const val = this.client.utils.decode(interaction.customId);
const user = val.split("_")[0] ?? "";
const cmd = val.split("_")[1] ?? "";
+
if (cmd === "delete-msg") {
- if (interaction.user.id !== user && !new Permissions(interaction.member.permissions as BitFieldResolvable | undefined).has("MANAGE_MESSAGES")) {
+ if (
+ interaction.user.id !== user &&
+ !new Permissions(
+ interaction.member.permissions as BitFieldResolvable | undefined
+ ).has("MANAGE_MESSAGES")
+ ) {
void interaction.reply({
ephemeral: true,
embeds: [
- createEmbed("error", i18n.__mf("events.createInteraction.message1", { user: user.toString() }), true)
+ createEmbed(
+ "error",
+ i18n.__mf("events.createInteraction.message1", {
+ user: user.toString()
+ }),
+ true
+ )
]
});
} else {
@@ -31,36 +54,54 @@ export class InteractionCreateEvent extends BaseEvent {
}
}
}
+
const context = new CommandContext(interaction);
if (interaction.isContextMenu()) {
const data = interaction.options.getUser("user") ?? interaction.options.getMessage("message");
- const cmd = this.client.commands.find(x => (data as { type: string }).type === "MESSAGE" ? x.meta.contextChat === interaction.commandName : x.meta.contextUser === interaction.commandName);
+ const cmd = this.client.commands.find(x =>
+ (data as { type: string }).type === "MESSAGE"
+ ? x.meta.contextChat === interaction.commandName
+ : x.meta.contextUser === interaction.commandName
+ );
if (cmd) {
context.additionalArgs.set("options", data);
void cmd.execute(context);
}
}
+
if (interaction.isCommand()) {
- const cmd = this.client.commands.filter(x => x.meta.slash !== undefined).find(x => x.meta.slash!.name === interaction.commandName);
+ const cmd = this.client.commands
+ .filter(x => x.meta.slash !== undefined)
+ .find(x => x.meta.slash!.name === interaction.commandName);
if (cmd) {
void cmd.execute(context);
}
}
+
if (interaction.isSelectMenu()) {
const val = this.client.utils.decode(interaction.customId);
const user = val.split("_")[0] ?? "";
const cmd = val.split("_")[1] ?? "";
const exec = (val.split("_")[2] ?? "yes") === "yes";
+
if (interaction.user.id !== user) {
void interaction.reply({
ephemeral: true,
embeds: [
- createEmbed("error", i18n.__mf("events.createInteraction.message1", { user: user.toString() }), true)
+ createEmbed(
+ "error",
+ i18n.__mf("events.createInteraction.message1", {
+ user: user.toString()
+ }),
+ true
+ )
]
});
}
if (cmd && user === interaction.user.id && exec) {
- const command = this.client.commands.filter(x => x.meta.slash !== undefined).find(x => x.meta.name === cmd);
+ const command = this.client.commands
+ .filter(x => x.meta.slash !== undefined)
+ .find(x => x.meta.name === cmd);
if (command) {
context.additionalArgs.set("values", interaction.values);
void command.execute(context);
diff --git a/src/events/MessageCreateEvent.ts b/src/events/MessageCreateEvent.ts
index baf34aa52..6a3bbcf93 100644
--- a/src/events/MessageCreateEvent.ts
+++ b/src/events/MessageCreateEvent.ts
@@ -1,24 +1,41 @@
+import { createEmbed } from "../utils/functions/createEmbed";
import { BaseEvent } from "../structures/BaseEvent";
-import { createEmbed } from "../utils/createEmbed";
+import { Event } from "../utils/decorators/Event";
import i18n from "../config";
import { Message, User } from "discord.js";
+@Event("messageCreate")
export class MessageCreateEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "messageCreate");
- }
-
public execute(message: Message): Message | undefined {
+ this.client.debugLog.logData("info", "MESSAGE_CREATE", [
+ ["ID", message.id],
+ ["Guild", message.guild ? `${message.guild.name}(${message.guild.id})` : "DM"],
+ ["Channel", message.channel.type === "DM" ? "DM" : `${message.channel.name}(${message.channel.id})`],
+ ["Author", `${message.author.tag}(${message.author.id})`]
+ ]);
+
if (message.author.bot || message.channel.type === "DM" || !this.client.commands.isReady) return message;
if (this.getUserFromMention(message.content)?.id === this.client.user?.id) {
- message.reply({ embeds: [createEmbed("info", `👋 **|** ${i18n.__mf("events.createMessage", { author: message.author.toString(), prefix: `\`${this.client.config.mainPrefix}\`` })}`)] }).catch(e => this.client.logger.error("PROMISE_ERR:", e));
+ message
+ .reply({
+ embeds: [
+ createEmbed(
+ "info",
+ `👋 **|** ${i18n.__mf("events.createMessage", {
+ author: message.author.toString(),
+ prefix: `\`${this.client.config.mainPrefix}\``
+ })}`
+ )
+ ]
+ })
+ .catch(e => this.client.logger.error("PROMISE_ERR:", e));
}
const pref = this.client.config.altPrefixes.concat(this.client.config.mainPrefix).find(p => {
if (p === "{mention}") {
// eslint-disable-next-line prefer-named-capture-group
- const userMention = (/<@(!)?\d*?>/).exec(message.content);
+ const userMention = /<@(!)?\d*?>/.exec(message.content);
if (userMention?.index !== 0) return false;
const user = this.getUserFromMention(userMention[0]);
@@ -35,7 +52,7 @@ export class MessageCreateEvent extends BaseEvent {
private getUserFromMention(mention: string): User | undefined {
// eslint-disable-next-line prefer-named-capture-group
- const matches = (/^<@!?(\d+)>$/).exec(mention);
+ const matches = /^<@!?(\d+)>$/.exec(mention);
if (!matches) return undefined;
const id = matches[1];
diff --git a/src/events/ReadyEvent.ts b/src/events/ReadyEvent.ts
index 706846b21..8f26b9f90 100644
--- a/src/events/ReadyEvent.ts
+++ b/src/events/ReadyEvent.ts
@@ -1,17 +1,22 @@
import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
import { Presence } from "discord.js";
+@Event("ready")
export class ReadyEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "ready");
- }
-
public async execute(): Promise {
- if (this.client.application?.owner) this.client.config.owners.push(this.client.application.owner.id);
+ if (this.client.application?.owner) {
+ this.client.config.devs.push(this.client.application.owner.id);
+ }
+
await this.client.spotify.renew();
await this.doPresence();
- this.client.logger.info(this.formatString("{username} is ready to serve {users.size} users on {guilds.size} guilds in " +
- "{textChannels.size} text channels and {voiceChannels.size} voice channels!"));
+ this.client.logger.info(
+ this.formatString(
+ "{username} is ready to serve {users.size} users on {guilds.size} guilds in " +
+ "{textChannels.size} text channels and {voiceChannels.size} voice channels!"
+ )
+ );
}
private async formatString(text: string): Promise {
@@ -44,11 +49,17 @@ export class ReadyEvent extends BaseEvent {
}
private async setPresence(random: boolean): Promise {
- const activityNumber = random ? Math.floor(Math.random() * this.client.config.presenceData.activities.length) : 0;
+ const activityNumber = random
+ ? Math.floor(Math.random() * this.client.config.presenceData.activities.length)
+ : 0;
const statusNumber = random ? Math.floor(Math.random() * this.client.config.presenceData.status.length) : 0;
- const activity = (await Promise.all(
- this.client.config.presenceData.activities.map(async a => Object.assign(a, { name: await this.formatString(a.name) }))
- ))[activityNumber];
+ const activity = (
+ await Promise.all(
+ this.client.config.presenceData.activities.map(async a =>
+ Object.assign(a, { name: await this.formatString(a.name) })
+ )
+ )
+ )[activityNumber];
return this.client.user!.setPresence({
activities: (activity as { name: string } | undefined) ? [activity] : [],
@@ -60,7 +71,9 @@ export class ReadyEvent extends BaseEvent {
try {
return await this.setPresence(false);
} catch (e) {
- if ((e as Error).message !== "Shards are still being spawned.") this.client.logger.error(String(e));
+ if ((e as Error).message !== "Shards are still being spawned.") {
+ this.client.logger.error(String(e));
+ }
return undefined;
} finally {
setInterval(() => this.setPresence(true), this.client.config.presenceData.interval);
diff --git a/src/events/VoiceStateUpdateEvent.ts b/src/events/VoiceStateUpdateEvent.ts
index a3fa1e346..08b7c3098 100644
--- a/src/events/VoiceStateUpdateEvent.ts
+++ b/src/events/VoiceStateUpdateEvent.ts
@@ -1,18 +1,48 @@
+import { createEmbed } from "../utils/functions/createEmbed";
import { ServerQueue } from "../structures/ServerQueue";
+import { formatMS } from "../utils/functions/formatMS";
import { BaseEvent } from "../structures/BaseEvent";
-import { createEmbed } from "../utils/createEmbed";
-import { formatMS } from "../utils/formatMS";
-import { IQueueSong } from "../typings";
+import { Event } from "../utils/decorators/Event";
+import { QueueSong } from "../typings";
import i18n from "../config";
import { AudioPlayerPausedState, entersState, VoiceConnectionStatus } from "@discordjs/voice";
import { Message, StageChannel, VoiceState, VoiceChannel } from "discord.js";
+@Event("voiceStateUpdate")
export class VoiceStateUpdateEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "voiceStateUpdate");
- }
-
public async execute(oldState: VoiceState, newState: VoiceState): Promise {
+ if (this.client.config.debugMode) {
+ const oldCh = oldState.channel ? `${oldState.channel.name}(${oldState.channel.id})` : "Not connected";
+ const newCh = newState.channel ? `${newState.channel.name}(${newState.channel.id})` : "Not connected";
+ const chDiff = oldState.channel?.id === newState.channel?.id ? [] : [["Channel", `${oldCh} -> ${newCh}`]];
+
+ const oldServM = oldState.serverMute ? "Muted" : "Unmuted";
+ const newServM = newState.serverMute ? "Muted" : "Unmuted";
+ const servMute = oldServM === newServM ? [] : [["Server Mute", `${oldServM} -> ${newServM}`]];
+
+ const oldSelfM = oldState.selfMute ? "Muted" : "Unmuted";
+ const newSelfM = newState.selfMute ? "Muted" : "Unmuted";
+ const selfMute = oldSelfM === newSelfM ? [] : [["Self Mute", `${oldSelfM} -> ${newSelfM}`]];
+
+ const oldServD = oldState.serverDeaf ? "Deaf" : "Undeaf";
+ const newServD = newState.serverDeaf ? "Deaf" : "Undeaf";
+ const servDeaf = oldServD === newServD ? [] : [["Server Deaf", `${oldServD} -> ${newServD}`]];
+
+ const oldSelfD = oldState.selfDeaf ? "Deaf" : "Undeaf";
+ const newSelfD = newState.selfDeaf ? "Deaf" : "Undeaf";
+ const selfDeaf = oldSelfD === newSelfD ? [] : [["Self Deaf", `${oldSelfD} -> ${newSelfD}`]];
+
+ this.client.debugLog.logData("info", "VOICE_STATE_UPDATE", [
+ ["Guild", `${oldState.guild.name}(${oldState.guild.id})`],
+ ["User", oldState.member ? `${oldState.member.user.tag}(${oldState.member.user.id})` : "[???]"],
+ ...chDiff,
+ ...servMute,
+ ...selfMute,
+ ...servDeaf,
+ ...selfDeaf
+ ]);
+ }
+
const queue = newState.guild.queue;
if (!queue) return;
@@ -20,7 +50,9 @@ export class VoiceStateUpdateEvent extends BaseEvent {
const oldVC = oldState.channel;
const newID = newVC?.id;
const oldID = oldVC?.id;
- const queueVC = newState.guild.channels.cache.get(queue.connection!.joinConfig.channelId!)! as StageChannel | VoiceChannel;
+ const queueVC = newState.guild.channels.cache.get(queue.connection!.joinConfig.channelId!)! as
+ | StageChannel
+ | VoiceChannel;
const member = newState.member;
const oldMember = oldState.member;
const newVCMembers = newVC?.members.filter(m => !m.user.bot);
@@ -32,8 +64,20 @@ export class VoiceStateUpdateEvent extends BaseEvent {
queue.destroy();
if (!isIdle) {
- this.client.logger.info(`${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Disconnected from the voice channel at ${newState.guild.name}, the queue was deleted.`);
- queue.textChannel.send({ embeds: [createEmbed("error", `⏹️ **|** ${i18n.__("events.voiceStateUpdate.disconnectFromVCMessage")}`)] })
+ this.client.logger.info(
+ `${
+ this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""
+ } Disconnected from the voice channel at ${newState.guild.name}, the queue was deleted.`
+ );
+ queue.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "error",
+ `⏹️ **|** ${i18n.__("events.voiceStateUpdate.disconnectFromVCMessage")}`
+ )
+ ]
+ })
.catch(e => this.client.logger.error("VOICE_STATE_UPDATE_EVENT_ERR:", e));
}
}
@@ -44,34 +88,63 @@ export class VoiceStateUpdateEvent extends BaseEvent {
if (!newVCMembers) return;
queue.skipVoters = [];
if (oldVC?.rtcRegion !== newVC?.rtcRegion) {
- const msg = await queue.textChannel.send({ embeds: [createEmbed("info", i18n.__("events.voiceStateUpdate.reconfigureConnection"))] });
+ const msg = await queue.textChannel.send({
+ embeds: [createEmbed("info", i18n.__("events.voiceStateUpdate.reconfigureConnection"))]
+ });
queue.connection?.configureNetworking();
try {
await entersState(queue.connection!, VoiceConnectionStatus.Ready, 20000);
- void msg.edit({ embeds: [createEmbed("success", i18n.__("events.voiceStateUpdate.connectionReconfigured"), true)] });
+ void msg.edit({
+ embeds: [
+ createEmbed("success", i18n.__("events.voiceStateUpdate.connectionReconfigured"), true)
+ ]
+ });
} catch {
queue.destroy();
- this.client.logger.info(`${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Unable to re-configure networking on ${newState.guild.name} voice channel, the queue was deleted.`);
- void msg.edit({ embeds: [createEmbed("error", i18n.__("events.voiceStateUpdate.unableReconfigureConnection"), true)] });
+ this.client.logger.info(
+ `${
+ this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""
+ } Unable to re-configure networking on ${
+ newState.guild.name
+ } voice channel, the queue was deleted.`
+ );
+ void msg.edit({
+ embeds: [
+ createEmbed("error", i18n.__("events.voiceStateUpdate.unableReconfigureConnection"), true)
+ ]
+ });
return;
}
}
if (newVC?.type === "GUILD_STAGE_VOICE" && newState.suppress) {
- const msg = await queue.textChannel.send({ embeds: [createEmbed("info", i18n.__("events.voiceStateUpdate.joiningAsSpeaker"))] });
+ const msg = await queue.textChannel.send({
+ embeds: [createEmbed("info", i18n.__("events.voiceStateUpdate.joiningAsSpeaker"))]
+ });
const suppress = await newState.setSuppressed(false).catch(err => ({ error: err }));
if (suppress && "error" in suppress) {
queue.destroy();
- this.client.logger.info(`${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Unable to join as Speaker at ${newState.guild.name} stage channel, the queue was deleted.`);
- void queue.textChannel.send({ embeds: [createEmbed("error", i18n.__("events.voiceStateUpdate.unableJoinStageMessage"), true)] })
+ this.client.logger.info(
+ `${
+ this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""
+ } Unable to join as Speaker at ${newState.guild.name} stage channel, the queue was deleted.`
+ );
+ void queue.textChannel
+ .send({
+ embeds: [
+ createEmbed("error", i18n.__("events.voiceStateUpdate.unableJoinStageMessage"), true)
+ ]
+ })
.catch(e => {
this.client.logger.error("VOICE_STATE_UPDATE_EVENT_ERR:", e);
});
return;
}
- await msg.edit({ embeds: [createEmbed("success", i18n.__("events.voiceStateUpdate.joinStageMessage"), true)] });
+ await msg.edit({
+ embeds: [createEmbed("success", i18n.__("events.voiceStateUpdate.joinStageMessage"), true)]
+ });
}
if (newVCMembers.size === 0 && queue.timeout === null && !queue.idle) {
this.timeout(newVCMembers, queue, newState);
@@ -80,7 +153,13 @@ export class VoiceStateUpdateEvent extends BaseEvent {
}
}
- if (oldID === queueVC.id && newID !== queueVC.id && !member?.user.bot && queue.timeout === null && !queue.idle) {
+ if (
+ oldID === queueVC.id &&
+ newID !== queueVC.id &&
+ !member?.user.bot &&
+ queue.timeout === null &&
+ !queue.idle
+ ) {
queue.skipVoters = queue.skipVoters.filter(x => x !== member?.id);
this.timeout(queueVCMembers, queue, newState);
}
@@ -94,7 +173,7 @@ export class VoiceStateUpdateEvent extends BaseEvent {
clearTimeout(queue.timeout!);
state.guild.queue!.timeout = null;
- queue.player?.pause();
+ queue.player.pause();
const timeout = 60000;
const duration = formatMS(timeout);
@@ -102,10 +181,29 @@ export class VoiceStateUpdateEvent extends BaseEvent {
queue.lastVSUpdateMsg = null;
state.guild.queue!.timeout = setTimeout(() => {
queue.destroy();
- void queue.textChannel.send({ embeds: [createEmbed("error", `⏹ **|** ${i18n.__mf("events.voiceStateUpdate.deleteQueue", { duration: `\`${duration}\`` })}`).setAuthor({ name: i18n.__("events.voiceStateUpdate.deleteQueueFooter") })] });
+ void queue.textChannel.send({
+ embeds: [
+ createEmbed(
+ "error",
+ `⏹ **|** ${i18n.__mf("events.voiceStateUpdate.deleteQueue", {
+ duration: `\`${duration}\``
+ })}`
+ ).setAuthor({ name: i18n.__("events.voiceStateUpdate.deleteQueueFooter") })
+ ]
+ });
}, timeout);
- void queue.textChannel.send({ embeds: [createEmbed("warn", `⏸ **|** ${i18n.__mf("events.voiceStateUpdate.pauseQueue", { duration: `\`${duration}\`` })}`).setAuthor({ name: i18n.__("events.voiceStateUpdate.pauseQueueFooter") })] })
- .then(msg => queue.lastVSUpdateMsg = msg.id);
+ void queue.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "warn",
+ `⏸ **|** ${i18n.__mf("events.voiceStateUpdate.pauseQueue", {
+ duration: `\`${duration}\``
+ })}`
+ ).setAuthor({ name: i18n.__("events.voiceStateUpdate.pauseQueueFooter") })
+ ]
+ })
+ .then(msg => (queue.lastVSUpdateMsg = msg.id));
}
// eslint-disable-next-line class-methods-use-this
@@ -115,9 +213,24 @@ export class VoiceStateUpdateEvent extends BaseEvent {
clearTimeout(queue.timeout!);
state.guild.queue!.timeout = null;
- const song = ((queue.player!.state as AudioPlayerPausedState).resource.metadata as IQueueSong).song;
-
- void queue.textChannel.send({ embeds: [createEmbed("info", `▶ **|** ${i18n.__mf("events.voiceStateUpdate.resumeQueue", { song: `[${song.title}](${song.url})` })}`).setThumbnail(song.thumbnail).setAuthor({ name: i18n.__("events.voiceStateUpdate.resumeQueueFooter") })] }).then(msg => queue.lastVSUpdateMsg = msg.id);
- state.guild.queue?.player?.unpause();
+ const song = ((queue.player.state as AudioPlayerPausedState).resource.metadata as QueueSong).song;
+
+ void queue.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "info",
+ `▶ **|** ${i18n.__mf("events.voiceStateUpdate.resumeQueue", {
+ song: `[${song.title}](${song.url})`
+ })}`
+ )
+ .setThumbnail(song.thumbnail)
+ .setAuthor({
+ name: i18n.__("events.voiceStateUpdate.resumeQueueFooter")
+ })
+ ]
+ })
+ .then(msg => (queue.lastVSUpdateMsg = msg.id));
+ state.guild.queue?.player.unpause();
}
}
diff --git a/src/events/WarnEvent.ts b/src/events/WarnEvent.ts
index 10b896ce2..8cba6dd75 100644
--- a/src/events/WarnEvent.ts
+++ b/src/events/WarnEvent.ts
@@ -1,10 +1,8 @@
import { BaseEvent } from "../structures/BaseEvent";
+import { Event } from "../utils/decorators/Event";
+@Event("warn")
export class WarnEvent extends BaseEvent {
- public constructor(client: BaseEvent["client"]) {
- super(client, "warn");
- }
-
public execute(warn: string): void {
this.client.logger.warn("CLIENT_WARN:", warn);
}
diff --git a/src/index.ts b/src/index.ts
index df8fc7d19..081bfaebe 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,24 +1,39 @@
-import "dotenv/config";
-import { isProd, shardingMode, shardsCount } from "./config";
-import { RawonLogger } from "./utils/RawonLogger";
+import { enableRepl, isProd, shardingMode, shardsCount } from "./config";
+import { importURLToString } from "./utils/functions/importURLToString";
+import { RawonLogger } from "./utils/structures/RawonLogger";
import { ShardingManager } from "discord.js";
import { resolve } from "path";
+import { start } from "repl";
const log = new RawonLogger({ prod: isProd });
-const manager = new ShardingManager(resolve(__dirname, "bot.js"), {
+const manager = new ShardingManager(resolve(importURLToString(import.meta.url), "bot.js"), {
totalShards: shardsCount,
respawn: true,
token: process.env.DISCORD_TOKEN,
mode: shardingMode
});
-manager.on("shardCreate", shard => {
- log.info(`[ShardManager] Shard #${shard.id} Spawned.`);
- shard.on("disconnect", () => {
- log.warn("SHARD_DISCONNECTED: ", { stack: `[ShardManager] Shard #${shard.id} has disconnected.` });
- }).on("reconnection", () => {
- log.info(`[ShardManager] Shard #${shard.id} has reconnected.`);
+if (enableRepl) {
+ const repl = start({
+ prompt: "> "
});
- if (manager.shards.size === manager.totalShards) log.info("[ShardManager] All shards are spawned successfully.");
-}).spawn().catch(e => log.error("SHARD_SPAWN_ERR: ", e));
+
+ repl.context.shardManager = manager;
+ process.stdin.on("data", _ => repl.displayPrompt(true));
+ repl.on("exit", () => process.exit());
+}
+
+manager
+ .on("shardCreate", shard => {
+ log.info(`[ShardManager] Shard #${shard.id} has spawned.`);
+ shard
+ .on("disconnect", () =>
+ log.warn("SHARD_DISCONNECTED: ", { stack: `[ShardManager] Shard #${shard.id} has disconnected.` })
+ )
+ .on("reconnection", () => log.info(`[ShardManager] Shard #${shard.id} has reconnected.`));
+ if (manager.shards.size === manager.totalShards)
+ log.info("[ShardManager] All shards are spawned successfully.");
+ })
+ .spawn()
+ .catch(e => log.error("SHARD_SPAWN_ERR: ", e));
diff --git a/src/structures/BaseCommand.ts b/src/structures/BaseCommand.ts
index 1788f388a..8520167c8 100644
--- a/src/structures/BaseCommand.ts
+++ b/src/structures/BaseCommand.ts
@@ -1,11 +1,11 @@
-/* eslint-disable @typescript-eslint/no-unused-vars */
import { CommandContext } from "./CommandContext";
-import { ICommandComponent } from "../typings";
+import { CommandComponent } from "../typings";
import { Rawon } from "./Rawon";
-import { CommandInteraction, Message, SelectMenuInteraction } from "discord.js";
-export abstract class BaseCommand implements ICommandComponent {
- public constructor(public client: Rawon, public meta: ICommandComponent["meta"]) {}
+export abstract class BaseCommand implements CommandComponent {
+ public constructor(public client: Rawon, public meta: CommandComponent["meta"]) {}
public abstract execute(ctx: CommandContext): any;
}
+
+export type ExtendedCommandConstructor = new (...args: ConstructorParameters) => BaseCommand;
diff --git a/src/structures/BaseEvent.ts b/src/structures/BaseEvent.ts
index 7674a8e74..c84ed3e48 100644
--- a/src/structures/BaseEvent.ts
+++ b/src/structures/BaseEvent.ts
@@ -1,8 +1,10 @@
-import { IEvent } from "../typings";
+import { Event } from "../typings";
import { Rawon } from "./Rawon";
-export abstract class BaseEvent implements IEvent {
- public constructor(public client: Rawon, public readonly name: IEvent["name"]) {}
+export abstract class BaseEvent implements Event {
+ public constructor(public client: Rawon, public readonly name: Event["name"]) {}
public abstract execute(...args: any): any;
}
+
+export type ExtendedEventConstructor = new (...args: ConstructorParameters) => BaseEvent;
diff --git a/src/structures/CommandContext.ts b/src/structures/CommandContext.ts
index 304936874..bfba5dab5 100644
--- a/src/structures/CommandContext.ts
+++ b/src/structures/CommandContext.ts
@@ -1,14 +1,41 @@
-/* eslint-disable @typescript-eslint/no-unnecessary-condition */
-import { InteractionTypes, MessageComponentTypes } from "../typings/enum";
+/* eslint-disable @typescript-eslint/no-unnecessary-condition, no-nested-ternary */
import { MessageInteractionAction } from "../typings";
-import { ButtonInteraction, Collection, CommandInteraction, ContextMenuInteraction, GuildMember, Interaction, InteractionReplyOptions, Message, MessageActionRow, MessageButton, MessageMentions, MessageOptions, MessagePayload, SelectMenuInteraction, TextBasedChannel, User } from "discord.js";
+import {
+ ButtonInteraction,
+ Collection,
+ CommandInteraction,
+ ContextMenuInteraction,
+ GuildMember,
+ Interaction,
+ InteractionReplyOptions,
+ Message,
+ MessageActionRow,
+ MessageButton,
+ MessageComponentInteraction,
+ MessageMentions,
+ MessageOptions,
+ MessagePayload,
+ ModalSubmitFieldsResolver,
+ ModalSubmitInteraction,
+ SelectMenuInteraction,
+ TextBasedChannel,
+ User
+} from "discord.js";
export class CommandContext {
public additionalArgs: Collection = new Collection();
public channel: TextBasedChannel | null = this.context.channel;
public guild = this.context.guild;
- public constructor(public readonly context: CommandInteraction | ContextMenuInteraction | Interaction | Message | SelectMenuInteraction, public args: string[] = []) {}
+ public constructor(
+ public readonly context:
+ | CommandInteraction
+ | ContextMenuInteraction
+ | Interaction
+ | Message
+ | SelectMenuInteraction,
+ public args: string[] = []
+ ) {}
public async deferReply(): Promise {
if (this.isInteraction()) {
@@ -17,41 +44,69 @@ export class CommandContext {
return Promise.resolve(undefined);
}
- public async reply(options: InteractionReplyOptions
- | MessageOptions
- | MessagePayload
- | string
- | { askDeletion?: { reference: string } }, autoedit?: boolean): Promise {
+ public async reply(
+ options:
+ | InteractionReplyOptions
+ | MessageOptions
+ | MessagePayload
+ | string
+ | { askDeletion?: { reference: string } },
+ autoedit?: boolean
+ ): Promise {
if (this.isInteraction()) {
- if ((this.context as Interaction).isCommand() && (this.context as CommandInteraction).replied && !autoedit) throw new Error("Interaction is already replied.");
+ if (
+ ((this.context as Interaction).isCommand() || (this.context as Interaction).isSelectMenu()) &&
+ (this.context as CommandInteraction).replied &&
+ !autoedit
+ )
+ throw new Error("Interaction is already replied.");
}
- const context = this.context as CommandInteraction | Message;
- // eslint-disable-next-line no-nested-ternary
- const rep = await this.send(options, this.isInteraction() ? (context as Interaction).isCommand() ? (context as CommandInteraction).replied || (context as CommandInteraction).deferred ? "editReply" : "reply" : "reply" : "reply").catch(e => ({ error: e }));
- if (!rep || "error" in rep) throw new Error(`Unable to reply context, because: ${rep ? (rep.error as Error).message : "Unknown"}`);
+ const context = this.context as CommandInteraction | Message | SelectMenuInteraction;
+ const rep = await this.send(
+ options,
+ this.isInteraction()
+ ? (context as Interaction).isCommand() || (context as Interaction).isSelectMenu()
+ ? (context as CommandInteraction).replied || (context as CommandInteraction).deferred
+ ? "editReply"
+ : "reply"
+ : "reply"
+ : "reply"
+ ).catch(e => ({ error: e }));
+ if (!rep || "error" in rep) {
+ throw new Error(`Unable to reply context, because: ${rep ? (rep.error as Error).message : "Unknown"}`);
+ }
// @ts-expect-error-next-line
return rep instanceof Message ? rep : new Message(this.context.client, rep);
}
- public async send(options: InteractionReplyOptions | MessageOptions | MessagePayload | string | { askDeletion?: { reference: string } }, type: MessageInteractionAction = "editReply"): Promise {
- const deletionBtn = new MessageActionRow()
- .addComponents(
- new MessageButton()
- .setEmoji("🗑️")
- .setStyle("DANGER")
- );
+ public async send(
+ options:
+ | InteractionReplyOptions
+ | MessageOptions
+ | MessagePayload
+ | string
+ | { askDeletion?: { reference: string } },
+ type: MessageInteractionAction = "editReply"
+ ): Promise {
+ const deletionBtn = new MessageActionRow().addComponents(new MessageButton().setEmoji("🗑️").setStyle("DANGER"));
if ((options as { askDeletion?: { reference: string } }).askDeletion) {
- deletionBtn.components[0].setCustomId(Buffer.from(`${(options as { askDeletion: { reference: string } }).askDeletion.reference}_delete-msg`).toString("base64"));
+ deletionBtn.components[0].setCustomId(
+ Buffer.from(
+ `${(options as { askDeletion: { reference: string } }).askDeletion.reference}_delete-msg`
+ ).toString("base64")
+ );
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
(options as InteractionReplyOptions).components
? (options as InteractionReplyOptions).components!.push(deletionBtn)
- : (options as InteractionReplyOptions).components = [deletionBtn];
+ : ((options as InteractionReplyOptions).components = [deletionBtn]);
}
if (this.isInteraction()) {
(options as InteractionReplyOptions).fetchReply = true;
- const msg = await (this.context as CommandInteraction)[type](options as InteractionReplyOptions | MessagePayload | string) as Message;
+ const msg = (await (this.context as CommandInteraction)[type](
+ options as InteractionReplyOptions | MessagePayload | string
+ )) as Message;
const channel = this.context.channel;
const res = await channel!.messages.fetch(msg.id).catch(() => null);
return res ?? msg;
@@ -63,33 +118,31 @@ export class CommandContext {
}
public isInteraction(): boolean {
- return this.isCommand() || this.isContextMenu() || this.isMessageComponent() || this.isButton() || this.isSelectMenu();
+ return this.context instanceof Interaction;
}
public isCommand(): boolean {
- return InteractionTypes[(this.context as Interaction).type as Exclude] === InteractionTypes.APPLICATION_COMMAND && "targetId" in this.context;
+ return this.context instanceof CommandInteraction;
}
public isContextMenu(): boolean {
- return InteractionTypes[(this.context as Interaction).type as Exclude] === InteractionTypes.APPLICATION_COMMAND && "targetId" in this.context;
+ return this.context instanceof ContextMenuInteraction;
}
public isMessageComponent(): boolean {
- return InteractionTypes[(this.context as Interaction).type as Exclude] === InteractionTypes.MESSAGE_COMPONENT;
+ return this.context instanceof MessageComponentInteraction;
}
public isButton(): boolean {
- return (
- InteractionTypes[(this.context as Interaction).type as Exclude] === InteractionTypes.MESSAGE_COMPONENT &&
- MessageComponentTypes[(this.context as ButtonInteraction).componentType] === MessageComponentTypes.BUTTON
- );
+ return this.context instanceof ButtonInteraction;
}
public isSelectMenu(): boolean {
- return (
- InteractionTypes[(this.context as Interaction).type as Exclude] === InteractionTypes.MESSAGE_COMPONENT &&
- MessageComponentTypes[(this.context as SelectMenuInteraction).componentType] === MessageComponentTypes.SELECT_MENU
- );
+ return this.context instanceof SelectMenuInteraction;
+ }
+
+ public isModal(): boolean {
+ return this.context instanceof ModalSubmitInteraction;
}
public get mentions(): MessageMentions | null {
@@ -104,6 +157,10 @@ export class CommandContext {
return this.context instanceof Interaction ? (this.context as CommandInteraction).options : null;
}
+ public get fields(): ModalSubmitFieldsResolver | null {
+ return this.context instanceof ModalSubmitInteraction ? (this.context as ModalSubmitInteraction).fields : null;
+ }
+
public get author(): User {
return this.context instanceof Interaction ? this.context.user : this.context.author;
}
diff --git a/src/structures/Rawon.ts b/src/structures/Rawon.ts
index 1e449d56f..08c01b391 100644
--- a/src/structures/Rawon.ts
+++ b/src/structures/Rawon.ts
@@ -1,26 +1,60 @@
+import { importURLToString } from "../utils/functions/importURLToString";
+import { DebugLogManager } from "../utils/structures/DebugLogManager";
+import { JSONDataManager } from "../utils/structures/JSONDataManager";
+import { CommandManager } from "../utils/structures/CommandManager";
+import { ModerationLogs } from "../utils/structures/ModerationLogs";
+import { EventsLoader } from "../utils/structures/EventsLoader";
+import { ClientUtils } from "../utils/structures/ClientUtils";
+import { RawonLogger } from "../utils/structures/RawonLogger";
import { soundcloud } from "../utils/handlers/SoundCloudUtil";
-import { CommandManager } from "../utils/CommandManager";
-import { EventsLoader } from "../utils/EventsLoader";
-import { ClientUtils } from "../utils/ClientUtils";
-import { RawonLogger } from "../utils/RawonLogger";
-import { formatMS } from "../utils/formatMS";
+import { SpotifyUtil } from "../utils/handlers/SpotifyUtil";
+import { formatMS } from "../utils/functions/formatMS";
+import { GuildData } from "../typings";
import * as config from "../config";
import { Client, ClientOptions } from "discord.js";
import { resolve } from "path";
import got from "got";
-import { SpotifyUtil } from "../utils/handlers/SpotifyUtil";
export class Rawon extends Client {
public readonly config = config;
+ public readonly commands = new CommandManager(this, resolve(importURLToString(import.meta.url), "..", "commands"));
+ public readonly events = new EventsLoader(this, resolve(importURLToString(import.meta.url), "..", "events"));
+ public readonly data = new JSONDataManager>(resolve(process.cwd(), "data.json"));
public readonly logger = new RawonLogger({ prod: this.config.isProd });
- public readonly request = got;
- public readonly commands = new CommandManager(this, resolve(__dirname, "..", "commands"));
- public readonly events = new EventsLoader(this, resolve(__dirname, "..", "events"));
- public readonly soundcloud = soundcloud;
+ public readonly debugLog = new DebugLogManager(this.config.debugMode, this.config.isProd);
+ public readonly modlogs = new ModerationLogs(this);
public readonly spotify = new SpotifyUtil(this);
public readonly utils = new ClientUtils(this);
+ public readonly soundcloud = soundcloud;
+ public readonly request = got.extend({
+ hooks: {
+ beforeError: [
+ error => {
+ this.debugLog.logData("error", "GOT_REQUEST", [
+ ["URL", error.options.url?.toString() ?? "[???]"],
+ ["Code", error.code],
+ ["Response", error.response?.rawBody.toString("ascii") ?? "[???]"]
+ ]);
+
+ return error;
+ }
+ ],
+ beforeRequest: [
+ options => {
+ this.debugLog.logData("info", "GOT_REQUEST", [
+ ["URL", options.url?.toString() ?? "[???]"],
+ ["Method", options.method],
+ ["Encoding", options.encoding ?? "UTF-8"],
+ ["Agent", options.agent.http ? "HTTP" : "HTTPS"]
+ ]);
+ }
+ ]
+ }
+ });
- public constructor(opt: ClientOptions) { super(opt); }
+ public constructor(opt: ClientOptions) {
+ super(opt);
+ }
public build: () => Promise = async () => {
const start = Date.now();
diff --git a/src/structures/ServerQueue.ts b/src/structures/ServerQueue.ts
index 96bad99a4..86a3de700 100644
--- a/src/structures/ServerQueue.ts
+++ b/src/structures/ServerQueue.ts
@@ -1,22 +1,36 @@
-import { SongManager } from "../utils/SongManager";
-import { LoopMode } from "../typings";
-import { AudioPlayer, AudioPlayerStatus, VoiceConnection } from "@discordjs/voice";
-import { TextBasedChannel, Snowflake } from "discord.js";
+/* eslint-disable no-nested-ternary */
+import { SongManager } from "../utils/structures/SongManager";
+import { createEmbed } from "../utils/functions/createEmbed";
+import { play } from "../utils/handlers/GeneralUtil";
+import { LoopMode, QueueSong } from "../typings";
+import { Rawon } from "./Rawon";
+import i18n from "../config";
+import {
+ AudioPlayer,
+ AudioPlayerPlayingState,
+ AudioPlayerStatus,
+ AudioResource,
+ createAudioPlayer,
+ VoiceConnection
+} from "@discordjs/voice";
+import { TextChannel, Snowflake } from "discord.js";
export class ServerQueue {
- public loopMode: LoopMode = "OFF";
- public shuffle = false;
public stayInVC = this.textChannel.client.config.stayInVCAfterFinished;
+ public readonly player: AudioPlayer = createAudioPlayer();
public connection: VoiceConnection | null = null;
- public player: AudioPlayer | null = null;
public dcTimeout: NodeJS.Timeout | null = null;
public timeout: NodeJS.Timeout | null = null;
- public readonly songs = new SongManager();
- private _skipVoters: Snowflake[] = [];
- private _lastMusicMsg: Snowflake | null = null;
+ public readonly songs = new SongManager(this.client, this.textChannel.guild);
+ public loopMode: LoopMode = "OFF";
+ public shuffle = false;
+
private _lastVSUpdateMsg: Snowflake | null = null;
+ private _lastMusicMsg: Snowflake | null = null;
+ private _skipVoters: Snowflake[] = [];
+ private _volume = 100;
- public constructor(public readonly textChannel: TextBasedChannel) {
+ public constructor(public readonly textChannel: TextChannel) {
Object.defineProperties(this, {
_skipVoters: {
enumerable: false
@@ -26,13 +40,101 @@ export class ServerQueue {
},
_lastVSUpdateMsg: {
enumerable: false
+ },
+ _volume: {
+ enumerable: false
}
});
+
+ this.player
+ // @ts-expect-error: Ignore a compile error due to typed emitter error
+ .on("stateChange", (oldState, newState) => {
+ if (newState.status === AudioPlayerStatus.Playing && oldState.status !== AudioPlayerStatus.Paused) {
+ newState.resource.volume?.setVolumeLogarithmic(this.volume / 100);
+
+ const newSong = ((this.player.state as AudioPlayerPlayingState).resource.metadata as QueueSong)
+ .song;
+ this.sendStartPlayingMsg(newSong);
+ } else if (newState.status === AudioPlayerStatus.Idle) {
+ const song = (oldState as AudioPlayerPlayingState).resource.metadata as QueueSong;
+ this.client.logger.info(
+ `${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Track: "${
+ song.song.title
+ }" on ${this.textChannel.guild.name} has ended.`
+ );
+ this.skipVoters = [];
+ if (this.loopMode === "OFF") {
+ this.songs.delete(song.key);
+ }
+
+ const nextS =
+ this.shuffle && this.loopMode !== "SONG"
+ ? this.songs.random()?.key
+ : this.loopMode === "SONG"
+ ? song.key
+ : this.songs
+ .sortByIndex()
+ .filter(x => x.index > song.index)
+ .first()?.key ??
+ (this.loopMode === "QUEUE" ? this.songs.sortByIndex().first()?.key ?? "" : "");
+
+ this.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "info",
+ `⏹ **|** ${i18n.__mf("utils.generalHandler.stopPlaying", {
+ song: `[${song.song.title}](${song.song.url})`
+ })}`
+ ).setThumbnail(song.song.thumbnail)
+ ]
+ })
+ .then(m => (this.lastMusicMsg = m.id))
+ .catch(e => this.client.logger.error("PLAY_ERR:", e))
+ .finally(() => {
+ play(this.textChannel.guild, nextS).catch(e => {
+ this.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("utils.generalHandler.errorPlaying", {
+ message: `\`${e as string}\``
+ }),
+ true
+ )
+ ]
+ })
+ .catch(er => this.client.logger.error("PLAY_ERR:", er));
+ this.connection?.disconnect();
+ return this.client.logger.error("PLAY_ERR:", e);
+ });
+ });
+ }
+ })
+ .on("error", err => {
+ this.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "error",
+ i18n.__mf("utils.generalHandler.errorPlaying", { message: `\`${err.message}\`` }),
+ true
+ )
+ ]
+ })
+ .catch(e => this.client.logger.error("PLAY_CMD_ERR:", e));
+ this.destroy();
+ this.client.logger.error("PLAY_ERR:", err);
+ })
+ .on("debug", message => {
+ this.client.logger.debug(message);
+ });
}
public stop(): void {
this.songs.clear();
- this.player?.stop(true);
+ this.player.stop(true);
}
public destroy(): void {
@@ -40,9 +142,18 @@ export class ServerQueue {
this.connection?.disconnect();
clearTimeout(this.timeout!);
clearTimeout(this.dcTimeout!);
- if (this.textChannel.type !== "DM") {
- delete this.textChannel.guild.queue;
- }
+ delete this.textChannel.guild.queue;
+ }
+
+ public get volume(): number {
+ return this._volume;
+ }
+
+ public set volume(newVol: number) {
+ this._volume = newVol;
+ (
+ this.player.state as AudioPlayerPlayingState & { resource: AudioResource | undefined }
+ ).resource.volume?.setVolumeLogarithmic(this._volume / 100);
}
public get skipVoters(): Snowflake[] {
@@ -59,7 +170,8 @@ export class ServerQueue {
public set lastMusicMsg(value: Snowflake | null) {
if (this._lastMusicMsg !== null) {
- this.textChannel.messages.fetch(this._lastMusicMsg, { cache: false })
+ this.textChannel.messages
+ .fetch(this._lastMusicMsg, { cache: false })
.then(msg => {
void msg.delete();
})
@@ -74,7 +186,8 @@ export class ServerQueue {
public set lastVSUpdateMsg(value: Snowflake | null) {
if (this._lastVSUpdateMsg !== null) {
- this.textChannel.messages.fetch(this._lastVSUpdateMsg, { cache: false })
+ this.textChannel.messages
+ .fetch(this._lastVSUpdateMsg, { cache: false })
.then(msg => {
void msg.delete();
})
@@ -84,18 +197,43 @@ export class ServerQueue {
}
public get playing(): boolean {
- return this.player?.state.status === AudioPlayerStatus.Playing;
+ return this.player.state.status === AudioPlayerStatus.Playing;
}
public set playing(value: boolean) {
if (value) {
- this.player?.unpause();
+ this.player.unpause();
} else {
- this.player?.pause();
+ this.player.pause();
}
}
public get idle(): boolean {
- return this.player?.state.status === AudioPlayerStatus.Idle && this.songs.size === 0;
+ return this.player.state.status === AudioPlayerStatus.Idle && this.songs.size === 0;
+ }
+
+ public get client(): Rawon {
+ return this.textChannel.client as Rawon;
+ }
+
+ private sendStartPlayingMsg(newSong: QueueSong["song"]): void {
+ this.client.logger.info(
+ `${this.client.shard ? `[Shard #${this.client.shard.ids[0]}]` : ""} Track: "${newSong.title}" on ${
+ this.textChannel.guild.name
+ } has started.`
+ );
+ this.textChannel
+ .send({
+ embeds: [
+ createEmbed(
+ "info",
+ `▶ **|** ${i18n.__mf("utils.generalHandler.startPlaying", {
+ song: `[${newSong.title}](${newSong.url})`
+ })}`
+ ).setThumbnail(newSong.thumbnail)
+ ]
+ })
+ .then(m => (this.lastMusicMsg = m.id))
+ .catch(e => this.client.logger.error("PLAY_ERR:", e));
}
}
diff --git a/src/typings/index.d.ts b/src/typings/index.d.ts
index 35c472afe..51533410f 100644
--- a/src/typings/index.d.ts
+++ b/src/typings/index.d.ts
@@ -2,136 +2,146 @@
import { CommandContext } from "../structures/CommandContext";
import { ServerQueue } from "../structures/ServerQueue";
import { Rawon } from "../structures/Rawon";
-
-import { ActivityType, ApplicationCommandOptionData, ApplicationCommandType, ClientEvents, ClientPresenceStatus, Client as OClient, Collection, GuildMember, MessageEmbed } from "discord.js";
+import {
+ ActivityType,
+ ApplicationCommandOptionData,
+ ApplicationCommandType,
+ ClientEvents,
+ ClientPresenceStatus,
+ Client as OClient,
+ Collection,
+ GuildMember,
+ MessageEmbed,
+ Guild
+} from "discord.js";
export type MessageInteractionAction = "editReply" | "followUp" | "reply";
export interface QueryData {
- isURL: boolean;
sourceType?: "query" | "soundcloud" | "spotify" | "unknown" | "youtube";
type?: "playlist" | "track" | "unknown";
+ isURL: boolean;
}
-export interface basicYoutubeVideoInfo {
- id: string;
- url: string;
- title: string;
- thumbnails: { url: string; width: number; height: number }[];
+export interface BasicYoutubeVideoInfo {
+ thumbnails?: { url: string; width: number; height: number }[];
duration: number;
+ title: string;
+ url: string;
+ id: string;
}
export interface SearchTrackResult {
type?: "results" | "selection";
- items: ISong[];
+ items: Song[];
}
export interface PaginationPayload {
- author: string;
+ edit: (index: number, embed: MessageEmbed, page: string) => unknown;
+ embed: MessageEmbed;
content?: string;
pages: string[];
- embed: MessageEmbed;
- edit: (index: number, embed: MessageEmbed, page: string) => unknown;
+ author: string;
}
-export interface IRawonLoggerOptions {
+export interface RawonLoggerOptions {
prod: boolean;
}
export interface SlashOption {
- name?: string;
- description?: string;
- type?: ApplicationCommandType;
options?: ApplicationCommandOptionData[];
+ type?: ApplicationCommandType;
defaultPermission?: boolean;
+ description?: string;
+ name?: string;
}
-export interface IpresenceData {
+export interface PresenceData {
activities: { name: string; type: Exclude }[];
status: ClientPresenceStatus[];
interval: number;
}
-export interface IEvent {
+export interface Event {
readonly name: keyof ClientEvents;
execute: (...args: any) => void;
}
-export interface ICommandComponent {
+export interface CommandComponent {
+ execute: (context: CommandContext) => any;
meta: {
+ readonly category?: string;
+ readonly path?: string;
+ contextChat?: string;
+ contextUser?: string;
+ description?: string;
+ slash?: SlashOption;
aliases?: string[];
cooldown?: number;
disable?: boolean;
- readonly path?: string;
devOnly?: boolean;
- description?: string;
- readonly category?: string;
- name: string;
usage?: string;
- slash?: SlashOption;
- contextChat?: string;
- contextUser?: string;
+ name: string;
};
- execute: (context: CommandContext) => any;
}
-export interface ICategoryMeta {
- name: string;
+export interface CategoryMeta {
+ cmds: Collection;
hide: boolean;
- cmds: Collection;
+ name: string;
}
declare module "discord.js" {
// @ts-expect-error Override typings
export interface Client extends OClient {
+ commands: Rawon["commands"];
+ request: Rawon["request"];
config: Rawon["config"];
logger: Rawon["logger"];
- request: Rawon["request"];
- commands: Rawon["commands"];
events: Rawon["events"];
build: () => Promise;
}
export interface Guild {
- client: Rawon;
queue?: ServerQueue;
+ client: Rawon;
}
}
-export interface ISong {
- id: string;
+export interface Song {
+ thumbnail: string;
+ duration: number;
title: string;
url: string;
- duration: number;
- thumbnail: string;
+ id: string;
}
-export interface IQueueSong {
- song: ISong;
+export interface QueueSong {
requester: GuildMember;
index: number;
+ song: Song;
key: string;
}
export type LoopMode = "OFF" | "QUEUE" | "SONG";
-export interface ILyricsAPIResult {
- error: E;
- artist?: E extends true ? null : string;
- song?: E extends true ? null : string;
+export interface LyricsAPIResult {
+ synced: E extends true ? never : boolean | string;
album_art?: E extends true ? null : string;
+ message?: E extends true ? string : never;
+ artist?: E extends true ? null : string;
lyrics?: E extends true ? null : string;
+ song?: E extends true ? null : string;
url?: E extends true ? null : string;
- message?: E extends true ? string : never;
- synced: E extends true ? never : boolean | string;
+ error: E;
}
-export interface ISpotifyAccessTokenAPIResult {
- clientId: string;
- accessToken?: string;
+export interface SpotifyAccessTokenAPIResult {
accessTokenExpirationTimestampMs: number;
+ accessToken?: string;
isAnonymous: boolean;
+ clientId: string;
}
export interface ExternalUrls {
@@ -141,10 +151,10 @@ export interface ExternalUrls {
export interface ArtistsEntity {
external_urls: ExternalUrls;
href: string;
- id: string;
name: string;
type: string;
uri: string;
+ id: string;
}
export interface SpotifyArtist {
@@ -155,8 +165,8 @@ export interface SpotifyPlaylist {
name: string;
tracks: {
items: { track: SpotifyTrack }[];
- next: string | null;
previous: string | null;
+ next: string | null;
};
}
@@ -166,10 +176,46 @@ export interface SpotifyTrack {
external_urls: {
spotify: string;
};
- id: string;
name: string;
+ id: string;
}
export interface SpotifyArtist {
tracks: SpotifyTrack[];
}
+
+export interface GuildData {
+ dj?: {
+ enable: boolean;
+ role: string | null;
+ };
+ infractions: Record<
+ string,
+ {
+ on: number;
+ reason: string | null;
+ }[]
+ >;
+ modLog?: {
+ enable: boolean;
+ channel: string | null;
+ };
+ mute?: string | null;
+}
+
+export type NonAbstractConstructor = new (...args: any[]) => Result;
+export type Constructor = NonAbstractConstructor | (abstract new (...args: any[]) => Result);
+
+export type MethodDecorator = (
+ target: Target,
+ propertyKey: string,
+ descriptor: PropertyDescriptor
+) => Result;
+export type ClassDecorator = (target: Target) => Result;
+export type Promisable