diff --git a/.gitignore b/.gitignore
index 0b87358..65a4c07 100644
--- a/.gitignore
+++ b/.gitignore
@@ -131,6 +131,7 @@ out
# Custom
.replit
+index.js
replit.nix
__dump__
__test__
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..842d2e0
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,7 @@
+# Ignore artifacts:
+dist
+types
+docs
+metadata
+__test__
+__dump__
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000..e74ed9f
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "trailingComma": "es5",
+ "tabWidth": 4,
+ "semi": false,
+ "singleQuote": true
+}
diff --git a/README.md b/README.md
index 548dce1..fbbd5b5 100644
--- a/README.md
+++ b/README.md
@@ -1,131 +1,163 @@
-
+
# ForgeMusic
-An standard music library tailored for [ForgeScript](https://npmjs.com/package/@tryforge/forgescript).
+
+A standard music library tailored for [ForgeScript](https://npmjs.com/package/@tryforge/forgescript).
------
+---
+
## Features
+
- Easy to use API.
- Various amount of events.
- Support for various filters.
- Support for most audio providers.
-----
+---
+
## Contents
+
1. [Installation](#installation)
2. [Setup](#setup)
- 1. [Listening Events](#listening-events)
+ 1. [Listening Events](#listening-events)
1. [Disallowed Events](#disallowed-events)
- 2. [Commands](#commands)
- 1. [Event Data: Types and Interfaces](#event-data-types-and-interfaces)
- 1. [Example](#example)
+ 2. [Commands](#commands)
+ 1. [Event Data: Types and Interfaces](#event-data-types-and-interfaces)
+ 1. [Example](#example)
3. [Advices](#advices)
-4. [Tips](#tips)
- 1. [Adding support for YouTube](#adding-support-for-youtube)
-5. [Contributors](#contributors)
-----
+4. [Contributors](#contributors)
+
+---
+
## Installation
+
In your project, navigate to your terminal and write the following command.
+
```bash
npm install @tryforge/forge.music
```
+
If you are using another package manager than npm, Google how to install Node.js dependencies.
-----
+---
+
## Setup
+
Now, you must require the `ForgeMusic` class in your main file.
+
```js
-const { ForgeMusic } = require("@tryforge/forge.music");
+const { ForgeMusic } = require('@tryforge/forge.music')
```
+
As it is required, now you are allowed to create an instance of it.
+
```js
const music = new ForgeMusic({
- events: []
-});
+ events: [],
+})
```
+
Now, extension is defined and ready to be attached to the client.
+
```js
const client = new ForgeClient({
extensions: [music],
// ...client options
-});
+})
```
+
> [!CAUTION]
> Your `ForgeClient` instance requires the following intent in order for ForgeMusic to work: **GuildVoiceStates**.
+
### Listening Events
+
ForgeMusic provides a simple interface to declare the events to listen to.
First, we need to require the `GuildQueueEvent` enumerator.
+
```js
-const { ForgeMusic, GuildQueueEvent } = require("@tryforge/forge.music");
+const { ForgeMusic, GuildQueueEvent } = require('@tryforge/forge.music')
```
+
As it is required, now you must pass an array of values of this enumerator under `events` property in ForgeMusic constructor.
+
```js
const music = new ForgeMusic({
events: [
GuildQueueEvent.PlayerFinish,
GuildQueueEvent.PlayerStart,
GuildQueueEvent.PlayerError,
- GuildQueueEvent.Error
- ]
-});
+ GuildQueueEvent.Error,
+ ],
+})
```
+
Current setup must look like this.
+
```js
-const { ForgeMusic, GuildQueueEvent } = require("@tryforge/forge.music");
+const { ForgeMusic, GuildQueueEvent } = require('@tryforge/forge.music')
const music = new ForgeMusic({
events: [
GuildQueueEvent.PlayerFinish,
GuildQueueEvent.PlayerStart,
GuildQueueEvent.PlayerError,
- GuildQueueEvent.Error
- ]
-});
+ GuildQueueEvent.Error,
+ ],
+})
const client = new ForgeClient({
extensions: [music],
// ...client options
-});
+})
```
+
#### Disallowed Events
+
The following events are not supported by the extension.
+
- VoiceStateUpdate
- WillAutoPlay
- WillPlayTrack
+
### Commands
+
To add event commands, ForgeMusic provides an integrated command manager to take care of this.
You must define your commands after your ForgeClient definition to prevent errors.
+
```js
// Adding directly.
music.commands.add({
- name: "commandName",
+ name: 'commandName',
type: GuildQueueEvent.PlayerStart,
- code: "$log[A track started playing.]"
-});
+ code: '$log[A track started playing.]',
+})
// Loading from a path tree.
-music.commands.load("./path/to/commands");
+music.commands.load('./path/to/commands')
```
+
#### Event Data: Types and Interfaces
+
In each music event, you can access to that event data using the JSON Dump ([$env](https://github.com/tryforge/ForgeScript/blob/main/src%2Fnative%2Fvariable%2Fenv.ts)).
The following, is a list of event with its accessible properties.
+
- [AudioFiltersUpdate](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FaudioFiltersUpdate.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- `oldFilters`: [FiltersName](https://discord-player.js.org/docs/discord-player/type/FiltersName)
- `newFilters`: [FiltersName](https://discord-player.js.org/docs/discord-player/type/FiltersName)
- [AudioTrackAdd](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FaudioTrackAdd.ts)
- - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- [AudioTrackRemove](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FaudioTrackRemove.ts)
- - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- [BiquadFiltersUpdate](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FbiquadFiltersUpdate.ts)
- - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `oldFilters`: [BiquadFilters](https://discord-player.js.org/docs/discord-player/type/BiquadFilters)
- - `newFilters`: [BiquadFilters](https://discord-player.js.org/docs/discord-player/type/BiquadFilters)
+ - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
+ - `oldFilters`: [BiquadFilters](https://discord-player.js.org/docs/discord-player/type/BiquadFilters)
+ - `newFilters`: [BiquadFilters](https://discord-player.js.org/docs/discord-player/type/BiquadFilters)
- [ChannelPopulate](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FchannelPopulate.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- [Connection](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2Fconnection.ts)
@@ -158,23 +190,23 @@ The following, is a list of event with its accessible properties.
- `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- [PlayerFinish](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerFinish.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- [PlayerPause](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerPause.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- [PlayerResume](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerResume.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- [PlayerSkip](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerSkip.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- - `reason`: [TrackSkipReason]()
- - `description`: string
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `reason`: [TrackSkipReason]()
+ - `description`: string
- [PlayerStart](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerStart.ts)
- - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- [PlayerTrigger](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FplayerTrigger.ts)
- - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
- - `reason`: [PlayerTriggeredReason](https://discord-player.js.org/docs/discord-player/type/PlayerTriggeredReason)
+ - `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
+ - `track`: [Track](https://discord-player.js.org/docs/discord-player/class/Track)
+ - `reason`: [PlayerTriggeredReason](https://discord-player.js.org/docs/discord-player/type/PlayerTriggeredReason)
- [QueueCreate](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FqueueCreate.ts)
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- [QueueDelete](https://github.com/tryforge/ForgeMusic/blob/main/src%2Fevents%2FqueueDelete.ts)
@@ -183,7 +215,9 @@ The following, is a list of event with its accessible properties.
- `queue`: [GuildQueue](https://discord-player.js.org/docs/discord-player/class/GuildQueue)
- `oldVolume`: number
- `newVolume`: number
+
##### Example
+
```js
{
name: "myCommand",
@@ -191,45 +225,12 @@ The following, is a list of event with its accessible properties.
code: "$!sendMessage[$env[queue;metadata;text;id];A track started playing.]"
}
```
+
## Advices
- You must add the following events to the extension in order to work properly.
- GuildQueueEvent.Error
- GuildQueueEvent.PlayerError
-## Tips
-### Default Extractors
-The base framework provides some base music sources you can use. You must load them like follows.
-```js
-const { DefaultExtractors } = require("@tryforge/forge.music");
-const music = new ForgeMusic({
- // ...
- includeExtractors: DefaultExtractors
-});
-```
-### Adding Support for YouTube
-ForgeMusic by default does not provide support for streaming from YouTube.
-You must install `discord-player-youtubei` and then require `YoutubeiExtractor` from it.
-```bash
-npm install discord-player-youtubei
-```
-then, do the following step.
-```js
-const { DefaultExtractors, ForgeMusic, GuildQueueEvent } = require("@tryforge/forge.music");
-const { YoutubeiExtractor } = require("discord-player-youtubei");
-const music = new ForgeMusic({
- events: [
- GuildQueueEvent.AudioTrackAdd,
- GuildQueueEvent.Connection,
- GuildQueueEvent.PlayerError,
- GuildQueueEvent.Error
- ],
- includeExtractors: DefaultExtractors
-});
-```
-With the previous step done, register the **YoutubeiExtractor** into the extension registry.
-```js
-music.player.extractors.register(YoutubeiExtractor, {});
-```
-And now, you're ready to use YouTube provider as smooth as possible.
+
## Contributors
Many thanks for the contributors for making this extension the best choice out there.
[](https://github.com/tryforge/ForgeMusic)
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..2d67084
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,814 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "@tryforge/forge.music",
+ "dependencies": {
+ "@discord-player/extractor": "^7.2.0",
+ "@snazzah/davey": "^0.1.10",
+ "discord-player": "^7.2.0",
+ },
+ "devDependencies": {
+ "@tryforge/forgescript": "^2.6.0",
+ "ascii-table3": "^0.9.0",
+ "discord-player-deezer": "^2.6.0",
+ "discord-player-soundcloud": "^1.0.7",
+ "discord-player-spotify": "^1.1.9",
+ "discord-player-youtubei": "^2.0.0-dev.2",
+ "discord.js": "^14.25.1",
+ "dotenv": "^16.6.1",
+ "googlevideo": "^4.0.4",
+ "prettier": "3.5.1",
+ "tsc-alias": "^1.8.16",
+ "typescript": "^5.9.3",
+ },
+ },
+ },
+ "trustedDependencies": [
+ "youtube-dl-exec",
+ ],
+ "packages": {
+ "@asamuzakjp/css-color": ["@asamuzakjp/css-color@3.2.0", "", { "dependencies": { "@csstools/css-calc": "^2.1.3", "@csstools/css-color-parser": "^3.0.9", "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "lru-cache": "^10.4.3" } }, "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw=="],
+
+ "@bufbuild/protobuf": ["@bufbuild/protobuf@2.11.0", "", {}, "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ=="],
+
+ "@csstools/color-helpers": ["@csstools/color-helpers@5.1.0", "", {}, "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA=="],
+
+ "@csstools/css-calc": ["@csstools/css-calc@2.1.4", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ=="],
+
+ "@csstools/css-color-parser": ["@csstools/css-color-parser@3.1.0", "", { "dependencies": { "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA=="],
+
+ "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.5", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.4" } }, "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ=="],
+
+ "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="],
+
+ "@discord-player/equalizer": ["@discord-player/equalizer@7.2.0", "", {}, "sha512-k0mzMC92YrooRrSeT7LAgJNf+ce8VCxXJNDtRXL+Eli0WtUwvv30+Wz1vpIMdcuqEX+HRRDkBnMDY1thL5449A=="],
+
+ "@discord-player/extractor": ["@discord-player/extractor@7.2.0", "", { "dependencies": { "file-type": "^16.5.4", "isomorphic-unfetch": "^4.0.2", "node-html-parser": "^7.0.2", "reverbnation-scraper": "^2.0.0", "soundcloud.ts": "^0.5.5", "spotify-url-info": "^3.2.6" } }, "sha512-S+e1g+A8+VXP3TUbK4CpQdVEFPLHJaJBXDVGypUHjezxWfn8YzbiS7eRdgcebuTw2kYC/bCww5+bDiUdEjxLLA=="],
+
+ "@discord-player/ffmpeg": ["@discord-player/ffmpeg@7.2.0", "", {}, "sha512-XjBbi+Zpm7dtDE7gf4KLYf53J3PNKk0gDigFt1dvRVJ38WmrUUpqRn0QdrH7CwRJhXfexTimSg71xj7Zn65jWw=="],
+
+ "@discord-player/opus": ["@discord-player/opus@7.2.0", "", {}, "sha512-R6/hdU95o42Xdt/oNVtpi6PLL8FqBVOCLalH3kmpQ42F2adLwA3E9V0qfQcyZuUW7NcVbWfLYevV8rmcj/75lg=="],
+
+ "@discord-player/utils": ["@discord-player/utils@7.2.0", "", { "dependencies": { "@discordjs/collection": "^1.1.0" } }, "sha512-07zpzOXbSKIKwwZxKdj1UznB1MYHFZjrC3mZeggreY21yJzNE+MYeH2ueDRH8V4f9tOR8KGustJc36Qza6+uMQ=="],
+
+ "@discordjs/builders": ["@discordjs/builders@1.14.0", "", { "dependencies": { "@discordjs/formatters": "^0.6.2", "@discordjs/util": "^1.2.0", "@sapphire/shapeshift": "^4.0.0", "discord-api-types": "^0.38.40", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.4", "tslib": "^2.6.3" } }, "sha512-7pVKxVWkeLUtrTo9nTYkjRcJk0Hlms6lYervXAD7E7+K5lil9ms2JrEB1TalMiHvQMh7h1HJZ4fCJa0/vHpl4w=="],
+
+ "@discordjs/collection": ["@discordjs/collection@1.5.3", "", {}, "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ=="],
+
+ "@discordjs/formatters": ["@discordjs/formatters@0.6.2", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-y4UPwWhH6vChKRkGdMB4odasUbHOUwy7KL+OVwF86PvT6QVOwElx+TiI1/6kcmcEe+g5YRXJFiXSXUdabqZOvQ=="],
+
+ "@discordjs/rest": ["@discordjs/rest@2.6.1", "", { "dependencies": { "@discordjs/collection": "^2.1.1", "@discordjs/util": "^1.2.0", "@sapphire/async-queue": "^1.5.3", "@sapphire/snowflake": "^3.5.5", "@vladfrangu/async_event_emitter": "^2.4.6", "discord-api-types": "^0.38.40", "magic-bytes.js": "^1.13.0", "tslib": "^2.6.3", "undici": "6.24.1" } }, "sha512-wwQdgjeaoYFiaG+atbqx6aJDpqW7JHAo0HrQkBTbYzM3/PJ3GweQIpgElNcGZ26DCUOXMyawYd0YF7vtr+fZXg=="],
+
+ "@discordjs/util": ["@discordjs/util@1.2.0", "", { "dependencies": { "discord-api-types": "^0.38.33" } }, "sha512-3LKP7F2+atl9vJFhaBjn4nOaSWahZ/yWjOvA4e5pnXkt2qyXRCHLxoBQy81GFtLGCq7K9lPm9R517M1U+/90Qg=="],
+
+ "@discordjs/ws": ["@discordjs/ws@1.2.3", "", { "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.0", "@sapphire/async-queue": "^1.5.2", "@types/ws": "^8.5.10", "@vladfrangu/async_event_emitter": "^2.2.4", "discord-api-types": "^0.38.1", "tslib": "^2.6.2", "ws": "^8.17.0" } }, "sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw=="],
+
+ "@emnapi/core": ["@emnapi/core@1.9.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" } }, "sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.9.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg=="],
+
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.4", "", { "os": "aix", "cpu": "ppc64" }, "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q=="],
+
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.27.4", "", { "os": "android", "cpu": "arm" }, "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ=="],
+
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.4", "", { "os": "android", "cpu": "arm64" }, "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw=="],
+
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.27.4", "", { "os": "android", "cpu": "x64" }, "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw=="],
+
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ=="],
+
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw=="],
+
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw=="],
+
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ=="],
+
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.4", "", { "os": "linux", "cpu": "arm" }, "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg=="],
+
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA=="],
+
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.4", "", { "os": "linux", "cpu": "ia32" }, "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA=="],
+
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA=="],
+
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw=="],
+
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA=="],
+
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.4", "", { "os": "linux", "cpu": "none" }, "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw=="],
+
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA=="],
+
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.4", "", { "os": "linux", "cpu": "x64" }, "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA=="],
+
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q=="],
+
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.4", "", { "os": "none", "cpu": "x64" }, "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg=="],
+
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.4", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow=="],
+
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ=="],
+
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.4", "", { "os": "none", "cpu": "arm64" }, "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg=="],
+
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.4", "", { "os": "sunos", "cpu": "x64" }, "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g=="],
+
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg=="],
+
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw=="],
+
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.4", "", { "os": "win32", "cpu": "x64" }, "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg=="],
+
+ "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@kikobeats/time-span": ["@kikobeats/time-span@1.0.12", "", {}, "sha512-YeeiMfGaBKGoob/APJlRTZE1j8OL4cxKvjiOba49ED1IXlB+vj85q/aXMw/EZjEUMp5nBnfPmFoZEiwWLDNrYg=="],
+
+ "@mithron/deezer-music-metadata": ["@mithron/deezer-music-metadata@1.0.3", "", { "dependencies": { "axios": "^0.27.2", "cheerio": "^1.0.0-rc.12" } }, "sha512-/RwhXUp7pfGRNoWOODOTA+ZtSCD0MnY6MDRRCbXXynMIGCOJUBUXXhCtuw6Z+2f785ggoSqwNSi1U6bsbJWBvw=="],
+
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
+
+ "@noble/hashes": ["@noble/hashes@2.0.1", "", {}, "sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw=="],
+
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+
+ "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.0", "", { "os": "android", "cpu": "arm" }, "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A=="],
+
+ "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.0", "", { "os": "android", "cpu": "arm64" }, "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw=="],
+
+ "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.60.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA=="],
+
+ "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.60.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw=="],
+
+ "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.60.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw=="],
+
+ "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.60.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA=="],
+
+ "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g=="],
+
+ "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.60.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ=="],
+
+ "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A=="],
+
+ "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.60.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ=="],
+
+ "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw=="],
+
+ "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog=="],
+
+ "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.60.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ=="],
+
+ "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.60.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg=="],
+
+ "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA=="],
+
+ "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.60.0", "", { "os": "linux", "cpu": "none" }, "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ=="],
+
+ "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.60.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ=="],
+
+ "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg=="],
+
+ "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.60.0", "", { "os": "linux", "cpu": "x64" }, "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw=="],
+
+ "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.60.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw=="],
+
+ "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.60.0", "", { "os": "none", "cpu": "arm64" }, "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA=="],
+
+ "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.60.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ=="],
+
+ "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.60.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w=="],
+
+ "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA=="],
+
+ "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w=="],
+
+ "@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="],
+
+ "@sapphire/shapeshift": ["@sapphire/shapeshift@4.0.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" } }, "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg=="],
+
+ "@sapphire/snowflake": ["@sapphire/snowflake@3.5.3", "", {}, "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ=="],
+
+ "@snazzah/davey": ["@snazzah/davey@0.1.10", "", { "optionalDependencies": { "@snazzah/davey-android-arm-eabi": "0.1.10", "@snazzah/davey-android-arm64": "0.1.10", "@snazzah/davey-darwin-arm64": "0.1.10", "@snazzah/davey-darwin-x64": "0.1.10", "@snazzah/davey-freebsd-x64": "0.1.10", "@snazzah/davey-linux-arm-gnueabihf": "0.1.10", "@snazzah/davey-linux-arm64-gnu": "0.1.10", "@snazzah/davey-linux-arm64-musl": "0.1.10", "@snazzah/davey-linux-x64-gnu": "0.1.10", "@snazzah/davey-linux-x64-musl": "0.1.10", "@snazzah/davey-wasm32-wasi": "0.1.10", "@snazzah/davey-win32-arm64-msvc": "0.1.10", "@snazzah/davey-win32-ia32-msvc": "0.1.10", "@snazzah/davey-win32-x64-msvc": "0.1.10" } }, "sha512-J5f7vV5/tnj0xGnqufFRd6qiWn3FcR3iXjpjpEmO2Ok+Io0AASkMaZ3I39TsL45as0Qo5bq9wWuamFQ77PjJ+g=="],
+
+ "@snazzah/davey-android-arm-eabi": ["@snazzah/davey-android-arm-eabi@0.1.10", "", { "os": "android", "cpu": "arm" }, "sha512-7bwHxSNEI2wVXOT6xnmpnO9SHb2xwAnf9oEdL45dlfVHTgU1Okg5rwGwRvZ2aLVFFbTyecfC8EVZyhpyTkjLSw=="],
+
+ "@snazzah/davey-android-arm64": ["@snazzah/davey-android-arm64@0.1.10", "", { "os": "android", "cpu": "arm64" }, "sha512-68WUf2LQwQTP9MgPcCqTWwJztJSIk0keGfF2Y/b+MihSDh29fYJl7C0rbz69aUrVCvCC2lYkB/46P8X1kBz7yg=="],
+
+ "@snazzah/davey-darwin-arm64": ["@snazzah/davey-darwin-arm64@0.1.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-nYC+DWCGUC1jUGEenCNQE/jJpL/02m0ebY/NvTCQbul5ktI/ShVzgA3kzssEhZvhf6jbH048Rs39wDhp/b24Jg=="],
+
+ "@snazzah/davey-darwin-x64": ["@snazzah/davey-darwin-x64@0.1.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-0q5Rrcs+O9sSSnPX+A3R3djEQs2nTAtMe5N3lApO6lZas/QNMl6wkEWCvTbDc2cfAYBMSk2jgc1awlRXi4LX3Q=="],
+
+ "@snazzah/davey-freebsd-x64": ["@snazzah/davey-freebsd-x64@0.1.10", "", { "os": "freebsd", "cpu": "x64" }, "sha512-/Gq5YDD6Oz8iBqVJLswUnetCv9JCRo1quYX5ujzpAG8zPCNItZo4g4h5p9C+h4Yoay2quWBYhoaVqQKT96bm8g=="],
+
+ "@snazzah/davey-linux-arm-gnueabihf": ["@snazzah/davey-linux-arm-gnueabihf@0.1.10", "", { "os": "linux", "cpu": "arm" }, "sha512-0Z7Vrt0WIbgxws9CeHB9qlueYJlvltI44rUuZmysdi70UcHGxlr7nE3MnzYCr9nRWRegohn8EQPWHMKMDJH2GA=="],
+
+ "@snazzah/davey-linux-arm64-gnu": ["@snazzah/davey-linux-arm64-gnu@0.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-xhZQycn4QB+qXhqm/QmZ+kb9MHMXcbjjoPfvcIL4WMQXFG/zUWHW8EiBk7ZTEGMOpeab3F9D1+MlgumglYByUQ=="],
+
+ "@snazzah/davey-linux-arm64-musl": ["@snazzah/davey-linux-arm64-musl@0.1.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-pudzQCP9rZItwW4qHHvciMwtNd9kWH4l73g6Id1LRpe6sc8jiFBV7W+YXITj2PZbI0by6XPfkRP6Dk5IkGOuAw=="],
+
+ "@snazzah/davey-linux-x64-gnu": ["@snazzah/davey-linux-x64-gnu@0.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-DC8qRmk+xJEFNqjxKB46cETKeDQqgUqE5p39KXS2k6Vl/XTi8pw8pXOxrPfYte5neoqlWAVQzbxuLnwpyRJVEQ=="],
+
+ "@snazzah/davey-linux-x64-musl": ["@snazzah/davey-linux-x64-musl@0.1.10", "", { "os": "linux", "cpu": "x64" }, "sha512-wPR5/2QmsF7sR0WUaCwbk4XI3TLcxK9PVK8mhgcAYyuRpbhcVgNGWXs8ulcyMSXve5pFRJAFAuMTGCEb014peg=="],
+
+ "@snazzah/davey-wasm32-wasi": ["@snazzah/davey-wasm32-wasi@0.1.10", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-SfQavU+eKTDbRmPeLRodrVSfsWq25PYTmH1nIZW3B27L6IkijzjXZZuxiU1ZG1gdI5fB7mwXrOTtx34t+vAG7Q=="],
+
+ "@snazzah/davey-win32-arm64-msvc": ["@snazzah/davey-win32-arm64-msvc@0.1.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-Raafk53smYs67wZCY9bQXHXzbaiRMS5QCdjTdin3D9fF5A06T/0Zv1z7/YnaN+O3GSL/Ou3RvynF7SziToYiFQ=="],
+
+ "@snazzah/davey-win32-ia32-msvc": ["@snazzah/davey-win32-ia32-msvc@0.1.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-pAs43l/DiZ+icqBwxIwNePzuYxFM1ZblVuf7t6vwwSLxvova7vnREnU7qDVjbc5/YTUHOsqYy3S6TpZMzDo2lw=="],
+
+ "@snazzah/davey-win32-x64-msvc": ["@snazzah/davey-win32-x64-msvc@0.1.10", "", { "os": "win32", "cpu": "x64" }, "sha512-kr6148VVBoUT4CtD+5hYshTFRny7R/xQZxXFhFc0fYjtmdMVM8Px9M91olg1JFNxuNzdfMfTufR58Q3wfBocug=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
+ "@tryforge/forgescript": ["@tryforge/forgescript@2.6.0", "", { "dependencies": { "chalk": "^4.1.2", "discord.js": "^14.25.1", "ms-utility": "^3.3.0", "tiny-typed-emitter": "^2.1.0", "undici": "^5.23.0" } }, "sha512-S+HR3uo3959GW94GnFLLop5xJI+8rJ30Nx43662SDHmJ3il1r5VJQYdD8lso3mfhVv0pAqY74mTJwhXx7TQ7ag=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/node": ["@types/node@25.5.0", "", { "dependencies": { "undici-types": "~7.18.0" } }, "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw=="],
+
+ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
+
+ "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.7", "", {}, "sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g=="],
+
+ "@web-scrobbler/metadata-filter": ["@web-scrobbler/metadata-filter@3.2.0", "", {}, "sha512-K2Wkq9AOJkgj4Hk9g0flKnNWYkJy1GTPpHTgpNLU5OXaXgqPKLyrtb62M1cIxMN3ESH6XGvPKM92VEl/Gc3Rog=="],
+
+ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
+
+ "acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="],
+
+ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+ "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
+
+ "ascii-table3": ["ascii-table3@0.9.0", "", { "dependencies": { "printable-characters": "^1.0.42" } }, "sha512-/JcvVCQRTVQHwLI8TCxSeOS9AcCV01MbCJC4plSP5ulygJH+D30lz85nvMcER5k+qoX2fJ1C/i13Zo1/eoMGTw=="],
+
+ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
+ "axios": ["axios@0.27.2", "", { "dependencies": { "follow-redirects": "^1.14.9", "form-data": "^4.0.0" } }, "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "bgutils-js": ["bgutils-js@3.2.0", "", {}, "sha512-CacO15JvxbclbLeCAAm9DETGlLuisRGWpPigoRvNsccSCPEC4pwYwA2g2x/pv7Om/sk79d4ib35V5HHmxPBpDg=="],
+
+ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+
+ "binary-version": ["binary-version@7.1.0", "", { "dependencies": { "execa": "^8.0.1", "find-versions": "^6.0.0" } }, "sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw=="],
+
+ "binary-version-check": ["binary-version-check@6.1.0", "", { "dependencies": { "binary-version": "^7.1.0", "semver": "^7.6.0", "semver-truncate": "^3.0.0" } }, "sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA=="],
+
+ "blowfish-node": ["blowfish-node@1.1.4", "", {}, "sha512-Iahpxc/cutT0M0tgwV5goklB+EzDuiYLgwJg050AmUG2jSIOpViWMLdnRgBxzZuNfswAgHSUiIdvmNdgL2v6DA=="],
+
+ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="],
+
+ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
+
+ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "cheerio": ["cheerio@1.2.0", "", { "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "encoding-sniffer": "^0.2.1", "htmlparser2": "^10.1.0", "parse5": "^7.3.0", "parse5-htmlparser2-tree-adapter": "^7.1.0", "parse5-parser-stream": "^7.1.2", "undici": "^7.19.0", "whatwg-mimetype": "^4.0.0" } }, "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg=="],
+
+ "cheerio-select": ["cheerio-select@2.1.0", "", { "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", "css-what": "^6.1.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" } }, "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g=="],
+
+ "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
+ "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="],
+
+ "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "consola": ["consola@3.4.2", "", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="],
+
+ "convert-hrtime": ["convert-hrtime@5.0.0", "", {}, "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
+ "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="],
+
+ "dargs": ["dargs@7.0.0", "", {}, "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg=="],
+
+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
+
+ "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "debug-logfmt": ["debug-logfmt@1.4.10", "", { "dependencies": { "@kikobeats/time-span": "~1.0.5", "null-prototype-object": "~1.2.2", "pretty-ms": "~7.0.1" } }, "sha512-+8rNw7zjXNRntMoJyp5211Y4W3nkhCCMBO7qe8Pht/9NscMklHwyTXMLUzk84YUDSksg87XRmK/LCzJdJ4eU7Q=="],
+
+ "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="],
+
+ "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
+ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
+
+ "discord-api-types": ["discord-api-types@0.38.42", "", {}, "sha512-qs1kya7S84r5RR8m9kgttywGrmmoHaRifU1askAoi+wkoSefLpZP6aGXusjNw5b0jD3zOg3LTwUa3Tf2iHIceQ=="],
+
+ "discord-player": ["discord-player@7.2.0", "", { "dependencies": { "@discord-player/equalizer": "^7.2.0", "@discord-player/ffmpeg": "^7.2.0", "@discord-player/utils": "^7.2.0", "@web-scrobbler/metadata-filter": "^3.1.0", "discord-voip": "^7.2.0", "libsodium-wrappers": "^0.7.13" }, "peerDependencies": { "@discord-player/extractor": "^7.2.0", "mediaplex": "^1" } }, "sha512-0UCo/IKZjEqkv3DLdEWh2jQ0hyzqaTxm25yCCG3NQpiRfCetaRVPbjdTgo4/4YOdNcZEypIPZtkE6lJxpkbtnA=="],
+
+ "discord-player-deezer": ["discord-player-deezer@2.6.0", "", { "dependencies": { "@mithron/deezer-music-metadata": "^1.0.3", "blowfish-node": "^1.1.4" } }, "sha512-eFdOzbMWwG8iDCkLhehyXrEjG2BtmXBJfHWVmqfsVlGkB4DiBgPNjTjpEGvfBbo3ArgCsT+VxJuSCgog7TMvWg=="],
+
+ "discord-player-soundcloud": ["discord-player-soundcloud@1.0.7", "", { "dependencies": { "soundcloud.ts": "^0.6.3" } }, "sha512-LWXoW/BXPa0lr4nd8NMLIQynbfWTiWLKYhd8ranif5ji1SPdynq7U5ogCR+14jHPmn0VJyx4DAwbi8XrW9yMlA=="],
+
+ "discord-player-spotify": ["discord-player-spotify@1.1.9", "", { "dependencies": { "acorn": "^8.16.0", "node-html-parser": "^7.0.1", "otpauth": "^9.3.6" } }, "sha512-LASyWjB/645/JyPLiN1gVKVjRrwDm6gHYgbG8ekq5dVWnsBQ1AU8B377b0kBnTuP2VzNl/bNO6wHctaNtI+n9A=="],
+
+ "discord-player-youtubei": ["discord-player-youtubei@2.0.0-dev.2", "", { "dependencies": { "bgutils-js": "^3.2.0", "jsdom": "^26.1.0", "tiny-typed-emitter": "^2.1.0", "undici": "^7.1.0", "youtube-dl-exec": "^3.1.3", "youtubei.js": "^16.0.1" }, "bin": { "discord-player-youtubei": "bin/index.js" } }, "sha512-GMePJAA8quiGcKsgA3XIqb1GDhbKxlLcJAhPpQqFyPoJbZlQeTqJakN/yGWN4sQJzcx8aiMOnXqe3cSuRD3ctQ=="],
+
+ "discord-voip": ["discord-voip@7.2.0", "", { "dependencies": { "@discord-player/ffmpeg": "^7.2.0", "@discord-player/opus": "^7.2.0", "@discord-player/utils": "^7.2.0", "@types/ws": "^8.5.10", "tsup": "^8.3.5", "typescript": "^5.5.4" } }, "sha512-bteX8XrSSqltsjV13jd6uTr5qVZ+c8yjnx2hV/AhvxgA/9qJ2i43Hkrs4qisw/o94s23Ni3tXXQohvu0EzB4+w=="],
+
+ "discord.js": ["discord.js@14.25.1", "", { "dependencies": { "@discordjs/builders": "^1.13.0", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.2", "@discordjs/rest": "^2.6.0", "@discordjs/util": "^1.2.0", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", "discord-api-types": "^0.38.33", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.3" } }, "sha512-2l0gsPOLPs5t6GFZfQZKnL1OJNYFcuC/ETWsW4VtKVD/tg4ICa9x+jb9bkPffkMdRpRpuUaO/fKkHCBeiCKh8g=="],
+
+ "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
+ "dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="],
+
+ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
+
+ "encoding-sniffer": ["encoding-sniffer@0.2.1", "", { "dependencies": { "iconv-lite": "^0.6.3", "whatwg-encoding": "^3.1.1" } }, "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw=="],
+
+ "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
+
+ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
+
+ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
+
+ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
+
+ "esbuild": ["esbuild@0.27.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.4", "@esbuild/android-arm": "0.27.4", "@esbuild/android-arm64": "0.27.4", "@esbuild/android-x64": "0.27.4", "@esbuild/darwin-arm64": "0.27.4", "@esbuild/darwin-x64": "0.27.4", "@esbuild/freebsd-arm64": "0.27.4", "@esbuild/freebsd-x64": "0.27.4", "@esbuild/linux-arm": "0.27.4", "@esbuild/linux-arm64": "0.27.4", "@esbuild/linux-ia32": "0.27.4", "@esbuild/linux-loong64": "0.27.4", "@esbuild/linux-mips64el": "0.27.4", "@esbuild/linux-ppc64": "0.27.4", "@esbuild/linux-riscv64": "0.27.4", "@esbuild/linux-s390x": "0.27.4", "@esbuild/linux-x64": "0.27.4", "@esbuild/netbsd-arm64": "0.27.4", "@esbuild/netbsd-x64": "0.27.4", "@esbuild/openbsd-arm64": "0.27.4", "@esbuild/openbsd-x64": "0.27.4", "@esbuild/openharmony-arm64": "0.27.4", "@esbuild/sunos-x64": "0.27.4", "@esbuild/win32-arm64": "0.27.4", "@esbuild/win32-ia32": "0.27.4", "@esbuild/win32-x64": "0.27.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ=="],
+
+ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-glob": ["fast-glob@3.3.3", "", { "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.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
+
+ "file-type": ["file-type@16.5.4", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.0", "strtok3": "^6.2.4", "token-types": "^4.1.1" } }, "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "find-versions": ["find-versions@6.0.0", "", { "dependencies": { "semver-regex": "^4.0.5", "super-regex": "^1.0.0" } }, "sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA=="],
+
+ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="],
+
+ "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="],
+
+ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
+
+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+
+ "function-timeout": ["function-timeout@1.0.2", "", {}, "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA=="],
+
+ "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
+
+ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
+
+ "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="],
+
+ "get-tsconfig": ["get-tsconfig@4.13.7", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q=="],
+
+ "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "globby": ["globby@11.1.0", "", { "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" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
+
+ "googlevideo": ["googlevideo@4.0.4", "", { "dependencies": { "@bufbuild/protobuf": "^2.0.0" } }, "sha512-S/rfuoPBI+qXCEUPJeVhXsHoISMgVhOz8hHSpGWa0OztfHhh+g9EKaEcqAb/+ttO7meoNQNqIy9dfIpz7HPc4g=="],
+
+ "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
+
+ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
+
+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+
+ "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="],
+
+ "himalaya": ["himalaya@1.1.1", "", {}, "sha512-mJLY5tErGWtsw8hO2fJ2vK4IpG6S1AIgVkduRo4FqFJhgI2H3XLzgemRemk45zcnFyxNNpOfrIDle2KcnJM0lA=="],
+
+ "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],
+
+ "htmlparser2": ["htmlparser2@10.1.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.2.2", "entities": "^7.0.1" } }, "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ=="],
+
+ "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
+
+ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
+
+ "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="],
+
+ "iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
+
+ "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
+
+ "is-unix": ["is-unix@2.0.14", "", {}, "sha512-ZE+Iq0h1pxZu/IGsBKobH5PZ0L3ylv7WHEmKiRG8kEzue6f+w0i3ckwnDY7Ckej2jjq1c7NDYljEkNqOxv4w9A=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "isomorphic-unfetch": ["isomorphic-unfetch@4.0.2", "", { "dependencies": { "node-fetch": "^3.2.0", "unfetch": "^5.0.0" } }, "sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA=="],
+
+ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
+
+ "jsdom": ["jsdom@26.1.0", "", { "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", "decimal.js": "^10.5.0", "html-encoding-sniffer": "^4.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.16", "parse5": "^7.2.1", "rrweb-cssom": "^0.8.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^5.1.1", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^3.1.1", "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.1.1", "ws": "^8.18.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg=="],
+
+ "libsodium": ["libsodium@0.7.16", "", {}, "sha512-3HrzSPuzm6Yt9aTYCDxYEG8x8/6C0+ag655Y7rhhWZM9PT4NpdnbqlzXhGZlDnkgR6MeSTnOt/VIyHLs9aSf+Q=="],
+
+ "libsodium-wrappers": ["libsodium-wrappers@0.7.16", "", { "dependencies": { "libsodium": "^0.7.16" } }, "sha512-Gtr/WBx4dKjvRL1pvfwZqu7gO6AfrQ0u9vFL+kXihtHf6NfkROR8pjYWn98MFDI3jN19Ii1ZUfPR9afGiPyfHg=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "load-tsconfig": ["load-tsconfig@0.2.5", "", {}, "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg=="],
+
+ "lodash": ["lodash@4.17.23", "", {}, "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="],
+
+ "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],
+
+ "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "magic-bytes.js": ["magic-bytes.js@1.13.0", "", {}, "sha512-afO2mnxW7GDTXMm5/AoN1WuOcdoKhtgXjIvHmobqTD1grNplhGdv3PFOyjCVmrnOZBIT/gD/koDKpYG+0mvHcg=="],
+
+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+
+ "make-asynchronous": ["make-asynchronous@1.1.0", "", { "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", "web-worker": "^1.5.0" } }, "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg=="],
+
+ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
+
+ "mediaplex": ["mediaplex@1.0.0", "", { "optionalDependencies": { "mediaplex-android-arm-eabi": "1.0.0", "mediaplex-android-arm64": "1.0.0", "mediaplex-darwin-arm64": "1.0.0", "mediaplex-darwin-universal": "1.0.0", "mediaplex-darwin-x64": "1.0.0", "mediaplex-freebsd-x64": "1.0.0", "mediaplex-linux-arm-gnueabihf": "1.0.0", "mediaplex-linux-arm-musleabihf": "1.0.0", "mediaplex-linux-arm64-gnu": "1.0.0", "mediaplex-linux-arm64-musl": "1.0.0", "mediaplex-linux-riscv64-gnu": "1.0.0", "mediaplex-linux-x64-gnu": "1.0.0", "mediaplex-linux-x64-musl": "1.0.0", "mediaplex-win32-arm64-msvc": "1.0.0", "mediaplex-win32-ia32-msvc": "1.0.0", "mediaplex-win32-x64-msvc": "1.0.0" } }, "sha512-2vj7Px34rNUmHKilpAagU7jNhKIyoG8/wZ/cvJQzUdhvul8ef03NOK3No3LWVZEF1Pi27VSFOwBvawli/B86hA=="],
+
+ "mediaplex-android-arm-eabi": ["mediaplex-android-arm-eabi@1.0.0", "", { "os": "android", "cpu": "arm" }, "sha512-/Ec33NNTeYxDLePRewOnjt82yVjwFy2monHk4OFk/wov7gDXvNCwSsLVRzgQgVQ2QAxmEND75Cx1nlyMWRjfFQ=="],
+
+ "mediaplex-android-arm64": ["mediaplex-android-arm64@1.0.0", "", { "os": "android", "cpu": "arm64" }, "sha512-qisiHCK6HiRhw9qKr99yGFqtJHV9w///Vg5sc3RCA5FpEZOgK/EPkE3XEyVaBXux6XzU9lF5KeCfHuWW/rZEGQ=="],
+
+ "mediaplex-darwin-arm64": ["mediaplex-darwin-arm64@1.0.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uux5Lb2RfE+51Xz+wf0fwBpx14k66eexeMjw2IWpEK5LMIU8QI1AU+ag/ocIxEf6yIdu/Dj8b4zaxxfr2B7usw=="],
+
+ "mediaplex-darwin-universal": ["mediaplex-darwin-universal@1.0.0", "", { "os": "darwin" }, "sha512-dwFIEZHuH7zsnAhAqP77Pc7i/YWMgXnDT2hBxF9/K5/wGxlV1HtdpJfY9Pug3A5SiCpb9YwQy5VGhW0se/aqIw=="],
+
+ "mediaplex-darwin-x64": ["mediaplex-darwin-x64@1.0.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-pAiCp8vPNb1b103v2xV3x6W9SQZifg6+5TGZOczlltpEbANWSy5112MqEwCM3XBohOHcal1zLC2qxdaHM8edhw=="],
+
+ "mediaplex-freebsd-x64": ["mediaplex-freebsd-x64@1.0.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-9lRsE3GumCRODm6OWBtfRyFCgC5mfLPVl+4miR52/+PVw2ABrdV+lnz2cKZDUfnmwxDGV1fTG6QMxs5D3xcuZQ=="],
+
+ "mediaplex-linux-arm-gnueabihf": ["mediaplex-linux-arm-gnueabihf@1.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mDBD2d/87CdmR4P0IUYyznzEmBoar7p4cbQiyT44voZ8LIG9w0RWHpP1r5zprbnt73YRrZwJTYhurF7mVixgRQ=="],
+
+ "mediaplex-linux-arm-musleabihf": ["mediaplex-linux-arm-musleabihf@1.0.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Jzu8hRxS9vjbgRh92sfPV++wHHUHVGMRmHS0YAxzLso73IAVKMArhsVIEcTDVVN4/yF4D0HzD63AX6M3dgeoCA=="],
+
+ "mediaplex-linux-arm64-gnu": ["mediaplex-linux-arm64-gnu@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-y6NXkTtjFSDqd6cXliZ8QYcQuHcVCk9MYHIHRNpPJU30M0CUvFx5Itgaemr/Si4Pl+VbU+UGHsoY7O1yoT7xEQ=="],
+
+ "mediaplex-linux-arm64-musl": ["mediaplex-linux-arm64-musl@1.0.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-7bpJG5wILQXLAEUAcFafMtlZmNZXKRFXaiMGKWSj29YZnyEwSHRiQEyemxu72SEYQibfwyq9Ah830pZAcfnIsg=="],
+
+ "mediaplex-linux-riscv64-gnu": ["mediaplex-linux-riscv64-gnu@1.0.0", "", { "os": "linux", "cpu": "none" }, "sha512-p0m6R5O/jSg3w6u7LCw2bwCDeXKKeYEmIqy9ORvOVZT6Cin96ojhj6ELj8/spRh8Uox1DUxiPkBJrTEzeNWugA=="],
+
+ "mediaplex-linux-x64-gnu": ["mediaplex-linux-x64-gnu@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-8piBl1DmEeRtElr+aG8OgC7cszzhQN8jGh+ClB6FKIZ2uiRf9SQ9tWH4hsE+qm17SamOekiibG5kXDLNAtPrtg=="],
+
+ "mediaplex-linux-x64-musl": ["mediaplex-linux-x64-musl@1.0.0", "", { "os": "linux", "cpu": "x64" }, "sha512-9hZvUDxPHIuFI+Y4bT3io/TnDK1fnXbfAMWhObWd5qx7YyZJcvgS2M4p0x9a57dZnLSPc7sbNov1tQTqMm03RQ=="],
+
+ "mediaplex-win32-arm64-msvc": ["mediaplex-win32-arm64-msvc@1.0.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-R2cQlKR+AjbafdtVnyPftkALxeam4XPEanT5SBo/IO1WmglC5MzppqHm8Gto5NleE16AqXHRPanQoi53fK49xg=="],
+
+ "mediaplex-win32-ia32-msvc": ["mediaplex-win32-ia32-msvc@1.0.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-CWvcvHw4x0moo2gJeDZEbar39TbCeZ0bV3Vu0n+DWzFEDxl5p3iIeZqlDsHbSvNQeU0iKVCQOgatxvUly3E/4g=="],
+
+ "mediaplex-win32-x64-msvc": ["mediaplex-win32-x64-msvc@1.0.0", "", { "os": "win32", "cpu": "x64" }, "sha512-yocvA647y6kAgBLpjllVjmp6ayvaBuqwrF+KhQnUnXbGH8celV0clJw9y7Ca8e38v89Yj4C73KpHxwGBk0sGqQ=="],
+
+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
+
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "meriyah": ["meriyah@6.1.4", "", {}, "sha512-Sz8FzjzI0kN13GK/6MVEsVzMZEPvOhnmmI1lU5+/1cGOiK3QUahntrNNtdVeihrO7t9JpoH75iMNXg6R6uWflQ=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="],
+
+ "mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "ms-utility": ["ms-utility@3.3.0", "", {}, "sha512-PM1brH9z25ICcU17rK8yLwjH5sekCHs1xiftUTKmkoSlBY+F/l7G+zyUMmZ148SkVwOPb0qDGZgawKvELJ+klQ=="],
+
+ "mylas": ["mylas@2.1.14", "", {}, "sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
+
+ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
+
+ "node-html-parser": ["node-html-parser@7.1.0", "", { "dependencies": { "css-select": "^5.1.0", "he": "1.2.0" } }, "sha512-iJo8b2uYGT40Y8BTyy5ufL6IVbN8rbm/1QK2xffXU/1a/v3AAa0d1YAoqBNYqaS4R/HajkWIpIfdE6KcyFh1AQ=="],
+
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+ "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
+
+ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "null-prototype-object": ["null-prototype-object@1.2.6", "", {}, "sha512-m+HuHAqaOiqlxVAzI3GtRgS4JIk3aAZ5RbkYxxPiACXyQZzS5uxjOXMASlWNdPYZ/5d4/+YclUlI+XXNlyN7Jg=="],
+
+ "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
+
+ "otpauth": ["otpauth@9.5.0", "", { "dependencies": { "@noble/hashes": "2.0.1" } }, "sha512-Ldhc6UYl4baR5toGr8nfKC+L/b8/RgHKoIixAebgoNGzUUCET02g04rMEZ2ZsPfeVQhMHcuaOgb28nwMr81zCA=="],
+
+ "p-event": ["p-event@6.0.1", "", { "dependencies": { "p-timeout": "^6.1.2" } }, "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w=="],
+
+ "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="],
+
+ "parse-ms": ["parse-ms@2.1.0", "", {}, "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="],
+
+ "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="],
+
+ "parse5-parser-stream": ["parse5-parser-stream@7.1.2", "", { "dependencies": { "parse5": "^7.0.0" } }, "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="],
+
+ "peek-readable": ["peek-readable@4.1.0", "", {}, "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
+
+ "plimit-lit": ["plimit-lit@1.6.1", "", { "dependencies": { "queue-lit": "^1.5.1" } }, "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "prettier": ["prettier@3.5.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw=="],
+
+ "pretty-ms": ["pretty-ms@7.0.1", "", { "dependencies": { "parse-ms": "^2.1.0" } }, "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q=="],
+
+ "printable-characters": ["printable-characters@1.0.42", "", {}, "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ=="],
+
+ "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
+
+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "queue-lit": ["queue-lit@1.5.2", "", {}, "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
+
+ "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
+
+ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "reverbnation-scraper": ["reverbnation-scraper@2.0.0", "", { "dependencies": { "node-fetch": "^2.6.0" } }, "sha512-t1Mew5QC9QEVEry5DXyagvci2O+TgXTGoMHbNoW5NRz6LTOzK/DLHUpnrQwloX8CVX5z1a802vwHM3YgUVOvKg=="],
+
+ "rollup": ["rollup@4.60.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.60.0", "@rollup/rollup-android-arm64": "4.60.0", "@rollup/rollup-darwin-arm64": "4.60.0", "@rollup/rollup-darwin-x64": "4.60.0", "@rollup/rollup-freebsd-arm64": "4.60.0", "@rollup/rollup-freebsd-x64": "4.60.0", "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", "@rollup/rollup-linux-arm-musleabihf": "4.60.0", "@rollup/rollup-linux-arm64-gnu": "4.60.0", "@rollup/rollup-linux-arm64-musl": "4.60.0", "@rollup/rollup-linux-loong64-gnu": "4.60.0", "@rollup/rollup-linux-loong64-musl": "4.60.0", "@rollup/rollup-linux-ppc64-gnu": "4.60.0", "@rollup/rollup-linux-ppc64-musl": "4.60.0", "@rollup/rollup-linux-riscv64-gnu": "4.60.0", "@rollup/rollup-linux-riscv64-musl": "4.60.0", "@rollup/rollup-linux-s390x-gnu": "4.60.0", "@rollup/rollup-linux-x64-gnu": "4.60.0", "@rollup/rollup-linux-x64-musl": "4.60.0", "@rollup/rollup-openbsd-x64": "4.60.0", "@rollup/rollup-openharmony-arm64": "4.60.0", "@rollup/rollup-win32-arm64-msvc": "4.60.0", "@rollup/rollup-win32-ia32-msvc": "4.60.0", "@rollup/rollup-win32-x64-gnu": "4.60.0", "@rollup/rollup-win32-x64-msvc": "4.60.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ=="],
+
+ "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
+
+ "semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+
+ "semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="],
+
+ "semver-truncate": ["semver-truncate@3.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
+
+ "soundcloud.ts": ["soundcloud.ts@0.6.9", "", {}, "sha512-mOUpdtNFPhoz8xwoEQMLY/W6VQeXhAeoWEwaMVZozhb0qKX1IfWcXKr2LyxoDpZgOUovIb+gOx9wHQNj1YcO3w=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "spotify-uri": ["spotify-uri@4.1.0", "", {}, "sha512-SFpBt8pQqO7DOFBsdUjv3GxGZAKYP7UqcTflfE7h3YL1lynl/6Motq7NERoJJR8eF9kXQRSpcdMmV5ou84rbng=="],
+
+ "spotify-url-info": ["spotify-url-info@3.3.0", "", { "dependencies": { "himalaya": "~1.1.0", "spotify-uri": "~4.1.0" } }, "sha512-Oln8MPghuttL6e2e8NyQg0MilZqEbMYawKZDAMbz1NpSX+on2bEtibKVBPYKlJGU/Lxvo/qXFqydMxa0fKCmwg=="],
+
+ "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
+
+ "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
+
+ "strtok3": ["strtok3@6.3.0", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^4.1.0" } }, "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "super-regex": ["super-regex@1.1.0", "", { "dependencies": { "function-timeout": "^1.0.1", "make-asynchronous": "^1.0.1", "time-span": "^5.1.0" } }, "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "time-span": ["time-span@5.1.0", "", { "dependencies": { "convert-hrtime": "^5.0.0" } }, "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA=="],
+
+ "tiny-typed-emitter": ["tiny-typed-emitter@2.1.0", "", {}, "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="],
+
+ "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="],
+
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "tinyspawn": ["tinyspawn@1.5.6", "", {}, "sha512-BKTzT5bfCP+P5I4lQlb7XJsWqRh0lNaZViiS/T3fXVjpGuT7PtaFl1w7fRAYFSUzlL9BHjJWQA9GNhdnF9EOhQ=="],
+
+ "tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="],
+
+ "tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "token-types": ["token-types@4.2.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ=="],
+
+ "tough-cookie": ["tough-cookie@5.1.2", "", { "dependencies": { "tldts": "^6.1.32" } }, "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A=="],
+
+ "tr46": ["tr46@5.1.1", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "ts-mixer": ["ts-mixer@6.0.4", "", {}, "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA=="],
+
+ "tsc-alias": ["tsc-alias@1.8.16", "", { "dependencies": { "chokidar": "^3.5.3", "commander": "^9.0.0", "get-tsconfig": "^4.10.0", "globby": "^11.0.4", "mylas": "^2.1.9", "normalize-path": "^3.0.0", "plimit-lit": "^1.2.6" }, "bin": { "tsc-alias": "dist/bin/index.js" } }, "sha512-QjCyu55NFyRSBAl6+MTFwplpFcnm2Pq01rR/uxfqJoLMm6X3O14KEGtaSDZpJYaE1bJBGDjD0eSuiIWPe2T58g=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "tsup": ["tsup@8.5.1", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.27.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "^0.7.6", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing=="],
+
+ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="],
+
+ "undici": ["undici@5.29.0", "", { "dependencies": { "@fastify/busboy": "^2.0.0" } }, "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg=="],
+
+ "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
+
+ "unfetch": ["unfetch@5.0.0", "", {}, "sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg=="],
+
+ "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="],
+
+ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
+
+ "web-worker": ["web-worker@1.5.0", "", {}, "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="],
+
+ "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
+
+ "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],
+
+ "whatwg-mimetype": ["whatwg-mimetype@4.0.0", "", {}, "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg=="],
+
+ "whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "ws": ["ws@8.20.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA=="],
+
+ "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
+
+ "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
+
+ "youtube-dl-exec": ["youtube-dl-exec@3.1.4", "", { "dependencies": { "binary-version-check": "~6.1.0", "dargs": "~7.0.0", "debug-logfmt": "~1.4.0", "is-unix": "~2.0.10", "tinyspawn": "~1.5.0" } }, "sha512-2jctjIWELBD2SGiKNeBCgPoXKlXgq7pnVCqk0QlJv9B5ZMwYzBn8P9OJ+EErYNMbfZSsqtW6UqPHbmVT+0o5tQ=="],
+
+ "youtubei.js": ["youtubei.js@16.0.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.0.0", "meriyah": "^6.1.4" } }, "sha512-3802bCAGkBc2/G5WUTc0l/bO5mPYJbQAHL04d9hE9PnrDHoBUT8MN721Yqt4RCNncAXdHcfee9VdJy3Fhq1r5g=="],
+
+ "@discord-player/extractor/soundcloud.ts": ["soundcloud.ts@0.5.5", "", { "dependencies": { "undici": "^6.17.0" } }, "sha512-bygjhC1w/w26Nk0Y+4D4cWSEJ1TdxLaE6+w4pCazFzPF+J4mzuB62ggWmFa7BiwnirzNf9lgPbjzrQYGege4Ew=="],
+
+ "@discordjs/rest/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="],
+
+ "@discordjs/rest/@sapphire/snowflake": ["@sapphire/snowflake@3.5.5", "", {}, "sha512-xzvBr1Q1c4lCe7i6sRnrofxeO1QTP/LKQ6A6qy0iB4x5yfiSfARMEQEghojzTNALDTcv8En04qYNIco9/K9eZQ=="],
+
+ "@discordjs/rest/undici": ["undici@6.24.1", "", {}, "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA=="],
+
+ "@discordjs/ws/@discordjs/collection": ["@discordjs/collection@2.1.1", "", {}, "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg=="],
+
+ "cheerio/undici": ["undici@7.24.6", "", {}, "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA=="],
+
+ "discord-player-youtubei/undici": ["undici@7.24.6", "", {}, "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA=="],
+
+ "discord.js/undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="],
+
+ "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "htmlparser2/entities": ["entities@7.0.1", "", {}, "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA=="],
+
+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "reverbnation-scraper/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
+
+ "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="],
+
+ "tsup/chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
+
+ "@discord-player/extractor/soundcloud.ts/undici": ["undici@6.21.3", "", {}, "sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw=="],
+
+ "reverbnation-scraper/node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
+
+ "tsup/chokidar/readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
+
+ "reverbnation-scraper/node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
+
+ "reverbnation-scraper/node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+ }
+}
diff --git a/dist/classes/handlers/MusicEventHandler.js b/dist/classes/handlers/MusicEventHandler.js
index 0c26b16..65da12d 100644
--- a/dist/classes/handlers/MusicEventHandler.js
+++ b/dist/classes/handlers/MusicEventHandler.js
@@ -12,7 +12,9 @@ class MusicEventHandler extends forgescript_1.BaseEventHandler {
* @param client - ForgeClient instance.
*/
register(client) {
- client.getExtension(ForgeMusic_1.ForgeMusic).player.events.on(this.name, this.listener.bind(client));
+ client
+ .getExtension(ForgeMusic_1.ForgeMusic)
+ .player.events.on(this.name, this.listener.bind(client));
}
}
exports.MusicEventHandler = MusicEventHandler;
diff --git a/dist/classes/managers/MusicCommandManager.js b/dist/classes/managers/MusicCommandManager.js
index 95acff6..576f57b 100644
--- a/dist/classes/managers/MusicCommandManager.js
+++ b/dist/classes/managers/MusicCommandManager.js
@@ -5,7 +5,7 @@ const forgescript_1 = require("@tryforge/forgescript");
/**
* Common music handler name.
*/
-exports.handlerName = "ForgeMusic";
+exports.handlerName = 'ForgeMusic';
/**
* The music command manager.
*/
diff --git a/dist/classes/structures/ForgeMusic.js b/dist/classes/structures/ForgeMusic.js
index 9914d0e..6ce3380 100644
--- a/dist/classes/structures/ForgeMusic.js
+++ b/dist/classes/structures/ForgeMusic.js
@@ -11,8 +11,8 @@ const getVersion_1 = require("../../utils/getVersion");
class ForgeMusic extends forgescript_1.ForgeExtension {
options;
/** Cock my beloved. <3 */
- name = "ForgeMusic";
- description = "A standard music library tailored for ForgeScript.";
+ name = 'ForgeMusic';
+ description = 'A standard music library tailored for ForgeScript.';
version = (0, getVersion_1.getVersion)();
/**
* The entrypoint of the player application.
@@ -25,7 +25,7 @@ class ForgeMusic extends forgescript_1.ForgeExtension {
/**
* The required intents for this extension to work.
*/
- requiredIntents = ["GuildVoiceStates"];
+ requiredIntents = ['GuildVoiceStates'];
/**
* Creates an instance of the music extension.
* @returns {ForgeMusic}
@@ -38,6 +38,24 @@ class ForgeMusic extends forgescript_1.ForgeExtension {
process.exit();
}
}
+ /**
+ * Add multiple extractors into the player.
+ * @param engines - Extractor engines to add.
+ */
+ addEngines(engines) {
+ const extractors = engines.map((engine) => engine[0]);
+ const extractorOptions = {};
+ let i = 0;
+ for (const engine of engines) {
+ const id = engine[0].identifier;
+ const options = engine[1];
+ if (options) {
+ extractorOptions[id] = options;
+ }
+ i++;
+ }
+ this.player.extractors.loadMulti(extractors, extractorOptions);
+ }
/**
* Starts the music extension.
* @param client - The discord client instance.
@@ -61,22 +79,23 @@ class ForgeMusic extends forgescript_1.ForgeExtension {
}
// Loading the extractors.
if (this.options.includeExtractors) {
- this.player.extractors.loadMulti(this.options.includeExtractors)
- .then(() => forgescript_1.Logger.info("Extractors loaded successfully!"))
- .catch((e) => forgescript_1.Logger.error("Unable to load the extractors; with reason: " + e));
+ this.player.extractors
+ .loadMulti(this.options.includeExtractors)
+ .then(() => forgescript_1.Logger.info('Extractors loaded successfully!'))
+ .catch((e) => forgescript_1.Logger.error('Unable to load the extractors; with reason: ' + e));
}
}
/**
* Returns the events location.
*/
get eventsLocation() {
- return __dirname.replace(/classes(\\|\/)structures/, "events");
+ return __dirname.replace(/classes(\\|\/)structures/, 'events');
}
/**
* Returns the native functions location.
*/
get nativesLocation() {
- return __dirname.replace(/classes(\\|\/)structures/, "natives");
+ return __dirname.replace(/classes(\\|\/)structures/, 'natives');
}
/**
* Returns the user-defined `on connect` options.
@@ -89,7 +108,9 @@ class ForgeMusic extends forgescript_1.ForgeExtension {
* @returns {boolean}
*/
#hasInvalidEvents() {
- return this.options && this.options.events && this.options.events.some(this.#invalidEventPredicate);
+ return (this.options &&
+ this.options.events &&
+ this.options.events.some(this.#invalidEventPredicate));
}
/**
* Event check predicate.
@@ -97,7 +118,9 @@ class ForgeMusic extends forgescript_1.ForgeExtension {
* @returns {boolean}
*/
#invalidEventPredicate(event) {
- return event === discord_player_1.GuildQueueEvent.VoiceStateUpdate || event === discord_player_1.GuildQueueEvent.WillAutoPlay || event === discord_player_1.GuildQueueEvent.WillPlayTrack;
+ return (event === discord_player_1.GuildQueueEvent.VoiceStateUpdate ||
+ event === discord_player_1.GuildQueueEvent.WillAutoPlay ||
+ event === discord_player_1.GuildQueueEvent.WillPlayTrack);
}
}
exports.ForgeMusic = ForgeMusic;
diff --git a/dist/docgen.js b/dist/docgen.js
index 4bcae3a..f7f5654 100644
--- a/dist/docgen.js
+++ b/dist/docgen.js
@@ -5,33 +5,42 @@ const forgescript_1 = require("@tryforge/forgescript");
const MusicCommandManager_1 = require("./classes/managers/MusicCommandManager");
const ascii_table3_1 = require("ascii-table3");
const path_1 = require("path");
-(0, forgescript_1.generateMetadata)((0, path_1.join)(__dirname, "natives"), "natives", MusicCommandManager_1.handlerName, true, void 0, (0, path_1.join)(__dirname, "events"))
- .then(() => forgescript_1.Logger.info("Documentation generation done"))
+(0, forgescript_1.generateMetadata)((0, path_1.join)(__dirname, 'natives'), 'natives', MusicCommandManager_1.handlerName, true, void 0, (0, path_1.join)(__dirname, 'events'))
+ .then(() => forgescript_1.Logger.info('Documentation generation done'))
.catch((e) => forgescript_1.Logger.error(e));
function toCamelCase(text) {
- return text.split(' ').map((part, i) => i === 0
+ return text
+ .split(' ')
+ .map((part, i) => i === 0
? part.toLowerCase()
- : `${part[0].toUpperCase()}${part.slice(1)}`).join("");
+ : `${part[0].toUpperCase()}${part.slice(1)}`)
+ .join('');
}
/**
* Generates markdown documentation for every function in the library.
*/
function generateFunctionDocs() {
- const dataPath = (0, path_1.join)(process.cwd(), "metadata", "functions.json");
- const data = JSON.parse((0, fs_1.readFileSync)(dataPath, "utf-8"));
- if (!(0, fs_1.existsSync)((0, path_1.join)(process.cwd(), "docs"))) {
- (0, fs_1.mkdirSync)((0, path_1.join)(process.cwd(), "docs"));
+ const dataPath = (0, path_1.join)(process.cwd(), 'metadata', 'functions.json');
+ const data = JSON.parse((0, fs_1.readFileSync)(dataPath, 'utf-8'));
+ if (!(0, fs_1.existsSync)((0, path_1.join)(process.cwd(), 'docs'))) {
+ (0, fs_1.mkdirSync)((0, path_1.join)(process.cwd(), 'docs'));
}
for (const func of data) {
- forgescript_1.Logger.info("Parsing", func.name);
+ forgescript_1.Logger.info('Parsing', func.name);
let content = [
`# ${func.name}`,
func.description,
'## Usage',
- `\`\`\`\n${func.name}${!!func.args ? ('[' + `${func.args.map(t => `${t.rest ? '...' : ''}${toCamelCase(t.name)}${t.required ? '' : '?'}`).join(";")}` + ']') : ''}\n\`\`\``,
+ `\`\`\`\n${func.name}${!!func.args ? '[' + `${func.args.map((t) => `${t.rest ? '...' : ''}${toCamelCase(t.name)}${t.required ? '' : '?'}`).join(';')}` + ']' : ''}\n\`\`\``,
];
if (func.args) {
- const args = func.args.map(f => [f.name, f.description, f.type, f.required ? 'Yes' : 'No', f.rest ? 'Yes' : 'No']);
+ const args = func.args.map((f) => [
+ f.name,
+ f.description,
+ f.type,
+ f.required ? 'Yes' : 'No',
+ f.rest ? 'Yes' : 'No',
+ ]);
const table = new ascii_table3_1.AsciiTable3()
.setStyle('github-markdown')
.setHeading('Name', 'Description', 'Type', 'Required', 'Rest')
@@ -42,7 +51,7 @@ function generateFunctionDocs() {
content.push('## Output', `> ${func.output.join(', ')}`);
}
content.push(`View source on [GitHub](https://github.com/Cyberghxst/forgemusic/blob/dev/src/natives/${func.name.slice(1)}.ts)`);
- (0, fs_1.writeFileSync)((0, path_1.join)(process.cwd(), "docs", `${func.name.slice(1)}.md`), content.join("\n"), "utf-8");
+ (0, fs_1.writeFileSync)((0, path_1.join)(process.cwd(), 'docs', `${func.name.slice(1)}.md`), content.join('\n'), 'utf-8');
}
return true;
}
diff --git a/dist/events/audioFiltersUpdate.js b/dist/events/audioFiltersUpdate.js
index 2083dc6..b38debf 100644
--- a/dist/events/audioFiltersUpdate.js
+++ b/dist/events/audioFiltersUpdate.js
@@ -10,7 +10,7 @@ const discord_player_1 = require("discord-player");
const eventName = discord_player_1.GuildQueueEvent.AudioFiltersUpdate;
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: eventName,
- description: "Executed when FFMPEG audio filters are updated.",
+ description: 'Executed when FFMPEG audio filters are updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(eventName);
if (!commands)
@@ -21,12 +21,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/audioTrackAdd.js b/dist/events/audioTrackAdd.js
index 4951e4f..a9bbdde 100644
--- a/dist/events/audioTrackAdd.js
+++ b/dist/events/audioTrackAdd.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.AudioTrackAdd,
- description: "Executed when audio track is added to the queue.",
+ description: 'Executed when audio track is added to the queue.',
async listener(queue, track) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.AudioTrackAdd);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/audioTrackRemove.js b/dist/events/audioTrackRemove.js
index b52d4e0..b8d6dc5 100644
--- a/dist/events/audioTrackRemove.js
+++ b/dist/events/audioTrackRemove.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.AudioTrackRemove,
- description: "Executed when audio track is removed from the queue.",
+ description: 'Executed when audio track is removed from the queue.',
async listener(queue, track) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.AudioTrackRemove);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/audioTracksAdd.js b/dist/events/audioTracksAdd.js
index ff69078..c7dfbd6 100644
--- a/dist/events/audioTracksAdd.js
+++ b/dist/events/audioTracksAdd.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.AudioTracksAdd,
- description: "Executed when multiple audio track are added to the queue.",
+ description: 'Executed when multiple audio track are added to the queue.',
async listener(queue, tracks) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.AudioTracksAdd);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, tracks },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/biquadFiltersUpdate.js b/dist/events/biquadFiltersUpdate.js
index 993a638..ffb6860 100644
--- a/dist/events/biquadFiltersUpdate.js
+++ b/dist/events/biquadFiltersUpdate.js
@@ -10,7 +10,7 @@ const discord_player_1 = require("discord-player");
const eventName = discord_player_1.GuildQueueEvent.BiquadFiltersUpdate;
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: eventName,
- description: "Executed when biquad filters is updated.",
+ description: 'Executed when biquad filters is updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(eventName);
if (!commands)
@@ -21,12 +21,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/channelPopulate.js b/dist/events/channelPopulate.js
index cb97ebf..8a4417a 100644
--- a/dist/events/channelPopulate.js
+++ b/dist/events/channelPopulate.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.ChannelPopulate,
- description: "Executed when a voice channel is populated.",
+ description: 'Executed when a voice channel is populated.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.ChannelPopulate);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/connection.js b/dist/events/connection.js
index 3d5c112..239e839 100644
--- a/dist/events/connection.js
+++ b/dist/events/connection.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.Connection,
- description: "Executed when a connection is created.",
+ description: 'Executed when a connection is created.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.Connection);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/connectionDestroyed.js b/dist/events/connectionDestroyed.js
index 047b660..bf6032e 100644
--- a/dist/events/connectionDestroyed.js
+++ b/dist/events/connectionDestroyed.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.ConnectionDestroyed,
- description: "Executed when a connection is destroyed.",
+ description: 'Executed when a connection is destroyed.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.ConnectionDestroyed);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/debug.js b/dist/events/debug.js
index 560de6b..c651eb0 100644
--- a/dist/events/debug.js
+++ b/dist/events/debug.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.Debug,
- description: "Executed when the queue sends a debug info.",
+ description: 'Executed when the queue sends a debug info.',
async listener(queue, message) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.Debug);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, message },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/disconnect.js b/dist/events/disconnect.js
index b7ef191..2666fc5 100644
--- a/dist/events/disconnect.js
+++ b/dist/events/disconnect.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.Disconnect,
- description: "Executed when the bot is disconnected from the channel.",
+ description: 'Executed when the bot is disconnected from the channel.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.Disconnect);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/dspUpdate.js b/dist/events/dspUpdate.js
index 66be937..0d38713 100644
--- a/dist/events/dspUpdate.js
+++ b/dist/events/dspUpdate.js
@@ -10,7 +10,7 @@ const discord_player_1 = require("discord-player");
const eventName = discord_player_1.GuildQueueEvent.DSPUpdate;
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: eventName,
- description: "Executed when dsp filters are updated.",
+ description: 'Executed when dsp filters are updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(eventName);
if (!commands)
@@ -21,12 +21,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/emptyChannel.js b/dist/events/emptyChannel.js
index 48f95c4..b1de610 100644
--- a/dist/events/emptyChannel.js
+++ b/dist/events/emptyChannel.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.EmptyChannel,
- description: "Executed when the voice channel is empty.",
+ description: 'Executed when the voice channel is empty.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.EmptyChannel);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/emptyQueue.js b/dist/events/emptyQueue.js
index 7b512e4..8885957 100644
--- a/dist/events/emptyQueue.js
+++ b/dist/events/emptyQueue.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.EmptyQueue,
- description: "Executed when the queue is empty.",
+ description: 'Executed when the queue is empty.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.EmptyQueue);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/equalizerUpdate.js b/dist/events/equalizerUpdate.js
index 633c5dc..d0d1647 100644
--- a/dist/events/equalizerUpdate.js
+++ b/dist/events/equalizerUpdate.js
@@ -10,7 +10,7 @@ const discord_player_1 = require("discord-player");
const eventName = discord_player_1.GuildQueueEvent.EqualizerUpdate;
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: eventName,
- description: "Executed when equalizer config is updated.",
+ description: 'Executed when equalizer config is updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(eventName);
if (!commands)
@@ -21,12 +21,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/error.js b/dist/events/error.js
index 37bafab..0e32aea 100644
--- a/dist/events/error.js
+++ b/dist/events/error.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.Error,
- description: "Executed when the queue encounters error.",
+ description: 'Executed when the queue encounters error.',
async listener(queue, error) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.Error);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, error },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerError.js b/dist/events/playerError.js
index 6d24820..74f6b44 100644
--- a/dist/events/playerError.js
+++ b/dist/events/playerError.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerError,
- description: "Executed when the audio player errors while streaming audio track.",
+ description: 'Executed when the audio player errors while streaming audio track.',
async listener(queue, error, track) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerError);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, error, track },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerFinish.js b/dist/events/playerFinish.js
index 05e5356..772e405 100644
--- a/dist/events/playerFinish.js
+++ b/dist/events/playerFinish.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerFinish,
- description: "Executed when the audio player finishes streaming audio track.",
+ description: 'Executed when the audio player finishes streaming audio track.',
async listener(queue, track) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerFinish);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerPause.js b/dist/events/playerPause.js
index ea2d508..96cad0a 100644
--- a/dist/events/playerPause.js
+++ b/dist/events/playerPause.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerPause,
- description: "Executed when audio player is paused.",
+ description: 'Executed when audio player is paused.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerPause);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerResume.js b/dist/events/playerResume.js
index 837d967..4f129af 100644
--- a/dist/events/playerResume.js
+++ b/dist/events/playerResume.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerResume,
- description: "Executed when audio player is resumed.",
+ description: 'Executed when audio player is resumed.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerResume);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerSkip.js b/dist/events/playerSkip.js
index 55cb779..981c497 100644
--- a/dist/events/playerSkip.js
+++ b/dist/events/playerSkip.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerSkip,
- description: "Executed when the audio player skips current track.",
+ description: 'Executed when the audio player skips current track.',
async listener(queue, track, reason, description) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerSkip);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track, reason, description },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerStart.js b/dist/events/playerStart.js
index 863b591..151600d 100644
--- a/dist/events/playerStart.js
+++ b/dist/events/playerStart.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerStart,
- description: "Executed when the audio player starts streaming audio track.",
+ description: 'Executed when the audio player starts streaming audio track.',
async listener(queue, track) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerStart);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/playerTrigger.js b/dist/events/playerTrigger.js
index 735f8bd..d86abfd 100644
--- a/dist/events/playerTrigger.js
+++ b/dist/events/playerTrigger.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.PlayerTrigger,
- description: "Executed when the audio player is triggered.",
+ description: 'Executed when the audio player is triggered.',
async listener(queue, track, reason) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.PlayerTrigger);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, track, reason },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/queueCreate.js b/dist/events/queueCreate.js
index fef4ce1..9745701 100644
--- a/dist/events/queueCreate.js
+++ b/dist/events/queueCreate.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.QueueCreate,
- description: "Executed when a queue is successfully created.",
+ description: 'Executed when a queue is successfully created.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.QueueCreate);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/queueDelete.js b/dist/events/queueDelete.js
index 49dcc52..ea62a5b 100644
--- a/dist/events/queueDelete.js
+++ b/dist/events/queueDelete.js
@@ -6,7 +6,7 @@ const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
const discord_player_1 = require("discord-player");
exports.default = new MusicEventHandler_1.MusicEventHandler({
name: discord_player_1.GuildQueueEvent.QueueDelete,
- description: "Executed when a queue is successfully deleted.",
+ description: 'Executed when a queue is successfully deleted.',
async listener(queue) {
const commands = this.getExtension(ForgeMusic_1.ForgeMusic).commands.get(discord_player_1.GuildQueueEvent.QueueDelete);
if (!commands)
@@ -17,12 +17,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/events/volumeChange.js b/dist/events/volumeChange.js
index 279812e..d8a4c48 100644
--- a/dist/events/volumeChange.js
+++ b/dist/events/volumeChange.js
@@ -21,12 +21,9 @@ exports.default = new MusicEventHandler_1.MusicEventHandler({
client: this,
command,
environment: { queue, oldVolume, newVolume },
- data: command.compiled.code
+ data: command.compiled.code,
});
- await this.getExtension(ForgeMusic_1.ForgeMusic)
- .player
- .context
- .provide(context, () => forgescript_1.Interpreter.run(context));
+ await this.getExtension(ForgeMusic_1.ForgeMusic).player.context.provide(context, () => forgescript_1.Interpreter.run(context));
}
- }
+ },
});
diff --git a/dist/index.js b/dist/index.js
index 96e7a7f..cc6def0 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1,11 +1,44 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
-exports.QueryType = exports.QueueRepeatMode = exports.GuildQueueEvent = exports.ForgeMusic = exports.DefaultExtractors = void 0;
+exports.withErrorEvents = exports.QueryType = exports.QueueRepeatMode = exports.GuildQueueEvent = exports.ForgeMusic = exports.DefaultExtractors = exports.AttachmentExtractor = exports.AllEvents = void 0;
+const extractor_1 = require("@discord-player/extractor");
+Object.defineProperty(exports, "AttachmentExtractor", { enumerable: true, get: function () { return extractor_1.AttachmentExtractor; } });
+Object.defineProperty(exports, "DefaultExtractors", { enumerable: true, get: function () { return extractor_1.DefaultExtractors; } });
const discord_player_1 = require("discord-player");
Object.defineProperty(exports, "GuildQueueEvent", { enumerable: true, get: function () { return discord_player_1.GuildQueueEvent; } });
Object.defineProperty(exports, "QueueRepeatMode", { enumerable: true, get: function () { return discord_player_1.QueueRepeatMode; } });
Object.defineProperty(exports, "QueryType", { enumerable: true, get: function () { return discord_player_1.QueryType; } });
-const extractor_1 = require("@discord-player/extractor");
-Object.defineProperty(exports, "DefaultExtractors", { enumerable: true, get: function () { return extractor_1.DefaultExtractors; } });
const ForgeMusic_1 = require("./classes/structures/ForgeMusic");
Object.defineProperty(exports, "ForgeMusic", { enumerable: true, get: function () { return ForgeMusic_1.ForgeMusic; } });
+/**
+ * An array including the events that are not supported.
+ */
+const blacklistedEvents = [
+ 'audioTracksAdd',
+ 'audioTracksRemove',
+ 'willPlayTrack',
+ 'willAutoPlay',
+ 'voiceStateUpdate',
+];
+/**
+ * The list of all events.
+ */
+const AllEvents = Object.keys(discord_player_1.GuildQueueEvent).filter((event) => !blacklistedEvents.includes(event));
+exports.AllEvents = AllEvents;
+/**
+ * Returns an array including the given events and the error events.
+ * @param events The events to be included.
+ * @returns An array including the given events and the error events.
+ * @example
+ * ```typescript
+ * // This:
+ * events: [GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart, GuildQueueEvent.Error, GuildQueueEvent.PlayerError]
+ *
+ * // is the same as:
+ * events: withErrorEvents(GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart)
+ * ```
+ */
+const withErrorEvents = (...events) => {
+ return Array.from(new Set([discord_player_1.GuildQueueEvent.Error, discord_player_1.GuildQueueEvent.PlayerError, ...events]));
+};
+exports.withErrorEvents = withErrorEvents;
diff --git a/dist/natives/clearQueue.js b/dist/natives/clearQueue.js
index 9a4a492..4414da5 100644
--- a/dist/natives/clearQueue.js
+++ b/dist/natives/clearQueue.js
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$clearQueue",
- version: "1.0.0",
- description: "Clear the guild queue.",
+ name: '$clearQueue',
+ version: '1.0.0',
+ description: 'Clear the guild queue.',
unwrap: false,
execute(ctx) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
queue.clear();
return this.success();
- }
+ },
});
diff --git a/dist/natives/clearQueueHistory.js b/dist/natives/clearQueueHistory.js
index 6e12487..5b1ebf7 100644
--- a/dist/natives/clearQueueHistory.js
+++ b/dist/natives/clearQueueHistory.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$clearQueueHistory",
- version: "1.0.0",
- description: "Clear the queue history.",
+ name: '$clearQueueHistory',
+ version: '1.0.0',
+ description: 'Clear the queue history.',
unwrap: false,
execute(ctx) {
- (0, discord_player_1.useQueue)(ctx.guild).history.clear();
+ (0, discord_player_1.useQueue)(ctx.guild.id).history.clear();
return this.success();
- }
+ },
});
diff --git a/dist/natives/currentTrackTotalDuration.js b/dist/natives/currentTrackTotalDuration.js
index 38af666..2e94f83 100644
--- a/dist/natives/currentTrackTotalDuration.js
+++ b/dist/natives/currentTrackTotalDuration.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$currentTrackTotalDuration",
- version: "1.0.0",
- description: "Returns the total duration of the current audio track.",
+ name: '$currentTrackTotalDuration',
+ version: '1.0.0',
+ description: 'Returns the total duration of the current audio track.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).totalDuration);
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.currentTrack.durationMS);
+ },
});
diff --git a/dist/natives/deleteQueue.js b/dist/natives/deleteQueue.js
index b2c568e..508eb80 100644
--- a/dist/natives/deleteQueue.js
+++ b/dist/natives/deleteQueue.js
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$deleteQueue",
- version: "1.0.0",
- description: "Deletes the queue of the current guild.",
+ name: '$deleteQueue',
+ version: '1.0.0',
+ description: 'Deletes the queue of the current guild.',
unwrap: false,
output: forgescript_1.ArgType.Unknown,
execute(ctx) {
- if ((0, discord_player_1.useQueue)(ctx.guild)) {
- (0, discord_player_1.useQueue)(ctx.guild).delete();
+ if ((0, discord_player_1.useQueue)(ctx.guild.id)) {
+ (0, discord_player_1.useQueue)(ctx.guild.id).delete();
}
return this.success();
- }
+ },
});
diff --git a/dist/natives/disableAllFilters.js b/dist/natives/disableAllFilters.js
index 2826b58..5b37a5a 100644
--- a/dist/natives/disableAllFilters.js
+++ b/dist/natives/disableAllFilters.js
@@ -4,19 +4,23 @@ const forgescript_1 = require("@tryforge/forgescript");
const constants_1 = require("../utils/constants");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$disableAllFilters",
- version: "1.0.0",
- description: "Disable the provided FFMPEG filters.",
+ name: '$disableAllFilters',
+ version: '1.0.0',
+ description: 'Disable the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, "Filters", "Filter names to be disabled.")],
+ args: [
+ forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, 'Filters', 'Filter names to be disabled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
const allFilters = queue.filters.ffmpeg.getFiltersEnabled();
for (const filter of filters) {
const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase());
await queue.filters.ffmpeg.toggle(foundFilter);
}
return this.success();
- }
+ },
});
diff --git a/dist/natives/enableAllFilters.js b/dist/natives/enableAllFilters.js
index 72fba85..551988b 100644
--- a/dist/natives/enableAllFilters.js
+++ b/dist/natives/enableAllFilters.js
@@ -4,19 +4,23 @@ const forgescript_1 = require("@tryforge/forgescript");
const constants_1 = require("../utils/constants");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$enableAllFilters",
- version: "1.0.0",
- description: "Enable the provided FFMPEG filters.",
+ name: '$enableAllFilters',
+ version: '1.0.0',
+ description: 'Enable the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, "Filters", "Filter names to be enabled.")],
+ args: [
+ forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, 'Filters', 'Filter names to be enabled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
const allFilters = queue.filters.ffmpeg.getFiltersDisabled();
for (const filter of filters) {
const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase());
await queue.filters.ffmpeg.toggle(foundFilter);
}
return this.success();
- }
+ },
});
diff --git a/dist/natives/findExtractor.js b/dist/natives/findExtractor.js
new file mode 100644
index 0000000..629e59a
--- /dev/null
+++ b/dist/natives/findExtractor.js
@@ -0,0 +1,22 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
+const forgescript_1 = require("@tryforge/forgescript");
+exports.default = new forgescript_1.NativeFunction({
+ name: '$findExtractor',
+ version: '1.0.0',
+ description: 'Find an extractor by name.',
+ brackets: true,
+ unwrap: true,
+ args: [forgescript_1.Arg.requiredString('Name', 'The name of the extractor to find.')],
+ async execute(ctx, [query]) {
+ const globalPlayer = ctx.getExtension(ForgeMusic_1.ForgeMusic).player;
+ if (!globalPlayer)
+ return this.customError('Unable to find an instance of player!');
+ const extractors = Array.from(globalPlayer.extractors.store.values());
+ let result;
+ result = extractors.find((ex) => ex.identifier.toLowerCase().includes(query.toLowerCase()) ||
+ ex.constructor.name.toLowerCase().includes(query.toLowerCase()))?.identifier;
+ return this.success(result);
+ },
+});
diff --git a/dist/natives/getAvailableProviders.js b/dist/natives/getAvailableProviders.js
index 0123040..c55cb09 100644
--- a/dist/natives/getAvailableProviders.js
+++ b/dist/natives/getAvailableProviders.js
@@ -3,14 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$getAvailableProviders",
- version: "1.0.0",
- description: "Get the available audio providers.",
+ name: '$getAvailableProviders',
+ version: '1.0.0',
+ description: 'Get the available audio providers.',
unwrap: false,
output: forgescript_1.ArgType.String,
execute(ctx) {
- const names = [...(0, discord_player_1.useMainPlayer)().extractors.store.values()]
- .map((x) => x.constructor.name.replace("Extractor", "").replace(/[^a-zA-Z+]/g, ""));
- return this.success(names.join(","));
- }
+ const names = [...(0, discord_player_1.useMainPlayer)().extractors.store.values()].map((x) => x.constructor.name
+ .replace('Extractor', '')
+ .replace(/[^a-zA-Z+]/g, ''));
+ return this.success(names.join(','));
+ },
});
diff --git a/dist/natives/getDisabledFilters.js b/dist/natives/getDisabledFilters.js
index f30c282..2ac20a8 100644
--- a/dist/natives/getDisabledFilters.js
+++ b/dist/natives/getDisabledFilters.js
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$getDisabledFilters",
- version: "1.0.0",
- description: "Return the disabled FFMPEG filters.",
+ name: '$getDisabledFilters',
+ version: '1.0.0',
+ description: 'Return the disabled FFMPEG filters.',
unwrap: false,
output: forgescript_1.ArgType.String,
execute(ctx) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
- return this.success(queue.filters.ffmpeg.getFiltersDisabled().join(","));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.filters.ffmpeg.getFiltersDisabled().join(','));
+ },
});
diff --git a/dist/natives/getEnabledFilters.js b/dist/natives/getEnabledFilters.js
index f636ebe..9d90b5d 100644
--- a/dist/natives/getEnabledFilters.js
+++ b/dist/natives/getEnabledFilters.js
@@ -3,13 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$getEnabledFilters",
- version: "1.0.0",
- description: "Return the enabled FFMPEG filters.",
+ name: '$getEnabledFilters',
+ version: '1.0.0',
+ description: 'Return the enabled FFMPEG filters.',
unwrap: false,
output: forgescript_1.ArgType.String,
execute(ctx) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
- return this.success(queue.filters.ffmpeg.getFiltersEnabled().join(","));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.filters.ffmpeg.getFiltersEnabled().join(','));
+ },
});
diff --git a/dist/natives/getLoopMode.js b/dist/natives/getLoopMode.js
index e2e50d5..9856d3f 100644
--- a/dist/natives/getLoopMode.js
+++ b/dist/natives/getLoopMode.js
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const discord_player_1 = require("discord-player");
const forgescript_1 = require("@tryforge/forgescript");
exports.default = new forgescript_1.NativeFunction({
- name: "$getLoopMode",
- version: "1.0.0",
- description: "Returns the state of the loop mode.",
+ name: '$getLoopMode',
+ version: '1.0.0',
+ description: 'Returns the state of the loop mode.',
unwrap: false,
output: discord_player_1.QueueRepeatMode,
execute(ctx) {
const player = (0, discord_player_1.useMainPlayer)();
- return this.success(Object.keys(discord_player_1.QueueRepeatMode)[player.queues.get(ctx.guild).repeatMode]);
- }
+ return this.success(Object.keys(discord_player_1.QueueRepeatMode)[player.queues.get(ctx.guild.id).repeatMode]);
+ },
});
diff --git a/dist/natives/getVolume.js b/dist/natives/getVolume.js
index 8e16b5d..7228dae 100644
--- a/dist/natives/getVolume.js
+++ b/dist/natives/getVolume.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$getVolume",
- version: "1.0.0",
- description: "Get the current volume of the music player.",
+ name: '$getVolume',
+ version: '1.0.0',
+ description: 'Get the current volume of the music player.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).volume);
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.volume);
+ },
});
diff --git a/dist/natives/hasMusicNode.js b/dist/natives/hasMusicNode.js
index 1d3facb..d988002 100644
--- a/dist/natives/hasMusicNode.js
+++ b/dist/natives/hasMusicNode.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$hasMusicNode",
- version: "1.0.0",
- description: "Check whether the current guild has a music node created.",
+ name: '$hasMusicNode',
+ version: '1.0.0',
+ description: 'Check whether the current guild has a music node created.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, discord_player_1.useMainPlayer)().nodes.has(ctx.guild));
- }
+ return this.success((0, discord_player_1.useMainPlayer)().nodes.has(ctx.guild.id));
+ },
});
diff --git a/dist/natives/isFilterEnabled.js b/dist/natives/isFilterEnabled.js
index fcb1897..28363d8 100644
--- a/dist/natives/isFilterEnabled.js
+++ b/dist/natives/isFilterEnabled.js
@@ -4,17 +4,23 @@ const forgescript_1 = require("@tryforge/forgescript");
const constants_1 = require("../utils/constants");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$isFilterEnabled",
- version: "1.0.0",
- description: "Check whether the provided filter is enabled.",
+ name: '$isFilterEnabled',
+ version: '1.0.0',
+ description: 'Check whether the provided filter is enabled.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredEnum(constants_1.FFMPEGFilters, "Filters", "Filter names to be toggled.")],
+ args: [
+ forgescript_1.Arg.requiredEnum(constants_1.FFMPEGFilters, 'Filters', 'Filter names to be toggled.'),
+ ],
output: forgescript_1.ArgType.Boolean,
async execute(ctx, [filter]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
- const allFilters = queue.filters.ffmpeg.getFiltersEnabled().concat(queue.filters.ffmpeg.getFiltersDisabled());
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ const allFilters = queue.filters.ffmpeg
+ .getFiltersEnabled()
+ .concat(queue.filters.ffmpeg.getFiltersDisabled());
const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase());
return this.success(queue.filters.ffmpeg.isEnabled(foundFilter));
- }
+ },
});
diff --git a/dist/natives/isPaused.js b/dist/natives/isPaused.js
index 9a094ff..22efffb 100644
--- a/dist/natives/isPaused.js
+++ b/dist/natives/isPaused.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$isPaused",
- version: "1.0.0",
- description: "Check whether the music player is paused.",
+ name: '$isPaused',
+ version: '1.0.0',
+ description: 'Check whether the music player is paused.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).isPaused());
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.isPaused());
+ },
});
diff --git a/dist/natives/isPlaying.js b/dist/natives/isPlaying.js
index ace42af..9226735 100644
--- a/dist/natives/isPlaying.js
+++ b/dist/natives/isPlaying.js
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$isPlaying",
- version: "1.0.0",
- description: "Check whether the music player is playing a track.",
+ name: '$isPlaying',
+ version: '1.0.0',
+ description: 'Check whether the music player is playing a track.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
const player = (0, discord_player_1.useMainPlayer)();
- return this.success(player.queues.get(ctx.guild).isPlaying());
- }
+ return this.success(player.queues.get(ctx.guild.id).isPlaying());
+ },
});
diff --git a/dist/natives/isQueueHistoryDisabled.js b/dist/natives/isQueueHistoryDisabled.js
index 3994a0b..665fe56 100644
--- a/dist/natives/isQueueHistoryDisabled.js
+++ b/dist/natives/isQueueHistoryDisabled.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$isQueueHistoryDisabled",
- version: "1.0.0",
- description: "Returns whether the queue history is disabled.",
+ name: '$isQueueHistoryDisabled',
+ version: '1.0.0',
+ description: 'Returns whether the queue history is disabled.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).history.disabled);
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).history.disabled);
+ },
});
diff --git a/dist/natives/isQueueHistoryEmpty.js b/dist/natives/isQueueHistoryEmpty.js
index 8df347c..056ad10 100644
--- a/dist/natives/isQueueHistoryEmpty.js
+++ b/dist/natives/isQueueHistoryEmpty.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$isQueueHistoryEmpty",
- version: "1.0.0",
- description: "Returns whether the queue history is empty.",
+ name: '$isQueueHistoryEmpty',
+ version: '1.0.0',
+ description: 'Returns whether the queue history is empty.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).history.isEmpty());
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).history.isEmpty());
+ },
});
diff --git a/dist/natives/leaveVoiceChannel.js b/dist/natives/leaveVoiceChannel.js
index 84c5ab7..56f24cd 100644
--- a/dist/natives/leaveVoiceChannel.js
+++ b/dist/natives/leaveVoiceChannel.js
@@ -1,20 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
-const hasQueue_1 = __importDefault(require("../utils/hasQueue"));
exports.default = new forgescript_1.NativeFunction({
- name: "$leaveVoiceChannel",
- version: "1.0.0",
- description: "Destroys the current voice connection.",
+ name: '$leaveVoiceChannel',
+ version: '1.0.0',
+ description: 'Destroys the current voice connection.',
unwrap: false,
async execute(ctx) {
- if ((0, hasQueue_1.default)(ctx)) {
- await (0, discord_player_1.useQueue)(ctx.guild).connection.destroy();
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (queue) {
+ await queue.connection.destroy();
}
return this.success();
- }
+ },
});
diff --git a/dist/natives/moveTrack.js b/dist/natives/moveTrack.js
index d41a776..8dd238d 100644
--- a/dist/natives/moveTrack.js
+++ b/dist/natives/moveTrack.js
@@ -3,20 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$moveTrack",
- version: "1.0.0",
- description: "Moves the track to a new position.",
+ name: '$moveTrack',
+ version: '1.0.0',
+ description: 'Moves the track to a new position.',
brackets: true,
unwrap: true,
args: [
- forgescript_1.Arg.requiredNumber("Position", "The track position to be moved."),
- forgescript_1.Arg.requiredNumber("New Position", "The new position of the track.")
+ forgescript_1.Arg.requiredNumber('Position', 'The track position to be moved.'),
+ forgescript_1.Arg.requiredNumber('New Position', 'The new position of the track.'),
],
execute(ctx, [position, newPosition]) {
const player = (0, discord_player_1.useMainPlayer)();
- const queue = player.queues.get(ctx.guild);
+ const queue = player.queues.get(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
const track = queue.node.remove(position);
queue.node.insert(track, newPosition);
return this.success();
- }
+ },
});
diff --git a/dist/natives/pauseTrack.js b/dist/natives/pauseTrack.js
index 93b42e2..907edca 100644
--- a/dist/natives/pauseTrack.js
+++ b/dist/natives/pauseTrack.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$pauseTrack",
- version: "1.0.0",
- description: "Pauses the current track.",
+ name: '$pauseTrack',
+ version: '1.0.0',
+ description: 'Pauses the current track.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).pause());
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.pause());
+ },
});
diff --git a/dist/natives/playNext.js b/dist/natives/playNext.js
index 466da6d..c008bd7 100644
--- a/dist/natives/playNext.js
+++ b/dist/natives/playNext.js
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$playNext",
- version: "1.0.0",
- description: "Play the next track in the queue, if any.",
+ name: '$playNext',
+ version: '1.0.0',
+ description: 'Play the next track in the queue, if any.',
unwrap: false,
output: forgescript_1.ArgType.Unknown,
async execute(ctx) {
- await (0, discord_player_1.useQueue)(ctx.guild).history.next();
+ await (0, discord_player_1.useQueue)(ctx.guild.id).history.next();
return this.success();
- }
+ },
});
diff --git a/dist/natives/playPrevious.js b/dist/natives/playPrevious.js
index 2509fd4..04bb868 100644
--- a/dist/natives/playPrevious.js
+++ b/dist/natives/playPrevious.js
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$playPrevious",
- version: "1.0.0",
- description: "Play the previous track in the queue history, if any.",
+ name: '$playPrevious',
+ version: '1.0.0',
+ description: 'Play the previous track in the queue history, if any.',
unwrap: false,
output: forgescript_1.ArgType.Unknown,
async execute(ctx) {
- await (0, discord_player_1.useQueue)(ctx.guild).history.previous();
+ await (0, discord_player_1.useQueue)(ctx.guild.id).history.previous();
return this.success();
- }
+ },
});
diff --git a/dist/natives/playTrack.js b/dist/natives/playTrack.js
index 6111367..21ccbd5 100644
--- a/dist/natives/playTrack.js
+++ b/dist/natives/playTrack.js
@@ -4,49 +4,52 @@ const discord_player_1 = require("discord-player");
const forgescript_1 = require("@tryforge/forgescript");
const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
exports.default = new forgescript_1.NativeFunction({
- name: "$playTrack",
- version: "1.0.0",
- description: "Play a track by query.",
+ name: '$playTrack',
+ version: '1.0.0',
+ description: 'Play a track by query.',
brackets: true,
unwrap: true,
args: [
{
- name: "Channel ID",
- description: "Voice channel ID to play the track on.",
+ name: 'Channel ID',
+ description: 'Voice channel ID to play the track on.',
type: forgescript_1.ArgType.Channel,
required: true,
rest: false,
- check: (c) => c.isVoiceBased()
+ check: (c) => c.isVoiceBased(),
},
- forgescript_1.Arg.requiredString("Query", "Track name to be searched."),
- forgescript_1.Arg.optionalString("Engine", "The query search engine, can be extractor name to target an specific one. (custom)"),
- forgescript_1.Arg.optionalEnum(discord_player_1.QueryType, "Fallback Engine", "Fallback search engine to use."),
+ forgescript_1.Arg.requiredString('Query', 'Track name to be searched.'),
+ forgescript_1.Arg.optionalString('Engine', 'The query search engine, can be extractor name to target an specific one. (custom)'),
+ forgescript_1.Arg.optionalEnum(discord_player_1.QueryType, 'Fallback Engine', 'Fallback search engine to use.'),
{
- name: "Block Extractors",
- description: "List of extractors to block.",
+ name: 'Block Extractors',
+ description: 'List of extractors to block.',
type: forgescript_1.ArgType.String,
required: false,
- rest: true
- }
+ rest: true,
+ },
],
- async execute(ctx, [voiceChannel, query, searchEngine, fallbackSearchEngine, blockExtractors]) {
+ async execute(ctx, [voiceChannel, query, searchEngine, fallbackSearchEngine, blockExtractors,]) {
const player = (0, discord_player_1.useMainPlayer)();
const connectOptions = ctx.getExtension(ForgeMusic_1.ForgeMusic).connectOptions ?? {};
const connectionOptionsUnion = {
metadata: { text: ctx.channel },
- ...connectOptions
+ ...connectOptions,
};
let executed = true;
- const result = await player.play(voiceChannel, query, {
+ const result = await player
+ .play(voiceChannel, query, {
nodeOptions: connectionOptionsUnion,
- searchEngine: searchEngine,
- fallbackSearchEngine,
- blockExtractors,
- requestedBy: ctx.user
- }).catch((e) => {
+ searchEngine: searchEngine ||
+ undefined,
+ fallbackSearchEngine: fallbackSearchEngine || undefined,
+ blockExtractors: blockExtractors || undefined,
+ requestedBy: ctx.user,
+ })
+ .catch((e) => {
executed = false;
return e;
});
return executed ? this.success() : this.error(result);
- }
+ },
});
diff --git a/dist/natives/playerElapsedTime.js b/dist/natives/playerElapsedTime.js
index 5028230..bcdf3f8 100644
--- a/dist/natives/playerElapsedTime.js
+++ b/dist/natives/playerElapsedTime.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$playerElapsedTime",
- version: "1.0.0",
- description: "Returns the elapsed time of the current song in milliseconds.",
+ name: '$playerElapsedTime',
+ version: '1.0.0',
+ description: 'Returns the elapsed time of the current song in milliseconds.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).getTimestamp().progress * 1000);
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.getTimestamp().progress * 1000);
+ },
});
diff --git a/dist/natives/queue.js b/dist/natives/queue.js
index be780d0..6cf392e 100644
--- a/dist/natives/queue.js
+++ b/dist/natives/queue.js
@@ -5,23 +5,26 @@ const constants_1 = require("../utils/constants");
const node_vm_1 = require("node:vm");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queue",
- description: "Returns queue songs resolving the given text placeholders.",
- version: "1.0.0",
+ name: '$queue',
+ description: 'Returns queue songs resolving the given text placeholders.',
+ version: '1.0.0',
brackets: false,
unwrap: true,
args: [
- forgescript_1.Arg.optionalNumber("Start Index", "The queue song start index."),
- forgescript_1.Arg.optionalNumber("Limit", "The amount of queue songs to be retrieved."),
- forgescript_1.Arg.optionalString("Text", "The text to be resolved."),
- forgescript_1.Arg.optionalString("Separator", "The separator for each result.")
+ forgescript_1.Arg.optionalNumber('Start Index', 'The queue song start index.'),
+ forgescript_1.Arg.optionalNumber('Limit', 'The amount of queue songs to be retrieved.'),
+ forgescript_1.Arg.optionalString('Text', 'The text to be resolved.'),
+ forgescript_1.Arg.optionalString('Separator', 'The separator for each result.'),
],
output: forgescript_1.ArgType.String,
async execute(ctx, [index, limit, text, separator]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
const tracks = queue.tracks.data;
- text ||= "{position} {track.title} | <@{track.requestedBy.username}>";
- const results = tracks.slice(index ?? 0, limit ?? undefined)
+ text ||= '{position} {track.title} | <@{track.requestedBy.username}>';
+ const results = tracks
+ .slice(index ?? 0, limit ?? undefined)
.map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
.map((song, i) => {
const matches = song.match(constants_1.PLACEHOLDER_PATTERN) ?? [];
@@ -29,10 +32,10 @@ exports.default = new forgescript_1.NativeFunction({
for (const match of matches) {
const placeholderValue = match.slice(1, -1);
const result = (0, node_vm_1.runInContext)(placeholderValue, context);
- song = song.replace(new RegExp(match, "g"), result);
+ song = song.replace(new RegExp(match, 'g'), result);
}
return song;
});
- return this.success(results.join(separator || ","));
- }
+ return this.success(results.join(separator || ','));
+ },
});
diff --git a/dist/natives/queueEstimatedDuration.js b/dist/natives/queueEstimatedDuration.js
index 3b62e84..c08d390 100644
--- a/dist/natives/queueEstimatedDuration.js
+++ b/dist/natives/queueEstimatedDuration.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queueEstimatedDuration",
- version: "1.0.0",
- description: "Returns the estimated duration of the current guild queue in milliseconds.",
+ name: '$queueEstimatedDuration',
+ version: '1.0.0',
+ description: 'Returns the estimated duration of the current guild queue in milliseconds.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).estimatedDuration);
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).estimatedDuration);
+ },
});
diff --git a/dist/natives/queueHistory.js b/dist/natives/queueHistory.js
index 6db9c60..bf678bd 100644
--- a/dist/natives/queueHistory.js
+++ b/dist/natives/queueHistory.js
@@ -5,25 +5,27 @@ const constants_1 = require("../utils/constants");
const node_vm_1 = require("node:vm");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queueHistory",
- description: "Returns queue history songs resolving the given text placeholders.",
- version: "1.0.0",
+ name: '$queueHistory',
+ description: 'Returns queue history songs resolving the given text placeholders.',
+ version: '1.0.0',
brackets: false,
unwrap: true,
args: [
- forgescript_1.Arg.optionalNumber("Start Index", "The queue song start index."),
- forgescript_1.Arg.optionalNumber("Limit", "The amount of queue history songs to be retrieved."),
- forgescript_1.Arg.optionalString("Text", "The text to be resolved."),
- forgescript_1.Arg.optionalString("Separator", "The separator for each result.")
+ forgescript_1.Arg.optionalNumber('Start Index', 'The queue song start index.'),
+ forgescript_1.Arg.optionalNumber('Limit', 'The amount of queue history songs to be retrieved.'),
+ forgescript_1.Arg.optionalString('Text', 'The text to be resolved.'),
+ forgescript_1.Arg.optionalString('Separator', 'The separator for each result.'),
],
output: forgescript_1.ArgType.String,
async execute(ctx, [index, limit, text, separator]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
let tracks = queue.history.tracks.data;
if (index)
tracks = tracks.slice(index, limit ?? undefined);
const resolvedTracks = [];
- text ??= "{position} {track.title} | {track.requestedBy}";
+ text ??= '{position} {track.title} | {track.requestedBy}';
let i = 0, advance = () => i++;
for (const track of tracks) {
let result = text.replace(/\{position\}/g, String(i + 1));
@@ -37,11 +39,11 @@ exports.default = new forgescript_1.NativeFunction({
for (const match of matches) {
const placeholderValue = match.slice(1, -1);
const placeholderResult = (0, node_vm_1.runInContext)(placeholderValue, context);
- result = result.replace(new RegExp(match, "g"), placeholderResult);
+ result = result.replace(new RegExp(match, 'g'), placeholderResult);
}
resolvedTracks.push(result);
advance();
}
- return this.success(resolvedTracks.join(separator ?? ","));
- }
+ return this.success(resolvedTracks.join(separator ?? ','));
+ },
});
diff --git a/dist/natives/queueHistoryLength.js b/dist/natives/queueHistoryLength.js
index e76193d..a8832a9 100644
--- a/dist/natives/queueHistoryLength.js
+++ b/dist/natives/queueHistoryLength.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queueHistoryLength",
- version: "1.0.0",
- description: "Returns the length of the tracks that were played.",
+ name: '$queueHistoryLength',
+ version: '1.0.0',
+ description: 'Returns the length of the tracks that were played.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).history.tracks.data.length);
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).history.tracks.data.length);
+ },
});
diff --git a/dist/natives/queueLength.js b/dist/natives/queueLength.js
index 4fc3337..6c1d83a 100644
--- a/dist/natives/queueLength.js
+++ b/dist/natives/queueLength.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queueLength",
- version: "1.0.0",
- description: "Returns the length of the current guild queue.",
+ name: '$queueLength',
+ version: '1.0.0',
+ description: 'Returns the length of the current guild queue.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).tracks.size);
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).tracks.size);
+ },
});
diff --git a/dist/natives/queuePing.js b/dist/natives/queuePing.js
index df89a8a..4e247bc 100644
--- a/dist/natives/queuePing.js
+++ b/dist/natives/queuePing.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$queuePing",
- version: "1.0.0",
- description: "Returns the latency of the current guild queue.",
+ name: '$queuePing',
+ version: '1.0.0',
+ description: 'Returns the latency of the current guild queue.',
unwrap: false,
output: forgescript_1.ArgType.Number,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).ping);
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).ping);
+ },
});
diff --git a/dist/natives/removeTrack.js b/dist/natives/removeTrack.js
index 5266377..f9bec0a 100644
--- a/dist/natives/removeTrack.js
+++ b/dist/natives/removeTrack.js
@@ -1,19 +1,19 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$removeTrack",
- version: "1.0.0",
- description: "Removes the track that is located at the given position.",
+ name: '$removeTrack',
+ version: '1.0.0',
+ description: 'Removes the track that is located at the given position.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredNumber("Position", "The track position to be removed.")],
+ args: [forgescript_1.Arg.requiredNumber('Position', 'The track position to be removed.')],
output: forgescript_1.ArgType.Boolean,
execute(ctx, [position]) {
- return this.success(!!(0, getNode_1.default)(ctx).remove(position));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(!!queue.node.remove(position));
+ },
});
diff --git a/dist/natives/resumeTrack.js b/dist/natives/resumeTrack.js
index 4d2a50c..0f8942c 100644
--- a/dist/natives/resumeTrack.js
+++ b/dist/natives/resumeTrack.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$resumeTrack",
- version: "1.0.0",
- description: "Resumes the current paused track.",
+ name: '$resumeTrack',
+ version: '1.0.0',
+ description: 'Resumes the current paused track.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).resume());
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.resume());
+ },
});
diff --git a/dist/natives/searchTrack.js b/dist/natives/searchTrack.js
index 2058041..53163aa 100644
--- a/dist/natives/searchTrack.js
+++ b/dist/natives/searchTrack.js
@@ -1,52 +1,52 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const discord_player_1 = require("discord-player");
const forgescript_1 = require("@tryforge/forgescript");
const constants_1 = require("../utils/constants");
const node_vm_1 = require("node:vm");
const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
-const hasQueue_1 = __importDefault(require("../utils/hasQueue"));
exports.default = new forgescript_1.NativeFunction({
- name: "$searchTrack",
- version: "1.0.0",
- description: "Search for a track using the given query.",
+ name: '$searchTrack',
+ version: '1.0.0',
+ description: 'Search for a track using the given query.',
brackets: true,
unwrap: true,
args: [
- forgescript_1.Arg.requiredString("Query", "The query to search for."),
- forgescript_1.Arg.requiredString("Text Result", "The formatted text result to return."),
- forgescript_1.Arg.optionalString("Separator", "The result separator."),
- forgescript_1.Arg.optionalString("Engine", "The query search engine, can be extractor name to target an specific one. (custom)"),
- forgescript_1.Arg.optionalEnum(discord_player_1.QueryType, "Fallback Engine", "Fallback search engine to use."),
- forgescript_1.Arg.optionalNumber("Limit", "The maximum number of results to return."),
- forgescript_1.Arg.optionalBoolean("Add To Player", "Whether add the results to the music player."),
+ forgescript_1.Arg.requiredString('Query', 'The query to search for.'),
+ forgescript_1.Arg.requiredString('Text Result', 'The formatted text result to return.'),
+ forgescript_1.Arg.optionalString('Separator', 'The result separator.'),
+ forgescript_1.Arg.optionalString('Engine', 'The query search engine, can be extractor name to target an specific one. (custom)'),
+ forgescript_1.Arg.optionalEnum(discord_player_1.QueryType, 'Fallback Engine', 'Fallback search engine to use.'),
+ forgescript_1.Arg.optionalNumber('Limit', 'The maximum number of results to return.'),
+ forgescript_1.Arg.optionalBoolean('Add To Player', 'Whether add the results to the music player.'),
{
- name: "Block Extractors",
- description: "List of extractors to block.",
+ name: 'Block Extractors',
+ description: 'List of extractors to block.',
type: forgescript_1.ArgType.String,
required: false,
- rest: true
- }
+ rest: true,
+ },
],
- async execute(ctx, [query, text, separator, engine, fallbackEngine, limit, addToPlayer, blockedExtractors]) {
- const searchResult = await ctx.client.getExtension(ForgeMusic_1.ForgeMusic).player.search(query, {
- searchEngine: engine,
- fallbackSearchEngine: fallbackEngine,
- blockExtractors: blockedExtractors,
- requestedBy: ctx.user
- });
+ async execute(ctx, [query, text, separator, engine, fallbackEngine, limit, addToPlayer, blockedExtractors,]) {
+ const searchOptions = {
+ searchEngine: engine || undefined,
+ fallbackSearchEngine: fallbackEngine || undefined,
+ blockExtractors: blockedExtractors || undefined,
+ requestedBy: ctx.user,
+ };
+ const searchResult = await ctx.client
+ .getExtension(ForgeMusic_1.ForgeMusic)
+ .player.search(query, searchOptions);
const connectOptions = ctx.getExtension(ForgeMusic_1.ForgeMusic).connectOptions ?? {};
const connectionOptionsUnion = {
metadata: { text: ctx.channel },
- ...connectOptions
+ ...connectOptions,
};
let tracks = searchResult.tracks;
if (limit && tracks.length > limit)
tracks = tracks.slice(0, limit);
- const formattedTracks = tracks.map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
+ const formattedTracks = tracks
+ .map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
.map((trackText, i) => {
const track = tracks[i];
const matches = trackText.match(constants_1.PLACEHOLDER_PATTERN) ?? [];
@@ -54,16 +54,21 @@ exports.default = new forgescript_1.NativeFunction({
for (const match of matches) {
const placeholderValue = match.slice(1, -1);
const result = (0, node_vm_1.runInContext)(placeholderValue, context);
- trackText = trackText.replace(new RegExp(match, "g"), result);
+ trackText = trackText.replace(new RegExp(match, 'g'), result);
}
return trackText;
});
- if (addToPlayer && (0, hasQueue_1.default)(ctx))
- (0, discord_player_1.useQueue)(ctx.guild).addTrack(tracks);
- else if (addToPlayer && !(0, hasQueue_1.default)(ctx)) {
- const queue = await ctx.client.getExtension(ForgeMusic_1.ForgeMusic).player.queues.create(ctx.guild, connectionOptionsUnion);
+ let queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (addToPlayer && queue)
+ queue.addTrack(tracks);
+ else if (addToPlayer && !queue) {
+ queue = await ctx.client
+ .getExtension(ForgeMusic_1.ForgeMusic)
+ .player.queues.create(ctx.guild.id, connectionOptionsUnion);
queue.addTrack(tracks);
}
- return this.success(searchResult.tracks.length > 0 ? formattedTracks.join(separator ?? ",") : "");
- }
+ return this.success(searchResult.tracks.length > 0
+ ? formattedTracks.join(separator ?? ',')
+ : '');
+ },
});
diff --git a/dist/natives/seekTrack.js b/dist/natives/seekTrack.js
index b080bc2..5063a9f 100644
--- a/dist/natives/seekTrack.js
+++ b/dist/natives/seekTrack.js
@@ -1,19 +1,19 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$seekTrack",
- version: "1.0.0",
- description: "Seeks a track.",
+ name: '$seekTrack',
+ version: '1.0.0',
+ description: 'Seeks a track.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredTime("Duration", "Seek duration to be applied.")],
+ args: [forgescript_1.Arg.requiredTime('Duration', 'Seek duration to be applied.')],
output: forgescript_1.ArgType.Boolean,
async execute(ctx, [duration]) {
- return this.success(await (0, getNode_1.default)(ctx).seek(duration));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(await queue.node.seek(duration));
+ },
});
diff --git a/dist/natives/setLoopMode.js b/dist/natives/setLoopMode.js
index 276a7ca..44b0314 100644
--- a/dist/natives/setLoopMode.js
+++ b/dist/natives/setLoopMode.js
@@ -3,15 +3,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
const discord_player_1 = require("discord-player");
const forgescript_1 = require("@tryforge/forgescript");
exports.default = new forgescript_1.NativeFunction({
- name: "$setLoopMode",
- version: "1.0.0",
- description: "Set the loop mode of the music player.",
+ name: '$setLoopMode',
+ version: '1.0.0',
+ description: 'Set the loop mode of the music player.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredString("Mode", "The loop mode of the music player.")],
+ args: [forgescript_1.Arg.requiredString('Mode', 'The loop mode of the music player.')],
execute(ctx, [mode]) {
const player = (0, discord_player_1.useMainPlayer)();
- player.queues.get(ctx.guild).setRepeatMode(discord_player_1.QueueRepeatMode[mode.toUpperCase()]);
+ player.queues
+ .get(ctx.guild.id)
+ .setRepeatMode(discord_player_1.QueueRepeatMode[mode.toUpperCase()]);
return this.success();
- }
+ },
});
diff --git a/dist/natives/setVolume.js b/dist/natives/setVolume.js
index 23f8c85..3b5662e 100644
--- a/dist/natives/setVolume.js
+++ b/dist/natives/setVolume.js
@@ -1,19 +1,19 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$setVolume",
- version: "1.0.0",
- description: "Set the volume of the music player.",
+ name: '$setVolume',
+ version: '1.0.0',
+ description: 'Set the volume of the music player.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredNumber("Amount", "The volume amount to be applied.")],
+ args: [forgescript_1.Arg.requiredNumber('Amount', 'The volume amount to be applied.')],
execute(ctx, [amount]) {
- (0, getNode_1.default)(ctx).setVolume(amount);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ queue.node.setVolume(amount);
return this.success();
- }
+ },
});
diff --git a/dist/natives/shuffleQueue.js b/dist/natives/shuffleQueue.js
index dbcfa84..8358117 100644
--- a/dist/natives/shuffleQueue.js
+++ b/dist/natives/shuffleQueue.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$shuffleQueue",
- version: "1.0.0",
- description: "Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.",
+ name: '$shuffleQueue',
+ version: '1.0.0',
+ description: 'Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).enableShuffle(true));
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).enableShuffle(true));
+ },
});
diff --git a/dist/natives/shuffleTracks.js b/dist/natives/shuffleTracks.js
index 0aaac8c..98cdb5d 100644
--- a/dist/natives/shuffleTracks.js
+++ b/dist/natives/shuffleTracks.js
@@ -3,13 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$shuffleTracks",
- version: "1.0.0",
- description: "Shuffle the current guild queue.",
+ name: '$shuffleTracks',
+ version: '1.0.0',
+ description: 'Shuffle the current guild queue.',
unwrap: false,
execute(ctx) {
const player = (0, discord_player_1.useMainPlayer)();
- player.queues.get(ctx.guild).tracks.shuffle();
+ player.queues.get(ctx.guild.id).tracks.shuffle();
return this.success();
- }
+ },
});
diff --git a/dist/natives/skipTo.js b/dist/natives/skipTo.js
index 238a146..6dd444f 100644
--- a/dist/natives/skipTo.js
+++ b/dist/natives/skipTo.js
@@ -1,19 +1,19 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$skipTo",
- version: "1.0.0",
- description: "Skip the current track to the given position.",
+ name: '$skipTo',
+ version: '1.0.0',
+ description: 'Skip the current track to the given position.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.requiredNumber("Position", "The track position to be played.")],
+ args: [forgescript_1.Arg.requiredNumber('Position', 'The track position to be played.')],
output: forgescript_1.ArgType.Boolean,
execute(ctx, [position]) {
- return this.success((0, getNode_1.default)(ctx).skipTo(position));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.skipTo(position));
+ },
});
diff --git a/dist/natives/skipTrack.js b/dist/natives/skipTrack.js
index 8f715f7..3ae8b8b 100644
--- a/dist/natives/skipTrack.js
+++ b/dist/natives/skipTrack.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$skipTrack",
- version: "1.0.0",
- description: "Skip the current track.",
+ name: '$skipTrack',
+ version: '1.0.0',
+ description: 'Skip the current track.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).skip());
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.skip());
+ },
});
diff --git a/dist/natives/stopTrack.js b/dist/natives/stopTrack.js
index 6053b94..1da635d 100644
--- a/dist/natives/stopTrack.js
+++ b/dist/natives/stopTrack.js
@@ -1,17 +1,17 @@
"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
-const getNode_1 = __importDefault(require("../utils/getNode"));
+const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$stopTrack",
- version: "1.0.0",
- description: "Forces to stop the current track.",
+ name: '$stopTrack',
+ version: '1.0.0',
+ description: 'Forces to stop the current track.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, getNode_1.default)(ctx).stop(true));
- }
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ return this.success(queue.node.stop(true));
+ },
});
diff --git a/dist/natives/toggleFilters.js b/dist/natives/toggleFilters.js
index ebe2278..544d5dd 100644
--- a/dist/natives/toggleFilters.js
+++ b/dist/natives/toggleFilters.js
@@ -4,19 +4,25 @@ const forgescript_1 = require("@tryforge/forgescript");
const constants_1 = require("../utils/constants");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$toggleFilters",
- version: "1.0.0",
- description: "Toggle the provided FFMPEG filters.",
+ name: '$toggleFilters',
+ version: '1.0.0',
+ description: 'Toggle the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, "Filters", "Filter names to be toggled.")],
+ args: [
+ forgescript_1.Arg.restEnum(constants_1.FFMPEGFilters, 'Filters', 'Filter names to be toggled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
- const allFilters = queue.filters.ffmpeg.getFiltersEnabled().concat(queue.filters.ffmpeg.getFiltersDisabled());
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
+ const allFilters = queue.filters.ffmpeg
+ .getFiltersEnabled()
+ .concat(queue.filters.ffmpeg.getFiltersDisabled());
for (const filter of filters) {
const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase());
await queue.filters.ffmpeg.toggle(foundFilter);
}
return this.success();
- }
+ },
});
diff --git a/dist/natives/trackInfo.js b/dist/natives/trackInfo.js
index ff84b3c..e4435a6 100644
--- a/dist/natives/trackInfo.js
+++ b/dist/natives/trackInfo.js
@@ -3,21 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$trackInfo",
- version: "1.0.0",
- description: "Returns information of the current track.",
+ name: '$trackInfo',
+ version: '1.0.0',
+ description: 'Returns information of the current track.',
brackets: true,
unwrap: true,
- args: [
- forgescript_1.Arg.restString("Properties", "The track properties to be accesed.")
- ],
+ args: [forgescript_1.Arg.restString('Properties', 'The track properties to be accesed.')],
output: forgescript_1.ArgType.String,
execute(ctx, [properties]) {
- const queue = (0, discord_player_1.useQueue)(ctx.guild);
+ const queue = (0, discord_player_1.useQueue)(ctx.guild.id);
+ if (!queue)
+ return this.customError('No queue found.');
const track = queue.currentTrack;
- ctx.setEnvironmentKey("myTrack", track);
- const got = ctx.getEnvironmentKey(...["myTrack", ...properties]);
- ctx.deleteEnvironmentKey("myTrack");
+ ctx.setEnvironmentKey('myTrack', track);
+ const got = ctx.getEnvironmentKey(...['myTrack', ...properties]);
+ ctx.deleteEnvironmentKey('myTrack');
return this.success(got);
- }
+ },
});
diff --git a/dist/natives/unshuffleQueue.js b/dist/natives/unshuffleQueue.js
index d30be44..485047c 100644
--- a/dist/natives/unshuffleQueue.js
+++ b/dist/natives/unshuffleQueue.js
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
const forgescript_1 = require("@tryforge/forgescript");
const discord_player_1 = require("discord-player");
exports.default = new forgescript_1.NativeFunction({
- name: "$unshuffleQueue",
- version: "1.0.0",
- description: "Disable shuffle mode for the queue.",
+ name: '$unshuffleQueue',
+ version: '1.0.0',
+ description: 'Disable shuffle mode for the queue.',
unwrap: false,
output: forgescript_1.ArgType.Boolean,
execute(ctx) {
- return this.success((0, discord_player_1.useQueue)(ctx.guild).disableShuffle());
- }
+ return this.success((0, discord_player_1.useQueue)(ctx.guild.id).disableShuffle());
+ },
});
diff --git a/dist/utils/getNode.js b/dist/utils/getNode.js
deleted file mode 100644
index 37cc219..0000000
--- a/dist/utils/getNode.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = default_1;
-const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
-function default_1(ctx) {
- const extension = ctx.client.getExtension(ForgeMusic_1.ForgeMusic);
- const queue = extension.player.queues.get(ctx.guild);
- return queue.node;
-}
diff --git a/dist/utils/getQueue.js b/dist/utils/getQueue.js
deleted file mode 100644
index 24a5d9b..0000000
--- a/dist/utils/getQueue.js
+++ /dev/null
@@ -1,9 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = default_1;
-const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
-function default_1(ctx) {
- const extension = ctx.client.getExtension(ForgeMusic_1.ForgeMusic);
- const queue = extension.player.queues.get(ctx.guild);
- return queue;
-}
diff --git a/dist/utils/getVersion.js b/dist/utils/getVersion.js
index fbc94c5..f4d2895 100644
--- a/dist/utils/getVersion.js
+++ b/dist/utils/getVersion.js
@@ -8,7 +8,7 @@ const path_1 = require("path");
* @returns {string}
*/
function getVersion() {
- const stringContent = (0, fs_1.readFileSync)((0, path_1.join)(process.cwd(), "package.json"), "utf-8");
+ const stringContent = (0, fs_1.readFileSync)((0, path_1.join)(process.cwd(), 'package.json'), 'utf-8');
const data = JSON.parse(stringContent);
return data.version;
}
diff --git a/dist/utils/hasQueue.js b/dist/utils/hasQueue.js
deleted file mode 100644
index 3ee9323..0000000
--- a/dist/utils/hasQueue.js
+++ /dev/null
@@ -1,8 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = default_1;
-const ForgeMusic_1 = require("../classes/structures/ForgeMusic");
-function default_1(ctx) {
- const extension = ctx.client.getExtension(ForgeMusic_1.ForgeMusic);
- return extension.player.queues.has(ctx.guild);
-}
diff --git a/docs/findExtractor.md b/docs/findExtractor.md
new file mode 100644
index 0000000..5f475cd
--- /dev/null
+++ b/docs/findExtractor.md
@@ -0,0 +1,12 @@
+# $findExtractor
+Find an extractor by name.
+## Usage
+```
+$findExtractor[name]
+```
+## Fields
+| Name | Description | Type | Required | Rest |
+|------|------------------------------------|--------|----------|------|
+| Name | The name of the extractor to find. | String | Yes | No |
+
+View source on [GitHub](https://github.com/Cyberghxst/forgemusic/blob/dev/src/natives/findExtractor.ts)
\ No newline at end of file
diff --git a/docs/trackInfo.md b/docs/trackInfo.md
index 604f2b2..11470a9 100644
--- a/docs/trackInfo.md
+++ b/docs/trackInfo.md
@@ -2,12 +2,12 @@
Returns information of the current track.
## Usage
```
-$trackInfo[...properties]
+$trackInfo[...properties?]
```
## Fields
| Name | Description | Type | Required | Rest |
|------------|-------------------------------------|--------|----------|------|
-| Properties | The track properties to be accesed. | String | Yes | Yes |
+| Properties | The track properties to be accesed. | String | No | Yes |
## Output
> String
diff --git a/metadata/events.json b/metadata/events.json
index be8cf54..07c5a2c 100644
--- a/metadata/events.json
+++ b/metadata/events.json
@@ -1 +1 @@
-[{"name":"audioFiltersUpdate","description":"Executed when FFMPEG audio filters are updated.","version":"1.0.0"},{"name":"audioTrackAdd","description":"Executed when audio track is added to the queue.","version":"1.0.0"},{"name":"audioTrackRemove","description":"Executed when audio track is removed from the queue.","version":"1.0.0"},{"name":"audioTracksAdd","description":"Executed when multiple audio track are added to the queue.","version":"1.0.0"},{"name":"biquadFiltersUpdate","description":"Executed when biquad filters is updated.","version":"1.0.0"},{"name":"channelPopulate","description":"Executed when a voice channel is populated.","version":"1.0.0"},{"name":"connection","description":"Executed when a connection is created.","version":"1.0.0"},{"name":"connectionDestroyed","description":"Executed when a connection is destroyed.","version":"1.0.0"},{"name":"debug","description":"Executed when the queue sends a debug info.","version":"1.0.0"},{"name":"disconnect","description":"Executed when the bot is disconnected from the channel.","version":"1.0.0"},{"name":"dspUpdate","description":"Executed when dsp filters are updated.","version":"1.0.0"},{"name":"emptyChannel","description":"Executed when the voice channel is empty.","version":"1.0.0"},{"name":"emptyQueue","description":"Executed when the queue is empty.","version":"1.0.0"},{"name":"equalizerUpdate","description":"Executed when equalizer config is updated.","version":"1.0.0"},{"name":"error","description":"Executed when the queue encounters error.","version":"1.0.0"},{"name":"playerError","description":"Executed when the audio player errors while streaming audio track.","version":"1.0.0"},{"name":"playerFinish","description":"Executed when the audio player finishes streaming audio track.","version":"1.0.0"},{"name":"playerPause","description":"Executed when audio player is paused.","version":"1.0.0"},{"name":"playerResume","description":"Executed when audio player is resumed.","version":"1.0.0"},{"name":"playerSkip","description":"Executed when the audio player skips current track.","version":"1.0.0"},{"name":"playerStart","description":"Executed when the audio player starts streaming audio track.","version":"1.0.0"},{"name":"playerTrigger","description":"Executed when the audio player is triggered.","version":"1.0.0"},{"name":"queueCreate","description":"Executed when a queue is successfully created.","version":"1.0.0"},{"name":"queueDelete","description":"Executed when a queue is successfully deleted.","version":"1.0.0"},{"name":"volumeChange","description":"Executed when audio player's volume is changed.","version":"1.0.0"}]
\ No newline at end of file
+[{"name":"audioFiltersUpdate","description":"Executed when FFMPEG audio filters are updated.","version":"1.0.1"},{"name":"audioTrackAdd","description":"Executed when audio track is added to the queue.","version":"1.0.1"},{"name":"audioTrackRemove","description":"Executed when audio track is removed from the queue.","version":"1.0.1"},{"name":"audioTracksAdd","description":"Executed when multiple audio track are added to the queue.","version":"1.0.1"},{"name":"biquadFiltersUpdate","description":"Executed when biquad filters is updated.","version":"1.0.1"},{"name":"channelPopulate","description":"Executed when a voice channel is populated.","version":"1.0.1"},{"name":"connection","description":"Executed when a connection is created.","version":"1.0.1"},{"name":"connectionDestroyed","description":"Executed when a connection is destroyed.","version":"1.0.1"},{"name":"debug","description":"Executed when the queue sends a debug info.","version":"1.0.1"},{"name":"disconnect","description":"Executed when the bot is disconnected from the channel.","version":"1.0.1"},{"name":"dspUpdate","description":"Executed when dsp filters are updated.","version":"1.0.1"},{"name":"emptyChannel","description":"Executed when the voice channel is empty.","version":"1.0.1"},{"name":"emptyQueue","description":"Executed when the queue is empty.","version":"1.0.1"},{"name":"equalizerUpdate","description":"Executed when equalizer config is updated.","version":"1.0.1"},{"name":"error","description":"Executed when the queue encounters error.","version":"1.0.1"},{"name":"playerError","description":"Executed when the audio player errors while streaming audio track.","version":"1.0.1"},{"name":"playerFinish","description":"Executed when the audio player finishes streaming audio track.","version":"1.0.1"},{"name":"playerPause","description":"Executed when audio player is paused.","version":"1.0.1"},{"name":"playerResume","description":"Executed when audio player is resumed.","version":"1.0.1"},{"name":"playerSkip","description":"Executed when the audio player skips current track.","version":"1.0.1"},{"name":"playerStart","description":"Executed when the audio player starts streaming audio track.","version":"1.0.1"},{"name":"playerTrigger","description":"Executed when the audio player is triggered.","version":"1.0.1"},{"name":"queueCreate","description":"Executed when a queue is successfully created.","version":"1.0.1"},{"name":"queueDelete","description":"Executed when a queue is successfully deleted.","version":"1.0.1"},{"name":"volumeChange","description":"Executed when audio player's volume is changed.","version":"1.0.1"}]
\ No newline at end of file
diff --git a/metadata/functions.json b/metadata/functions.json
index b24f0f8..8313293 100644
--- a/metadata/functions.json
+++ b/metadata/functions.json
@@ -1 +1 @@
-[{"name":"$clearQueue","version":"1.0.0","description":"Clear the guild queue.","unwrap":false},{"name":"$clearQueueHistory","version":"1.0.0","description":"Clear the queue history.","unwrap":false},{"name":"$currentTrackTotalDuration","version":"1.0.0","description":"Returns the total duration of the current audio track.","unwrap":false,"output":["Number"]},{"name":"$deleteQueue","version":"1.0.0","description":"Deletes the queue of the current guild.","unwrap":false,"output":["Unknown"]},{"name":"$disableAllFilters","version":"1.0.0","description":"Disable the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be disabled.","rest":true,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$enableAllFilters","version":"1.0.0","description":"Enable the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be enabled.","rest":true,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$getAvailableProviders","version":"1.0.0","description":"Get the available audio providers.","unwrap":false,"output":["String"]},{"name":"$getDisabledFilters","version":"1.0.0","description":"Return the disabled FFMPEG filters.","unwrap":false,"output":["String"]},{"name":"$getEnabledFilters","version":"1.0.0","description":"Return the enabled FFMPEG filters.","unwrap":false,"output":["String"]},{"name":"$getLoopMode","version":"1.0.0","description":"Returns the state of the loop mode.","unwrap":false,"output":["QueueRepeatMode"]},{"name":"$getVolume","version":"1.0.0","description":"Get the current volume of the music player.","unwrap":false,"output":["Number"]},{"name":"$hasMusicNode","version":"1.0.0","description":"Check whether the current guild has a music node created.","unwrap":false,"output":["Boolean"]},{"name":"$isFilterEnabled","version":"1.0.0","description":"Check whether the provided filter is enabled.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be toggled.","rest":false,"required":true,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}],"output":["Boolean"]},{"name":"$isPaused","version":"1.0.0","description":"Check whether the music player is paused.","unwrap":false,"output":["Boolean"]},{"name":"$isPlaying","version":"1.0.0","description":"Check whether the music player is playing a track.","unwrap":false,"output":["Boolean"]},{"name":"$isQueueHistoryDisabled","version":"1.0.0","description":"Returns whether the queue history is disabled.","unwrap":false,"output":["Boolean"]},{"name":"$isQueueHistoryEmpty","version":"1.0.0","description":"Returns whether the queue history is empty.","unwrap":false,"output":["Boolean"]},{"name":"$leaveVoiceChannel","version":"1.0.0","description":"Destroys the current voice connection.","unwrap":false},{"name":"$moveTrack","version":"1.0.0","description":"Moves the track to a new position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be moved.","rest":false,"required":true,"type":"Number"},{"name":"New Position","description":"The new position of the track.","rest":false,"required":true,"type":"Number"}]},{"name":"$pauseTrack","version":"1.0.0","description":"Pauses the current track.","unwrap":false,"output":["Boolean"]},{"name":"$playerElapsedTime","version":"1.0.0","description":"Returns the elapsed time of the current song in milliseconds.","unwrap":false,"output":["Number"]},{"name":"$playNext","version":"1.0.0","description":"Play the next track in the queue, if any.","unwrap":false,"output":["Unknown"]},{"name":"$playPrevious","version":"1.0.0","description":"Play the previous track in the queue history, if any.","unwrap":false,"output":["Unknown"]},{"name":"$playTrack","version":"1.0.0","description":"Play a track by query.","brackets":true,"unwrap":true,"args":[{"name":"Channel ID","description":"Voice channel ID to play the track on.","type":"Channel","required":true,"rest":false},{"name":"Query","description":"Track name to be searched.","rest":false,"required":true,"type":"String"},{"name":"Engine","description":"The query search engine, can be extractor name to target an specific one. (custom)","rest":false,"type":"String"},{"name":"Fallback Engine","description":"Fallback search engine to use.","rest":false,"type":"Enum","enum":["AUTO","YOUTUBE","YOUTUBE_PLAYLIST","SOUNDCLOUD_TRACK","SOUNDCLOUD_PLAYLIST","SOUNDCLOUD","SPOTIFY_SONG","SPOTIFY_ALBUM","SPOTIFY_PLAYLIST","SPOTIFY_SEARCH","FACEBOOK","VIMEO","ARBITRARY","REVERBNATION","YOUTUBE_SEARCH","YOUTUBE_VIDEO","SOUNDCLOUD_SEARCH","APPLE_MUSIC_SONG","APPLE_MUSIC_ALBUM","APPLE_MUSIC_PLAYLIST","APPLE_MUSIC_SEARCH","FILE","AUTO_SEARCH","DISCORD_PLAYER_BLOB"],"enumName":"QueryType"},{"name":"Block Extractors","description":"List of extractors to block.","type":"String","required":false,"rest":true}]},{"name":"$queue","description":"Returns queue songs resolving the given text placeholders.","version":"1.0.0","brackets":false,"unwrap":true,"args":[{"name":"Start Index","description":"The queue song start index.","rest":false,"type":"Number"},{"name":"Limit","description":"The amount of queue songs to be retrieved.","rest":false,"type":"Number"},{"name":"Text","description":"The text to be resolved.","rest":false,"type":"String"},{"name":"Separator","description":"The separator for each result.","rest":false,"type":"String"}],"output":["String"]},{"name":"$queueEstimatedDuration","version":"1.0.0","description":"Returns the estimated duration of the current guild queue in milliseconds.","unwrap":false,"output":["Number"]},{"name":"$queueHistory","description":"Returns queue history songs resolving the given text placeholders.","version":"1.0.0","brackets":false,"unwrap":true,"args":[{"name":"Start Index","description":"The queue song start index.","rest":false,"type":"Number"},{"name":"Limit","description":"The amount of queue history songs to be retrieved.","rest":false,"type":"Number"},{"name":"Text","description":"The text to be resolved.","rest":false,"type":"String"},{"name":"Separator","description":"The separator for each result.","rest":false,"type":"String"}],"output":["String"]},{"name":"$queueHistoryLength","version":"1.0.0","description":"Returns the length of the tracks that were played.","unwrap":false,"output":["Number"]},{"name":"$queueLength","version":"1.0.0","description":"Returns the length of the current guild queue.","unwrap":false,"output":["Number"]},{"name":"$queuePing","version":"1.0.0","description":"Returns the latency of the current guild queue.","unwrap":false,"output":["Number"]},{"name":"$removeTrack","version":"1.0.0","description":"Removes the track that is located at the given position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be removed.","rest":false,"required":true,"type":"Number"}],"output":["Boolean"]},{"name":"$resumeTrack","version":"1.0.0","description":"Resumes the current paused track.","unwrap":false,"output":["Boolean"]},{"name":"$searchTrack","version":"1.0.0","description":"Search for a track using the given query.","brackets":true,"unwrap":true,"args":[{"name":"Query","description":"The query to search for.","rest":false,"required":true,"type":"String"},{"name":"Text Result","description":"The formatted text result to return.","rest":false,"required":true,"type":"String"},{"name":"Separator","description":"The result separator.","rest":false,"type":"String"},{"name":"Engine","description":"The query search engine, can be extractor name to target an specific one. (custom)","rest":false,"type":"String"},{"name":"Fallback Engine","description":"Fallback search engine to use.","rest":false,"type":"Enum","enum":["AUTO","YOUTUBE","YOUTUBE_PLAYLIST","SOUNDCLOUD_TRACK","SOUNDCLOUD_PLAYLIST","SOUNDCLOUD","SPOTIFY_SONG","SPOTIFY_ALBUM","SPOTIFY_PLAYLIST","SPOTIFY_SEARCH","FACEBOOK","VIMEO","ARBITRARY","REVERBNATION","YOUTUBE_SEARCH","YOUTUBE_VIDEO","SOUNDCLOUD_SEARCH","APPLE_MUSIC_SONG","APPLE_MUSIC_ALBUM","APPLE_MUSIC_PLAYLIST","APPLE_MUSIC_SEARCH","FILE","AUTO_SEARCH","DISCORD_PLAYER_BLOB"],"enumName":"QueryType"},{"name":"Limit","description":"The maximum number of results to return.","rest":false,"type":"Number"},{"name":"Add To Player","description":"Whether add the results to the music player.","rest":false,"type":"Boolean"},{"name":"Block Extractors","description":"List of extractors to block.","type":"String","required":false,"rest":true}]},{"name":"$seekTrack","version":"1.0.0","description":"Seeks a track.","brackets":true,"unwrap":true,"args":[{"name":"Duration","description":"Seek duration to be applied.","rest":false,"required":true,"type":"Time"}],"output":["Boolean"]},{"name":"$setLoopMode","version":"1.0.0","description":"Set the loop mode of the music player.","brackets":true,"unwrap":true,"args":[{"name":"Mode","description":"The loop mode of the music player.","rest":false,"required":true,"type":"String"}]},{"name":"$setVolume","version":"1.0.0","description":"Set the volume of the music player.","brackets":true,"unwrap":true,"args":[{"name":"Amount","description":"The volume amount to be applied.","rest":false,"required":true,"type":"Number"}]},{"name":"$shuffleQueue","version":"1.0.0","description":"Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.","unwrap":false,"output":["Boolean"]},{"name":"$shuffleTracks","version":"1.0.0","description":"Shuffle the current guild queue.","unwrap":false},{"name":"$skipTo","version":"1.0.0","description":"Skip the current track to the given position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be played.","rest":false,"required":true,"type":"Number"}],"output":["Boolean"]},{"name":"$skipTrack","version":"1.0.0","description":"Skip the current track.","unwrap":false,"output":["Boolean"]},{"name":"$stopTrack","version":"1.0.0","description":"Forces to stop the current track.","unwrap":false,"output":["Boolean"]},{"name":"$toggleFilters","version":"1.0.0","description":"Toggle the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be toggled.","rest":true,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$trackInfo","version":"1.0.0","description":"Returns information of the current track.","brackets":true,"unwrap":true,"args":[{"name":"Properties","description":"The track properties to be accesed.","rest":true,"required":true,"type":"String"}],"output":["String"]},{"name":"$unshuffleQueue","version":"1.0.0","description":"Disable shuffle mode for the queue.","unwrap":false,"output":["Boolean"]}]
\ No newline at end of file
+[{"name":"$clearQueue","version":"1.0.0","description":"Clear the guild queue.","unwrap":false},{"name":"$clearQueueHistory","version":"1.0.0","description":"Clear the queue history.","unwrap":false},{"name":"$currentTrackTotalDuration","version":"1.0.0","description":"Returns the total duration of the current audio track.","unwrap":false,"output":["Number"]},{"name":"$deleteQueue","version":"1.0.0","description":"Deletes the queue of the current guild.","unwrap":false,"output":["Unknown"]},{"name":"$disableAllFilters","version":"1.0.0","description":"Disable the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be disabled.","rest":true,"required":false,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$enableAllFilters","version":"1.0.0","description":"Enable the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be enabled.","rest":true,"required":false,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$findExtractor","version":"1.0.0","description":"Find an extractor by name.","brackets":true,"unwrap":true,"args":[{"name":"Name","description":"The name of the extractor to find.","rest":false,"required":true,"type":"String"}]},{"name":"$getAvailableProviders","version":"1.0.0","description":"Get the available audio providers.","unwrap":false,"output":["String"]},{"name":"$getDisabledFilters","version":"1.0.0","description":"Return the disabled FFMPEG filters.","unwrap":false,"output":["String"]},{"name":"$getEnabledFilters","version":"1.0.0","description":"Return the enabled FFMPEG filters.","unwrap":false,"output":["String"]},{"name":"$getLoopMode","version":"1.0.0","description":"Returns the state of the loop mode.","unwrap":false,"output":["QueueRepeatMode"]},{"name":"$getVolume","version":"1.0.0","description":"Get the current volume of the music player.","unwrap":false,"output":["Number"]},{"name":"$hasMusicNode","version":"1.0.0","description":"Check whether the current guild has a music node created.","unwrap":false,"output":["Boolean"]},{"name":"$isFilterEnabled","version":"1.0.0","description":"Check whether the provided filter is enabled.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be toggled.","rest":false,"required":true,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}],"output":["Boolean"]},{"name":"$isPaused","version":"1.0.0","description":"Check whether the music player is paused.","unwrap":false,"output":["Boolean"]},{"name":"$isPlaying","version":"1.0.0","description":"Check whether the music player is playing a track.","unwrap":false,"output":["Boolean"]},{"name":"$isQueueHistoryDisabled","version":"1.0.0","description":"Returns whether the queue history is disabled.","unwrap":false,"output":["Boolean"]},{"name":"$isQueueHistoryEmpty","version":"1.0.0","description":"Returns whether the queue history is empty.","unwrap":false,"output":["Boolean"]},{"name":"$leaveVoiceChannel","version":"1.0.0","description":"Destroys the current voice connection.","unwrap":false},{"name":"$moveTrack","version":"1.0.0","description":"Moves the track to a new position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be moved.","rest":false,"required":true,"type":"Number"},{"name":"New Position","description":"The new position of the track.","rest":false,"required":true,"type":"Number"}]},{"name":"$pauseTrack","version":"1.0.0","description":"Pauses the current track.","unwrap":false,"output":["Boolean"]},{"name":"$playerElapsedTime","version":"1.0.0","description":"Returns the elapsed time of the current song in milliseconds.","unwrap":false,"output":["Number"]},{"name":"$playNext","version":"1.0.0","description":"Play the next track in the queue, if any.","unwrap":false,"output":["Unknown"]},{"name":"$playPrevious","version":"1.0.0","description":"Play the previous track in the queue history, if any.","unwrap":false,"output":["Unknown"]},{"name":"$playTrack","version":"1.0.0","description":"Play a track by query.","brackets":true,"unwrap":true,"args":[{"name":"Channel ID","description":"Voice channel ID to play the track on.","type":"Channel","required":true,"rest":false},{"name":"Query","description":"Track name to be searched.","rest":false,"required":true,"type":"String"},{"name":"Engine","description":"The query search engine, can be extractor name to target an specific one. (custom)","rest":false,"type":"String"},{"name":"Fallback Engine","description":"Fallback search engine to use.","rest":false,"type":"Enum","enum":["AUTO","YOUTUBE","YOUTUBE_PLAYLIST","SOUNDCLOUD_TRACK","SOUNDCLOUD_PLAYLIST","SOUNDCLOUD","SPOTIFY_SONG","SPOTIFY_ALBUM","SPOTIFY_PLAYLIST","SPOTIFY_SEARCH","FACEBOOK","VIMEO","ARBITRARY","REVERBNATION","YOUTUBE_SEARCH","YOUTUBE_VIDEO","SOUNDCLOUD_SEARCH","APPLE_MUSIC_SONG","APPLE_MUSIC_ALBUM","APPLE_MUSIC_PLAYLIST","APPLE_MUSIC_SEARCH","FILE","AUTO_SEARCH","DISCORD_PLAYER_BLOB"],"enumName":"QueryType"},{"name":"Block Extractors","description":"List of extractors to block.","type":"String","required":false,"rest":true}]},{"name":"$queue","description":"Returns queue songs resolving the given text placeholders.","version":"1.0.0","brackets":false,"unwrap":true,"args":[{"name":"Start Index","description":"The queue song start index.","rest":false,"type":"Number"},{"name":"Limit","description":"The amount of queue songs to be retrieved.","rest":false,"type":"Number"},{"name":"Text","description":"The text to be resolved.","rest":false,"type":"String"},{"name":"Separator","description":"The separator for each result.","rest":false,"type":"String"}],"output":["String"]},{"name":"$queueEstimatedDuration","version":"1.0.0","description":"Returns the estimated duration of the current guild queue in milliseconds.","unwrap":false,"output":["Number"]},{"name":"$queueHistory","description":"Returns queue history songs resolving the given text placeholders.","version":"1.0.0","brackets":false,"unwrap":true,"args":[{"name":"Start Index","description":"The queue song start index.","rest":false,"type":"Number"},{"name":"Limit","description":"The amount of queue history songs to be retrieved.","rest":false,"type":"Number"},{"name":"Text","description":"The text to be resolved.","rest":false,"type":"String"},{"name":"Separator","description":"The separator for each result.","rest":false,"type":"String"}],"output":["String"]},{"name":"$queueHistoryLength","version":"1.0.0","description":"Returns the length of the tracks that were played.","unwrap":false,"output":["Number"]},{"name":"$queueLength","version":"1.0.0","description":"Returns the length of the current guild queue.","unwrap":false,"output":["Number"]},{"name":"$queuePing","version":"1.0.0","description":"Returns the latency of the current guild queue.","unwrap":false,"output":["Number"]},{"name":"$removeTrack","version":"1.0.0","description":"Removes the track that is located at the given position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be removed.","rest":false,"required":true,"type":"Number"}],"output":["Boolean"]},{"name":"$resumeTrack","version":"1.0.0","description":"Resumes the current paused track.","unwrap":false,"output":["Boolean"]},{"name":"$searchTrack","version":"1.0.0","description":"Search for a track using the given query.","brackets":true,"unwrap":true,"args":[{"name":"Query","description":"The query to search for.","rest":false,"required":true,"type":"String"},{"name":"Text Result","description":"The formatted text result to return.","rest":false,"required":true,"type":"String"},{"name":"Separator","description":"The result separator.","rest":false,"type":"String"},{"name":"Engine","description":"The query search engine, can be extractor name to target an specific one. (custom)","rest":false,"type":"String"},{"name":"Fallback Engine","description":"Fallback search engine to use.","rest":false,"type":"Enum","enum":["AUTO","YOUTUBE","YOUTUBE_PLAYLIST","SOUNDCLOUD_TRACK","SOUNDCLOUD_PLAYLIST","SOUNDCLOUD","SPOTIFY_SONG","SPOTIFY_ALBUM","SPOTIFY_PLAYLIST","SPOTIFY_SEARCH","FACEBOOK","VIMEO","ARBITRARY","REVERBNATION","YOUTUBE_SEARCH","YOUTUBE_VIDEO","SOUNDCLOUD_SEARCH","APPLE_MUSIC_SONG","APPLE_MUSIC_ALBUM","APPLE_MUSIC_PLAYLIST","APPLE_MUSIC_SEARCH","FILE","AUTO_SEARCH","DISCORD_PLAYER_BLOB"],"enumName":"QueryType"},{"name":"Limit","description":"The maximum number of results to return.","rest":false,"type":"Number"},{"name":"Add To Player","description":"Whether add the results to the music player.","rest":false,"type":"Boolean"},{"name":"Block Extractors","description":"List of extractors to block.","type":"String","required":false,"rest":true}]},{"name":"$seekTrack","version":"1.0.0","description":"Seeks a track.","brackets":true,"unwrap":true,"args":[{"name":"Duration","description":"Seek duration to be applied.","rest":false,"required":true,"type":"Time"}],"output":["Boolean"]},{"name":"$setLoopMode","version":"1.0.0","description":"Set the loop mode of the music player.","brackets":true,"unwrap":true,"args":[{"name":"Mode","description":"The loop mode of the music player.","rest":false,"required":true,"type":"String"}]},{"name":"$setVolume","version":"1.0.0","description":"Set the volume of the music player.","brackets":true,"unwrap":true,"args":[{"name":"Amount","description":"The volume amount to be applied.","rest":false,"required":true,"type":"Number"}]},{"name":"$shuffleQueue","version":"1.0.0","description":"Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.","unwrap":false,"output":["Boolean"]},{"name":"$shuffleTracks","version":"1.0.0","description":"Shuffle the current guild queue.","unwrap":false},{"name":"$skipTo","version":"1.0.0","description":"Skip the current track to the given position.","brackets":true,"unwrap":true,"args":[{"name":"Position","description":"The track position to be played.","rest":false,"required":true,"type":"Number"}],"output":["Boolean"]},{"name":"$skipTrack","version":"1.0.0","description":"Skip the current track.","unwrap":false,"output":["Boolean"]},{"name":"$stopTrack","version":"1.0.0","description":"Forces to stop the current track.","unwrap":false,"output":["Boolean"]},{"name":"$toggleFilters","version":"1.0.0","description":"Toggle the provided FFMPEG filters.","brackets":true,"unwrap":true,"args":[{"name":"Filters","description":"Filter names to be toggled.","rest":true,"required":false,"type":"Enum","enum":["Bassboost_low","Bassboost","Bassboost_high","8d","Vaporwave","Nightcore","Lofi","Phaser","Tremolo","Vibrato","Reverse","Treble","Normalizer2","Normalizer","Surrounding","Pulsator","Subboost","Karaoke","Flanger","Gate","Haas","Mcompand","Mono","Mstlr","Mstrr","Compressor","Expander","Softlimiter","Chorus","Chorus2d","Chorus3d","Fadein","Dim","Earrape","Silenceremove"],"enumName":"FFMPEGFilters"}]},{"name":"$trackInfo","version":"1.0.0","description":"Returns information of the current track.","brackets":true,"unwrap":true,"args":[{"name":"Properties","description":"The track properties to be accesed.","rest":true,"required":false,"type":"String"}],"output":["String"]},{"name":"$unshuffleQueue","version":"1.0.0","description":"Disable shuffle mode for the queue.","unwrap":false,"output":["Boolean"]}]
\ No newline at end of file
diff --git a/metadata/paths.json b/metadata/paths.json
new file mode 100644
index 0000000..67dcef0
--- /dev/null
+++ b/metadata/paths.json
@@ -0,0 +1 @@
+{"functions":"src/natives","events":"src/events"}
\ No newline at end of file
diff --git a/package.json b/package.json
index 760d3b8..aac420b 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,13 @@
{
"name": "@tryforge/forge.music",
- "version": "1.0.0",
+ "version": "1.0.1",
"description": "Extension to add music functionality to your ForgeScript bot.",
"main": "./dist/index.js",
"types": "./types/index.d.ts",
"scripts": {
- "build": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json && node ./dist/docgen.js",
- "test": "node ./__test__"
+ "build": "tsc -p tsconfig.json && tsc-alias -p tsconfig.json && node ./dist/docgen.js && bun run prettier",
+ "test": "node ./__test__",
+ "prettier": "prettier ./src/ --write"
},
"keywords": [
"forgescript",
@@ -16,20 +17,26 @@
"bdfd-music"
],
"author": "BotForge",
- "packageManager": "pnpm@9.15.2",
+ "packageManager": "bun@1.3.9",
"license": "GPL-3.0",
"devDependencies": {
- "@tryforge/forgescript": "github:tryforge/ForgeScript#dev",
+ "@tryforge/forgescript": "^2.6.0",
"ascii-table3": "^0.9.0",
- "discord-player-youtubei": "^1.4.1",
- "discord.js": "^14.17.3",
- "dotenv": "^16.4.7",
- "tsc-alias": "^1.8.10",
- "typescript": "^5.7.3"
+ "discord-player-deezer": "^2.6.0",
+ "discord-player-soundcloud": "^1.0.7",
+ "discord-player-spotify": "^1.1.9",
+ "discord-player-youtubei": "^2.0.0-dev.2",
+ "discord.js": "^14.25.1",
+ "dotenv": "^16.6.1",
+ "googlevideo": "^4.0.4",
+ "prettier": "3.5.1",
+ "tsc-alias": "^1.8.16",
+ "typescript": "^5.9.3"
},
"dependencies": {
- "@discord-player/extractor": "^7.1.0",
- "discord-player": "^7.1.0"
+ "@discord-player/extractor": "^7.2.0",
+ "@snazzah/davey": "^0.1.10",
+ "discord-player": "^7.2.0"
},
"pnpm": {
"peerDependencyRules": {
@@ -37,5 +44,16 @@
"@discord-player/extractor": "7"
}
}
- }
-}
+ },
+ "homepage": "https://docs.botforge.org/?p=ForgeMusic",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/tryforge/ForgeMusic.git"
+ },
+ "bugs": {
+ "url": "https://github.com/tryforge/ForgeMusic/issues"
+ },
+ "trustedDependencies": [
+ "youtube-dl-exec"
+ ]
+}
\ No newline at end of file
diff --git a/src/classes/handlers/MusicEventHandler.ts b/src/classes/handlers/MusicEventHandler.ts
index 7980aeb..5c5b7b5 100644
--- a/src/classes/handlers/MusicEventHandler.ts
+++ b/src/classes/handlers/MusicEventHandler.ts
@@ -1,7 +1,7 @@
-import { BaseEventHandler, ForgeClient } from "@tryforge/forgescript"
-import { GuildQueueEvent, GuildQueueEvents } from "discord-player"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildTextBasedChannel } from "discord.js"
+import { BaseEventHandler, ForgeClient } from '@tryforge/forgescript'
+import { GuildQueueEvent, GuildQueueEvents } from 'discord-player'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildTextBasedChannel } from 'discord.js'
/**
* Fix the typings for the music event handler.
@@ -13,13 +13,21 @@ export type TypedGuildQueueEvents = {
/**
* The generic music event handler.
*/
-export class MusicEventHandler extends BaseEventHandler {
+export class MusicEventHandler<
+ Events extends TypedGuildQueueEvents = TypedGuildQueueEvents,
+ Names extends keyof Events = keyof Events,
+> extends BaseEventHandler {
/**
* Register this event.
* @param client - ForgeClient instance.
*/
public register(client: ForgeClient) {
- client.getExtension(ForgeMusic).player.events.on(this.name as keyof GuildQueueEvents, this.listener.bind(client))
+ client
+ .getExtension(ForgeMusic)
+ .player.events.on(
+ this.name as keyof GuildQueueEvents,
+ this.listener.bind(client)
+ )
}
}
@@ -32,4 +40,4 @@ export interface AdditionalMeta {
* The text channel where the command was called.
*/
text: GuildTextBasedChannel
-}
\ No newline at end of file
+}
diff --git a/src/classes/managers/MusicCommandManager.ts b/src/classes/managers/MusicCommandManager.ts
index a4630d6..95a9b0f 100644
--- a/src/classes/managers/MusicCommandManager.ts
+++ b/src/classes/managers/MusicCommandManager.ts
@@ -1,14 +1,14 @@
-import { BaseCommandManager } from "@tryforge/forgescript"
-import { GuildQueueEvent } from "discord-player"
+import { BaseCommandManager } from '@tryforge/forgescript'
+import { GuildQueueEvent } from 'discord-player'
/**
* Common music handler name.
*/
-export const handlerName = "ForgeMusic"
+export const handlerName = 'ForgeMusic'
/**
* The music command manager.
*/
export class MusicCommandManager extends BaseCommandManager<`${GuildQueueEvent}`> {
handlerName = handlerName
-}
\ No newline at end of file
+}
diff --git a/src/classes/structures/ForgeMusic.ts b/src/classes/structures/ForgeMusic.ts
index decc22a..14dd9e4 100644
--- a/src/classes/structures/ForgeMusic.ts
+++ b/src/classes/structures/ForgeMusic.ts
@@ -1,8 +1,19 @@
-import { type BaseExtractor, GuildNodeCreateOptions, GuildQueueEvent, Player, type PlayerInitOptions } from "discord-player"
-import { EventManager, ForgeClient, ForgeExtension, Logger } from "@tryforge/forgescript"
-import { MusicCommandManager, handlerName } from "@managers/MusicCommandManager"
-import { type GatewayIntentsString } from "discord.js"
-import { getVersion } from "@utils/getVersion"
+import {
+ type BaseExtractor,
+ GuildNodeCreateOptions,
+ GuildQueueEvent,
+ Player,
+ type PlayerInitOptions,
+} from 'discord-player'
+import {
+ EventManager,
+ ForgeClient,
+ ForgeExtension,
+ Logger,
+} from '@tryforge/forgescript'
+import { MusicCommandManager, handlerName } from '@managers/MusicCommandManager'
+import { type GatewayIntentsString } from 'discord.js'
+import { getVersion } from '@utils/getVersion'
/**
* Constructor options of the music extension.
@@ -11,7 +22,7 @@ interface ForgeMusicInitOptions extends PlayerInitOptions {
/**
* Options that are used when a guild node is created.
*/
- connectOptions?: Omit, "metadata">
+ connectOptions?: Omit, 'metadata'>
/**
* Array of event names the extension must listen to.
*/
@@ -19,16 +30,21 @@ interface ForgeMusicInitOptions extends PlayerInitOptions {
/**
* Predicate to load certain extractors.
*/
- includeExtractors?: typeof BaseExtractor[]
+ includeExtractors?: (typeof BaseExtractor)[]
}
+type TupleEngineOption> = [
+ T,
+ ConstructorParameters['1'],
+]
+
/**
* The entrypoint of the forge music system.
*/
export class ForgeMusic extends ForgeExtension {
/** Cock my beloved. <3 */
- public name = "ForgeMusic"
- public description = "A standard music library tailored for ForgeScript."
+ public name = 'ForgeMusic'
+ public description = 'A standard music library tailored for ForgeScript.'
public version = getVersion()
/**
@@ -42,7 +58,7 @@ export class ForgeMusic extends ForgeExtension {
/**
* The required intents for this extension to work.
*/
- private requiredIntents: GatewayIntentsString[] = ["GuildVoiceStates"]
+ private requiredIntents: GatewayIntentsString[] = ['GuildVoiceStates']
/**
* Creates an instance of the music extension.
@@ -51,11 +67,38 @@ export class ForgeMusic extends ForgeExtension {
public constructor(private options?: ForgeMusicInitOptions) {
super()
if (this.#hasInvalidEvents()) {
- Logger.error("ForgeMusic found that you are using some of the following events:\n- VoiceStateUpdate\n- WillAutoPlay\n- WillPlayTrack\nthat aren't supported.")
+ Logger.error(
+ "ForgeMusic found that you are using some of the following events:\n- VoiceStateUpdate\n- WillAutoPlay\n- WillPlayTrack\nthat aren't supported."
+ )
process.exit()
}
}
+ /**
+ * Add multiple extractors into the player.
+ * @param engines - Extractor engines to add.
+ */
+ public addEngines>(
+ engines: TupleEngineOption[]
+ ) {
+ const extractors = engines.map((engine) => engine[0])
+ const extractorOptions: Record = {}
+
+ let i = 0
+ for (const engine of engines) {
+ const id = engine[0].identifier
+ const options = engine[1]
+
+ if (options) {
+ extractorOptions[id] = options
+ }
+
+ i++
+ }
+
+ this.player.extractors.loadMulti(extractors, extractorOptions)
+ }
+
/**
* Starts the music extension.
* @param client - The discord client instance.
@@ -64,7 +107,9 @@ export class ForgeMusic extends ForgeExtension {
public init(client: ForgeClient) {
// Checking if client has the required intents.
if (!client.options.intents.has(this.requiredIntents[0])) {
- Logger.warn(`${this.name} requires the following intents to work: \"${this.requiredIntents[0]}\"`)
+ Logger.warn(
+ `${this.name} requires the following intents to work: \"${this.requiredIntents[0]}\"`
+ )
}
// Create a main player instance.
@@ -83,9 +128,14 @@ export class ForgeMusic extends ForgeExtension {
// Loading the extractors.
if (this.options.includeExtractors) {
- this.player.extractors.loadMulti(this.options.includeExtractors)
- .then(() => Logger.info("Extractors loaded successfully!"))
- .catch((e) => Logger.error("Unable to load the extractors; with reason: " + e))
+ this.player.extractors
+ .loadMulti(this.options.includeExtractors)
+ .then(() => Logger.info('Extractors loaded successfully!'))
+ .catch((e) =>
+ Logger.error(
+ 'Unable to load the extractors; with reason: ' + e
+ )
+ )
}
}
@@ -93,14 +143,14 @@ export class ForgeMusic extends ForgeExtension {
* Returns the events location.
*/
public get eventsLocation() {
- return __dirname.replace(/classes(\\|\/)structures/, "events")
+ return __dirname.replace(/classes(\\|\/)structures/, 'events')
}
/**
* Returns the native functions location.
*/
public get nativesLocation() {
- return __dirname.replace(/classes(\\|\/)structures/, "natives")
+ return __dirname.replace(/classes(\\|\/)structures/, 'natives')
}
/**
@@ -115,7 +165,11 @@ export class ForgeMusic extends ForgeExtension {
* @returns {boolean}
*/
#hasInvalidEvents() {
- return this.options && this.options.events && this.options.events.some(this.#invalidEventPredicate)
+ return (
+ this.options &&
+ this.options.events &&
+ this.options.events.some(this.#invalidEventPredicate)
+ )
}
/**
@@ -124,6 +178,10 @@ export class ForgeMusic extends ForgeExtension {
* @returns {boolean}
*/
#invalidEventPredicate(event: GuildQueueEvent) {
- return event === GuildQueueEvent.VoiceStateUpdate || event === GuildQueueEvent.WillAutoPlay || event === GuildQueueEvent.WillPlayTrack
+ return (
+ event === GuildQueueEvent.VoiceStateUpdate ||
+ event === GuildQueueEvent.WillAutoPlay ||
+ event === GuildQueueEvent.WillPlayTrack
+ )
}
-}
\ No newline at end of file
+}
diff --git a/src/docgen.ts b/src/docgen.ts
index 90319f1..cc4efc1 100644
--- a/src/docgen.ts
+++ b/src/docgen.ts
@@ -1,56 +1,65 @@
-import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
-import { generateMetadata, Logger } from "@tryforge/forgescript"
-import { handlerName } from "@managers/MusicCommandManager"
-import { AsciiTable3 } from "ascii-table3"
-import { join } from "path"
+import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'
+import { generateMetadata, Logger } from '@tryforge/forgescript'
+import { handlerName } from '@managers/MusicCommandManager'
+import { AsciiTable3 } from 'ascii-table3'
+import { join } from 'path'
generateMetadata(
- join(__dirname, "natives"),
- "natives",
+ join(__dirname, 'natives'),
+ 'natives',
handlerName,
true,
void 0,
- join(__dirname, "events")
+ join(__dirname, 'events')
)
-.then(() => Logger.info("Documentation generation done"))
-.catch((e) => Logger.error(e));
+ .then(() => Logger.info('Documentation generation done'))
+ .catch((e) => Logger.error(e))
function toCamelCase(text: string): string {
- return text.split(' ').map(
- (part, i) => i === 0
- ? part.toLowerCase()
- : `${part[0].toUpperCase()}${part.slice(1)}`
- ).join("")
+ return text
+ .split(' ')
+ .map((part, i) =>
+ i === 0
+ ? part.toLowerCase()
+ : `${part[0].toUpperCase()}${part.slice(1)}`
+ )
+ .join('')
}
/**
* Generates markdown documentation for every function in the library.
*/
function generateFunctionDocs() {
- const dataPath = join(process.cwd(), "metadata", "functions.json")
- const data = JSON.parse(readFileSync(dataPath, "utf-8"))
+ const dataPath = join(process.cwd(), 'metadata', 'functions.json')
+ const data = JSON.parse(readFileSync(dataPath, 'utf-8'))
- if (!existsSync(join(process.cwd(), "docs"))) {
- mkdirSync(join(process.cwd(), "docs"))
+ if (!existsSync(join(process.cwd(), 'docs'))) {
+ mkdirSync(join(process.cwd(), 'docs'))
}
for (const func of data) {
- Logger.info("Parsing", func.name)
+ Logger.info('Parsing', func.name)
let content = [
`# ${func.name}`,
func.description,
'## Usage',
- `\`\`\`\n${func.name}${!!func.args ? ('[' + `${func.args.map(t => `${t.rest ? '...' : ''}${toCamelCase(t.name)}${t.required ? '' : '?'}`).join(";")}` + ']') : ''}\n\`\`\``,
+ `\`\`\`\n${func.name}${!!func.args ? '[' + `${func.args.map((t) => `${t.rest ? '...' : ''}${toCamelCase(t.name)}${t.required ? '' : '?'}`).join(';')}` + ']' : ''}\n\`\`\``,
]
if (func.args) {
- const args = func.args.map(f => [f.name, f.description, f.type, f.required ? 'Yes' : 'No', f.rest ? 'Yes' : 'No'])
+ const args = func.args.map((f) => [
+ f.name,
+ f.description,
+ f.type,
+ f.required ? 'Yes' : 'No',
+ f.rest ? 'Yes' : 'No',
+ ])
const table = new AsciiTable3()
- .setStyle('github-markdown')
- .setHeading('Name', 'Description', 'Type', 'Required', 'Rest')
- .addRowMatrix(args)
+ .setStyle('github-markdown')
+ .setHeading('Name', 'Description', 'Type', 'Required', 'Rest')
+ .addRowMatrix(args)
content.push('## Fields', table.toString())
}
@@ -59,12 +68,18 @@ function generateFunctionDocs() {
content.push('## Output', `> ${func.output.join(', ')}`)
}
- content.push(`View source on [GitHub](https://github.com/Cyberghxst/forgemusic/blob/dev/src/natives/${func.name.slice(1)}.ts)`)
+ content.push(
+ `View source on [GitHub](https://github.com/Cyberghxst/forgemusic/blob/dev/src/natives/${func.name.slice(1)}.ts)`
+ )
- writeFileSync(join(process.cwd(), "docs", `${func.name.slice(1)}.md`), content.join("\n"), "utf-8")
+ writeFileSync(
+ join(process.cwd(), 'docs', `${func.name.slice(1)}.md`),
+ content.join('\n'),
+ 'utf-8'
+ )
}
return true
}
-generateFunctionDocs()
\ No newline at end of file
+generateFunctionDocs()
diff --git a/src/events/audioFiltersUpdate.ts b/src/events/audioFiltersUpdate.ts
index afc4951..850a811 100644
--- a/src/events/audioFiltersUpdate.ts
+++ b/src/events/audioFiltersUpdate.ts
@@ -1,7 +1,7 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
/**
* The event should be listen to.
@@ -10,10 +10,10 @@ const eventName = GuildQueueEvent.AudioFiltersUpdate
export default new MusicEventHandler({
name: eventName,
- description: "Executed when FFMPEG audio filters are updated.",
+ description: 'Executed when FFMPEG audio filters are updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic).commands.get(eventName)
- if (!commands) return;
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -21,13 +21,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/audioTrackAdd.ts b/src/events/audioTrackAdd.ts
index 70cf859..1af2008 100644
--- a/src/events/audioTrackAdd.ts
+++ b/src/events/audioTrackAdd.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.AudioTrackAdd,
- description: "Executed when audio track is added to the queue.",
+ description: 'Executed when audio track is added to the queue.',
async listener(queue, track) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.AudioTrackAdd)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.AudioTrackAdd
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/audioTrackRemove.ts b/src/events/audioTrackRemove.ts
index e97884c..4badbc4 100644
--- a/src/events/audioTrackRemove.ts
+++ b/src/events/audioTrackRemove.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.AudioTrackRemove,
- description: "Executed when audio track is removed from the queue.",
+ description: 'Executed when audio track is removed from the queue.',
async listener(queue, track) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.AudioTrackRemove)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.AudioTrackRemove
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/audioTracksAdd.ts b/src/events/audioTracksAdd.ts
index e144b0a..54f17cd 100644
--- a/src/events/audioTracksAdd.ts
+++ b/src/events/audioTracksAdd.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.AudioTracksAdd,
- description: "Executed when multiple audio track are added to the queue.",
+ description: 'Executed when multiple audio track are added to the queue.',
async listener(queue, tracks) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.AudioTracksAdd)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.AudioTracksAdd
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, tracks },
- data: command.compiled.code
+ data: command.compiled.code,
})
-
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/biquadFiltersUpdate.ts b/src/events/biquadFiltersUpdate.ts
index 3431954..d33d98c 100644
--- a/src/events/biquadFiltersUpdate.ts
+++ b/src/events/biquadFiltersUpdate.ts
@@ -1,7 +1,7 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
/**
* The event should be listen to.
@@ -10,10 +10,10 @@ const eventName = GuildQueueEvent.BiquadFiltersUpdate
export default new MusicEventHandler({
name: eventName,
- description: "Executed when biquad filters is updated.",
+ description: 'Executed when biquad filters is updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic).commands.get(eventName)
- if (!commands) return;
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -21,13 +21,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
})
-
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/channelPopulate.ts b/src/events/channelPopulate.ts
index c3761e0..7b66a32 100644
--- a/src/events/channelPopulate.ts
+++ b/src/events/channelPopulate.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.ChannelPopulate,
- description: "Executed when a voice channel is populated.",
+ description: 'Executed when a voice channel is populated.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.ChannelPopulate)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.ChannelPopulate
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
-
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/connection.ts b/src/events/connection.ts
index 957a43a..6dce433 100644
--- a/src/events/connection.ts
+++ b/src/events/connection.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.Connection,
- description: "Executed when a connection is created.",
+ description: 'Executed when a connection is created.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.Connection)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.Connection
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/connectionDestroyed.ts b/src/events/connectionDestroyed.ts
index 33214b5..3e30d68 100644
--- a/src/events/connectionDestroyed.ts
+++ b/src/events/connectionDestroyed.ts
@@ -1,28 +1,30 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.ConnectionDestroyed,
- description: "Executed when a connection is destroyed.",
+ description: 'Executed when a connection is destroyed.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.ConnectionDestroyed)
- if (!commands) return;
-
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.ConnectionDestroyed
+ )
+ if (!commands) return
+
for (const command of commands) {
const context = new Context({
obj: queue.metadata.text,
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/debug.ts b/src/events/debug.ts
index a3ec8fb..4d4dfcc 100644
--- a/src/events/debug.ts
+++ b/src/events/debug.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.Debug,
- description: "Executed when the queue sends a debug info.",
+ description: 'Executed when the queue sends a debug info.',
async listener(queue, message) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.Debug)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.Debug
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, message },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/disconnect.ts b/src/events/disconnect.ts
index 0de9108..bf44294 100644
--- a/src/events/disconnect.ts
+++ b/src/events/disconnect.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.Disconnect,
- description: "Executed when the bot is disconnected from the channel.",
+ description: 'Executed when the bot is disconnected from the channel.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.Disconnect)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.Disconnect
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/dspUpdate.ts b/src/events/dspUpdate.ts
index 37e54a0..8a8c596 100644
--- a/src/events/dspUpdate.ts
+++ b/src/events/dspUpdate.ts
@@ -1,7 +1,7 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
/**
* The event should be listen to.
@@ -10,10 +10,10 @@ const eventName = GuildQueueEvent.DSPUpdate
export default new MusicEventHandler({
name: eventName,
- description: "Executed when dsp filters are updated.",
+ description: 'Executed when dsp filters are updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic).commands.get(eventName)
- if (!commands) return;
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -21,13 +21,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
})
-
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/emptyChannel.ts b/src/events/emptyChannel.ts
index 390b2a0..60ffaf4 100644
--- a/src/events/emptyChannel.ts
+++ b/src/events/emptyChannel.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.EmptyChannel,
- description: "Executed when the voice channel is empty.",
+ description: 'Executed when the voice channel is empty.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.EmptyChannel)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.EmptyChannel
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/emptyQueue.ts b/src/events/emptyQueue.ts
index 8a43116..8f4ad56 100644
--- a/src/events/emptyQueue.ts
+++ b/src/events/emptyQueue.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.EmptyQueue,
- description: "Executed when the queue is empty.",
+ description: 'Executed when the queue is empty.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.EmptyQueue)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.EmptyQueue
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/equalizerUpdate.ts b/src/events/equalizerUpdate.ts
index 184fe7f..20de877 100644
--- a/src/events/equalizerUpdate.ts
+++ b/src/events/equalizerUpdate.ts
@@ -1,7 +1,7 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
/**
* The event should be listen to.
@@ -10,10 +10,10 @@ const eventName = GuildQueueEvent.EqualizerUpdate
export default new MusicEventHandler({
name: eventName,
- description: "Executed when equalizer config is updated.",
+ description: 'Executed when equalizer config is updated.',
async listener(queue, oldFilters, newFilters) {
const commands = this.getExtension(ForgeMusic).commands.get(eventName)
- if (!commands) return;
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -21,13 +21,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, oldFilters, newFilters },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/error.ts b/src/events/error.ts
index 2963cd7..0a38a39 100644
--- a/src/events/error.ts
+++ b/src/events/error.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.Error,
- description: "Executed when the queue encounters error.",
+ description: 'Executed when the queue encounters error.',
async listener(queue, error) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.Error)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.Error
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, error },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerError.ts b/src/events/playerError.ts
index 1ad9d37..c4c8057 100644
--- a/src/events/playerError.ts
+++ b/src/events/playerError.ts
@@ -1,14 +1,17 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerError,
- description: "Executed when the audio player errors while streaming audio track.",
+ description:
+ 'Executed when the audio player errors while streaming audio track.',
async listener(queue, error, track) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerError)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerError
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +19,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, error, track },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerFinish.ts b/src/events/playerFinish.ts
index 8154608..a1de04c 100644
--- a/src/events/playerFinish.ts
+++ b/src/events/playerFinish.ts
@@ -1,14 +1,17 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerFinish,
- description: "Executed when the audio player finishes streaming audio track.",
+ description:
+ 'Executed when the audio player finishes streaming audio track.',
async listener(queue, track) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerFinish)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerFinish
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +19,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerPause.ts b/src/events/playerPause.ts
index a1200a8..ef57a03 100644
--- a/src/events/playerPause.ts
+++ b/src/events/playerPause.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerPause,
- description: "Executed when audio player is paused.",
+ description: 'Executed when audio player is paused.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerPause)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerPause
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerResume.ts b/src/events/playerResume.ts
index 09faf11..9e4ed53 100644
--- a/src/events/playerResume.ts
+++ b/src/events/playerResume.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerResume,
- description: "Executed when audio player is resumed.",
+ description: 'Executed when audio player is resumed.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerResume)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerResume
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerSkip.ts b/src/events/playerSkip.ts
index e648481..36b46c9 100644
--- a/src/events/playerSkip.ts
+++ b/src/events/playerSkip.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerSkip,
- description: "Executed when the audio player skips current track.",
+ description: 'Executed when the audio player skips current track.',
async listener(queue, track, reason, description) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerSkip)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerSkip
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track, reason, description },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerStart.ts b/src/events/playerStart.ts
index c181418..74b0cca 100644
--- a/src/events/playerStart.ts
+++ b/src/events/playerStart.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerStart,
- description: "Executed when the audio player starts streaming audio track.",
+ description: 'Executed when the audio player starts streaming audio track.',
async listener(queue, track) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerStart)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerStart
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/playerTrigger.ts b/src/events/playerTrigger.ts
index 33410ca..a8da7f4 100644
--- a/src/events/playerTrigger.ts
+++ b/src/events/playerTrigger.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.PlayerTrigger,
- description: "Executed when the audio player is triggered.",
+ description: 'Executed when the audio player is triggered.',
async listener(queue, track, reason) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.PlayerTrigger)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.PlayerTrigger
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, track, reason },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/queueCreate.ts b/src/events/queueCreate.ts
index 237e655..6ca9af5 100644
--- a/src/events/queueCreate.ts
+++ b/src/events/queueCreate.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.QueueCreate,
- description: "Executed when a queue is successfully created.",
+ description: 'Executed when a queue is successfully created.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.QueueCreate)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.QueueCreate
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/queueDelete.ts b/src/events/queueDelete.ts
index d456c31..3d9a8bd 100644
--- a/src/events/queueDelete.ts
+++ b/src/events/queueDelete.ts
@@ -1,14 +1,16 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
export default new MusicEventHandler({
name: GuildQueueEvent.QueueDelete,
- description: "Executed when a queue is successfully deleted.",
+ description: 'Executed when a queue is successfully deleted.',
async listener(queue) {
- const commands = this.getExtension(ForgeMusic).commands.get(GuildQueueEvent.QueueDelete)
- if (!commands) return;
+ const commands = this.getExtension(ForgeMusic).commands.get(
+ GuildQueueEvent.QueueDelete
+ )
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -16,13 +18,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/events/volumeChange.ts b/src/events/volumeChange.ts
index e7e6c98..4de08ad 100644
--- a/src/events/volumeChange.ts
+++ b/src/events/volumeChange.ts
@@ -1,7 +1,7 @@
-import { MusicEventHandler } from "@handlers/MusicEventHandler"
-import { Context, Interpreter } from "@tryforge/forgescript"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { GuildQueueEvent } from "discord-player"
+import { MusicEventHandler } from '@handlers/MusicEventHandler'
+import { Context, Interpreter } from '@tryforge/forgescript'
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { GuildQueueEvent } from 'discord-player'
/**
* The event should be listen to.
@@ -13,7 +13,7 @@ export default new MusicEventHandler({
description: "Executed when audio player's volume is changed.",
async listener(queue, oldVolume, newVolume) {
const commands = this.getExtension(ForgeMusic).commands.get(eventName)
- if (!commands) return;
+ if (!commands) return
for (const command of commands) {
const context = new Context({
@@ -21,13 +21,13 @@ export default new MusicEventHandler({
client: this,
command,
environment: { queue, oldVolume, newVolume },
- data: command.compiled.code
+ data: command.compiled.code,
})
- await this.getExtension(ForgeMusic)
- .player
- .context
- .provide(context, () => Interpreter.run(context))
+ await this.getExtension(ForgeMusic).player.context.provide(
+ context,
+ () => Interpreter.run(context)
+ )
}
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/index.ts b/src/index.ts
index 261a02a..95187b3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,11 +1,57 @@
-import { GuildQueueEvent, QueueRepeatMode, QueryType } from "discord-player"
-import { DefaultExtractors } from "@discord-player/extractor"
-import { ForgeMusic } from "@structures/ForgeMusic"
+import {
+ AttachmentExtractor,
+ DefaultExtractors,
+} from '@discord-player/extractor'
+import { GuildQueueEvent, QueueRepeatMode, QueryType } from 'discord-player'
+import { ForgeMusic } from '@structures/ForgeMusic'
+
+/**
+ * An array including the events that are not supported.
+ */
+const blacklistedEvents = [
+ 'audioTracksAdd',
+ 'audioTracksRemove',
+ 'willPlayTrack',
+ 'willAutoPlay',
+ 'voiceStateUpdate',
+]
+
+/**
+ * The list of all events.
+ */
+const AllEvents = Object.keys(GuildQueueEvent).filter(
+ (event) => !blacklistedEvents.includes(event)
+)
+
+/**
+ * Returns an array including the given events and the error events.
+ * @param events The events to be included.
+ * @returns An array including the given events and the error events.
+ * @example
+ * ```typescript
+ * // This:
+ * events: [GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart, GuildQueueEvent.Error, GuildQueueEvent.PlayerError]
+ *
+ * // is the same as:
+ * events: withErrorEvents(GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart)
+ * ```
+ */
+const withErrorEvents = (...events: GuildQueueEvent[]) => {
+ return Array.from(
+ new Set([GuildQueueEvent.Error, GuildQueueEvent.PlayerError, ...events])
+ )
+}
-export {
+export {
+ AllEvents,
+ AttachmentExtractor,
+ /**
+ * Not fully stable.
+ */
DefaultExtractors,
ForgeMusic,
GuildQueueEvent,
QueueRepeatMode,
- QueryType
-}
\ No newline at end of file
+ QueryType,
+ withErrorEvents,
+}
diff --git a/src/natives/clearQueue.ts b/src/natives/clearQueue.ts
index 8712af9..c800cc8 100644
--- a/src/natives/clearQueue.ts
+++ b/src/natives/clearQueue.ts
@@ -1,16 +1,17 @@
-import { NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$clearQueue",
- version: "1.0.0",
- description: "Clear the guild queue.",
+ name: '$clearQueue',
+ version: '1.0.0',
+ description: 'Clear the guild queue.',
unwrap: false,
execute(ctx) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
queue.clear()
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/clearQueueHistory.ts b/src/natives/clearQueueHistory.ts
index 3943194..74eef10 100644
--- a/src/natives/clearQueueHistory.ts
+++ b/src/natives/clearQueueHistory.ts
@@ -1,13 +1,13 @@
-import { NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$clearQueueHistory",
- version: "1.0.0",
- description: "Clear the queue history.",
+ name: '$clearQueueHistory',
+ version: '1.0.0',
+ description: 'Clear the queue history.',
unwrap: false,
execute(ctx) {
- useQueue(ctx.guild).history.clear()
+ useQueue(ctx.guild.id).history.clear()
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/currentTrackTotalDuration.ts b/src/natives/currentTrackTotalDuration.ts
index 2df8f26..59e08a0 100644
--- a/src/natives/currentTrackTotalDuration.ts
+++ b/src/natives/currentTrackTotalDuration.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$currentTrackTotalDuration",
- version: "1.0.0",
- description: "Returns the total duration of the current audio track.",
+ name: '$currentTrackTotalDuration',
+ version: '1.0.0',
+ description: 'Returns the total duration of the current audio track.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(getNode(ctx).totalDuration)
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.currentTrack.durationMS)
+ },
+})
diff --git a/src/natives/deleteQueue.ts b/src/natives/deleteQueue.ts
index 3476e0f..07cce72 100644
--- a/src/natives/deleteQueue.ts
+++ b/src/natives/deleteQueue.ts
@@ -1,17 +1,17 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$deleteQueue",
- version: "1.0.0",
- description: "Deletes the queue of the current guild.",
+ name: '$deleteQueue',
+ version: '1.0.0',
+ description: 'Deletes the queue of the current guild.',
unwrap: false,
output: ArgType.Unknown,
execute(ctx) {
- if (useQueue(ctx.guild)) {
- useQueue(ctx.guild).delete()
+ if (useQueue(ctx.guild.id)) {
+ useQueue(ctx.guild.id).delete()
}
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/disableAllFilters.ts b/src/natives/disableAllFilters.ts
index 6f17ba4..f957338 100644
--- a/src/natives/disableAllFilters.ts
+++ b/src/natives/disableAllFilters.ts
@@ -1,23 +1,29 @@
-import { Arg, NativeFunction } from "@tryforge/forgescript"
-import { FFMPEGFilters } from "@utils/constants"
-import { useQueue } from "discord-player"
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { FFMPEGFilters } from '@utils/constants'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$disableAllFilters",
- version: "1.0.0",
- description: "Disable the provided FFMPEG filters.",
+ name: '$disableAllFilters',
+ version: '1.0.0',
+ description: 'Disable the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [Arg.restEnum(FFMPEGFilters, "Filters", "Filter names to be disabled.")],
+ args: [
+ Arg.restEnum(FFMPEGFilters, 'Filters', 'Filter names to be disabled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
const allFilters = queue.filters.ffmpeg.getFiltersEnabled()
for (const filter of filters) {
- const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase())
- await queue.filters.ffmpeg.toggle(foundFilter);
+ const foundFilter = allFilters.find(
+ (fil) => fil.toLowerCase() === filter.toLowerCase()
+ )
+ await queue.filters.ffmpeg.toggle(foundFilter)
}
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/enableAllFilters.ts b/src/natives/enableAllFilters.ts
index a8c54b0..9af44cc 100644
--- a/src/natives/enableAllFilters.ts
+++ b/src/natives/enableAllFilters.ts
@@ -1,23 +1,29 @@
-import { Arg, NativeFunction } from "@tryforge/forgescript"
-import { FFMPEGFilters } from "@utils/constants"
-import { useQueue } from "discord-player"
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { FFMPEGFilters } from '@utils/constants'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$enableAllFilters",
- version: "1.0.0",
- description: "Enable the provided FFMPEG filters.",
+ name: '$enableAllFilters',
+ version: '1.0.0',
+ description: 'Enable the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [Arg.restEnum(FFMPEGFilters, "Filters", "Filter names to be enabled.")],
+ args: [
+ Arg.restEnum(FFMPEGFilters, 'Filters', 'Filter names to be enabled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
const allFilters = queue.filters.ffmpeg.getFiltersDisabled()
for (const filter of filters) {
- const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase())
- await queue.filters.ffmpeg.toggle(foundFilter);
+ const foundFilter = allFilters.find(
+ (fil) => fil.toLowerCase() === filter.toLowerCase()
+ )
+ await queue.filters.ffmpeg.toggle(foundFilter)
}
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/findExtractor.ts b/src/natives/findExtractor.ts
new file mode 100644
index 0000000..2b3aa3c
--- /dev/null
+++ b/src/natives/findExtractor.ts
@@ -0,0 +1,28 @@
+import { ForgeMusic } from '@structures/ForgeMusic'
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
+
+export default new NativeFunction({
+ name: '$findExtractor',
+ version: '1.0.0',
+ description: 'Find an extractor by name.',
+ brackets: true,
+ unwrap: true,
+ args: [Arg.requiredString('Name', 'The name of the extractor to find.')],
+ async execute(ctx, [query]) {
+ const globalPlayer = ctx.getExtension(ForgeMusic).player
+ if (!globalPlayer)
+ return this.customError('Unable to find an instance of player!')
+
+ const extractors = Array.from(globalPlayer.extractors.store.values())
+ let result: string
+
+ result = extractors.find(
+ (ex) =>
+ ex.identifier.toLowerCase().includes(query.toLowerCase()) ||
+ ex.constructor.name.toLowerCase().includes(query.toLowerCase())
+ )?.identifier
+
+ return this.success(result)
+ },
+})
diff --git a/src/natives/getAvailableProviders.ts b/src/natives/getAvailableProviders.ts
index a5efc39..d464b76 100644
--- a/src/natives/getAvailableProviders.ts
+++ b/src/natives/getAvailableProviders.ts
@@ -1,16 +1,19 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useMainPlayer } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useMainPlayer } from 'discord-player'
export default new NativeFunction({
- name: "$getAvailableProviders",
- version: "1.0.0",
- description: "Get the available audio providers.",
+ name: '$getAvailableProviders',
+ version: '1.0.0',
+ description: 'Get the available audio providers.',
unwrap: false,
output: ArgType.String,
execute(ctx) {
- const names = [...useMainPlayer().extractors.store.values()]
- .map((x) => x.constructor.name.replace("Extractor", "").replace(/[^a-zA-Z+]/g, ""))
+ const names = [...useMainPlayer().extractors.store.values()].map((x) =>
+ x.constructor.name
+ .replace('Extractor', '')
+ .replace(/[^a-zA-Z+]/g, '')
+ )
- return this.success(names.join(","))
- }
-})
\ No newline at end of file
+ return this.success(names.join(','))
+ },
+})
diff --git a/src/natives/getDisabledFilters.ts b/src/natives/getDisabledFilters.ts
index 0aa5de0..90adcba 100644
--- a/src/natives/getDisabledFilters.ts
+++ b/src/natives/getDisabledFilters.ts
@@ -1,14 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$getDisabledFilters",
- version: "1.0.0",
- description: "Return the disabled FFMPEG filters.",
+ name: '$getDisabledFilters',
+ version: '1.0.0',
+ description: 'Return the disabled FFMPEG filters.',
unwrap: false,
output: ArgType.String,
execute(ctx) {
- const queue = useQueue(ctx.guild)
- return this.success(queue.filters.ffmpeg.getFiltersDisabled().join(","))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.filters.ffmpeg.getFiltersDisabled().join(','))
+ },
+})
diff --git a/src/natives/getEnabledFilters.ts b/src/natives/getEnabledFilters.ts
index 1bba07f..35e8c51 100644
--- a/src/natives/getEnabledFilters.ts
+++ b/src/natives/getEnabledFilters.ts
@@ -1,14 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$getEnabledFilters",
- version: "1.0.0",
- description: "Return the enabled FFMPEG filters.",
+ name: '$getEnabledFilters',
+ version: '1.0.0',
+ description: 'Return the enabled FFMPEG filters.',
unwrap: false,
output: ArgType.String,
execute(ctx) {
- const queue = useQueue(ctx.guild)
- return this.success(queue.filters.ffmpeg.getFiltersEnabled().join(","))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.filters.ffmpeg.getFiltersEnabled().join(','))
+ },
+})
diff --git a/src/natives/getLoopMode.ts b/src/natives/getLoopMode.ts
index 7479eee..d7d70c5 100644
--- a/src/natives/getLoopMode.ts
+++ b/src/natives/getLoopMode.ts
@@ -1,15 +1,19 @@
-import { QueueRepeatMode, useMainPlayer } from "discord-player"
-import { NativeFunction } from "@tryforge/forgescript"
+import { QueueRepeatMode, useMainPlayer } from 'discord-player'
+import { NativeFunction } from '@tryforge/forgescript'
export default new NativeFunction({
- name: "$getLoopMode",
- version: "1.0.0",
- description: "Returns the state of the loop mode.",
+ name: '$getLoopMode',
+ version: '1.0.0',
+ description: 'Returns the state of the loop mode.',
unwrap: false,
output: QueueRepeatMode,
execute(ctx) {
const player = useMainPlayer()
-
- return this.success(Object.keys(QueueRepeatMode)[player.queues.get(ctx.guild).repeatMode])
- }
-})
\ No newline at end of file
+
+ return this.success(
+ Object.keys(QueueRepeatMode)[
+ player.queues.get(ctx.guild.id).repeatMode
+ ]
+ )
+ },
+})
diff --git a/src/natives/getVolume.ts b/src/natives/getVolume.ts
index 968bc9c..0d74913 100644
--- a/src/natives/getVolume.ts
+++ b/src/natives/getVolume.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$getVolume",
- version: "1.0.0",
- description: "Get the current volume of the music player.",
+ name: '$getVolume',
+ version: '1.0.0',
+ description: 'Get the current volume of the music player.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(getNode(ctx).volume)
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.volume)
+ },
+})
diff --git a/src/natives/hasMusicNode.ts b/src/natives/hasMusicNode.ts
index 7cd1789..4ee96b6 100644
--- a/src/natives/hasMusicNode.ts
+++ b/src/natives/hasMusicNode.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useMainPlayer } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useMainPlayer } from 'discord-player'
export default new NativeFunction({
- name: "$hasMusicNode",
- version: "1.0.0",
- description: "Check whether the current guild has a music node created.",
+ name: '$hasMusicNode',
+ version: '1.0.0',
+ description: 'Check whether the current guild has a music node created.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(useMainPlayer().nodes.has(ctx.guild))
- }
-})
\ No newline at end of file
+ return this.success(useMainPlayer().nodes.has(ctx.guild.id))
+ },
+})
diff --git a/src/natives/isFilterEnabled.ts b/src/natives/isFilterEnabled.ts
index 5c3e070..db60164 100644
--- a/src/natives/isFilterEnabled.ts
+++ b/src/natives/isFilterEnabled.ts
@@ -1,21 +1,33 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { FFMPEGFilters } from "@utils/constants"
-import { useQueue } from "discord-player"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { FFMPEGFilters } from '@utils/constants'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$isFilterEnabled",
- version: "1.0.0",
- description: "Check whether the provided filter is enabled.",
+ name: '$isFilterEnabled',
+ version: '1.0.0',
+ description: 'Check whether the provided filter is enabled.',
brackets: true,
unwrap: true,
- args: [Arg.requiredEnum(FFMPEGFilters, "Filters", "Filter names to be toggled.")],
+ args: [
+ Arg.requiredEnum(
+ FFMPEGFilters,
+ 'Filters',
+ 'Filter names to be toggled.'
+ ),
+ ],
output: ArgType.Boolean,
async execute(ctx, [filter]) {
- const queue = useQueue(ctx.guild)
- const allFilters = queue.filters.ffmpeg.getFiltersEnabled().concat(queue.filters.ffmpeg.getFiltersDisabled())
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
- const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase())
+ const allFilters = queue.filters.ffmpeg
+ .getFiltersEnabled()
+ .concat(queue.filters.ffmpeg.getFiltersDisabled())
+
+ const foundFilter = allFilters.find(
+ (fil) => fil.toLowerCase() === filter.toLowerCase()
+ )
return this.success(queue.filters.ffmpeg.isEnabled(foundFilter))
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/isPaused.ts b/src/natives/isPaused.ts
index a761bf5..fa4efb3 100644
--- a/src/natives/isPaused.ts
+++ b/src/natives/isPaused.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$isPaused",
- version: "1.0.0",
- description: "Check whether the music player is paused.",
+ name: '$isPaused',
+ version: '1.0.0',
+ description: 'Check whether the music player is paused.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(getNode(ctx).isPaused())
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.isPaused())
+ },
+})
diff --git a/src/natives/isPlaying.ts b/src/natives/isPlaying.ts
index cc93214..7a14499 100644
--- a/src/natives/isPlaying.ts
+++ b/src/natives/isPlaying.ts
@@ -1,14 +1,14 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useMainPlayer } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useMainPlayer } from 'discord-player'
export default new NativeFunction({
- name: "$isPlaying",
- version: "1.0.0",
- description: "Check whether the music player is playing a track.",
+ name: '$isPlaying',
+ version: '1.0.0',
+ description: 'Check whether the music player is playing a track.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
const player = useMainPlayer()
- return this.success(player.queues.get(ctx.guild).isPlaying())
- }
-})
\ No newline at end of file
+ return this.success(player.queues.get(ctx.guild.id).isPlaying())
+ },
+})
diff --git a/src/natives/isQueueHistoryDisabled.ts b/src/natives/isQueueHistoryDisabled.ts
index cb7f9b3..401fd70 100644
--- a/src/natives/isQueueHistoryDisabled.ts
+++ b/src/natives/isQueueHistoryDisabled.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$isQueueHistoryDisabled",
- version: "1.0.0",
- description: "Returns whether the queue history is disabled.",
+ name: '$isQueueHistoryDisabled',
+ version: '1.0.0',
+ description: 'Returns whether the queue history is disabled.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(useQueue(ctx.guild).history.disabled)
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).history.disabled)
+ },
+})
diff --git a/src/natives/isQueueHistoryEmpty.ts b/src/natives/isQueueHistoryEmpty.ts
index 8721267..c1d60ff 100644
--- a/src/natives/isQueueHistoryEmpty.ts
+++ b/src/natives/isQueueHistoryEmpty.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$isQueueHistoryEmpty",
- version: "1.0.0",
- description: "Returns whether the queue history is empty.",
+ name: '$isQueueHistoryEmpty',
+ version: '1.0.0',
+ description: 'Returns whether the queue history is empty.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(useQueue(ctx.guild).history.isEmpty())
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).history.isEmpty())
+ },
+})
diff --git a/src/natives/leaveVoiceChannel.ts b/src/natives/leaveVoiceChannel.ts
index 1cdb0cf..5c1c2bb 100644
--- a/src/natives/leaveVoiceChannel.ts
+++ b/src/natives/leaveVoiceChannel.ts
@@ -1,17 +1,17 @@
-import { NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
-import hasQueue from "@utils/hasQueue"
+import { NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$leaveVoiceChannel",
- version: "1.0.0",
- description: "Destroys the current voice connection.",
+ name: '$leaveVoiceChannel',
+ version: '1.0.0',
+ description: 'Destroys the current voice connection.',
unwrap: false,
async execute(ctx) {
- if (hasQueue(ctx)) {
- await useQueue(ctx.guild).connection.destroy()
+ const queue = useQueue(ctx.guild.id)
+ if (queue) {
+ await queue.connection.destroy()
}
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/moveTrack.ts b/src/natives/moveTrack.ts
index ace172e..96b8fcd 100644
--- a/src/natives/moveTrack.ts
+++ b/src/natives/moveTrack.ts
@@ -1,23 +1,25 @@
-import { Arg, NativeFunction } from "@tryforge/forgescript"
-import { useMainPlayer } from "discord-player"
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { useMainPlayer } from 'discord-player'
export default new NativeFunction({
- name: "$moveTrack",
- version: "1.0.0",
- description: "Moves the track to a new position.",
+ name: '$moveTrack',
+ version: '1.0.0',
+ description: 'Moves the track to a new position.',
brackets: true,
unwrap: true,
args: [
- Arg.requiredNumber("Position", "The track position to be moved."),
- Arg.requiredNumber("New Position", "The new position of the track.")
+ Arg.requiredNumber('Position', 'The track position to be moved.'),
+ Arg.requiredNumber('New Position', 'The new position of the track.'),
],
execute(ctx, [position, newPosition]) {
const player = useMainPlayer()
- const queue = player.queues.get(ctx.guild)
+ const queue = player.queues.get(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
const track = queue.node.remove(position)
queue.node.insert(track, newPosition)
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/pauseTrack.ts b/src/natives/pauseTrack.ts
index 2a279b2..b24d911 100644
--- a/src/natives/pauseTrack.ts
+++ b/src/natives/pauseTrack.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$pauseTrack",
- version: "1.0.0",
- description: "Pauses the current track.",
+ name: '$pauseTrack',
+ version: '1.0.0',
+ description: 'Pauses the current track.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(getNode(ctx).pause())
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.pause())
+ },
+})
diff --git a/src/natives/playNext.ts b/src/natives/playNext.ts
index 3ee305d..9edfdd7 100644
--- a/src/natives/playNext.ts
+++ b/src/natives/playNext.ts
@@ -1,14 +1,14 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$playNext",
- version: "1.0.0",
- description: "Play the next track in the queue, if any.",
+ name: '$playNext',
+ version: '1.0.0',
+ description: 'Play the next track in the queue, if any.',
unwrap: false,
output: ArgType.Unknown,
async execute(ctx) {
- await useQueue(ctx.guild).history.next();
+ await useQueue(ctx.guild.id).history.next()
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/playPrevious.ts b/src/natives/playPrevious.ts
index c064677..93b8449 100644
--- a/src/natives/playPrevious.ts
+++ b/src/natives/playPrevious.ts
@@ -1,14 +1,14 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$playPrevious",
- version: "1.0.0",
- description: "Play the previous track in the queue history, if any.",
+ name: '$playPrevious',
+ version: '1.0.0',
+ description: 'Play the previous track in the queue history, if any.',
unwrap: false,
output: ArgType.Unknown,
async execute(ctx) {
- await useQueue(ctx.guild).history.previous();
+ await useQueue(ctx.guild.id).history.previous()
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/playTrack.ts b/src/natives/playTrack.ts
index 3e23633..88b6ba0 100644
--- a/src/natives/playTrack.ts
+++ b/src/natives/playTrack.ts
@@ -1,54 +1,74 @@
-import { QueryType, SearchQueryType, useMainPlayer } from "discord-player"
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { BaseChannel, VoiceBasedChannel } from "discord.js"
-import { ForgeMusic } from "@structures/ForgeMusic"
+import { QueryType, SearchQueryType, useMainPlayer } from 'discord-player'
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { BaseChannel, VoiceBasedChannel } from 'discord.js'
+import { ForgeMusic } from '@structures/ForgeMusic'
export default new NativeFunction({
- name: "$playTrack",
- version: "1.0.0",
- description: "Play a track by query.",
+ name: '$playTrack',
+ version: '1.0.0',
+ description: 'Play a track by query.',
brackets: true,
unwrap: true,
args: [
{
- name: "Channel ID",
- description: "Voice channel ID to play the track on.",
+ name: 'Channel ID',
+ description: 'Voice channel ID to play the track on.',
type: ArgType.Channel,
required: true,
rest: false,
- check: (c: BaseChannel) => c.isVoiceBased()
+ check: (c: BaseChannel) => c.isVoiceBased(),
},
- Arg.requiredString("Query", "Track name to be searched."),
- Arg.optionalString("Engine", "The query search engine, can be extractor name to target an specific one. (custom)"),
- Arg.optionalEnum(QueryType, "Fallback Engine", "Fallback search engine to use."),
+ Arg.requiredString('Query', 'Track name to be searched.'),
+ Arg.optionalString(
+ 'Engine',
+ 'The query search engine, can be extractor name to target an specific one. (custom)'
+ ),
+ Arg.optionalEnum(
+ QueryType,
+ 'Fallback Engine',
+ 'Fallback search engine to use.'
+ ),
{
- name: "Block Extractors",
- description: "List of extractors to block.",
+ name: 'Block Extractors',
+ description: 'List of extractors to block.',
type: ArgType.String,
required: false,
- rest: true
- }
+ rest: true,
+ },
],
- async execute(ctx, [voiceChannel, query, searchEngine, fallbackSearchEngine, blockExtractors]) {
+ async execute(
+ ctx,
+ [
+ voiceChannel,
+ query,
+ searchEngine,
+ fallbackSearchEngine,
+ blockExtractors,
+ ]
+ ) {
const player = useMainPlayer()
const connectOptions = ctx.getExtension(ForgeMusic).connectOptions ?? {}
const connectionOptionsUnion = {
metadata: { text: ctx.channel },
- ...connectOptions
+ ...connectOptions,
}
let executed = true
- const result = await player.play(voiceChannel, query, {
- nodeOptions: connectionOptionsUnion,
- searchEngine: searchEngine as (SearchQueryType | `ext:${string}`) | undefined,
- fallbackSearchEngine,
- blockExtractors,
- requestedBy: ctx.user
- }).catch((e) => {
- executed = false
- return e
- })
+ const result = await player
+ .play(voiceChannel, query, {
+ nodeOptions: connectionOptionsUnion,
+ searchEngine:
+ searchEngine ||
+ undefined,
+ fallbackSearchEngine: fallbackSearchEngine || undefined,
+ blockExtractors: blockExtractors || undefined,
+ requestedBy: ctx.user,
+ })
+ .catch((e) => {
+ executed = false
+ return e
+ })
return executed ? this.success() : this.error(result)
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/playerElapsedTime.ts b/src/natives/playerElapsedTime.ts
index 3840bac..1e47822 100644
--- a/src/natives/playerElapsedTime.ts
+++ b/src/natives/playerElapsedTime.ts
@@ -1,13 +1,17 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$playerElapsedTime",
- version: "1.0.0",
- description: "Returns the elapsed time of the current song in milliseconds.",
+ name: '$playerElapsedTime',
+ version: '1.0.0',
+ description:
+ 'Returns the elapsed time of the current song in milliseconds.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(getNode(ctx).getTimestamp().progress * 1000)
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.getTimestamp().progress * 1000)
+ },
+})
diff --git a/src/natives/queue.ts b/src/natives/queue.ts
index aa980f8..f3d1dd2 100644
--- a/src/natives/queue.ts
+++ b/src/natives/queue.ts
@@ -1,43 +1,48 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { PLACEHOLDER_PATTERN } from "@utils/constants"
-import { createContext, runInContext } from "node:vm"
-import { useQueue } from "discord-player"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { PLACEHOLDER_PATTERN } from '@utils/constants'
+import { createContext, runInContext } from 'node:vm'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queue",
- description: "Returns queue songs resolving the given text placeholders.",
- version: "1.0.0",
+ name: '$queue',
+ description: 'Returns queue songs resolving the given text placeholders.',
+ version: '1.0.0',
brackets: false,
unwrap: true,
args: [
- Arg.optionalNumber("Start Index", "The queue song start index."),
- Arg.optionalNumber("Limit", "The amount of queue songs to be retrieved."),
- Arg.optionalString("Text", "The text to be resolved."),
- Arg.optionalString("Separator", "The separator for each result.")
-
+ Arg.optionalNumber('Start Index', 'The queue song start index.'),
+ Arg.optionalNumber(
+ 'Limit',
+ 'The amount of queue songs to be retrieved.'
+ ),
+ Arg.optionalString('Text', 'The text to be resolved.'),
+ Arg.optionalString('Separator', 'The separator for each result.'),
],
output: ArgType.String,
async execute(ctx, [index, limit, text, separator]) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
const tracks = queue.tracks.data
- text ||= "{position} {track.title} | <@{track.requestedBy.username}>"
+ text ||= '{position} {track.title} | <@{track.requestedBy.username}>'
+
+ const results = tracks
+ .slice(index ?? 0, limit ?? undefined)
+ .map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
+ .map((song, i) => {
+ const matches = song.match(PLACEHOLDER_PATTERN) ?? []
+ const context = createContext({ track: tracks[i] })
- const results = tracks.slice(index ?? 0, limit ?? undefined)
- .map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
- .map((song, i) => {
- const matches = song.match(PLACEHOLDER_PATTERN) ?? []
- const context = createContext({ track: tracks[i] })
+ for (const match of matches) {
+ const placeholderValue = match.slice(1, -1)
+ const result = runInContext(placeholderValue, context)
+ song = song.replace(new RegExp(match, 'g'), result)
+ }
- for (const match of matches) {
- const placeholderValue = match.slice(1, -1)
- const result = runInContext(placeholderValue, context)
- song = song.replace(new RegExp(match, "g"), result)
- }
+ return song
+ })
- return song
- })
-
- return this.success(results.join(separator || ","))
- }
-})
\ No newline at end of file
+ return this.success(results.join(separator || ','))
+ },
+})
diff --git a/src/natives/queueEstimatedDuration.ts b/src/natives/queueEstimatedDuration.ts
index 46c5c44..6bbe58e 100644
--- a/src/natives/queueEstimatedDuration.ts
+++ b/src/natives/queueEstimatedDuration.ts
@@ -1,13 +1,14 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queueEstimatedDuration",
- version: "1.0.0",
- description: "Returns the estimated duration of the current guild queue in milliseconds.",
+ name: '$queueEstimatedDuration',
+ version: '1.0.0',
+ description:
+ 'Returns the estimated duration of the current guild queue in milliseconds.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(useQueue(ctx.guild).estimatedDuration)
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).estimatedDuration)
+ },
+})
diff --git a/src/natives/queueHistory.ts b/src/natives/queueHistory.ts
index e986588..1bc0f3f 100644
--- a/src/natives/queueHistory.ts
+++ b/src/natives/queueHistory.ts
@@ -1,32 +1,38 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { PLACEHOLDER_PATTERN } from "@utils/constants"
-import { createContext, runInContext } from "node:vm"
-import { useQueue } from "discord-player"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { PLACEHOLDER_PATTERN } from '@utils/constants'
+import { createContext, runInContext } from 'node:vm'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queueHistory",
- description: "Returns queue history songs resolving the given text placeholders.",
- version: "1.0.0",
+ name: '$queueHistory',
+ description:
+ 'Returns queue history songs resolving the given text placeholders.',
+ version: '1.0.0',
brackets: false,
unwrap: true,
args: [
- Arg.optionalNumber("Start Index", "The queue song start index."),
- Arg.optionalNumber("Limit", "The amount of queue history songs to be retrieved."),
- Arg.optionalString("Text", "The text to be resolved."),
- Arg.optionalString("Separator", "The separator for each result.")
-
+ Arg.optionalNumber('Start Index', 'The queue song start index.'),
+ Arg.optionalNumber(
+ 'Limit',
+ 'The amount of queue history songs to be retrieved.'
+ ),
+ Arg.optionalString('Text', 'The text to be resolved.'),
+ Arg.optionalString('Separator', 'The separator for each result.'),
],
output: ArgType.String,
async execute(ctx, [index, limit, text, separator]) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
let tracks = queue.history.tracks.data
- if (index) tracks = tracks.slice(index, limit ?? undefined);
+ if (index) tracks = tracks.slice(index, limit ?? undefined)
const resolvedTracks: string[] = []
- text ??= "{position} {track.title} | {track.requestedBy}"
+ text ??= '{position} {track.title} | {track.requestedBy}'
- let i = 0, advance = () => i++
+ let i = 0,
+ advance = () => i++
for (const track of tracks) {
let result = text.replace(/\{position\}/g, String(i + 1))
@@ -40,15 +46,21 @@ export default new NativeFunction({
const context = createContext({ track })
for (const match of matches) {
const placeholderValue = match.slice(1, -1)
- const placeholderResult = runInContext(placeholderValue, context)
+ const placeholderResult = runInContext(
+ placeholderValue,
+ context
+ )
- result = result.replace(new RegExp(match, "g"), placeholderResult)
+ result = result.replace(
+ new RegExp(match, 'g'),
+ placeholderResult
+ )
}
resolvedTracks.push(result)
advance()
}
-
- return this.success(resolvedTracks.join(separator ?? ","))
- }
-})
\ No newline at end of file
+
+ return this.success(resolvedTracks.join(separator ?? ','))
+ },
+})
diff --git a/src/natives/queueHistoryLength.ts b/src/natives/queueHistoryLength.ts
index 59ef90a..10ee555 100644
--- a/src/natives/queueHistoryLength.ts
+++ b/src/natives/queueHistoryLength.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queueHistoryLength",
- version: "1.0.0",
- description: "Returns the length of the tracks that were played.",
+ name: '$queueHistoryLength',
+ version: '1.0.0',
+ description: 'Returns the length of the tracks that were played.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(useQueue(ctx.guild).history.tracks.data.length)
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).history.tracks.data.length)
+ },
+})
diff --git a/src/natives/queueLength.ts b/src/natives/queueLength.ts
index 65f59fd..739d0e1 100644
--- a/src/natives/queueLength.ts
+++ b/src/natives/queueLength.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queueLength",
- version: "1.0.0",
- description: "Returns the length of the current guild queue.",
+ name: '$queueLength',
+ version: '1.0.0',
+ description: 'Returns the length of the current guild queue.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(useQueue(ctx.guild).tracks.size)
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).tracks.size)
+ },
+})
diff --git a/src/natives/queuePing.ts b/src/natives/queuePing.ts
index 2dce660..e417794 100644
--- a/src/natives/queuePing.ts
+++ b/src/natives/queuePing.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$queuePing",
- version: "1.0.0",
- description: "Returns the latency of the current guild queue.",
+ name: '$queuePing',
+ version: '1.0.0',
+ description: 'Returns the latency of the current guild queue.',
unwrap: false,
output: ArgType.Number,
execute(ctx) {
- return this.success(useQueue(ctx.guild).ping)
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).ping)
+ },
+})
diff --git a/src/natives/removeTrack.ts b/src/natives/removeTrack.ts
index 5067f1b..b7670f0 100644
--- a/src/natives/removeTrack.ts
+++ b/src/natives/removeTrack.ts
@@ -1,15 +1,18 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$removeTrack",
- version: "1.0.0",
- description: "Removes the track that is located at the given position.",
+ name: '$removeTrack',
+ version: '1.0.0',
+ description: 'Removes the track that is located at the given position.',
brackets: true,
unwrap: true,
- args: [Arg.requiredNumber("Position", "The track position to be removed.")],
+ args: [Arg.requiredNumber('Position', 'The track position to be removed.')],
output: ArgType.Boolean,
execute(ctx, [position]) {
- return this.success(!!getNode(ctx).remove(position))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(!!queue.node.remove(position))
+ },
+})
diff --git a/src/natives/resumeTrack.ts b/src/natives/resumeTrack.ts
index 1013498..9ca6008 100644
--- a/src/natives/resumeTrack.ts
+++ b/src/natives/resumeTrack.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$resumeTrack",
- version: "1.0.0",
- description: "Resumes the current paused track.",
+ name: '$resumeTrack',
+ version: '1.0.0',
+ description: 'Resumes the current paused track.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(getNode(ctx).resume())
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.resume())
+ },
+})
diff --git a/src/natives/searchTrack.ts b/src/natives/searchTrack.ts
index 7c2ec00..8def96a 100644
--- a/src/natives/searchTrack.ts
+++ b/src/natives/searchTrack.ts
@@ -1,71 +1,110 @@
-import { SearchQueryType, useQueue, QueryType } from "discord-player"
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { PLACEHOLDER_PATTERN } from "@utils/constants"
-import { createContext, runInContext } from "node:vm"
-import { ForgeMusic } from "@structures/ForgeMusic"
-import hasQueue from "@utils/hasQueue"
+import { SearchQueryType, useQueue, QueryType } from 'discord-player'
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { PLACEHOLDER_PATTERN } from '@utils/constants'
+import { createContext, runInContext } from 'node:vm'
+import { ForgeMusic } from '@structures/ForgeMusic'
export default new NativeFunction({
- name: "$searchTrack",
- version: "1.0.0",
- description: "Search for a track using the given query.",
+ name: '$searchTrack',
+ version: '1.0.0',
+ description: 'Search for a track using the given query.',
brackets: true,
unwrap: true,
args: [
- Arg.requiredString("Query", "The query to search for."),
- Arg.requiredString("Text Result", "The formatted text result to return."),
- Arg.optionalString("Separator", "The result separator."),
- Arg.optionalString("Engine", "The query search engine, can be extractor name to target an specific one. (custom)"),
- Arg.optionalEnum(QueryType, "Fallback Engine", "Fallback search engine to use."),
- Arg.optionalNumber("Limit", "The maximum number of results to return."),
- Arg.optionalBoolean("Add To Player", "Whether add the results to the music player."),
+ Arg.requiredString('Query', 'The query to search for.'),
+ Arg.requiredString(
+ 'Text Result',
+ 'The formatted text result to return.'
+ ),
+ Arg.optionalString('Separator', 'The result separator.'),
+ Arg.optionalString(
+ 'Engine',
+ 'The query search engine, can be extractor name to target an specific one. (custom)'
+ ),
+ Arg.optionalEnum(
+ QueryType,
+ 'Fallback Engine',
+ 'Fallback search engine to use.'
+ ),
+ Arg.optionalNumber('Limit', 'The maximum number of results to return.'),
+ Arg.optionalBoolean(
+ 'Add To Player',
+ 'Whether add the results to the music player.'
+ ),
{
- name: "Block Extractors",
- description: "List of extractors to block.",
+ name: 'Block Extractors',
+ description: 'List of extractors to block.',
type: ArgType.String,
required: false,
- rest: true
- }
+ rest: true,
+ },
],
- async execute(ctx, [query, text, separator, engine, fallbackEngine, limit, addToPlayer, blockedExtractors]) {
- const searchResult = await ctx.client.getExtension(ForgeMusic).player.search(query, {
- searchEngine: engine as SearchQueryType | `ext:${string}`,
- fallbackSearchEngine: fallbackEngine,
- blockExtractors: blockedExtractors,
- requestedBy: ctx.user
- })
+ async execute(
+ ctx,
+ [
+ query,
+ text,
+ separator,
+ engine,
+ fallbackEngine,
+ limit,
+ addToPlayer,
+ blockedExtractors,
+ ]
+ ) {
+ const searchOptions = {
+ searchEngine:
+ engine || undefined,
+ fallbackSearchEngine: fallbackEngine || undefined,
+ blockExtractors: blockedExtractors || undefined,
+ requestedBy: ctx.user,
+ }
+ const searchResult = await ctx.client
+ .getExtension(ForgeMusic)
+ .player.search(query, searchOptions)
const connectOptions = ctx.getExtension(ForgeMusic).connectOptions ?? {}
const connectionOptionsUnion = {
metadata: { text: ctx.channel },
- ...connectOptions
+ ...connectOptions,
}
let tracks = searchResult.tracks
- if (limit && tracks.length > limit) tracks = tracks.slice(0, limit);
+ if (limit && tracks.length > limit) tracks = tracks.slice(0, limit)
- const formattedTracks = tracks.map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
- .map((trackText, i) => {
- const track = tracks[i]
- const matches = trackText.match(PLACEHOLDER_PATTERN) ?? []
- const context = createContext({ track })
+ const formattedTracks = tracks
+ .map((_, i) => text.replace(/\{position\}/g, String(i + 1)))
+ .map((trackText, i) => {
+ const track = tracks[i]
+ const matches = trackText.match(PLACEHOLDER_PATTERN) ?? []
+ const context = createContext({ track })
- for (const match of matches) {
- const placeholderValue = match.slice(1, -1)
- const result = runInContext(placeholderValue, context)
+ for (const match of matches) {
+ const placeholderValue = match.slice(1, -1)
+ const result = runInContext(placeholderValue, context)
- trackText = trackText.replace(new RegExp(match, "g"), result)
- }
+ trackText = trackText.replace(
+ new RegExp(match, 'g'),
+ result
+ )
+ }
- return trackText
- })
+ return trackText
+ })
- if (addToPlayer && hasQueue(ctx)) useQueue(ctx.guild).addTrack(tracks);
- else if (addToPlayer && !hasQueue(ctx)) {
- const queue = await ctx.client.getExtension(ForgeMusic).player.queues.create(ctx.guild, connectionOptionsUnion)
+ let queue = useQueue(ctx.guild.id)
+ if (addToPlayer && queue) queue.addTrack(tracks)
+ else if (addToPlayer && !queue) {
+ queue = await ctx.client
+ .getExtension(ForgeMusic)
+ .player.queues.create(ctx.guild.id, connectionOptionsUnion)
queue.addTrack(tracks)
}
- return this.success(searchResult.tracks.length > 0 ? formattedTracks.join(separator ?? ",") : "")
- }
-})
\ No newline at end of file
+ return this.success(
+ searchResult.tracks.length > 0
+ ? formattedTracks.join(separator ?? ',')
+ : ''
+ )
+ },
+})
diff --git a/src/natives/seekTrack.ts b/src/natives/seekTrack.ts
index a145283..40f4ac6 100644
--- a/src/natives/seekTrack.ts
+++ b/src/natives/seekTrack.ts
@@ -1,15 +1,18 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$seekTrack",
- version: "1.0.0",
- description: "Seeks a track.",
+ name: '$seekTrack',
+ version: '1.0.0',
+ description: 'Seeks a track.',
brackets: true,
unwrap: true,
- args: [Arg.requiredTime("Duration", "Seek duration to be applied.")],
+ args: [Arg.requiredTime('Duration', 'Seek duration to be applied.')],
output: ArgType.Boolean,
async execute(ctx, [duration]) {
- return this.success(await getNode(ctx).seek(duration))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(await queue.node.seek(duration))
+ },
+})
diff --git a/src/natives/setLoopMode.ts b/src/natives/setLoopMode.ts
index 99b418a..ac04d2e 100644
--- a/src/natives/setLoopMode.ts
+++ b/src/natives/setLoopMode.ts
@@ -1,18 +1,20 @@
-import { QueueRepeatMode, useMainPlayer } from "discord-player"
-import { Arg, NativeFunction } from "@tryforge/forgescript"
+import { QueueRepeatMode, useMainPlayer } from 'discord-player'
+import { Arg, NativeFunction } from '@tryforge/forgescript'
export default new NativeFunction({
- name: "$setLoopMode",
- version: "1.0.0",
- description: "Set the loop mode of the music player.",
+ name: '$setLoopMode',
+ version: '1.0.0',
+ description: 'Set the loop mode of the music player.',
brackets: true,
unwrap: true,
- args: [Arg.requiredString("Mode", "The loop mode of the music player.")],
+ args: [Arg.requiredString('Mode', 'The loop mode of the music player.')],
execute(ctx, [mode]) {
const player = useMainPlayer()
- player.queues.get(ctx.guild).setRepeatMode(QueueRepeatMode[mode.toUpperCase()])
+ player.queues
+ .get(ctx.guild.id)
+ .setRepeatMode(QueueRepeatMode[mode.toUpperCase()])
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/setVolume.ts b/src/natives/setVolume.ts
index 3350c64..6cf5704 100644
--- a/src/natives/setVolume.ts
+++ b/src/natives/setVolume.ts
@@ -1,16 +1,19 @@
-import { Arg, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$setVolume",
- version: "1.0.0",
- description: "Set the volume of the music player.",
+ name: '$setVolume',
+ version: '1.0.0',
+ description: 'Set the volume of the music player.',
brackets: true,
unwrap: true,
- args: [Arg.requiredNumber("Amount", "The volume amount to be applied.")],
+ args: [Arg.requiredNumber('Amount', 'The volume amount to be applied.')],
execute(ctx, [amount]) {
- getNode(ctx).setVolume(amount)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ queue.node.setVolume(amount)
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/shuffleQueue.ts b/src/natives/shuffleQueue.ts
index 47fafe5..0eb6399 100644
--- a/src/natives/shuffleQueue.ts
+++ b/src/natives/shuffleQueue.ts
@@ -1,13 +1,14 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$shuffleQueue",
- version: "1.0.0",
- description: "Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.",
+ name: '$shuffleQueue',
+ version: '1.0.0',
+ description:
+ 'Shuffle the queue when the current track ends, unlike $shuffleTracks that can be undone, this function does not mutates the queue.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(useQueue(ctx.guild).enableShuffle(true))
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).enableShuffle(true))
+ },
+})
diff --git a/src/natives/shuffleTracks.ts b/src/natives/shuffleTracks.ts
index 9d0327d..077efa0 100644
--- a/src/natives/shuffleTracks.ts
+++ b/src/natives/shuffleTracks.ts
@@ -1,16 +1,16 @@
-import { NativeFunction } from "@tryforge/forgescript"
-import { useMainPlayer } from "discord-player"
+import { NativeFunction } from '@tryforge/forgescript'
+import { useMainPlayer } from 'discord-player'
export default new NativeFunction({
- name: "$shuffleTracks",
- version: "1.0.0",
- description: "Shuffle the current guild queue.",
+ name: '$shuffleTracks',
+ version: '1.0.0',
+ description: 'Shuffle the current guild queue.',
unwrap: false,
execute(ctx) {
const player = useMainPlayer()
- player.queues.get(ctx.guild).tracks.shuffle()
+ player.queues.get(ctx.guild.id).tracks.shuffle()
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/skipTo.ts b/src/natives/skipTo.ts
index 8b98e70..d103c38 100644
--- a/src/natives/skipTo.ts
+++ b/src/natives/skipTo.ts
@@ -1,15 +1,18 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$skipTo",
- version: "1.0.0",
- description: "Skip the current track to the given position.",
+ name: '$skipTo',
+ version: '1.0.0',
+ description: 'Skip the current track to the given position.',
brackets: true,
unwrap: true,
- args: [Arg.requiredNumber("Position", "The track position to be played.")],
+ args: [Arg.requiredNumber('Position', 'The track position to be played.')],
output: ArgType.Boolean,
execute(ctx, [position]) {
- return this.success(getNode(ctx).skipTo(position))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.skipTo(position))
+ },
+})
diff --git a/src/natives/skipTrack.ts b/src/natives/skipTrack.ts
index 4a51249..21449ec 100644
--- a/src/natives/skipTrack.ts
+++ b/src/natives/skipTrack.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$skipTrack",
- version: "1.0.0",
- description: "Skip the current track.",
+ name: '$skipTrack',
+ version: '1.0.0',
+ description: 'Skip the current track.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(getNode(ctx).skip())
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.skip())
+ },
+})
diff --git a/src/natives/stopTrack.ts b/src/natives/stopTrack.ts
index ccf4808..5b39fff 100644
--- a/src/natives/stopTrack.ts
+++ b/src/natives/stopTrack.ts
@@ -1,13 +1,16 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import getNode from "@utils/getNode"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$stopTrack",
- version: "1.0.0",
- description: "Forces to stop the current track.",
+ name: '$stopTrack',
+ version: '1.0.0',
+ description: 'Forces to stop the current track.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(getNode(ctx).stop(true))
- }
-})
\ No newline at end of file
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ return this.success(queue.node.stop(true))
+ },
+})
diff --git a/src/natives/toggleFilters.ts b/src/natives/toggleFilters.ts
index 945b96e..cda1a2e 100644
--- a/src/natives/toggleFilters.ts
+++ b/src/natives/toggleFilters.ts
@@ -1,23 +1,31 @@
-import { Arg, NativeFunction } from "@tryforge/forgescript"
-import { FFMPEGFilters } from "@utils/constants"
-import { useQueue } from "discord-player"
+import { Arg, NativeFunction } from '@tryforge/forgescript'
+import { FFMPEGFilters } from '@utils/constants'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$toggleFilters",
- version: "1.0.0",
- description: "Toggle the provided FFMPEG filters.",
+ name: '$toggleFilters',
+ version: '1.0.0',
+ description: 'Toggle the provided FFMPEG filters.',
brackets: true,
unwrap: true,
- args: [Arg.restEnum(FFMPEGFilters, "Filters", "Filter names to be toggled.")],
+ args: [
+ Arg.restEnum(FFMPEGFilters, 'Filters', 'Filter names to be toggled.'),
+ ],
async execute(ctx, [filters]) {
- const queue = useQueue(ctx.guild)
- const allFilters = queue.filters.ffmpeg.getFiltersEnabled().concat(queue.filters.ffmpeg.getFiltersDisabled())
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
+ const allFilters = queue.filters.ffmpeg
+ .getFiltersEnabled()
+ .concat(queue.filters.ffmpeg.getFiltersDisabled())
for (const filter of filters) {
- const foundFilter = allFilters.find((fil) => fil.toLowerCase() === filter.toLowerCase())
- await queue.filters.ffmpeg.toggle(foundFilter);
+ const foundFilter = allFilters.find(
+ (fil) => fil.toLowerCase() === filter.toLowerCase()
+ )
+ await queue.filters.ffmpeg.toggle(foundFilter)
}
return this.success()
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/trackInfo.ts b/src/natives/trackInfo.ts
index f963d41..caecc73 100644
--- a/src/natives/trackInfo.ts
+++ b/src/natives/trackInfo.ts
@@ -1,24 +1,24 @@
-import { Arg, ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { Arg, ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$trackInfo",
- version: "1.0.0",
- description: "Returns information of the current track.",
+ name: '$trackInfo',
+ version: '1.0.0',
+ description: 'Returns information of the current track.',
brackets: true,
unwrap: true,
- args: [
- Arg.restString("Properties", "The track properties to be accesed.")
- ],
+ args: [Arg.restString('Properties', 'The track properties to be accesed.')],
output: ArgType.String,
execute(ctx, [properties]) {
- const queue = useQueue(ctx.guild)
+ const queue = useQueue(ctx.guild.id)
+ if (!queue) return this.customError('No queue found.')
+
const track = queue.currentTrack
- ctx.setEnvironmentKey("myTrack", track)
- const got = ctx.getEnvironmentKey(...["myTrack", ...properties])
- ctx.deleteEnvironmentKey("myTrack")
+ ctx.setEnvironmentKey('myTrack', track)
+ const got = ctx.getEnvironmentKey(...['myTrack', ...properties])
+ ctx.deleteEnvironmentKey('myTrack')
return this.success(got)
- }
-})
\ No newline at end of file
+ },
+})
diff --git a/src/natives/unshuffleQueue.ts b/src/natives/unshuffleQueue.ts
index 897a1d7..f9a84ec 100644
--- a/src/natives/unshuffleQueue.ts
+++ b/src/natives/unshuffleQueue.ts
@@ -1,13 +1,13 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript"
-import { useQueue } from "discord-player"
+import { ArgType, NativeFunction } from '@tryforge/forgescript'
+import { useQueue } from 'discord-player'
export default new NativeFunction({
- name: "$unshuffleQueue",
- version: "1.0.0",
- description: "Disable shuffle mode for the queue.",
+ name: '$unshuffleQueue',
+ version: '1.0.0',
+ description: 'Disable shuffle mode for the queue.',
unwrap: false,
output: ArgType.Boolean,
execute(ctx) {
- return this.success(useQueue(ctx.guild).disableShuffle())
- }
-})
\ No newline at end of file
+ return this.success(useQueue(ctx.guild.id).disableShuffle())
+ },
+})
diff --git a/src/utils/constants.ts b/src/utils/constants.ts
index 9fce89e..478421c 100644
--- a/src/utils/constants.ts
+++ b/src/utils/constants.ts
@@ -2,44 +2,44 @@
* The list including the names of valid filters.
*/
export enum FFMPEGFilters {
- Bassboost_low = "Bassboost_low",
- Bassboost = "Bassboost",
- Bassboost_high = "Bassboost_high",
- "8d" = "8d",
- Vaporwave = "Vaporwave",
- Nightcore = "Nightcore",
- Lofi = "Lofi",
- Phaser = "Phaser",
- Tremolo = "Tremolo",
- Vibrato = "Vibrato",
- Reverse = "Reverse",
- Treble = "Treble",
- Normalizer2 = "Normalizer2",
- Normalizer = "Normalizer",
- Surrounding = "Surrounding",
- Pulsator = "Pulsator",
- Subboost = "Subboost",
- Karaoke = "Karaoke",
- Flanger = "Flanger",
- Gate = "Gate",
- Haas = "Haas",
- Mcompand = "Mcompand",
- Mono = "Mono",
- Mstlr = "Mstlr",
- Mstrr = "Mstrr",
- Compressor = "Compressor",
- Expander = "Expander",
- Softlimiter = "Softlimiter",
- Chorus = "Chorus",
- Chorus2d = "Chorus2d",
- Chorus3d = "Chorus3d",
- Fadein = "Fadein",
- Dim = "Dim",
- Earrape = "Earrape",
- Silenceremove = "Silenceremove"
+ Bassboost_low = 'Bassboost_low',
+ Bassboost = 'Bassboost',
+ Bassboost_high = 'Bassboost_high',
+ '8d' = '8d',
+ Vaporwave = 'Vaporwave',
+ Nightcore = 'Nightcore',
+ Lofi = 'Lofi',
+ Phaser = 'Phaser',
+ Tremolo = 'Tremolo',
+ Vibrato = 'Vibrato',
+ Reverse = 'Reverse',
+ Treble = 'Treble',
+ Normalizer2 = 'Normalizer2',
+ Normalizer = 'Normalizer',
+ Surrounding = 'Surrounding',
+ Pulsator = 'Pulsator',
+ Subboost = 'Subboost',
+ Karaoke = 'Karaoke',
+ Flanger = 'Flanger',
+ Gate = 'Gate',
+ Haas = 'Haas',
+ Mcompand = 'Mcompand',
+ Mono = 'Mono',
+ Mstlr = 'Mstlr',
+ Mstrr = 'Mstrr',
+ Compressor = 'Compressor',
+ Expander = 'Expander',
+ Softlimiter = 'Softlimiter',
+ Chorus = 'Chorus',
+ Chorus2d = 'Chorus2d',
+ Chorus3d = 'Chorus3d',
+ Fadein = 'Fadein',
+ Dim = 'Dim',
+ Earrape = 'Earrape',
+ Silenceremove = 'Silenceremove',
}
/**
* Capture pattern for song placeholders.
*/
-export const PLACEHOLDER_PATTERN = /\{[a-zA-Z0-9._]+(?:\.[a-zA-Z0-9._]+)*\}/g
\ No newline at end of file
+export const PLACEHOLDER_PATTERN = /\{[a-zA-Z0-9._]+(?:\.[a-zA-Z0-9._]+)*\}/g
diff --git a/src/utils/getNode.ts b/src/utils/getNode.ts
deleted file mode 100644
index b105dba..0000000
--- a/src/utils/getNode.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { Context } from "@tryforge/forgescript"
-
-export default function(ctx: Context) {
- const extension = ctx.client.getExtension(ForgeMusic)
- const queue = extension.player.queues.get(ctx.guild)
-
- return queue.node
-}
\ No newline at end of file
diff --git a/src/utils/getQueue.ts b/src/utils/getQueue.ts
deleted file mode 100644
index 1ced584..0000000
--- a/src/utils/getQueue.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { Context } from "@tryforge/forgescript"
-
-export default function(ctx: Context) {
- const extension = ctx.client.getExtension(ForgeMusic)
- const queue = extension.player.queues.get(ctx.guild)
-
- return queue
-}
\ No newline at end of file
diff --git a/src/utils/getVersion.ts b/src/utils/getVersion.ts
index 079c0ee..ac81690 100644
--- a/src/utils/getVersion.ts
+++ b/src/utils/getVersion.ts
@@ -1,5 +1,5 @@
-import { readFileSync } from "fs"
-import { join } from "path"
+import { readFileSync } from 'fs'
+import { join } from 'path'
/**
* Returns the package version.
@@ -7,13 +7,10 @@ import { join } from "path"
*/
export function getVersion() {
const stringContent = readFileSync(
- join(
- process.cwd(),
- "package.json"
- ),
- "utf-8"
+ join(process.cwd(), 'package.json'),
+ 'utf-8'
)
const data = JSON.parse(stringContent)
return data.version as string
-}
\ No newline at end of file
+}
diff --git a/src/utils/hasQueue.ts b/src/utils/hasQueue.ts
deleted file mode 100644
index 94eeba3..0000000
--- a/src/utils/hasQueue.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { ForgeMusic } from "@structures/ForgeMusic"
-import { Context } from "@tryforge/forgescript"
-
-export default function(ctx: Context) {
- const extension = ctx.client.getExtension(ForgeMusic)
-
- return extension.player.queues.has(ctx.guild)
-}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index c233261..6ce5dba 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -17,14 +17,9 @@
"@structures/*": ["./src/classes/structures/*"]
},
"tsBuildInfoFile": "./__dump__/.tsbuildinfo",
- "skipLibCheck": true
+ "skipLibCheck": true,
+ "skipDefaultLibCheck": true
},
- "include": [
- "./src/**/*.ts"
- ],
- "exclude": [
- "./__dump__",
- "./__test__",
- "./node_modules",
- ]
-}
\ No newline at end of file
+ "include": ["./src/**/*.ts"],
+ "exclude": ["./__dump__", "./__test__", "./node_modules"]
+}
diff --git a/types/classes/handlers/MusicEventHandler.d.ts b/types/classes/handlers/MusicEventHandler.d.ts
index ab5a1e0..88dca84 100644
--- a/types/classes/handlers/MusicEventHandler.d.ts
+++ b/types/classes/handlers/MusicEventHandler.d.ts
@@ -1,6 +1,6 @@
-import { BaseEventHandler, ForgeClient } from "@tryforge/forgescript";
-import { GuildQueueEvent, GuildQueueEvents } from "discord-player";
-import { GuildTextBasedChannel } from "discord.js";
+import { BaseEventHandler, ForgeClient } from '@tryforge/forgescript';
+import { GuildQueueEvent, GuildQueueEvents } from 'discord-player';
+import { GuildTextBasedChannel } from 'discord.js';
/**
* Fix the typings for the music event handler.
*/
diff --git a/types/classes/managers/MusicCommandManager.d.ts b/types/classes/managers/MusicCommandManager.d.ts
index c61e6ca..6a20923 100644
--- a/types/classes/managers/MusicCommandManager.d.ts
+++ b/types/classes/managers/MusicCommandManager.d.ts
@@ -1,5 +1,5 @@
-import { BaseCommandManager } from "@tryforge/forgescript";
-import { GuildQueueEvent } from "discord-player";
+import { BaseCommandManager } from '@tryforge/forgescript';
+import { GuildQueueEvent } from 'discord-player';
/**
* Common music handler name.
*/
diff --git a/types/classes/structures/ForgeMusic.d.ts b/types/classes/structures/ForgeMusic.d.ts
index e412ac2..099afb4 100644
--- a/types/classes/structures/ForgeMusic.d.ts
+++ b/types/classes/structures/ForgeMusic.d.ts
@@ -1,6 +1,6 @@
-import { type BaseExtractor, GuildNodeCreateOptions, GuildQueueEvent, Player, type PlayerInitOptions } from "discord-player";
-import { ForgeClient, ForgeExtension } from "@tryforge/forgescript";
-import { MusicCommandManager } from "../managers/MusicCommandManager";
+import { type BaseExtractor, GuildNodeCreateOptions, GuildQueueEvent, Player, type PlayerInitOptions } from 'discord-player';
+import { ForgeClient, ForgeExtension } from '@tryforge/forgescript';
+import { MusicCommandManager } from '../managers/MusicCommandManager';
/**
* Constructor options of the music extension.
*/
@@ -8,7 +8,7 @@ interface ForgeMusicInitOptions extends PlayerInitOptions {
/**
* Options that are used when a guild node is created.
*/
- connectOptions?: Omit, "metadata">;
+ connectOptions?: Omit, 'metadata'>;
/**
* Array of event names the extension must listen to.
*/
@@ -16,8 +16,12 @@ interface ForgeMusicInitOptions extends PlayerInitOptions {
/**
* Predicate to load certain extractors.
*/
- includeExtractors?: typeof BaseExtractor[];
+ includeExtractors?: (typeof BaseExtractor)[];
}
+type TupleEngineOption> = [
+ T,
+ ConstructorParameters['1']
+];
/**
* The entrypoint of the forge music system.
*/
@@ -45,6 +49,11 @@ export declare class ForgeMusic extends ForgeExtension {
* @returns {ForgeMusic}
*/
constructor(options?: ForgeMusicInitOptions);
+ /**
+ * Add multiple extractors into the player.
+ * @param engines - Extractor engines to add.
+ */
+ addEngines>(engines: TupleEngineOption[]): void;
/**
* Starts the music extension.
* @param client - The discord client instance.
diff --git a/types/events/audioFiltersUpdate.d.ts b/types/events/audioFiltersUpdate.d.ts
index 49e4cd8..40614b1 100644
--- a/types/events/audioFiltersUpdate.d.ts
+++ b/types/events/audioFiltersUpdate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/audioTrackAdd.d.ts b/types/events/audioTrackAdd.d.ts
index 16996ba..83eaba0 100644
--- a/types/events/audioTrackAdd.d.ts
+++ b/types/events/audioTrackAdd.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/audioTrackRemove.d.ts b/types/events/audioTrackRemove.d.ts
index 7912189..2f9a1b3 100644
--- a/types/events/audioTrackRemove.d.ts
+++ b/types/events/audioTrackRemove.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/audioTracksAdd.d.ts b/types/events/audioTracksAdd.d.ts
index 3c9cfa5..7ba683b 100644
--- a/types/events/audioTracksAdd.d.ts
+++ b/types/events/audioTracksAdd.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/biquadFiltersUpdate.d.ts b/types/events/biquadFiltersUpdate.d.ts
index 0bfffe0..931d66c 100644
--- a/types/events/biquadFiltersUpdate.d.ts
+++ b/types/events/biquadFiltersUpdate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/channelPopulate.d.ts b/types/events/channelPopulate.d.ts
index db8d6e0..301ba15 100644
--- a/types/events/channelPopulate.d.ts
+++ b/types/events/channelPopulate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/connection.d.ts b/types/events/connection.d.ts
index 5479408..ce8c799 100644
--- a/types/events/connection.d.ts
+++ b/types/events/connection.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/connectionDestroyed.d.ts b/types/events/connectionDestroyed.d.ts
index 5c08648..0f39be3 100644
--- a/types/events/connectionDestroyed.d.ts
+++ b/types/events/connectionDestroyed.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/debug.d.ts b/types/events/debug.d.ts
index 5f3ac27..c66d16e 100644
--- a/types/events/debug.d.ts
+++ b/types/events/debug.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/disconnect.d.ts b/types/events/disconnect.d.ts
index a5a3999..e807f70 100644
--- a/types/events/disconnect.d.ts
+++ b/types/events/disconnect.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/dspUpdate.d.ts b/types/events/dspUpdate.d.ts
index f07b497..0d927eb 100644
--- a/types/events/dspUpdate.d.ts
+++ b/types/events/dspUpdate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/emptyChannel.d.ts b/types/events/emptyChannel.d.ts
index a8f4cda..71e1dcb 100644
--- a/types/events/emptyChannel.d.ts
+++ b/types/events/emptyChannel.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/emptyQueue.d.ts b/types/events/emptyQueue.d.ts
index f0d9d09..d2e00e4 100644
--- a/types/events/emptyQueue.d.ts
+++ b/types/events/emptyQueue.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/equalizerUpdate.d.ts b/types/events/equalizerUpdate.d.ts
index 79d151f..e1c7f75 100644
--- a/types/events/equalizerUpdate.d.ts
+++ b/types/events/equalizerUpdate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/error.d.ts b/types/events/error.d.ts
index b940614..fa26af0 100644
--- a/types/events/error.d.ts
+++ b/types/events/error.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerError.d.ts b/types/events/playerError.d.ts
index 2f4aced..35417f9 100644
--- a/types/events/playerError.d.ts
+++ b/types/events/playerError.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerFinish.d.ts b/types/events/playerFinish.d.ts
index 3256c20..b396a15 100644
--- a/types/events/playerFinish.d.ts
+++ b/types/events/playerFinish.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerPause.d.ts b/types/events/playerPause.d.ts
index d52463e..bbdfa5b 100644
--- a/types/events/playerPause.d.ts
+++ b/types/events/playerPause.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerResume.d.ts b/types/events/playerResume.d.ts
index 5400f6b..1755437 100644
--- a/types/events/playerResume.d.ts
+++ b/types/events/playerResume.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerSkip.d.ts b/types/events/playerSkip.d.ts
index a224341..275eb0b 100644
--- a/types/events/playerSkip.d.ts
+++ b/types/events/playerSkip.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerStart.d.ts b/types/events/playerStart.d.ts
index fb2c4bd..1a36a9d 100644
--- a/types/events/playerStart.d.ts
+++ b/types/events/playerStart.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/playerTrigger.d.ts b/types/events/playerTrigger.d.ts
index 88854d4..97eb9a7 100644
--- a/types/events/playerTrigger.d.ts
+++ b/types/events/playerTrigger.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/queueCreate.d.ts b/types/events/queueCreate.d.ts
index ab2c490..b2cae2a 100644
--- a/types/events/queueCreate.d.ts
+++ b/types/events/queueCreate.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/queueDelete.d.ts b/types/events/queueDelete.d.ts
index fbf4271..98fb679 100644
--- a/types/events/queueDelete.d.ts
+++ b/types/events/queueDelete.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/events/volumeChange.d.ts b/types/events/volumeChange.d.ts
index ef31308..0f4370c 100644
--- a/types/events/volumeChange.d.ts
+++ b/types/events/volumeChange.d.ts
@@ -1,3 +1,3 @@
-import { MusicEventHandler } from "../classes/handlers/MusicEventHandler";
+import { MusicEventHandler } from '../classes/handlers/MusicEventHandler';
declare const _default: MusicEventHandler;
export default _default;
diff --git a/types/index.d.ts b/types/index.d.ts
index 80c924d..5495bda 100644
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1,4 +1,26 @@
-import { GuildQueueEvent, QueueRepeatMode, QueryType } from "discord-player";
-import { DefaultExtractors } from "@discord-player/extractor";
-import { ForgeMusic } from "./classes/structures/ForgeMusic";
-export { DefaultExtractors, ForgeMusic, GuildQueueEvent, QueueRepeatMode, QueryType };
+import { AttachmentExtractor, DefaultExtractors } from '@discord-player/extractor';
+import { GuildQueueEvent, QueueRepeatMode, QueryType } from 'discord-player';
+import { ForgeMusic } from './classes/structures/ForgeMusic';
+/**
+ * The list of all events.
+ */
+declare const AllEvents: string[];
+/**
+ * Returns an array including the given events and the error events.
+ * @param events The events to be included.
+ * @returns An array including the given events and the error events.
+ * @example
+ * ```typescript
+ * // This:
+ * events: [GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart, GuildQueueEvent.Error, GuildQueueEvent.PlayerError]
+ *
+ * // is the same as:
+ * events: withErrorEvents(GuildQueueEvent.AudioTracksAdd, GuildQueueEvent.PlayerStart)
+ * ```
+ */
+declare const withErrorEvents: (...events: GuildQueueEvent[]) => GuildQueueEvent[];
+export { AllEvents, AttachmentExtractor,
+/**
+ * Not fully stable.
+ */
+DefaultExtractors, ForgeMusic, GuildQueueEvent, QueueRepeatMode, QueryType, withErrorEvents, };
diff --git a/types/natives/clearQueue.d.ts b/types/natives/clearQueue.d.ts
index cdb6ef4..4ed2244 100644
--- a/types/natives/clearQueue.d.ts
+++ b/types/natives/clearQueue.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/clearQueueHistory.d.ts b/types/natives/clearQueueHistory.d.ts
index cdb6ef4..4ed2244 100644
--- a/types/natives/clearQueueHistory.d.ts
+++ b/types/natives/clearQueueHistory.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/currentTrackTotalDuration.d.ts b/types/natives/currentTrackTotalDuration.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/currentTrackTotalDuration.d.ts
+++ b/types/natives/currentTrackTotalDuration.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/deleteQueue.d.ts b/types/natives/deleteQueue.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/deleteQueue.d.ts
+++ b/types/natives/deleteQueue.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/disableAllFilters.d.ts b/types/natives/disableAllFilters.d.ts
index a7d8f5f..65ac5de 100644
--- a/types/natives/disableAllFilters.d.ts
+++ b/types/natives/disableAllFilters.d.ts
@@ -1,4 +1,4 @@
-import { NativeFunction } from "@tryforge/forgescript";
-import { FFMPEGFilters } from "../utils/constants";
+import { NativeFunction } from '@tryforge/forgescript';
+import { FFMPEGFilters } from '../utils/constants';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/enableAllFilters.d.ts b/types/natives/enableAllFilters.d.ts
index a7d8f5f..65ac5de 100644
--- a/types/natives/enableAllFilters.d.ts
+++ b/types/natives/enableAllFilters.d.ts
@@ -1,4 +1,4 @@
-import { NativeFunction } from "@tryforge/forgescript";
-import { FFMPEGFilters } from "../utils/constants";
+import { NativeFunction } from '@tryforge/forgescript';
+import { FFMPEGFilters } from '../utils/constants';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/findExtractor.d.ts b/types/natives/findExtractor.d.ts
new file mode 100644
index 0000000..1777dcc
--- /dev/null
+++ b/types/natives/findExtractor.d.ts
@@ -0,0 +1,3 @@
+import { NativeFunction } from '@tryforge/forgescript';
+declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
+export default _default;
diff --git a/types/natives/getAvailableProviders.d.ts b/types/natives/getAvailableProviders.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/getAvailableProviders.d.ts
+++ b/types/natives/getAvailableProviders.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/getDisabledFilters.d.ts b/types/natives/getDisabledFilters.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/getDisabledFilters.d.ts
+++ b/types/natives/getDisabledFilters.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/getEnabledFilters.d.ts b/types/natives/getEnabledFilters.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/getEnabledFilters.d.ts
+++ b/types/natives/getEnabledFilters.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/getLoopMode.d.ts b/types/natives/getLoopMode.d.ts
index cdb6ef4..4ed2244 100644
--- a/types/natives/getLoopMode.d.ts
+++ b/types/natives/getLoopMode.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/getVolume.d.ts b/types/natives/getVolume.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/getVolume.d.ts
+++ b/types/natives/getVolume.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/hasMusicNode.d.ts b/types/natives/hasMusicNode.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/hasMusicNode.d.ts
+++ b/types/natives/hasMusicNode.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/isFilterEnabled.d.ts b/types/natives/isFilterEnabled.d.ts
index ea6e73b..a4a160d 100644
--- a/types/natives/isFilterEnabled.d.ts
+++ b/types/natives/isFilterEnabled.d.ts
@@ -1,4 +1,4 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
-import { FFMPEGFilters } from "../utils/constants";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
+import { FFMPEGFilters } from '../utils/constants';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/isPaused.d.ts b/types/natives/isPaused.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/isPaused.d.ts
+++ b/types/natives/isPaused.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/isPlaying.d.ts b/types/natives/isPlaying.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/isPlaying.d.ts
+++ b/types/natives/isPlaying.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/isQueueHistoryDisabled.d.ts b/types/natives/isQueueHistoryDisabled.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/isQueueHistoryDisabled.d.ts
+++ b/types/natives/isQueueHistoryDisabled.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/isQueueHistoryEmpty.d.ts b/types/natives/isQueueHistoryEmpty.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/isQueueHistoryEmpty.d.ts
+++ b/types/natives/isQueueHistoryEmpty.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/leaveVoiceChannel.d.ts b/types/natives/leaveVoiceChannel.d.ts
index cdb6ef4..4ed2244 100644
--- a/types/natives/leaveVoiceChannel.d.ts
+++ b/types/natives/leaveVoiceChannel.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/moveTrack.d.ts b/types/natives/moveTrack.d.ts
index 066df76..b8b7eae 100644
--- a/types/natives/moveTrack.d.ts
+++ b/types/natives/moveTrack.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/pauseTrack.d.ts b/types/natives/pauseTrack.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/pauseTrack.d.ts
+++ b/types/natives/pauseTrack.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/playNext.d.ts b/types/natives/playNext.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/playNext.d.ts
+++ b/types/natives/playNext.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/playPrevious.d.ts b/types/natives/playPrevious.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/playPrevious.d.ts
+++ b/types/natives/playPrevious.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/playTrack.d.ts b/types/natives/playTrack.d.ts
index d6307cb..7bec452 100644
--- a/types/natives/playTrack.d.ts
+++ b/types/natives/playTrack.d.ts
@@ -1,5 +1,5 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
-import { BaseChannel, VoiceBasedChannel } from "discord.js";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
+import { BaseChannel, VoiceBasedChannel } from 'discord.js';
declare const _default: NativeFunction<[{
name: string;
description: string;
diff --git a/types/natives/playerElapsedTime.d.ts b/types/natives/playerElapsedTime.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/playerElapsedTime.d.ts
+++ b/types/natives/playerElapsedTime.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/queue.d.ts b/types/natives/queue.d.ts
index c410fad..35be515 100644
--- a/types/natives/queue.d.ts
+++ b/types/natives/queue.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/queueEstimatedDuration.d.ts b/types/natives/queueEstimatedDuration.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/queueEstimatedDuration.d.ts
+++ b/types/natives/queueEstimatedDuration.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/queueHistory.d.ts b/types/natives/queueHistory.d.ts
index c410fad..35be515 100644
--- a/types/natives/queueHistory.d.ts
+++ b/types/natives/queueHistory.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/queueHistoryLength.d.ts b/types/natives/queueHistoryLength.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/queueHistoryLength.d.ts
+++ b/types/natives/queueHistoryLength.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/queueLength.d.ts b/types/natives/queueLength.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/queueLength.d.ts
+++ b/types/natives/queueLength.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/queuePing.d.ts b/types/natives/queuePing.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/queuePing.d.ts
+++ b/types/natives/queuePing.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/removeTrack.d.ts b/types/natives/removeTrack.d.ts
index c02f47c..0033a28 100644
--- a/types/natives/removeTrack.d.ts
+++ b/types/natives/removeTrack.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/resumeTrack.d.ts b/types/natives/resumeTrack.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/resumeTrack.d.ts
+++ b/types/natives/resumeTrack.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/searchTrack.d.ts b/types/natives/searchTrack.d.ts
index 8935c9e..9aa4c47 100644
--- a/types/natives/searchTrack.d.ts
+++ b/types/natives/searchTrack.d.ts
@@ -1,4 +1,4 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg, import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/setLoopMode.d.ts b/types/natives/setLoopMode.d.ts
index cf23df1..1777dcc 100644
--- a/types/natives/setLoopMode.d.ts
+++ b/types/natives/setLoopMode.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/setVolume.d.ts b/types/natives/setVolume.d.ts
index 403d9d1..dac2c5a 100644
--- a/types/natives/setVolume.d.ts
+++ b/types/natives/setVolume.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/shuffleQueue.d.ts b/types/natives/shuffleQueue.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/shuffleQueue.d.ts
+++ b/types/natives/shuffleQueue.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/shuffleTracks.d.ts b/types/natives/shuffleTracks.d.ts
index cdb6ef4..4ed2244 100644
--- a/types/natives/shuffleTracks.d.ts
+++ b/types/natives/shuffleTracks.d.ts
@@ -1,3 +1,3 @@
-import { NativeFunction } from "@tryforge/forgescript";
+import { NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/skipTo.d.ts b/types/natives/skipTo.d.ts
index c02f47c..0033a28 100644
--- a/types/natives/skipTo.d.ts
+++ b/types/natives/skipTo.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/skipTrack.d.ts b/types/natives/skipTrack.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/skipTrack.d.ts
+++ b/types/natives/skipTrack.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/stopTrack.d.ts b/types/natives/stopTrack.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/stopTrack.d.ts
+++ b/types/natives/stopTrack.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/natives/toggleFilters.d.ts b/types/natives/toggleFilters.d.ts
index a7d8f5f..65ac5de 100644
--- a/types/natives/toggleFilters.d.ts
+++ b/types/natives/toggleFilters.d.ts
@@ -1,4 +1,4 @@
-import { NativeFunction } from "@tryforge/forgescript";
-import { FFMPEGFilters } from "../utils/constants";
+import { NativeFunction } from '@tryforge/forgescript';
+import { FFMPEGFilters } from '../utils/constants';
declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/trackInfo.d.ts b/types/natives/trackInfo.d.ts
index c159807..5d05f28 100644
--- a/types/natives/trackInfo.d.ts
+++ b/types/natives/trackInfo.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
-declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
+declare const _default: NativeFunction<[import("@tryforge/forgescript").IArg], true>;
export default _default;
diff --git a/types/natives/unshuffleQueue.d.ts b/types/natives/unshuffleQueue.d.ts
index 44d2f55..4c6d1fc 100644
--- a/types/natives/unshuffleQueue.d.ts
+++ b/types/natives/unshuffleQueue.d.ts
@@ -1,3 +1,3 @@
-import { ArgType, NativeFunction } from "@tryforge/forgescript";
+import { ArgType, NativeFunction } from '@tryforge/forgescript';
declare const _default: NativeFunction>[], false>;
export default _default;
diff --git a/types/utils/constants.d.ts b/types/utils/constants.d.ts
index affb5ab..3742bc1 100644
--- a/types/utils/constants.d.ts
+++ b/types/utils/constants.d.ts
@@ -5,7 +5,7 @@ export declare enum FFMPEGFilters {
Bassboost_low = "Bassboost_low",
Bassboost = "Bassboost",
Bassboost_high = "Bassboost_high",
- "8d" = "8d",
+ '8d' = "8d",
Vaporwave = "Vaporwave",
Nightcore = "Nightcore",
Lofi = "Lofi",
diff --git a/types/utils/getNode.d.ts b/types/utils/getNode.d.ts
deleted file mode 100644
index 5291278..0000000
--- a/types/utils/getNode.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Context } from "@tryforge/forgescript";
-export default function (ctx: Context): import("discord-player").GuildQueuePlayerNode;
diff --git a/types/utils/getQueue.d.ts b/types/utils/getQueue.d.ts
deleted file mode 100644
index f19f944..0000000
--- a/types/utils/getQueue.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Context } from "@tryforge/forgescript";
-export default function (ctx: Context): import("discord-player").GuildQueue;
diff --git a/types/utils/hasQueue.d.ts b/types/utils/hasQueue.d.ts
deleted file mode 100644
index df647a1..0000000
--- a/types/utils/hasQueue.d.ts
+++ /dev/null
@@ -1,2 +0,0 @@
-import { Context } from "@tryforge/forgescript";
-export default function (ctx: Context): boolean;