distube 4.0.0-dev.2 → 4.0.0-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.d.ts +604 -8
- package/dist/index.js +2437 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2375 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +72 -45
- package/dist/DisTube.d.ts +0 -54
- package/dist/DisTube.d.ts.map +0 -1
- package/dist/DisTube.js +0 -279
- package/dist/DisTube.js.map +0 -1
- package/dist/constant.d.ts +0 -27
- package/dist/constant.d.ts.map +0 -1
- package/dist/constant.js +0 -47
- package/dist/constant.js.map +0 -1
- package/dist/core/DisTubeBase.d.ts +0 -14
- package/dist/core/DisTubeBase.d.ts.map +0 -1
- package/dist/core/DisTubeBase.js +0 -31
- package/dist/core/DisTubeBase.js.map +0 -1
- package/dist/core/DisTubeHandler.d.ts +0 -27
- package/dist/core/DisTubeHandler.d.ts.map +0 -1
- package/dist/core/DisTubeHandler.js +0 -230
- package/dist/core/DisTubeHandler.js.map +0 -1
- package/dist/core/DisTubeOptions.d.ts +0 -23
- package/dist/core/DisTubeOptions.d.ts.map +0 -1
- package/dist/core/DisTubeOptions.js +0 -90
- package/dist/core/DisTubeOptions.js.map +0 -1
- package/dist/core/DisTubeStream.d.ts +0 -19
- package/dist/core/DisTubeStream.d.ts.map +0 -1
- package/dist/core/DisTubeStream.js +0 -72
- package/dist/core/DisTubeStream.js.map +0 -1
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -19
- package/dist/core/index.js.map +0 -1
- package/dist/core/manager/BaseManager.d.ts +0 -7
- package/dist/core/manager/BaseManager.d.ts.map +0 -1
- package/dist/core/manager/BaseManager.js +0 -16
- package/dist/core/manager/BaseManager.js.map +0 -1
- package/dist/core/manager/FilterManager.d.ts +0 -16
- package/dist/core/manager/FilterManager.d.ts.map +0 -1
- package/dist/core/manager/FilterManager.js +0 -88
- package/dist/core/manager/FilterManager.js.map +0 -1
- package/dist/core/manager/GuildIdManager.d.ts +0 -9
- package/dist/core/manager/GuildIdManager.d.ts.map +0 -1
- package/dist/core/manager/GuildIdManager.js +0 -25
- package/dist/core/manager/GuildIdManager.js.map +0 -1
- package/dist/core/manager/QueueManager.d.ts +0 -11
- package/dist/core/manager/QueueManager.d.ts.map +0 -1
- package/dist/core/manager/QueueManager.js +0 -172
- package/dist/core/manager/QueueManager.js.map +0 -1
- package/dist/core/manager/index.d.ts +0 -5
- package/dist/core/manager/index.d.ts.map +0 -1
- package/dist/core/manager/index.js +0 -17
- package/dist/core/manager/index.js.map +0 -1
- package/dist/core/voice/DisTubeVoice.d.ts +0 -32
- package/dist/core/voice/DisTubeVoice.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoice.js +0 -190
- package/dist/core/voice/DisTubeVoice.js.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.d.ts +0 -10
- package/dist/core/voice/DisTubeVoiceManager.d.ts.map +0 -1
- package/dist/core/voice/DisTubeVoiceManager.js +0 -36
- package/dist/core/voice/DisTubeVoiceManager.js.map +0 -1
- package/dist/core/voice/index.d.ts +0 -3
- package/dist/core/voice/index.d.ts.map +0 -1
- package/dist/core/voice/index.js +0 -15
- package/dist/core/voice/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/plugin/http.d.ts +0 -10
- package/dist/plugin/http.d.ts.map +0 -1
- package/dist/plugin/http.js +0 -18
- package/dist/plugin/http.js.map +0 -1
- package/dist/plugin/https.d.ts +0 -19
- package/dist/plugin/https.d.ts.map +0 -1
- package/dist/plugin/https.js +0 -47
- package/dist/plugin/https.js.map +0 -1
- package/dist/plugin/index.d.ts +0 -3
- package/dist/plugin/index.d.ts.map +0 -1
- package/dist/plugin/index.js +0 -15
- package/dist/plugin/index.js.map +0 -1
- package/dist/struct/CustomPlugin.d.ts +0 -10
- package/dist/struct/CustomPlugin.d.ts.map +0 -1
- package/dist/struct/CustomPlugin.js +0 -16
- package/dist/struct/CustomPlugin.js.map +0 -1
- package/dist/struct/DisTubeError.d.ts +0 -55
- package/dist/struct/DisTubeError.d.ts.map +0 -1
- package/dist/struct/DisTubeError.js +0 -64
- package/dist/struct/DisTubeError.js.map +0 -1
- package/dist/struct/ExtractorPlugin.d.ts +0 -13
- package/dist/struct/ExtractorPlugin.d.ts.map +0 -1
- package/dist/struct/ExtractorPlugin.js +0 -16
- package/dist/struct/ExtractorPlugin.js.map +0 -1
- package/dist/struct/Playlist.d.ts +0 -25
- package/dist/struct/Playlist.d.ts.map +0 -1
- package/dist/struct/Playlist.js +0 -77
- package/dist/struct/Playlist.js.map +0 -1
- package/dist/struct/Plugin.d.ts +0 -17
- package/dist/struct/Plugin.d.ts.map +0 -1
- package/dist/struct/Plugin.js +0 -37
- package/dist/struct/Plugin.js.map +0 -1
- package/dist/struct/Queue.d.ts +0 -49
- package/dist/struct/Queue.d.ts.map +0 -1
- package/dist/struct/Queue.js +0 -272
- package/dist/struct/Queue.js.map +0 -1
- package/dist/struct/SearchResult.d.ts +0 -19
- package/dist/struct/SearchResult.d.ts.map +0 -1
- package/dist/struct/SearchResult.js +0 -30
- package/dist/struct/SearchResult.js.map +0 -1
- package/dist/struct/Song.d.ts +0 -43
- package/dist/struct/Song.d.ts.map +0 -1
- package/dist/struct/Song.js +0 -138
- package/dist/struct/Song.js.map +0 -1
- package/dist/struct/TaskQueue.d.ts +0 -8
- package/dist/struct/TaskQueue.d.ts.map +0 -1
- package/dist/struct/TaskQueue.js +0 -39
- package/dist/struct/TaskQueue.js.map +0 -1
- package/dist/struct/index.d.ts +0 -10
- package/dist/struct/index.d.ts.map +0 -1
- package/dist/struct/index.js +0 -22
- package/dist/struct/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/type.d.ts +0 -104
- package/dist/type.d.ts.map +0 -1
- package/dist/type.js +0 -3
- package/dist/type.js.map +0 -1
- package/dist/util.d.ts +0 -22
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -189
- package/dist/util.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DisTubeError.js","sourceRoot":"","sources":["../../src/struct/DisTubeError.ts"],"names":[],"mappings":"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","sourcesContent":["import { inspect } from \"node:util\";\n\nconst ERROR_MESSAGES = {\n INVALID_TYPE: (expected: (number | string) | readonly (number | string)[], got: any, name?: string) =>\n `Expected ${\n Array.isArray(expected) ? expected.map(e => (typeof e === \"number\" ? e : `'${e}'`)).join(\" or \") : `'${expected}'`\n }${name ? ` for '${name}'` : \"\"}, but got ${inspect(got)}`,\n NUMBER_COMPARE: (name: string, expected: string, value: number) => `'${name}' must be ${expected} ${value}`,\n EMPTY_ARRAY: (name: string) => `'${name}' is an empty array`,\n EMPTY_FILTERED_ARRAY: (name: string, type: string) => `There is no valid '${type}' in the '${name}' array`,\n EMPTY_STRING: (name: string) => `'${name}' string must not be empty`,\n INVALID_KEY: (obj: string, key: string) => `'${key}' does not need to be provided in ${obj}`,\n MISSING_KEY: (obj: string, key: string) => `'${key}' needs to be provided in ${obj}`,\n MISSING_KEYS: (obj: string, key: string[], all: boolean) =>\n `${key.map(k => `'${k}'`).join(all ? \" and \" : \" or \")} need to be provided in ${obj}`,\n\n MISSING_INTENTS: (i: string) => `${i} intent must be provided for the Client`,\n DISABLED_OPTION: (o: string) => `DisTubeOptions.${o} is disabled`,\n ENABLED_OPTION: (o: string) => `DisTubeOptions.${o} is enabled`,\n\n NOT_IN_VOICE: \"User is not in any voice channel\",\n VOICE_FULL: \"The voice channel is full\",\n VOICE_CONNECT_FAILED: (s: number) => `Cannot connect to the voice channel after ${s} seconds`,\n VOICE_MISSING_PERMS: \"You do not have permission to join this voice channel\",\n VOICE_RECONNECT_FAILED: \"Cannot reconnect to the voice channel\",\n VOICE_CHANGE_GUILD: \"Cannot join a channel in a different guild\",\n\n NO_QUEUE: \"There is no playing queue in this guild\",\n QUEUE_EXIST: \"This guild has a Queue already\",\n PAUSED: \"The queue has been paused already\",\n RESUMED: \"The queue has been playing already\",\n NO_PREVIOUS: \"There is no previous song in this queue\",\n NO_UP_NEXT: \"There is no up next song\",\n NO_SONG_POSITION: \"Does not have any song at this position\",\n NO_PLAYING: \"There is no playing song in the queue\",\n\n NO_RESULT: \"No result found\",\n NO_RELATED: \"Cannot find any related songs\",\n CANNOT_PLAY_RELATED: \"Cannot play the related song\",\n UNAVAILABLE_VIDEO: \"This video is unavailable\",\n UNPLAYABLE_FORMATS: \"No playable format found\",\n NON_NSFW: \"Cannot play age-restricted content in non-NSFW channel\",\n NOT_SUPPORTED_URL: \"This url is not supported\",\n CANNOT_RESOLVE_SONG: (t: any) => `Cannot resolve ${inspect(t)} to a Song`,\n NO_VALID_SONG: \"'songs' array does not have any valid Song, SearchResult or url\",\n EMPTY_FILTERED_PLAYLIST:\n \"There is no valid video in the playlist\\n\" +\n \"Maybe age-restricted contents is filtered because you are in non-NSFW channel\",\n EMPTY_PLAYLIST: \"There is no valid video in the playlist\",\n};\n\ntype ErrorMessages = typeof ERROR_MESSAGES;\ntype ErrorCodes = keyof ErrorMessages;\ntype ErrorCode = { [K in ErrorCodes]-?: ErrorMessages[K] extends string ? K : never }[ErrorCodes];\ntype ErrorCodeTemplate = Exclude<keyof typeof ERROR_MESSAGES, ErrorCode>;\n\nconst errMsg = (msg: string | ((...x: any) => string), ...args: any) => (typeof msg === \"string\" ? msg : msg(...args));\n\nconst haveCode = (code: string): code is ErrorCodes => Object.keys(ERROR_MESSAGES).includes(code);\n\nexport class DisTubeError<T extends string> extends Error {\n errorCode: string;\n constructor(code: ErrorCode);\n constructor(code: T extends ErrorCodeTemplate ? T : never, ...args: Parameters<ErrorMessages[typeof code]>);\n constructor(code: ErrorCodeTemplate, _: never);\n constructor(code: T extends ErrorCodes ? \"This is built-in error code\" : T, message: string);\n constructor(code: string, ...args: any) {\n if (haveCode(code)) super(errMsg(ERROR_MESSAGES[code], ...args));\n else super(...args);\n\n this.errorCode = code;\n if (Error.captureStackTrace) Error.captureStackTrace(this, DisTubeError);\n }\n\n get name() {\n return `DisTubeError [${this.errorCode}]`;\n }\n\n get code() {\n return this.errorCode;\n }\n}\n"]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Plugin } from ".";
|
|
2
|
-
import { PluginType } from "..";
|
|
3
|
-
import type { GuildMember } from "discord.js";
|
|
4
|
-
import type { Awaitable, Playlist, Song } from "..";
|
|
5
|
-
export declare abstract class ExtractorPlugin extends Plugin {
|
|
6
|
-
type: PluginType;
|
|
7
|
-
abstract resolve<T = unknown>(url: string, options: {
|
|
8
|
-
member?: GuildMember;
|
|
9
|
-
metadata?: T;
|
|
10
|
-
}): Awaitable<Song<T> | Playlist<T>>;
|
|
11
|
-
validate(url: string): Awaitable<boolean>;
|
|
12
|
-
}
|
|
13
|
-
//# sourceMappingURL=ExtractorPlugin.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExtractorPlugin.d.ts","sourceRoot":"","sources":["../../src/struct/ExtractorPlugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAOpD,8BAAsB,eAAgB,SAAQ,MAAM;IAClD,IAAI,aAAwB;IAW5B,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,EAC1B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;KAAE,GAC9C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAMnC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;CAG1C"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ExtractorPlugin = void 0;
|
|
4
|
-
const _1 = require(".");
|
|
5
|
-
const __1 = require("..");
|
|
6
|
-
class ExtractorPlugin extends _1.Plugin {
|
|
7
|
-
constructor() {
|
|
8
|
-
super(...arguments);
|
|
9
|
-
this.type = __1.PluginType.EXTRACTOR;
|
|
10
|
-
}
|
|
11
|
-
validate(url) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
exports.ExtractorPlugin = ExtractorPlugin;
|
|
16
|
-
//# sourceMappingURL=ExtractorPlugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ExtractorPlugin.js","sourceRoot":"","sources":["../../src/struct/ExtractorPlugin.ts"],"names":[],"mappings":";;;AACA,wBAA2B;AAC3B,0BAAgC;AAShC,MAAsB,eAAgB,SAAQ,SAAM;IAApD;;QACE,SAAI,GAAG,cAAU,CAAC,SAAS,CAAC;IAuB9B,CAAC;IAHC,QAAQ,CAAC,GAAW;QAClB,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAxBD,0CAwBC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport { Plugin } from \".\";\nimport { PluginType } from \"..\";\nimport type { GuildMember } from \"discord.js\";\nimport type { Awaitable, Playlist, Song } from \"..\";\n\n/**\n * Extractor Plugin\n * @extends Plugin\n * @abstract\n */\nexport abstract class ExtractorPlugin extends Plugin {\n type = PluginType.EXTRACTOR;\n /**\n * Resolve the validated url to a {@link Song} or a {@link Playlist}.\n *\n * @param {string} url URL\n * @param {Object} [options] Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {*} [options.metadata] Metadata\n * @returns {Song|Playlist|Promise<Song|Playlist>}\n * @abstract\n */\n abstract resolve<T = unknown>(\n url: string,\n options: { member?: GuildMember; metadata?: T },\n ): Awaitable<Song<T> | Playlist<T>>;\n /**\n * Check if the url is working with this plugin\n * @param {string} url Input url\n * @returns {boolean|Promise<boolean>}\n */\n validate(url: string): Awaitable<boolean> {\n return false;\n }\n}\n\n/**\n * Resolve the validated url to a {@link Song} or a {@link Playlist}.\n *\n * @param {string} url URL\n * @param {Object} [options] Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {*} [options.metadata] Metadata\n * @returns {Song|Playlist|Promise<Song|Playlist>}\n * @method resolve\n * @memberof ExtractorPlugin#\n * @abstract\n */\n"]}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type ytpl from "@distube/ytpl";
|
|
2
|
-
import type { PlaylistInfo, Song } from "..";
|
|
3
|
-
import type { GuildMember } from "discord.js";
|
|
4
|
-
export declare class Playlist<T = unknown> implements PlaylistInfo {
|
|
5
|
-
#private;
|
|
6
|
-
source: string;
|
|
7
|
-
songs: Song[];
|
|
8
|
-
name: string;
|
|
9
|
-
url?: string;
|
|
10
|
-
thumbnail?: string;
|
|
11
|
-
[x: string]: any;
|
|
12
|
-
constructor(playlist: Song[] | ytpl.result | PlaylistInfo, options?: {
|
|
13
|
-
member?: GuildMember;
|
|
14
|
-
properties?: Record<string, any>;
|
|
15
|
-
metadata?: T;
|
|
16
|
-
});
|
|
17
|
-
get duration(): number;
|
|
18
|
-
get formattedDuration(): string;
|
|
19
|
-
get member(): GuildMember | undefined;
|
|
20
|
-
set member(member: GuildMember | undefined);
|
|
21
|
-
get user(): import("discord.js").User | undefined;
|
|
22
|
-
get metadata(): T;
|
|
23
|
-
set metadata(metadata: T);
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=Playlist.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Playlist.d.ts","sourceRoot":"","sources":["../../src/struct/Playlist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,qBAAa,QAAQ,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY;;IACxD,MAAM,EAAG,MAAM,CAAC;IAChB,KAAK,EAAG,IAAI,EAAE,CAAC;IACf,IAAI,EAAG,MAAM,CAAC;IAGd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;gBAUf,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,YAAY,EAC7C,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;KACT;IA4DR,IAAI,QAAQ,WAEX;IAMD,IAAI,iBAAiB,WAEpB;IAMD,IAAI,MAAM,IAIS,WAAW,GAAG,SAAS,CAFzC;IAED,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAIzC;IAMD,IAAI,IAAI,0CAEP;IAED,IAAI,QAAQ,IAIW,CAAC,CAFvB;IAED,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAGvB;CACF"}
|
package/dist/struct/Playlist.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
-
};
|
|
13
|
-
var _Playlist_metadata, _Playlist_member;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Playlist = void 0;
|
|
16
|
-
const __1 = require("..");
|
|
17
|
-
class Playlist {
|
|
18
|
-
constructor(playlist, options = {}) {
|
|
19
|
-
_Playlist_metadata.set(this, void 0);
|
|
20
|
-
_Playlist_member.set(this, void 0);
|
|
21
|
-
const { member, properties, metadata } = options;
|
|
22
|
-
if (typeof playlist !== "object") {
|
|
23
|
-
throw new __1.DisTubeError("INVALID_TYPE", ["Array<Song>", "object"], playlist, "playlist");
|
|
24
|
-
}
|
|
25
|
-
if (typeof properties !== "undefined" && !(0, __1.isRecord)(properties)) {
|
|
26
|
-
throw new __1.DisTubeError("INVALID_TYPE", "object", properties, "properties");
|
|
27
|
-
}
|
|
28
|
-
const info = playlist;
|
|
29
|
-
this.source = (info.source || properties?.source || "youtube").toLowerCase();
|
|
30
|
-
this.songs = Array.isArray(info) ? info : info.items || info.songs;
|
|
31
|
-
if (!Array.isArray(this.songs) || !this.songs.length) {
|
|
32
|
-
throw new __1.DisTubeError("EMPTY_PLAYLIST");
|
|
33
|
-
}
|
|
34
|
-
this.songs.map(s => s.constructor.name === "Song" && (s.playlist = this));
|
|
35
|
-
this.member = member || info.member || undefined;
|
|
36
|
-
this.name =
|
|
37
|
-
info.name ||
|
|
38
|
-
info.title ||
|
|
39
|
-
(this.songs[0].name
|
|
40
|
-
? `${this.songs[0].name} and ${this.songs.length - 1} more songs.`
|
|
41
|
-
: `${this.songs.length} songs playlist`);
|
|
42
|
-
this.url = info.url || info.webpage_url;
|
|
43
|
-
this.thumbnail = info.thumbnail?.url || info.thumbnail || this.songs[0].thumbnail;
|
|
44
|
-
if (properties)
|
|
45
|
-
for (const [key, value] of Object.entries(properties))
|
|
46
|
-
this[key] = value;
|
|
47
|
-
this.metadata = metadata;
|
|
48
|
-
}
|
|
49
|
-
get duration() {
|
|
50
|
-
return this.songs?.reduce((prev, next) => prev + (next.duration || 0), 0) || 0;
|
|
51
|
-
}
|
|
52
|
-
get formattedDuration() {
|
|
53
|
-
return (0, __1.formatDuration)(this.duration);
|
|
54
|
-
}
|
|
55
|
-
get member() {
|
|
56
|
-
return __classPrivateFieldGet(this, _Playlist_member, "f");
|
|
57
|
-
}
|
|
58
|
-
set member(member) {
|
|
59
|
-
if (!(0, __1.isMemberInstance)(member))
|
|
60
|
-
return;
|
|
61
|
-
__classPrivateFieldSet(this, _Playlist_member, member, "f");
|
|
62
|
-
this.songs.map(s => s.constructor.name === "Song" && (s.member = this.member));
|
|
63
|
-
}
|
|
64
|
-
get user() {
|
|
65
|
-
return this.member?.user;
|
|
66
|
-
}
|
|
67
|
-
get metadata() {
|
|
68
|
-
return __classPrivateFieldGet(this, _Playlist_metadata, "f");
|
|
69
|
-
}
|
|
70
|
-
set metadata(metadata) {
|
|
71
|
-
__classPrivateFieldSet(this, _Playlist_metadata, metadata, "f");
|
|
72
|
-
this.songs.map(s => s.constructor.name === "Song" && (s.metadata = metadata));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
exports.Playlist = Playlist;
|
|
76
|
-
_Playlist_metadata = new WeakMap(), _Playlist_member = new WeakMap();
|
|
77
|
-
//# sourceMappingURL=Playlist.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Playlist.js","sourceRoot":"","sources":["../../src/struct/Playlist.ts"],"names":[],"mappings":"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","sourcesContent":["import { DisTubeError, formatDuration, isMemberInstance, isRecord } from \"..\";\nimport type ytpl from \"@distube/ytpl\";\nimport type { PlaylistInfo, Song } from \"..\";\nimport type { GuildMember } from \"discord.js\";\n\n/**\n * Class representing a playlist.\n * @prop {string} source Playlist source\n * @template T - The type for the metadata (if any) of the playlist\n */\nexport class Playlist<T = unknown> implements PlaylistInfo {\n source!: string;\n songs!: Song[];\n name!: string;\n #metadata!: T;\n #member?: GuildMember;\n url?: string;\n thumbnail?: string;\n [x: string]: any;\n /**\n * Create a playlist\n * @param {Song[]|PlaylistInfo} playlist Playlist\n * @param {Object} [options] Optional options\n * @param {Discord.GuildMember} [options.member] Requested user\n * @param {Object} [options.properties] Custom properties\n * @param {T} [options.metadata] Playlist metadata\n */\n constructor(\n playlist: Song[] | ytpl.result | PlaylistInfo,\n options: {\n member?: GuildMember;\n properties?: Record<string, any>;\n metadata?: T;\n } = {},\n ) {\n const { member, properties, metadata } = options;\n\n if (typeof playlist !== \"object\") {\n throw new DisTubeError(\"INVALID_TYPE\", [\"Array<Song>\", \"object\"], playlist, \"playlist\");\n }\n if (typeof properties !== \"undefined\" && !isRecord(properties)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", properties, \"properties\");\n }\n // FIXME\n const info = playlist as any;\n /**\n * The source of the playlist\n * @type {string}\n */\n this.source = (info.source || properties?.source || \"youtube\").toLowerCase();\n /**\n * Playlist songs.\n * @type {Array<Song>}\n */\n this.songs = Array.isArray(info) ? info : info.items || info.songs;\n if (!Array.isArray(this.songs) || !this.songs.length) {\n throw new DisTubeError(\"EMPTY_PLAYLIST\");\n }\n this.songs.map(s => s.constructor.name === \"Song\" && (s.playlist = this));\n this.member = member || info.member || undefined;\n /**\n * Playlist name.\n * @type {string}\n */\n this.name =\n info.name ||\n info.title ||\n (this.songs[0].name\n ? `${this.songs[0].name} and ${this.songs.length - 1} more songs.`\n : `${this.songs.length} songs playlist`);\n /**\n * Playlist URL.\n * @type {string}\n */\n this.url = info.url || info.webpage_url;\n /**\n * Playlist thumbnail.\n * @type {string?}\n */\n this.thumbnail = info.thumbnail?.url || info.thumbnail || this.songs[0].thumbnail;\n if (properties) for (const [key, value] of Object.entries(properties)) this[key] = value;\n\n /**\n * Optional metadata that can be used to identify the playlist.\n * @type {T}\n */\n this.metadata = metadata as T;\n }\n\n /**\n * Playlist duration in second.\n * @type {number}\n */\n get duration() {\n return this.songs?.reduce((prev, next) => prev + (next.duration || 0), 0) || 0;\n }\n\n /**\n * Formatted duration string `hh:mm:ss`.\n * @type {string}\n */\n get formattedDuration() {\n return formatDuration(this.duration);\n }\n\n /**\n * User requested.\n * @type {Discord.GuildMember?}\n */\n get member() {\n return this.#member;\n }\n\n set member(member: GuildMember | undefined) {\n if (!isMemberInstance(member)) return;\n this.#member = member;\n this.songs.map(s => s.constructor.name === \"Song\" && (s.member = this.member));\n }\n\n /**\n * User requested.\n * @type {Discord.User?}\n */\n get user() {\n return this.member?.user;\n }\n\n get metadata() {\n return this.#metadata;\n }\n\n set metadata(metadata: T) {\n this.#metadata = metadata;\n this.songs.map(s => s.constructor.name === \"Song\" && (s.metadata = metadata));\n }\n}\n"]}
|
package/dist/struct/Plugin.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import type { Client, GuildTextBasedChannel } from "discord.js";
|
|
2
|
-
import type { Awaitable, DisTube, DisTubeEvents, DisTubeHandler, DisTubeVoiceManager, Options, PluginType, QueueManager, RelatedSong } from "..";
|
|
3
|
-
export declare abstract class Plugin {
|
|
4
|
-
type: PluginType;
|
|
5
|
-
distube: DisTube;
|
|
6
|
-
init(distube: DisTube): void;
|
|
7
|
-
emit(eventName: keyof DisTubeEvents, ...args: any): boolean;
|
|
8
|
-
emitError(error: Error, channel?: GuildTextBasedChannel): void;
|
|
9
|
-
get queues(): QueueManager;
|
|
10
|
-
get voices(): DisTubeVoiceManager;
|
|
11
|
-
get client(): Client;
|
|
12
|
-
get options(): Options;
|
|
13
|
-
get handler(): DisTubeHandler;
|
|
14
|
-
getStreamURL(url: string): Awaitable<string>;
|
|
15
|
-
getRelatedSongs(url: string): Awaitable<RelatedSong[]>;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=Plugin.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/struct/Plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,KAAK,EACV,SAAS,EACT,OAAO,EACP,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,UAAU,EACV,YAAY,EACZ,WAAW,EACZ,MAAM,IAAI,CAAC;AAOZ,8BAAsB,MAAM;IAC1B,IAAI,EAAG,UAAU,CAAC;IAClB,OAAO,EAAG,OAAO,CAAC;IAClB,IAAI,CAAC,OAAO,EAAE,OAAO;IAkBrB,IAAI,CAAC,SAAS,EAAE,MAAM,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,OAAO;IAQ3D,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,qBAAqB;IAQvD,IAAI,MAAM,IAAI,YAAY,CAEzB;IAMD,IAAI,MAAM,IAAI,mBAAmB,CAEhC;IAMD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAMD,IAAI,OAAO,IAAI,OAAO,CAErB;IAMD,IAAI,OAAO,IAAI,cAAc,CAE5B;IAOD,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IAS5C,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;CAGvD"}
|
package/dist/struct/Plugin.js
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Plugin = void 0;
|
|
4
|
-
class Plugin {
|
|
5
|
-
init(distube) {
|
|
6
|
-
this.distube = distube;
|
|
7
|
-
}
|
|
8
|
-
emit(eventName, ...args) {
|
|
9
|
-
return this.distube.emit(eventName, ...args);
|
|
10
|
-
}
|
|
11
|
-
emitError(error, channel) {
|
|
12
|
-
this.distube.emitError(error, channel);
|
|
13
|
-
}
|
|
14
|
-
get queues() {
|
|
15
|
-
return this.distube.queues;
|
|
16
|
-
}
|
|
17
|
-
get voices() {
|
|
18
|
-
return this.distube.voices;
|
|
19
|
-
}
|
|
20
|
-
get client() {
|
|
21
|
-
return this.distube.client;
|
|
22
|
-
}
|
|
23
|
-
get options() {
|
|
24
|
-
return this.distube.options;
|
|
25
|
-
}
|
|
26
|
-
get handler() {
|
|
27
|
-
return this.distube.handler;
|
|
28
|
-
}
|
|
29
|
-
getStreamURL(url) {
|
|
30
|
-
return url;
|
|
31
|
-
}
|
|
32
|
-
getRelatedSongs(url) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
exports.Plugin = Plugin;
|
|
37
|
-
//# sourceMappingURL=Plugin.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/struct/Plugin.ts"],"names":[],"mappings":";;;AAmBA,MAAsB,MAAM;IAG1B,IAAI,CAAC,OAAgB;QAKnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAYD,IAAI,CAAC,SAA8B,EAAE,GAAG,IAAS;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC;IAMD,SAAS,CAAC,KAAY,EAAE,OAA+B;QACrD,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAMD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAMD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAMD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAMD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAMD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAOD,YAAY,CAAC,GAAW;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IAOD,eAAe,CAAC,GAAW;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AA1FD,wBA0FC","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { Client, GuildTextBasedChannel } from \"discord.js\";\nimport type {\n Awaitable,\n DisTube,\n DisTubeEvents,\n DisTubeHandler,\n DisTubeVoiceManager,\n Options,\n PluginType,\n QueueManager,\n RelatedSong,\n} from \"..\";\n\n/**\n * DisTube Plugin\n * @abstract\n * @private\n */\nexport abstract class Plugin {\n type!: PluginType;\n distube!: DisTube;\n init(distube: DisTube) {\n /**\n * DisTube\n * @type {DisTube}\n */\n this.distube = distube;\n }\n /**\n * Type of the plugin\n * @name Plugin#type\n * @type {PluginType}\n */\n /**\n * Emit the {@link DisTube} of this base\n * @param {string} eventName Event name\n * @param {...any} args arguments\n * @returns {boolean}\n */\n emit(eventName: keyof DisTubeEvents, ...args: any): boolean {\n return this.distube.emit(eventName, ...args);\n }\n /**\n * Emit error event\n * @param {Error} error error\n * @param {Discord.BaseGuildTextChannel} [channel] Text channel where the error is encountered.\n */\n emitError(error: Error, channel?: GuildTextBasedChannel) {\n this.distube.emitError(error, channel);\n }\n /**\n * The queue manager\n * @type {QueueManager}\n * @readonly\n */\n get queues(): QueueManager {\n return this.distube.queues;\n }\n /**\n * The voice manager\n * @type {DisTubeVoiceManager}\n * @readonly\n */\n get voices(): DisTubeVoiceManager {\n return this.distube.voices;\n }\n /**\n * Discord.js client\n * @type {Discord.Client}\n * @readonly\n */\n get client(): Client {\n return this.distube.client;\n }\n /**\n * DisTube options\n * @type {DisTubeOptions}\n * @readonly\n */\n get options(): Options {\n return this.distube.options;\n }\n /**\n * DisTube handler\n * @type {DisTubeHandler}\n * @readonly\n */\n get handler(): DisTubeHandler {\n return this.distube.handler;\n }\n /**\n * Get the stream url from {@link Song#url}. Returns {@link Song#url} by default.\n * Not needed if the plugin plays song from YouTube.\n * @param {string} url Input url\n * @returns {string|Promise<string>}\n */\n getStreamURL(url: string): Awaitable<string> {\n return url;\n }\n /**\n * Get related songs from a supported url. {@link Song#member} should be `undefined`.\n * Not needed to add {@link Song#related} because it will be added with this function later.\n * @param {string} url Input url\n * @returns {Song[]|Promise<Song[]>}\n */\n getRelatedSongs(url: string): Awaitable<RelatedSong[]> {\n return [];\n }\n}\n"]}
|
package/dist/struct/Queue.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import { DisTubeBase, FilterManager } from "../core";
|
|
3
|
-
import { RepeatMode, Song, TaskQueue } from "..";
|
|
4
|
-
import type { DisTube, DisTubeVoice, DisTubeVoiceEvents } from "..";
|
|
5
|
-
import type { GuildMember, GuildTextBasedChannel, Snowflake } from "discord.js";
|
|
6
|
-
export declare class Queue extends DisTubeBase {
|
|
7
|
-
#private;
|
|
8
|
-
readonly id: Snowflake;
|
|
9
|
-
voice: DisTubeVoice;
|
|
10
|
-
songs: Song[];
|
|
11
|
-
previousSongs: Song[];
|
|
12
|
-
stopped: boolean;
|
|
13
|
-
_next: boolean;
|
|
14
|
-
_prev: boolean;
|
|
15
|
-
playing: boolean;
|
|
16
|
-
paused: boolean;
|
|
17
|
-
repeatMode: RepeatMode;
|
|
18
|
-
autoplay: boolean;
|
|
19
|
-
beginTime: number;
|
|
20
|
-
textChannel?: GuildTextBasedChannel;
|
|
21
|
-
_emptyTimeout?: NodeJS.Timeout;
|
|
22
|
-
clientMember: GuildMember;
|
|
23
|
-
_taskQueue: TaskQueue;
|
|
24
|
-
_listeners?: DisTubeVoiceEvents;
|
|
25
|
-
constructor(distube: DisTube, voice: DisTubeVoice, song: Song | Song[], textChannel?: GuildTextBasedChannel);
|
|
26
|
-
get filters(): FilterManager;
|
|
27
|
-
get formattedDuration(): string;
|
|
28
|
-
get duration(): number;
|
|
29
|
-
get currentTime(): number;
|
|
30
|
-
get formattedCurrentTime(): string;
|
|
31
|
-
get voiceChannel(): import("discord.js").VoiceBasedChannel | null;
|
|
32
|
-
get volume(): number;
|
|
33
|
-
set volume(value: number);
|
|
34
|
-
addToQueue(song: Song | Song[], position?: number): Queue;
|
|
35
|
-
pause(): Queue;
|
|
36
|
-
resume(): Queue;
|
|
37
|
-
setVolume(percent: number): Queue;
|
|
38
|
-
skip(): Promise<Song>;
|
|
39
|
-
previous(): Promise<Song>;
|
|
40
|
-
shuffle(): Promise<Queue>;
|
|
41
|
-
jump(position: number): Promise<Song>;
|
|
42
|
-
setRepeatMode(mode?: RepeatMode): RepeatMode;
|
|
43
|
-
seek(time: number): Queue;
|
|
44
|
-
addRelatedSong(): Promise<Song>;
|
|
45
|
-
stop(): Promise<void>;
|
|
46
|
-
remove(): void;
|
|
47
|
-
toggleAutoplay(): boolean;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=Queue.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../src/struct/Queue.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAgB,UAAU,EAAE,IAAI,EAAE,SAAS,EAAkB,MAAM,IAAI,CAAC;AAC/E,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,IAAI,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAMhF,qBAAa,KAAM,SAAQ,WAAW;;IACpC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,IAAI,EAAE,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAElB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,aAAa,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IAC/B,YAAY,EAAE,WAAW,CAAC;IAC1B,UAAU,EAAE,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,kBAAkB,CAAC;gBAQpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,WAAW,CAAC,EAAE,qBAAqB;IA+G3G,IAAI,OAAO,kBAEV;IAMD,IAAI,iBAAiB,WAEpB;IAMD,IAAI,QAAQ,WAEX;IAMD,IAAI,WAAW,WAEd;IAMD,IAAI,oBAAoB,WAEvB;IAMD,IAAI,YAAY,kDAEf;IACD,IAAI,MAAM,IAGQ,MAAM,CADvB;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAEvB;IASD,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,QAAQ,SAAI,GAAG,KAAK;IAuBpD,KAAK,IAAI,KAAK;IAWd,MAAM,IAAI,KAAK;IAYf,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAY3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBzB,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;IAuBzB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC3C,aAAa,CAAC,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU;IAc5C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK;IAYnB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,IAAI;IAkBV,MAAM;IAgBN,cAAc,IAAI,OAAO;CAI1B"}
|
package/dist/struct/Queue.js
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _Queue_filters;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.Queue = void 0;
|
|
16
|
-
const core_1 = require("../core");
|
|
17
|
-
const __1 = require("..");
|
|
18
|
-
class Queue extends core_1.DisTubeBase {
|
|
19
|
-
constructor(distube, voice, song, textChannel) {
|
|
20
|
-
super(distube);
|
|
21
|
-
_Queue_filters.set(this, void 0);
|
|
22
|
-
this.clientMember =
|
|
23
|
-
voice.channel.guild?.me ??
|
|
24
|
-
(() => {
|
|
25
|
-
throw new __1.DisTubeError("INVALID_TYPE", "GuildMember", null, "<VoiceChannel>.guild.me");
|
|
26
|
-
})();
|
|
27
|
-
this.voice = voice;
|
|
28
|
-
this.id = voice.id;
|
|
29
|
-
this.volume = 50;
|
|
30
|
-
this.songs = Array.isArray(song) ? [...song] : [song];
|
|
31
|
-
this.previousSongs = [];
|
|
32
|
-
this.stopped = false;
|
|
33
|
-
this._next = false;
|
|
34
|
-
this._prev = false;
|
|
35
|
-
this.playing = true;
|
|
36
|
-
this.paused = false;
|
|
37
|
-
this.repeatMode = __1.RepeatMode.DISABLED;
|
|
38
|
-
this.autoplay = false;
|
|
39
|
-
__classPrivateFieldSet(this, _Queue_filters, new core_1.FilterManager(distube, this), "f");
|
|
40
|
-
this.beginTime = 0;
|
|
41
|
-
this.textChannel = textChannel;
|
|
42
|
-
this._emptyTimeout = undefined;
|
|
43
|
-
this._taskQueue = new __1.TaskQueue();
|
|
44
|
-
this._listeners = undefined;
|
|
45
|
-
}
|
|
46
|
-
get filters() {
|
|
47
|
-
return __classPrivateFieldGet(this, _Queue_filters, "f");
|
|
48
|
-
}
|
|
49
|
-
get formattedDuration() {
|
|
50
|
-
return (0, __1.formatDuration)(this.duration);
|
|
51
|
-
}
|
|
52
|
-
get duration() {
|
|
53
|
-
return this.songs.length ? this.songs.reduce((prev, next) => prev + next.duration, 0) : 0;
|
|
54
|
-
}
|
|
55
|
-
get currentTime() {
|
|
56
|
-
return this.voice.playbackDuration + this.beginTime;
|
|
57
|
-
}
|
|
58
|
-
get formattedCurrentTime() {
|
|
59
|
-
return (0, __1.formatDuration)(this.currentTime);
|
|
60
|
-
}
|
|
61
|
-
get voiceChannel() {
|
|
62
|
-
return this.clientMember.voice.channel;
|
|
63
|
-
}
|
|
64
|
-
get volume() {
|
|
65
|
-
return this.voice.volume;
|
|
66
|
-
}
|
|
67
|
-
set volume(value) {
|
|
68
|
-
this.voice.volume = value;
|
|
69
|
-
}
|
|
70
|
-
addToQueue(song, position = 0) {
|
|
71
|
-
if (!song || (Array.isArray(song) && !song.length)) {
|
|
72
|
-
throw new __1.DisTubeError("INVALID_TYPE", ["Song", "Array<Song>"], song, "song");
|
|
73
|
-
}
|
|
74
|
-
if (typeof position !== "number" || !Number.isInteger(position)) {
|
|
75
|
-
throw new __1.DisTubeError("INVALID_TYPE", "integer", position, "position");
|
|
76
|
-
}
|
|
77
|
-
if (position <= 0) {
|
|
78
|
-
if (Array.isArray(song))
|
|
79
|
-
this.songs.push(...song);
|
|
80
|
-
else
|
|
81
|
-
this.songs.push(song);
|
|
82
|
-
}
|
|
83
|
-
else if (Array.isArray(song)) {
|
|
84
|
-
this.songs.splice(position, 0, ...song);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.songs.splice(position, 0, song);
|
|
88
|
-
}
|
|
89
|
-
if (Array.isArray(song))
|
|
90
|
-
song.map(s => delete s.formats);
|
|
91
|
-
else
|
|
92
|
-
delete song.formats;
|
|
93
|
-
return this;
|
|
94
|
-
}
|
|
95
|
-
pause() {
|
|
96
|
-
if (this.paused)
|
|
97
|
-
throw new __1.DisTubeError("PAUSED");
|
|
98
|
-
this.playing = false;
|
|
99
|
-
this.paused = true;
|
|
100
|
-
this.voice.pause();
|
|
101
|
-
return this;
|
|
102
|
-
}
|
|
103
|
-
resume() {
|
|
104
|
-
if (this.playing)
|
|
105
|
-
throw new __1.DisTubeError("RESUMED");
|
|
106
|
-
this.playing = true;
|
|
107
|
-
this.paused = false;
|
|
108
|
-
this.voice.unpause();
|
|
109
|
-
return this;
|
|
110
|
-
}
|
|
111
|
-
setVolume(percent) {
|
|
112
|
-
this.volume = percent;
|
|
113
|
-
return this;
|
|
114
|
-
}
|
|
115
|
-
async skip() {
|
|
116
|
-
await this._taskQueue.queuing();
|
|
117
|
-
try {
|
|
118
|
-
if (this.songs.length <= 1) {
|
|
119
|
-
if (this.autoplay)
|
|
120
|
-
await this.addRelatedSong();
|
|
121
|
-
else
|
|
122
|
-
throw new __1.DisTubeError("NO_UP_NEXT");
|
|
123
|
-
}
|
|
124
|
-
const song = this.songs[1];
|
|
125
|
-
this._next = true;
|
|
126
|
-
this.voice.stop();
|
|
127
|
-
return song;
|
|
128
|
-
}
|
|
129
|
-
finally {
|
|
130
|
-
this._taskQueue.resolve();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async previous() {
|
|
134
|
-
await this._taskQueue.queuing();
|
|
135
|
-
try {
|
|
136
|
-
if (!this.options.savePreviousSongs)
|
|
137
|
-
throw new __1.DisTubeError("DISABLED_OPTION", "savePreviousSongs");
|
|
138
|
-
if (this.previousSongs?.length === 0 && this.repeatMode !== __1.RepeatMode.QUEUE) {
|
|
139
|
-
throw new __1.DisTubeError("NO_PREVIOUS");
|
|
140
|
-
}
|
|
141
|
-
const song = this.repeatMode === 2 ? this.songs[this.songs.length - 1] : this.previousSongs[this.previousSongs.length - 1];
|
|
142
|
-
this._prev = true;
|
|
143
|
-
this.voice.stop();
|
|
144
|
-
return song;
|
|
145
|
-
}
|
|
146
|
-
finally {
|
|
147
|
-
this._taskQueue.resolve();
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
async shuffle() {
|
|
151
|
-
await this._taskQueue.queuing();
|
|
152
|
-
try {
|
|
153
|
-
const playing = this.songs.shift();
|
|
154
|
-
if (playing === undefined)
|
|
155
|
-
return this;
|
|
156
|
-
for (let i = this.songs.length - 1; i > 0; i--) {
|
|
157
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
158
|
-
[this.songs[i], this.songs[j]] = [this.songs[j], this.songs[i]];
|
|
159
|
-
}
|
|
160
|
-
this.songs.unshift(playing);
|
|
161
|
-
return this;
|
|
162
|
-
}
|
|
163
|
-
finally {
|
|
164
|
-
this._taskQueue.resolve();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
async jump(position) {
|
|
168
|
-
await this._taskQueue.queuing();
|
|
169
|
-
try {
|
|
170
|
-
if (typeof position !== "number")
|
|
171
|
-
throw new __1.DisTubeError("INVALID_TYPE", "number", position, "position");
|
|
172
|
-
if (!position || position > this.songs.length || -position > this.previousSongs.length) {
|
|
173
|
-
throw new __1.DisTubeError("NO_SONG_POSITION");
|
|
174
|
-
}
|
|
175
|
-
let nextSong;
|
|
176
|
-
if (position > 0) {
|
|
177
|
-
const nextSongs = this.songs.splice(position - 1);
|
|
178
|
-
if (this.options.savePreviousSongs) {
|
|
179
|
-
this.previousSongs.push(...this.songs);
|
|
180
|
-
}
|
|
181
|
-
else {
|
|
182
|
-
this.previousSongs.push(...this.songs.map(s => ({ id: s.id })));
|
|
183
|
-
}
|
|
184
|
-
this.songs = nextSongs;
|
|
185
|
-
this._next = true;
|
|
186
|
-
nextSong = nextSongs[1];
|
|
187
|
-
}
|
|
188
|
-
else if (!this.options.savePreviousSongs) {
|
|
189
|
-
throw new __1.DisTubeError("DISABLED_OPTION", "savePreviousSongs");
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
this._prev = true;
|
|
193
|
-
if (position !== -1)
|
|
194
|
-
this.songs.unshift(...this.previousSongs.splice(position + 1));
|
|
195
|
-
nextSong = this.previousSongs[this.previousSongs.length - 1];
|
|
196
|
-
}
|
|
197
|
-
this.voice.stop();
|
|
198
|
-
return nextSong;
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
this._taskQueue.resolve();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
setRepeatMode(mode) {
|
|
205
|
-
if (mode !== undefined && !Object.values(__1.RepeatMode).includes(mode)) {
|
|
206
|
-
throw new __1.DisTubeError("INVALID_TYPE", ["RepeatMode", "undefined"], mode, "mode");
|
|
207
|
-
}
|
|
208
|
-
if (mode === undefined)
|
|
209
|
-
this.repeatMode = (this.repeatMode + 1) % 3;
|
|
210
|
-
else if (this.repeatMode === mode)
|
|
211
|
-
this.repeatMode = __1.RepeatMode.DISABLED;
|
|
212
|
-
else
|
|
213
|
-
this.repeatMode = mode;
|
|
214
|
-
return this.repeatMode;
|
|
215
|
-
}
|
|
216
|
-
seek(time) {
|
|
217
|
-
if (typeof time !== "number")
|
|
218
|
-
throw new __1.DisTubeError("INVALID_TYPE", "number", time, "time");
|
|
219
|
-
if (isNaN(time) || time < 0)
|
|
220
|
-
throw new __1.DisTubeError("NUMBER_COMPARE", "time", "bigger or equal to", 0);
|
|
221
|
-
this.beginTime = time;
|
|
222
|
-
this.queues.playSong(this);
|
|
223
|
-
return this;
|
|
224
|
-
}
|
|
225
|
-
async addRelatedSong() {
|
|
226
|
-
if (!this.songs?.[0])
|
|
227
|
-
throw new __1.DisTubeError("NO_PLAYING");
|
|
228
|
-
const related = this.songs[0].related.find(v => !this.previousSongs.map(s => s.id).includes(v.id));
|
|
229
|
-
if (!related || !(related instanceof __1.Song))
|
|
230
|
-
throw new __1.DisTubeError("NO_RELATED");
|
|
231
|
-
const song = await this.handler.resolveSong(related, { member: this.clientMember, metadata: related.metadata });
|
|
232
|
-
if (!(song instanceof __1.Song))
|
|
233
|
-
throw new __1.DisTubeError("CANNOT_PLAY_RELATED");
|
|
234
|
-
this.addToQueue(song);
|
|
235
|
-
return song;
|
|
236
|
-
}
|
|
237
|
-
async stop() {
|
|
238
|
-
await this._taskQueue.queuing();
|
|
239
|
-
try {
|
|
240
|
-
this.playing = false;
|
|
241
|
-
this.paused = false;
|
|
242
|
-
this.stopped = true;
|
|
243
|
-
if (this.options.leaveOnStop)
|
|
244
|
-
this.voice.leave();
|
|
245
|
-
else
|
|
246
|
-
this.voice.stop();
|
|
247
|
-
this.remove();
|
|
248
|
-
}
|
|
249
|
-
finally {
|
|
250
|
-
this._taskQueue.resolve();
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
remove() {
|
|
254
|
-
this.stopped = true;
|
|
255
|
-
this.songs = [];
|
|
256
|
-
this.previousSongs = [];
|
|
257
|
-
if (this._listeners) {
|
|
258
|
-
for (const event of Object.keys(this._listeners)) {
|
|
259
|
-
this.voice.removeListener(event, this._listeners[event]);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
this.queues.remove(this.id);
|
|
263
|
-
this.emit("deleteQueue", this);
|
|
264
|
-
}
|
|
265
|
-
toggleAutoplay() {
|
|
266
|
-
this.autoplay = !this.autoplay;
|
|
267
|
-
return this.autoplay;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
exports.Queue = Queue;
|
|
271
|
-
_Queue_filters = new WeakMap();
|
|
272
|
-
//# sourceMappingURL=Queue.js.map
|
package/dist/struct/Queue.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Queue.js","sourceRoot":"","sources":["../../src/struct/Queue.ts"],"names":[],"mappings":"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","sourcesContent":["import { DisTubeBase, FilterManager } from \"../core\";\nimport { DisTubeError, RepeatMode, Song, TaskQueue, formatDuration } from \"..\";\nimport type { DisTube, DisTubeVoice, DisTubeVoiceEvents } from \"..\";\nimport type { GuildMember, GuildTextBasedChannel, Snowflake } from \"discord.js\";\n\n/**\n * Represents a queue.\n * @extends DisTubeBase\n */\nexport class Queue extends DisTubeBase {\n readonly id: Snowflake;\n voice: DisTubeVoice;\n songs: Song[];\n previousSongs: Song[];\n stopped: boolean;\n _next: boolean;\n _prev: boolean;\n playing: boolean;\n paused: boolean;\n repeatMode: RepeatMode;\n autoplay: boolean;\n #filters: FilterManager;\n beginTime: number;\n textChannel?: GuildTextBasedChannel;\n _emptyTimeout?: NodeJS.Timeout;\n clientMember: GuildMember;\n _taskQueue: TaskQueue;\n _listeners?: DisTubeVoiceEvents;\n /**\n * Create a queue for the guild\n * @param {DisTube} distube DisTube\n * @param {DisTubeVoice} voice Voice connection\n * @param {Song|Song[]} song First song(s)\n * @param {Discord.BaseGuildTextChannel?} textChannel Default text channel\n */\n constructor(distube: DisTube, voice: DisTubeVoice, song: Song | Song[], textChannel?: GuildTextBasedChannel) {\n super(distube);\n /**\n * The client user as a `GuildMember` of this queue's guild\n * @type {Discord.GuildMember}\n */\n this.clientMember =\n voice.channel.guild?.me ??\n (() => {\n throw new DisTubeError(\"INVALID_TYPE\", \"GuildMember\", null, \"<VoiceChannel>.guild.me\");\n })();\n /**\n * Voice connection of this queue.\n * @type {DisTubeVoice}\n */\n this.voice = voice;\n /**\n * Queue id (Guild id)\n * @type {Discord.Snowflake}\n */\n this.id = voice.id;\n /**\n * Get or set the stream volume. Default value: `50`.\n * @type {number}\n */\n this.volume = 50;\n /**\n * List of songs in the queue (The first one is the playing song)\n * @type {Array<Song>}\n */\n this.songs = Array.isArray(song) ? [...song] : [song];\n /**\n * List of the previous songs.\n * @type {Array<Song>}\n */\n this.previousSongs = [];\n /**\n * Whether stream is currently stopped.\n * @type {boolean}\n * @private\n */\n this.stopped = false;\n /**\n * Whether or not the last song was skipped to next song.\n * @type {boolean}\n * @private\n */\n this._next = false;\n /**\n * Whether or not the last song was skipped to previous song.\n * @type {boolean}\n * @private\n */\n this._prev = false;\n /**\n * Whether or not the stream is currently playing.\n * @type {boolean}\n */\n this.playing = true;\n /**\n * Whether or not the stream is currently paused.\n * @type {boolean}\n */\n this.paused = false;\n /**\n * Type of repeat mode (`0` is disabled, `1` is repeating a song, `2` is repeating all the queue).\n * Default value: `0` (disabled)\n * @type {RepeatMode}\n */\n this.repeatMode = RepeatMode.DISABLED;\n /**\n * Whether or not the autoplay mode is enabled.\n * Default value: `false`\n * @type {boolean}\n */\n this.autoplay = false;\n this.#filters = new FilterManager(distube, this);\n /**\n * What time in the song to begin (in seconds).\n * @type {number}\n */\n this.beginTime = 0;\n /**\n * The text channel of the Queue. (Default: where the first command is called).\n * @type {Discord.TextChannel?}\n */\n this.textChannel = textChannel;\n /**\n * Timeout for checking empty channel\n * @type {*}\n * @private\n */\n this._emptyTimeout = undefined;\n /**\n * Task queuing system\n * @type {TaskQueue}\n * @private\n */\n this._taskQueue = new TaskQueue();\n /**\n * DisTubeVoice listener\n * @type {Object}\n * @private\n */\n this._listeners = undefined;\n }\n /**\n * The filter manager of the queue\n * @type {FilterManager}\n * @readonly\n */\n get filters() {\n return this.#filters;\n }\n /**\n * Formatted duration string.\n * @type {string}\n * @readonly\n */\n get formattedDuration() {\n return formatDuration(this.duration);\n }\n /**\n * Queue's duration.\n * @type {number}\n * @readonly\n */\n get duration() {\n return this.songs.length ? this.songs.reduce((prev, next) => prev + next.duration, 0) : 0;\n }\n /**\n * What time in the song is playing (in seconds).\n * @type {number}\n * @readonly\n */\n get currentTime() {\n return this.voice.playbackDuration + this.beginTime;\n }\n /**\n * Formatted {@link Queue#currentTime} string.\n * @type {string}\n * @readonly\n */\n get formattedCurrentTime() {\n return formatDuration(this.currentTime);\n }\n /**\n * The voice channel playing in.\n * @type {Discord.VoiceChannel|Discord.StageChannel|null}\n * @readonly\n */\n get voiceChannel() {\n return this.clientMember.voice.channel;\n }\n get volume() {\n return this.voice.volume;\n }\n set volume(value: number) {\n this.voice.volume = value;\n }\n /**\n * @private\n * Add a Song or an array of Song to the queue\n * @param {Song|Song[]} song Song to add\n * @param {number} [position=0] Position to add, <= 0 to add to the end of the queue\n * @throws {Error}\n * @returns {Queue} The guild queue\n */\n addToQueue(song: Song | Song[], position = 0): Queue {\n if (!song || (Array.isArray(song) && !song.length)) {\n throw new DisTubeError(\"INVALID_TYPE\", [\"Song\", \"Array<Song>\"], song, \"song\");\n }\n if (typeof position !== \"number\" || !Number.isInteger(position)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"integer\", position, \"position\");\n }\n if (position <= 0) {\n if (Array.isArray(song)) this.songs.push(...song);\n else this.songs.push(song);\n } else if (Array.isArray(song)) {\n this.songs.splice(position, 0, ...song);\n } else {\n this.songs.splice(position, 0, song);\n }\n if (Array.isArray(song)) song.map(s => delete s.formats);\n else delete song.formats;\n return this;\n }\n /**\n * Pause the guild stream\n * @returns {Queue} The guild queue\n */\n pause(): Queue {\n if (this.paused) throw new DisTubeError(\"PAUSED\");\n this.playing = false;\n this.paused = true;\n this.voice.pause();\n return this;\n }\n /**\n * Resume the guild stream\n * @returns {Queue} The guild queue\n */\n resume(): Queue {\n if (this.playing) throw new DisTubeError(\"RESUMED\");\n this.playing = true;\n this.paused = false;\n this.voice.unpause();\n return this;\n }\n /**\n * Set the guild stream's volume\n * @param {number} percent The percentage of volume you want to set\n * @returns {Queue} The guild queue\n */\n setVolume(percent: number): Queue {\n this.volume = percent;\n return this;\n }\n\n /**\n * Skip the playing song if there is a next song in the queue.\n * <info>If {@link Queue#autoplay} is `true` and there is no up next song,\n * DisTube will add and play a related song.</info>\n * @returns {Promise<Song>} The song will skip to\n * @throws {Error}\n */\n async skip(): Promise<Song> {\n await this._taskQueue.queuing();\n try {\n if (this.songs.length <= 1) {\n if (this.autoplay) await this.addRelatedSong();\n else throw new DisTubeError(\"NO_UP_NEXT\");\n }\n const song = this.songs[1];\n this._next = true;\n this.voice.stop();\n return song;\n } finally {\n this._taskQueue.resolve();\n }\n }\n\n /**\n * Play the previous song if exists\n * @returns {Song} The guild queue\n * @throws {Error}\n */\n async previous(): Promise<Song> {\n await this._taskQueue.queuing();\n try {\n if (!this.options.savePreviousSongs) throw new DisTubeError(\"DISABLED_OPTION\", \"savePreviousSongs\");\n if (this.previousSongs?.length === 0 && this.repeatMode !== RepeatMode.QUEUE) {\n throw new DisTubeError(\"NO_PREVIOUS\");\n }\n const song =\n this.repeatMode === 2 ? this.songs[this.songs.length - 1] : this.previousSongs[this.previousSongs.length - 1];\n this._prev = true;\n this.voice.stop();\n return song;\n } finally {\n this._taskQueue.resolve();\n }\n }\n /**\n * Shuffle the queue's songs\n * @returns {Promise<Queue>} The guild queue\n */\n async shuffle(): Promise<Queue> {\n await this._taskQueue.queuing();\n try {\n const playing = this.songs.shift();\n if (playing === undefined) return this;\n for (let i = this.songs.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [this.songs[i], this.songs[j]] = [this.songs[j], this.songs[i]];\n }\n this.songs.unshift(playing);\n return this;\n } finally {\n this._taskQueue.resolve();\n }\n }\n /**\n * Jump to the song position in the queue.\n * The next one is 1, 2,...\n * The previous one is -1, -2,...\n * @param {number} position The song position to play\n * @returns {Promise<Song>} The new Song will be played\n * @throws {Error} if `num` is invalid number\n */\n async jump(position: number): Promise<Song> {\n await this._taskQueue.queuing();\n try {\n if (typeof position !== \"number\") throw new DisTubeError(\"INVALID_TYPE\", \"number\", position, \"position\");\n if (!position || position > this.songs.length || -position > this.previousSongs.length) {\n throw new DisTubeError(\"NO_SONG_POSITION\");\n }\n let nextSong: Song;\n if (position > 0) {\n const nextSongs = this.songs.splice(position - 1);\n if (this.options.savePreviousSongs) {\n this.previousSongs.push(...this.songs);\n } else {\n this.previousSongs.push(...this.songs.map(s => ({ id: s.id } as Song)));\n }\n this.songs = nextSongs;\n this._next = true;\n nextSong = nextSongs[1];\n } else if (!this.options.savePreviousSongs) {\n throw new DisTubeError(\"DISABLED_OPTION\", \"savePreviousSongs\");\n } else {\n this._prev = true;\n if (position !== -1) this.songs.unshift(...this.previousSongs.splice(position + 1));\n nextSong = this.previousSongs[this.previousSongs.length - 1];\n }\n this.voice.stop();\n return nextSong;\n } finally {\n this._taskQueue.resolve();\n }\n }\n /**\n * Set the repeat mode of the guild queue.\\\n * Toggle mode `(Disabled -> Song -> Queue -> Disabled ->...)` if `mode` is `undefined`\n * @param {RepeatMode?} [mode] The repeat modes (toggle if `undefined`)\n * @returns {RepeatMode} The new repeat mode\n */\n setRepeatMode(mode?: RepeatMode): RepeatMode {\n if (mode !== undefined && !Object.values(RepeatMode).includes(mode)) {\n throw new DisTubeError(\"INVALID_TYPE\", [\"RepeatMode\", \"undefined\"], mode, \"mode\");\n }\n if (mode === undefined) this.repeatMode = (this.repeatMode + 1) % 3;\n else if (this.repeatMode === mode) this.repeatMode = RepeatMode.DISABLED;\n else this.repeatMode = mode;\n return this.repeatMode;\n }\n /**\n * Set the playing time to another position\n * @param {number} time Time in seconds\n * @returns {Queue} The guild queue\n */\n seek(time: number): Queue {\n if (typeof time !== \"number\") throw new DisTubeError(\"INVALID_TYPE\", \"number\", time, \"time\");\n if (isNaN(time) || time < 0) throw new DisTubeError(\"NUMBER_COMPARE\", \"time\", \"bigger or equal to\", 0);\n this.beginTime = time;\n this.queues.playSong(this);\n return this;\n }\n /**\n * Add a related song of the playing song to the queue\n * @returns {Promise<Song>} The added song\n * @throws {Error}\n */\n async addRelatedSong(): Promise<Song> {\n if (!this.songs?.[0]) throw new DisTubeError(\"NO_PLAYING\");\n const related = this.songs[0].related.find(v => !this.previousSongs.map(s => s.id).includes(v.id));\n if (!related || !(related instanceof Song)) throw new DisTubeError(\"NO_RELATED\");\n const song = await this.handler.resolveSong(related, { member: this.clientMember, metadata: related.metadata });\n if (!(song instanceof Song)) throw new DisTubeError(\"CANNOT_PLAY_RELATED\");\n this.addToQueue(song);\n return song;\n }\n /**\n * Stop the guild stream and delete the queue\n */\n async stop() {\n await this._taskQueue.queuing();\n try {\n this.playing = false;\n this.paused = false;\n this.stopped = true;\n if (this.options.leaveOnStop) this.voice.leave();\n else this.voice.stop();\n this.remove();\n } finally {\n this._taskQueue.resolve();\n }\n }\n /**\n * Remove the queue from the manager\n * (This does not leave the voice channel even if {@link DisTubeOptions|DisTubeOptions.leaveOnStop} is enabled)\n * @private\n */\n remove() {\n this.stopped = true;\n this.songs = [];\n this.previousSongs = [];\n if (this._listeners) {\n for (const event of Object.keys(this._listeners) as (keyof DisTubeVoiceEvents)[]) {\n this.voice.removeListener(event, this._listeners[event]);\n }\n }\n this.queues.remove(this.id);\n this.emit(\"deleteQueue\", this);\n }\n /**\n * Toggle autoplay mode\n * @returns {boolean} Autoplay mode state\n */\n toggleAutoplay(): boolean {\n this.autoplay = !this.autoplay;\n return this.autoplay;\n }\n}\n"]}
|