magmastream 2.7.0 → 2.7.2
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/dist/index.d.ts +72 -37
- package/dist/structures/Manager.js +53 -36
- package/dist/structures/Node.js +52 -46
- package/dist/structures/Player.js +35 -40
- package/dist/structures/Queue.js +21 -21
- package/dist/structures/Rest.js +6 -5
- package/dist/structures/Utils.js +9 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1261,7 +1261,14 @@ interface UnresolvedQuery {
|
|
|
1261
1261
|
duration?: number;
|
|
1262
1262
|
}
|
|
1263
1263
|
type Sizes = "0" | "1" | "2" | "3" | "default" | "mqdefault" | "hqdefault" | "maxresdefault";
|
|
1264
|
-
|
|
1264
|
+
declare enum LoadTypes {
|
|
1265
|
+
Track = "track",
|
|
1266
|
+
Playlist = "playlist",
|
|
1267
|
+
Search = "search",
|
|
1268
|
+
Empty = "empty",
|
|
1269
|
+
Error = "error"
|
|
1270
|
+
}
|
|
1271
|
+
type LoadType = keyof typeof LoadTypes;
|
|
1265
1272
|
type State = "CONNECTED" | "CONNECTING" | "DISCONNECTED" | "DISCONNECTING" | "DESTROYING";
|
|
1266
1273
|
type SponsorBlockSegmentEvents = SponsorBlockSegmentSkipped | SponsorBlockSegmentsLoaded | SponsorBlockChapterStarted | SponsorBlockChaptersLoaded;
|
|
1267
1274
|
type SponsorBlockSegmentEventType = "SegmentSkipped" | "SegmentsLoaded" | "ChapterStarted" | "ChaptersLoaded";
|
|
@@ -1672,16 +1679,16 @@ declare enum SearchPlatform {
|
|
|
1672
1679
|
Bandcamp = "bcsearch"
|
|
1673
1680
|
}
|
|
1674
1681
|
declare enum PlayerStateEventTypes {
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1682
|
+
AutoPlayChange = "playerAutoplay",
|
|
1683
|
+
ConnectionChange = "playerConnection",
|
|
1684
|
+
RepeatChange = "playerRepeat",
|
|
1685
|
+
PauseChange = "playerPause",
|
|
1686
|
+
QueueChange = "queueChange",
|
|
1687
|
+
TrackChange = "trackChange",
|
|
1688
|
+
VolumeChange = "volumeChange",
|
|
1689
|
+
ChannelChange = "channelChange",
|
|
1690
|
+
PlayerCreate = "playerCreate",
|
|
1691
|
+
PlayerDestroy = "playerDestroy"
|
|
1685
1692
|
}
|
|
1686
1693
|
interface PlayerStateUpdateEvent {
|
|
1687
1694
|
changeType: PlayerStateEventTypes;
|
|
@@ -1731,12 +1738,12 @@ interface SearchQuery {
|
|
|
1731
1738
|
query: string;
|
|
1732
1739
|
}
|
|
1733
1740
|
interface LavalinkResponse {
|
|
1734
|
-
loadType:
|
|
1741
|
+
loadType: LoadTypes;
|
|
1735
1742
|
data: TrackData[] | PlaylistRawData;
|
|
1736
1743
|
}
|
|
1737
1744
|
interface SearchResult {
|
|
1738
1745
|
/** The load type of the result. */
|
|
1739
|
-
loadType:
|
|
1746
|
+
loadType: LoadTypes;
|
|
1740
1747
|
/** The array of tracks from the result. */
|
|
1741
1748
|
tracks: Track[];
|
|
1742
1749
|
/** The playlist info if the load type is 'playlist'. */
|
|
@@ -1776,33 +1783,61 @@ interface PlaylistData {
|
|
|
1776
1783
|
/** The songs of the playlist. */
|
|
1777
1784
|
tracks: Track[];
|
|
1778
1785
|
}
|
|
1786
|
+
declare enum ManagerEventTypes {
|
|
1787
|
+
Debug = "debug",
|
|
1788
|
+
NodeCreate = "nodeCreate",
|
|
1789
|
+
NodeDestroy = "nodeDestroy",
|
|
1790
|
+
NodeConnect = "nodeConnect",
|
|
1791
|
+
NodeReconnect = "nodeReconnect",
|
|
1792
|
+
NodeDisconnect = "nodeDisconnect",
|
|
1793
|
+
NodeError = "nodeError",
|
|
1794
|
+
NodeRaw = "nodeRaw",
|
|
1795
|
+
PlayerCreate = "playerCreate",
|
|
1796
|
+
PlayerDestroy = "playerDestroy",
|
|
1797
|
+
PlayerStateUpdate = "playerStateUpdate",
|
|
1798
|
+
PlayerMove = "playerMove",
|
|
1799
|
+
PlayerDisconnect = "playerDisconnect",
|
|
1800
|
+
QueueEnd = "queueEnd",
|
|
1801
|
+
SocketClosed = "socketClosed",
|
|
1802
|
+
TrackStart = "trackStart",
|
|
1803
|
+
TrackEnd = "trackEnd",
|
|
1804
|
+
TrackEndReason = "trackEndReason",
|
|
1805
|
+
TrackEndReasonRaw = "trackEndReasonRaw",
|
|
1806
|
+
TrackEndReasonData = "trackEndReasonData",
|
|
1807
|
+
TrackStuck = "trackStuck",
|
|
1808
|
+
TrackError = "trackError",
|
|
1809
|
+
SegmentsLoaded = "segmentsLoaded",
|
|
1810
|
+
SegmentSkipped = "segmentSkipped",
|
|
1811
|
+
ChapterStarted = "chapterStarted",
|
|
1812
|
+
ChaptersLoaded = "chaptersLoaded"
|
|
1813
|
+
}
|
|
1779
1814
|
interface ManagerEvents {
|
|
1780
|
-
|
|
1781
|
-
|
|
1782
|
-
|
|
1783
|
-
|
|
1784
|
-
|
|
1785
|
-
|
|
1815
|
+
[ManagerEventTypes.Debug]: [info: string];
|
|
1816
|
+
[ManagerEventTypes.NodeCreate]: [node: Node];
|
|
1817
|
+
[ManagerEventTypes.NodeDestroy]: [node: Node];
|
|
1818
|
+
[ManagerEventTypes.NodeConnect]: [node: Node];
|
|
1819
|
+
[ManagerEventTypes.NodeReconnect]: [node: Node];
|
|
1820
|
+
[ManagerEventTypes.NodeDisconnect]: [node: Node, reason: {
|
|
1786
1821
|
code?: number;
|
|
1787
1822
|
reason?: string;
|
|
1788
1823
|
}];
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
|
|
1805
|
-
|
|
1824
|
+
[ManagerEventTypes.NodeError]: [node: Node, error: Error];
|
|
1825
|
+
[ManagerEventTypes.NodeRaw]: [payload: unknown];
|
|
1826
|
+
[ManagerEventTypes.PlayerCreate]: [player: Player];
|
|
1827
|
+
[ManagerEventTypes.PlayerDestroy]: [player: Player];
|
|
1828
|
+
[ManagerEventTypes.PlayerStateUpdate]: [oldPlayer: Player, newPlayer: Player, changeType: PlayerStateUpdateEvent];
|
|
1829
|
+
[ManagerEventTypes.PlayerMove]: [player: Player, initChannel: string, newChannel: string];
|
|
1830
|
+
[ManagerEventTypes.PlayerDisconnect]: [player: Player, oldChannel: string];
|
|
1831
|
+
[ManagerEventTypes.QueueEnd]: [player: Player, track: Track | UnresolvedTrack, payload: TrackEndEvent];
|
|
1832
|
+
[ManagerEventTypes.SocketClosed]: [player: Player, payload: WebSocketClosedEvent];
|
|
1833
|
+
[ManagerEventTypes.TrackStart]: [player: Player, track: Track, payload: TrackStartEvent];
|
|
1834
|
+
[ManagerEventTypes.TrackEnd]: [player: Player, track: Track, payload: TrackEndEvent];
|
|
1835
|
+
[ManagerEventTypes.TrackStuck]: [player: Player, track: Track, payload: TrackStuckEvent];
|
|
1836
|
+
[ManagerEventTypes.TrackError]: [player: Player, track: Track | UnresolvedTrack, payload: TrackExceptionEvent];
|
|
1837
|
+
[ManagerEventTypes.SegmentsLoaded]: [player: Player, track: Track | UnresolvedTrack, payload: SponsorBlockSegmentsLoaded];
|
|
1838
|
+
[ManagerEventTypes.SegmentSkipped]: [player: Player, track: Track | UnresolvedTrack, payload: SponsorBlockSegmentSkipped];
|
|
1839
|
+
[ManagerEventTypes.ChapterStarted]: [player: Player, track: Track | UnresolvedTrack, payload: SponsorBlockChapterStarted];
|
|
1840
|
+
[ManagerEventTypes.ChaptersLoaded]: [player: Player, track: Track | UnresolvedTrack, payload: SponsorBlockChaptersLoaded];
|
|
1806
1841
|
}
|
|
1807
1842
|
|
|
1808
|
-
export { type CPUStats, type EqualizerBand, type Exception, type Extendable, type FrameStats, type LavalinkInfo, type LavalinkResponse, type LoadType, Manager, type ManagerEvents, type ManagerOptions, type MemoryStats, Node, type NodeMessage, type NodeOptions, type NodeStats, type Payload, type PlayOptions, Player, type PlayerEvent, type PlayerEventType, type PlayerEvents, type PlayerOptions, PlayerStateEventTypes, type PlayerUpdate, type PlaylistData, type PlaylistInfoData, type PlaylistRawData, Plugin, Queue, SearchPlatform, type SearchQuery, type SearchResult, type Severity, type Sizes, type SponsorBlockChapterStarted, type SponsorBlockChaptersLoaded, type SponsorBlockSegment, type SponsorBlockSegmentEventType, type SponsorBlockSegmentEvents, type SponsorBlockSegmentSkipped, type SponsorBlockSegmentsLoaded, type State, Structure, type Track, type TrackData, type TrackDataInfo, type TrackEndEvent, type TrackEndReason, type TrackExceptionEvent, type TrackPluginInfo, type TrackSourceName, type TrackStartEvent, type TrackStuckEvent, TrackUtils, type UnresolvedQuery, type UnresolvedTrack, type UseNodeOption, UseNodeOptions, type VoicePacket, type VoiceServer, type VoiceState, type WebSocketClosedEvent, validSponsorBlocks };
|
|
1843
|
+
export { type CPUStats, type EqualizerBand, type Exception, type Extendable, type FrameStats, type LavalinkInfo, type LavalinkResponse, type LoadType, LoadTypes, Manager, ManagerEventTypes, type ManagerEvents, type ManagerOptions, type MemoryStats, Node, type NodeMessage, type NodeOptions, type NodeStats, type Payload, type PlayOptions, Player, type PlayerEvent, type PlayerEventType, type PlayerEvents, type PlayerOptions, PlayerStateEventTypes, type PlayerUpdate, type PlaylistData, type PlaylistInfoData, type PlaylistRawData, Plugin, Queue, SearchPlatform, type SearchQuery, type SearchResult, type Severity, type Sizes, type SponsorBlockChapterStarted, type SponsorBlockChaptersLoaded, type SponsorBlockSegment, type SponsorBlockSegmentEventType, type SponsorBlockSegmentEvents, type SponsorBlockSegmentSkipped, type SponsorBlockSegmentsLoaded, type State, Structure, type Track, type TrackData, type TrackDataInfo, type TrackEndEvent, type TrackEndReason, type TrackExceptionEvent, type TrackPluginInfo, type TrackSourceName, type TrackStartEvent, type TrackStuckEvent, TrackUtils, type UnresolvedQuery, type UnresolvedTrack, type UseNodeOption, UseNodeOptions, type VoicePacket, type VoiceServer, type VoiceState, type WebSocketClosedEvent, validSponsorBlocks };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PlayerStateEventTypes = exports.SearchPlatform = exports.UseNodeOptions = exports.Manager = void 0;
|
|
3
|
+
exports.ManagerEventTypes = exports.PlayerStateEventTypes = exports.SearchPlatform = exports.UseNodeOptions = exports.Manager = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
/* eslint-disable no-async-promise-executor */
|
|
6
6
|
const Utils_1 = require("./Utils");
|
|
@@ -336,9 +336,9 @@ class Manager extends events_1.EventEmitter {
|
|
|
336
336
|
// The events to listen for
|
|
337
337
|
const events = [
|
|
338
338
|
// The player state has been updated
|
|
339
|
-
|
|
339
|
+
ManagerEventTypes.PlayerStateUpdate,
|
|
340
340
|
// The player has been destroyed
|
|
341
|
-
|
|
341
|
+
ManagerEventTypes.PlayerDestroy,
|
|
342
342
|
];
|
|
343
343
|
// Register the events
|
|
344
344
|
for (const event of events) {
|
|
@@ -500,19 +500,19 @@ class Manager extends events_1.EventEmitter {
|
|
|
500
500
|
let searchData = [];
|
|
501
501
|
let playlistData;
|
|
502
502
|
switch (res.loadType) {
|
|
503
|
-
case
|
|
503
|
+
case Utils_1.LoadTypes.Search:
|
|
504
504
|
searchData = res.data;
|
|
505
505
|
break;
|
|
506
|
-
case
|
|
506
|
+
case Utils_1.LoadTypes.Track:
|
|
507
507
|
searchData = [res.data];
|
|
508
508
|
break;
|
|
509
|
-
case
|
|
509
|
+
case Utils_1.LoadTypes.Playlist:
|
|
510
510
|
playlistData = res.data;
|
|
511
511
|
break;
|
|
512
512
|
}
|
|
513
513
|
const tracks = searchData.map((track) => Utils_1.TrackUtils.build(track, requester));
|
|
514
514
|
let playlist = null;
|
|
515
|
-
if (res.loadType ===
|
|
515
|
+
if (res.loadType === Utils_1.LoadTypes.Playlist) {
|
|
516
516
|
playlist = {
|
|
517
517
|
name: playlistData.info.name,
|
|
518
518
|
playlistInfo: playlistData.pluginInfo,
|
|
@@ -536,7 +536,7 @@ class Manager extends events_1.EventEmitter {
|
|
|
536
536
|
track.author = cleanAuthor;
|
|
537
537
|
return track;
|
|
538
538
|
};
|
|
539
|
-
if (result.loadType ===
|
|
539
|
+
if (result.loadType === Utils_1.LoadTypes.Playlist) {
|
|
540
540
|
result.playlist.tracks = result.playlist.tracks.map(processTrack);
|
|
541
541
|
}
|
|
542
542
|
else {
|
|
@@ -642,26 +642,14 @@ class Manager extends events_1.EventEmitter {
|
|
|
642
642
|
decodeTracks(tracks) {
|
|
643
643
|
this.emit("debug", `[MANAGER] Decoding tracks: ${JSON.stringify(tracks)}`);
|
|
644
644
|
return new Promise(async (resolve, reject) => {
|
|
645
|
-
// Get the first available node for processing the decode request
|
|
646
645
|
const node = this.nodes.first();
|
|
647
|
-
if (!node)
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
// Send a POST request to the Lavalink API to decode tracks
|
|
653
|
-
const res = await node.rest.post("/v4/decodetracks", JSON.stringify(tracks));
|
|
654
|
-
// Check if a valid response is received
|
|
655
|
-
if (!res) {
|
|
656
|
-
return reject(new Error("No data returned from query."));
|
|
657
|
-
}
|
|
658
|
-
// Resolve the promise with the decoded track data
|
|
659
|
-
resolve(res);
|
|
660
|
-
}
|
|
661
|
-
catch (err) {
|
|
662
|
-
// Reject the promise if an error occurs during the API request
|
|
663
|
-
reject(err);
|
|
646
|
+
if (!node)
|
|
647
|
+
throw new Error("No available nodes.");
|
|
648
|
+
const res = (await node.rest.post("/v4/decodetracks", JSON.stringify(tracks)).catch((err) => reject(err)));
|
|
649
|
+
if (!res) {
|
|
650
|
+
return reject(new Error("No data returned from query."));
|
|
664
651
|
}
|
|
652
|
+
return resolve(res);
|
|
665
653
|
});
|
|
666
654
|
}
|
|
667
655
|
/**
|
|
@@ -799,14 +787,43 @@ var SearchPlatform;
|
|
|
799
787
|
})(SearchPlatform || (exports.SearchPlatform = SearchPlatform = {}));
|
|
800
788
|
var PlayerStateEventTypes;
|
|
801
789
|
(function (PlayerStateEventTypes) {
|
|
802
|
-
PlayerStateEventTypes["
|
|
803
|
-
PlayerStateEventTypes["
|
|
804
|
-
PlayerStateEventTypes["
|
|
805
|
-
PlayerStateEventTypes["
|
|
806
|
-
PlayerStateEventTypes["
|
|
807
|
-
PlayerStateEventTypes["
|
|
808
|
-
PlayerStateEventTypes["
|
|
809
|
-
PlayerStateEventTypes["
|
|
810
|
-
PlayerStateEventTypes["
|
|
811
|
-
PlayerStateEventTypes["
|
|
790
|
+
PlayerStateEventTypes["AutoPlayChange"] = "playerAutoplay";
|
|
791
|
+
PlayerStateEventTypes["ConnectionChange"] = "playerConnection";
|
|
792
|
+
PlayerStateEventTypes["RepeatChange"] = "playerRepeat";
|
|
793
|
+
PlayerStateEventTypes["PauseChange"] = "playerPause";
|
|
794
|
+
PlayerStateEventTypes["QueueChange"] = "queueChange";
|
|
795
|
+
PlayerStateEventTypes["TrackChange"] = "trackChange";
|
|
796
|
+
PlayerStateEventTypes["VolumeChange"] = "volumeChange";
|
|
797
|
+
PlayerStateEventTypes["ChannelChange"] = "channelChange";
|
|
798
|
+
PlayerStateEventTypes["PlayerCreate"] = "playerCreate";
|
|
799
|
+
PlayerStateEventTypes["PlayerDestroy"] = "playerDestroy";
|
|
812
800
|
})(PlayerStateEventTypes || (exports.PlayerStateEventTypes = PlayerStateEventTypes = {}));
|
|
801
|
+
var ManagerEventTypes;
|
|
802
|
+
(function (ManagerEventTypes) {
|
|
803
|
+
ManagerEventTypes["Debug"] = "debug";
|
|
804
|
+
ManagerEventTypes["NodeCreate"] = "nodeCreate";
|
|
805
|
+
ManagerEventTypes["NodeDestroy"] = "nodeDestroy";
|
|
806
|
+
ManagerEventTypes["NodeConnect"] = "nodeConnect";
|
|
807
|
+
ManagerEventTypes["NodeReconnect"] = "nodeReconnect";
|
|
808
|
+
ManagerEventTypes["NodeDisconnect"] = "nodeDisconnect";
|
|
809
|
+
ManagerEventTypes["NodeError"] = "nodeError";
|
|
810
|
+
ManagerEventTypes["NodeRaw"] = "nodeRaw";
|
|
811
|
+
ManagerEventTypes["PlayerCreate"] = "playerCreate";
|
|
812
|
+
ManagerEventTypes["PlayerDestroy"] = "playerDestroy";
|
|
813
|
+
ManagerEventTypes["PlayerStateUpdate"] = "playerStateUpdate";
|
|
814
|
+
ManagerEventTypes["PlayerMove"] = "playerMove";
|
|
815
|
+
ManagerEventTypes["PlayerDisconnect"] = "playerDisconnect";
|
|
816
|
+
ManagerEventTypes["QueueEnd"] = "queueEnd";
|
|
817
|
+
ManagerEventTypes["SocketClosed"] = "socketClosed";
|
|
818
|
+
ManagerEventTypes["TrackStart"] = "trackStart";
|
|
819
|
+
ManagerEventTypes["TrackEnd"] = "trackEnd";
|
|
820
|
+
ManagerEventTypes["TrackEndReason"] = "trackEndReason";
|
|
821
|
+
ManagerEventTypes["TrackEndReasonRaw"] = "trackEndReasonRaw";
|
|
822
|
+
ManagerEventTypes["TrackEndReasonData"] = "trackEndReasonData";
|
|
823
|
+
ManagerEventTypes["TrackStuck"] = "trackStuck";
|
|
824
|
+
ManagerEventTypes["TrackError"] = "trackError";
|
|
825
|
+
ManagerEventTypes["SegmentsLoaded"] = "segmentsLoaded";
|
|
826
|
+
ManagerEventTypes["SegmentSkipped"] = "segmentSkipped";
|
|
827
|
+
ManagerEventTypes["ChapterStarted"] = "chapterStarted";
|
|
828
|
+
ManagerEventTypes["ChaptersLoaded"] = "chaptersLoaded";
|
|
829
|
+
})(ManagerEventTypes || (exports.ManagerEventTypes = ManagerEventTypes = {}));
|
package/dist/structures/Node.js
CHANGED
|
@@ -96,7 +96,7 @@ class Node {
|
|
|
96
96
|
},
|
|
97
97
|
};
|
|
98
98
|
this.manager.nodes.set(this.options.identifier, this);
|
|
99
|
-
this.manager.emit(
|
|
99
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeCreate, this);
|
|
100
100
|
this.rest = new Rest_1.Rest(this, this.manager);
|
|
101
101
|
this.createSessionIdsFile();
|
|
102
102
|
this.loadSessionIds();
|
|
@@ -111,7 +111,7 @@ class Node {
|
|
|
111
111
|
createSessionIdsFile() {
|
|
112
112
|
// If the sessionIds.json file does not exist, create it
|
|
113
113
|
if (!fs_1.default.existsSync(sessionIdsFilePath)) {
|
|
114
|
-
this.manager.emit(
|
|
114
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Creating sessionId file at: ${sessionIdsFilePath}`);
|
|
115
115
|
// Create the file with an empty object as the content
|
|
116
116
|
fs_1.default.writeFileSync(sessionIdsFilePath, JSON.stringify({}), "utf-8");
|
|
117
117
|
}
|
|
@@ -124,7 +124,7 @@ class Node {
|
|
|
124
124
|
// Check if the sessionIds.json file exists
|
|
125
125
|
if (fs_1.default.existsSync(sessionIdsFilePath)) {
|
|
126
126
|
// Emit a debug event indicating that session IDs are being loaded
|
|
127
|
-
this.manager.emit(
|
|
127
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Loading sessionIds from file: ${sessionIdsFilePath}`);
|
|
128
128
|
// Read the content of the sessionIds.json file as a string
|
|
129
129
|
const sessionIdsData = fs_1.default.readFileSync(sessionIdsFilePath, "utf-8");
|
|
130
130
|
// Parse the JSON string into an object and convert it into a Map
|
|
@@ -139,7 +139,7 @@ class Node {
|
|
|
139
139
|
*/
|
|
140
140
|
updateSessionId() {
|
|
141
141
|
// Emit a debug event indicating that the session IDs are being updated
|
|
142
|
-
this.manager.emit(
|
|
142
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Updating sessionIds to file: ${sessionIdsFilePath}`);
|
|
143
143
|
// Update the session IDs Map with the new session ID
|
|
144
144
|
sessionIdsMap.set(this.options.identifier, this.sessionId);
|
|
145
145
|
// Write the updated session IDs Map to the sessionIds.json file
|
|
@@ -185,7 +185,7 @@ class Node {
|
|
|
185
185
|
identifier: this.options.identifier,
|
|
186
186
|
},
|
|
187
187
|
};
|
|
188
|
-
this.manager.emit(
|
|
188
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Connecting ${JSON.stringify(debugInfo)}`);
|
|
189
189
|
}
|
|
190
190
|
/**
|
|
191
191
|
* Destroys the Node and all players connected with it.
|
|
@@ -210,7 +210,7 @@ class Node {
|
|
|
210
210
|
sessionId: this.sessionId,
|
|
211
211
|
playerCount: this.manager.players.filter((p) => p.node == this).size,
|
|
212
212
|
};
|
|
213
|
-
this.manager.emit(
|
|
213
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Destroying node: ${JSON.stringify(debugInfo)}`);
|
|
214
214
|
// Destroy all players connected to the node
|
|
215
215
|
const players = this.manager.players.filter((p) => p.node == this);
|
|
216
216
|
if (players.size)
|
|
@@ -223,7 +223,7 @@ class Node {
|
|
|
223
223
|
this.reconnectAttempts = 1;
|
|
224
224
|
clearTimeout(this.reconnectTimeout);
|
|
225
225
|
// Emit a "nodeDestroy" event with the node as the argument
|
|
226
|
-
this.manager.emit(
|
|
226
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeDestroy, this);
|
|
227
227
|
// Destroy the node from the manager
|
|
228
228
|
this.manager.destroyNode(this.options.identifier);
|
|
229
229
|
}
|
|
@@ -244,21 +244,21 @@ class Node {
|
|
|
244
244
|
retryDelay: this.options.retryDelay,
|
|
245
245
|
};
|
|
246
246
|
// Emit a debug event indicating the node is attempting to reconnect
|
|
247
|
-
this.manager.emit(
|
|
247
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Reconnecting node: ${JSON.stringify(debugInfo)}`);
|
|
248
248
|
// Schedule the reconnection attempt after the specified retry delay
|
|
249
249
|
this.reconnectTimeout = setTimeout(() => {
|
|
250
250
|
// Check if the maximum number of retry attempts has been reached
|
|
251
251
|
if (this.reconnectAttempts >= this.options.retryAmount) {
|
|
252
252
|
// Emit an error event and destroy the node if retries are exhausted
|
|
253
253
|
const error = new Error(`Unable to connect after ${this.options.retryAmount} attempts.`);
|
|
254
|
-
this.manager.emit(
|
|
254
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeError, this, error);
|
|
255
255
|
return this.destroy();
|
|
256
256
|
}
|
|
257
257
|
// Remove all listeners from the current WebSocket and reset it
|
|
258
258
|
this.socket?.removeAllListeners();
|
|
259
259
|
this.socket = null;
|
|
260
260
|
// Emit a nodeReconnect event and attempt to connect again
|
|
261
|
-
this.manager.emit(
|
|
261
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeReconnect, this);
|
|
262
262
|
this.connect();
|
|
263
263
|
// Increment the reconnect attempts counter
|
|
264
264
|
this.reconnectAttempts++;
|
|
@@ -282,9 +282,9 @@ class Node {
|
|
|
282
282
|
connected: this.connected,
|
|
283
283
|
};
|
|
284
284
|
// Emit a debug event indicating the node is connected
|
|
285
|
-
this.manager.emit(
|
|
285
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Connected node: ${JSON.stringify(debugInfo)}`);
|
|
286
286
|
// Emit a "nodeConnect" event with the node as the argument
|
|
287
|
-
this.manager.emit(
|
|
287
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeConnect, this);
|
|
288
288
|
}
|
|
289
289
|
/**
|
|
290
290
|
* Handles the "close" event emitted by the WebSocket connection.
|
|
@@ -305,9 +305,9 @@ class Node {
|
|
|
305
305
|
reason,
|
|
306
306
|
};
|
|
307
307
|
// Emit a "nodeDisconnect" event with the node and the close event as arguments
|
|
308
|
-
this.manager.emit(
|
|
308
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeDisconnect, this, { code, reason });
|
|
309
309
|
// Emit a debug event indicating the node is disconnected
|
|
310
|
-
this.manager.emit(
|
|
310
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Disconnected node: ${JSON.stringify(debugInfo)}`);
|
|
311
311
|
// If the close event was not initiated by the user, attempt to reconnect
|
|
312
312
|
if (code !== 1000 || reason !== "destroy")
|
|
313
313
|
this.reconnect();
|
|
@@ -329,9 +329,9 @@ class Node {
|
|
|
329
329
|
error: error.message,
|
|
330
330
|
};
|
|
331
331
|
// Emit a debug event indicating the error on the node
|
|
332
|
-
this.manager.emit(
|
|
332
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Error on node: ${JSON.stringify(debugInfo)}`);
|
|
333
333
|
// Emit a "nodeError" event with the node and the error as arguments
|
|
334
|
-
this.manager.emit(
|
|
334
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeError, this, error);
|
|
335
335
|
}
|
|
336
336
|
/**
|
|
337
337
|
* Handles an incoming message from the Lavalink node.
|
|
@@ -345,7 +345,7 @@ class Node {
|
|
|
345
345
|
const payload = JSON.parse(d.toString());
|
|
346
346
|
if (!payload.op)
|
|
347
347
|
return;
|
|
348
|
-
this.manager.emit(
|
|
348
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeRaw, payload);
|
|
349
349
|
let player;
|
|
350
350
|
switch (payload.op) {
|
|
351
351
|
case "stats":
|
|
@@ -358,11 +358,11 @@ class Node {
|
|
|
358
358
|
player.position = payload.state.position || 0;
|
|
359
359
|
break;
|
|
360
360
|
case "event":
|
|
361
|
-
this.manager.emit(
|
|
361
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Node message: ${JSON.stringify(payload)}`);
|
|
362
362
|
this.handleEvent(payload);
|
|
363
363
|
break;
|
|
364
364
|
case "ready":
|
|
365
|
-
this.manager.emit(
|
|
365
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Node message: ${JSON.stringify(payload)}`);
|
|
366
366
|
this.rest.setSessionId(payload.sessionId);
|
|
367
367
|
this.sessionId = payload.sessionId;
|
|
368
368
|
this.updateSessionId(); // Call to update session ID
|
|
@@ -380,7 +380,7 @@ class Node {
|
|
|
380
380
|
}
|
|
381
381
|
break;
|
|
382
382
|
default:
|
|
383
|
-
this.manager.emit(
|
|
383
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeError, this, new Error(`Unexpected op "${payload.op}" with data: ${payload.message}`));
|
|
384
384
|
return;
|
|
385
385
|
}
|
|
386
386
|
}
|
|
@@ -432,7 +432,7 @@ class Node {
|
|
|
432
432
|
break;
|
|
433
433
|
default:
|
|
434
434
|
error = new Error(`Node#event unknown event '${type}'.`);
|
|
435
|
-
this.manager.emit(
|
|
435
|
+
this.manager.emit(Manager_1.ManagerEventTypes.NodeError, this, error);
|
|
436
436
|
break;
|
|
437
437
|
}
|
|
438
438
|
}
|
|
@@ -447,9 +447,9 @@ class Node {
|
|
|
447
447
|
const oldPlayer = player;
|
|
448
448
|
player.playing = true;
|
|
449
449
|
player.paused = false;
|
|
450
|
-
this.manager.emit(
|
|
451
|
-
this.manager.emit(
|
|
452
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
450
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackStart, player, track, payload);
|
|
451
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
|
|
452
|
+
changeType: Manager_1.PlayerStateEventTypes.TrackChange,
|
|
453
453
|
details: {
|
|
454
454
|
changeType: "start",
|
|
455
455
|
track: track,
|
|
@@ -477,7 +477,7 @@ class Node {
|
|
|
477
477
|
}
|
|
478
478
|
// If the track was forcibly replaced
|
|
479
479
|
else if (reason === "replaced") {
|
|
480
|
-
this.manager.emit(
|
|
480
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackEnd, player, track, payload);
|
|
481
481
|
player.queue.previous = player.queue.current;
|
|
482
482
|
}
|
|
483
483
|
// If the track ended and it's set to repeat (track or queue)
|
|
@@ -492,8 +492,8 @@ class Node {
|
|
|
492
492
|
else {
|
|
493
493
|
await this.queueEnd(player, track, payload);
|
|
494
494
|
}
|
|
495
|
-
this.manager.emit(
|
|
496
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
495
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
|
|
496
|
+
changeType: Manager_1.PlayerStateEventTypes.TrackChange,
|
|
497
497
|
details: {
|
|
498
498
|
changeType: "end",
|
|
499
499
|
track: track,
|
|
@@ -552,7 +552,7 @@ class Node {
|
|
|
552
552
|
searchURI = `https://www.youtube.com/watch?v=${videoID}&list=RD${videoID}&index=${randomIndex}`;
|
|
553
553
|
} while (track.uri.includes(searchURI));
|
|
554
554
|
const res = await player.search(searchURI, player.get("Internal_BotUser"));
|
|
555
|
-
if (res.loadType ===
|
|
555
|
+
if (res.loadType === Utils_1.LoadTypes.Empty || res.loadType === Utils_1.LoadTypes.Error)
|
|
556
556
|
return false;
|
|
557
557
|
const foundTrack = res.tracks.find((t) => t.uri !== track.uri && t.author !== track.author && t.title !== track.title);
|
|
558
558
|
if (!foundTrack)
|
|
@@ -582,7 +582,7 @@ class Node {
|
|
|
582
582
|
return false;
|
|
583
583
|
const randomTrack = response.data.toptracks.track[Math.floor(Math.random() * response.data.toptracks.track.length)];
|
|
584
584
|
const res = await player.search({ query: `${randomTrack.artist.name} - ${randomTrack.name}`, source: selectedSource }, player.get("Internal_BotUser"));
|
|
585
|
-
if (res.loadType ===
|
|
585
|
+
if (res.loadType === Utils_1.LoadTypes.Empty || res.loadType === Utils_1.LoadTypes.Error)
|
|
586
586
|
return false;
|
|
587
587
|
const foundTrack = res.tracks.find((t) => t.uri !== track.uri);
|
|
588
588
|
if (!foundTrack)
|
|
@@ -600,7 +600,13 @@ class Node {
|
|
|
600
600
|
}
|
|
601
601
|
}
|
|
602
602
|
const url = `https://ws.audioscrobbler.com/2.0/?method=track.getSimilar&artist=${artist}&track=${title}&limit=10&autocorrect=1&api_key=${apiKey}&format=json`;
|
|
603
|
-
|
|
603
|
+
let response;
|
|
604
|
+
try {
|
|
605
|
+
response = await axios_1.default.get(url);
|
|
606
|
+
}
|
|
607
|
+
catch (error) {
|
|
608
|
+
return false;
|
|
609
|
+
}
|
|
604
610
|
if (response.data.error || !response.data.similartracks?.track?.length) {
|
|
605
611
|
const retryUrl = `https://ws.audioscrobbler.com/2.0/?method=artist.getTopTracks&artist=${artist}&autocorrect=1&api_key=${apiKey}&format=json`;
|
|
606
612
|
const retryResponse = await axios_1.default.get(retryUrl);
|
|
@@ -608,7 +614,7 @@ class Node {
|
|
|
608
614
|
return false;
|
|
609
615
|
const randomTrack = retryResponse.data.toptracks.track[Math.floor(Math.random() * retryResponse.data.toptracks.track.length)];
|
|
610
616
|
const res = await player.search({ query: `${randomTrack.artist.name} - ${randomTrack.name}`, source: selectedSource }, player.get("Internal_BotUser"));
|
|
611
|
-
if (res.loadType ===
|
|
617
|
+
if (res.loadType === Utils_1.LoadTypes.Empty || res.loadType === Utils_1.LoadTypes.Error)
|
|
612
618
|
return false;
|
|
613
619
|
const foundTrack = res.tracks.find((t) => t.uri !== track.uri);
|
|
614
620
|
if (!foundTrack)
|
|
@@ -619,7 +625,7 @@ class Node {
|
|
|
619
625
|
}
|
|
620
626
|
const randomTrack = response.data.similartracks.track[Math.floor(Math.random() * response.data.similartracks.track.length)];
|
|
621
627
|
const res = await player.search({ query: `${randomTrack.artist.name} - ${randomTrack.name}`, source: selectedSource }, player.get("Internal_BotUser"));
|
|
622
|
-
if (res.loadType ===
|
|
628
|
+
if (res.loadType === Utils_1.LoadTypes.Empty || res.loadType === Utils_1.LoadTypes.Error)
|
|
623
629
|
return false;
|
|
624
630
|
const foundTrack = res.tracks.find((t) => t.uri !== track.uri);
|
|
625
631
|
if (!foundTrack)
|
|
@@ -636,7 +642,7 @@ class Node {
|
|
|
636
642
|
this.queueEnd(player, track, payload);
|
|
637
643
|
return;
|
|
638
644
|
}
|
|
639
|
-
this.manager.emit(
|
|
645
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackEnd, player, track, payload);
|
|
640
646
|
if (this.manager.options.autoPlay)
|
|
641
647
|
player.play();
|
|
642
648
|
}
|
|
@@ -663,7 +669,7 @@ class Node {
|
|
|
663
669
|
queue.previous = queue.current;
|
|
664
670
|
queue.current = queue.shift();
|
|
665
671
|
// Emit the track end event
|
|
666
|
-
this.manager.emit(
|
|
672
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackEnd, player, track, payload);
|
|
667
673
|
// If the track was stopped manually and there are no more tracks in the queue, end the queue
|
|
668
674
|
if (payload.reason === "stopped" && !(queue.current = queue.shift())) {
|
|
669
675
|
this.queueEnd(player, track, payload);
|
|
@@ -690,7 +696,7 @@ class Node {
|
|
|
690
696
|
// Shift the queue to set the next track as current
|
|
691
697
|
player.queue.current = player.queue.shift();
|
|
692
698
|
// Emit the track end event
|
|
693
|
-
this.manager.emit(
|
|
699
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackEnd, player, track, payload);
|
|
694
700
|
// If autoplay is enabled, play the next track
|
|
695
701
|
if (this.manager.options.autoPlay)
|
|
696
702
|
player.play();
|
|
@@ -709,7 +715,7 @@ class Node {
|
|
|
709
715
|
player.queue.current = null;
|
|
710
716
|
if (!player.isAutoplay) {
|
|
711
717
|
player.playing = false;
|
|
712
|
-
this.manager.emit(
|
|
718
|
+
this.manager.emit(Manager_1.ManagerEventTypes.QueueEnd, player, track, payload);
|
|
713
719
|
return;
|
|
714
720
|
}
|
|
715
721
|
let attempts = 1;
|
|
@@ -723,7 +729,7 @@ class Node {
|
|
|
723
729
|
// If all attempts fail, reset the player state and emit queueEnd
|
|
724
730
|
player.queue.previous = null;
|
|
725
731
|
player.playing = false;
|
|
726
|
-
this.manager.emit(
|
|
732
|
+
this.manager.emit(Manager_1.ManagerEventTypes.QueueEnd, player, track, payload);
|
|
727
733
|
}
|
|
728
734
|
/**
|
|
729
735
|
* Handles the event when a track gets stuck during playback.
|
|
@@ -737,7 +743,7 @@ class Node {
|
|
|
737
743
|
*/
|
|
738
744
|
trackStuck(player, track, payload) {
|
|
739
745
|
player.stop();
|
|
740
|
-
this.manager.emit(
|
|
746
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackStuck, player, track, payload);
|
|
741
747
|
}
|
|
742
748
|
/**
|
|
743
749
|
* Handles the event when a track encounters an error during playback.
|
|
@@ -751,7 +757,7 @@ class Node {
|
|
|
751
757
|
*/
|
|
752
758
|
trackError(player, track, payload) {
|
|
753
759
|
player.stop();
|
|
754
|
-
this.manager.emit(
|
|
760
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackError, player, track, payload);
|
|
755
761
|
}
|
|
756
762
|
/**
|
|
757
763
|
* Emitted when the WebSocket connection for a player closes.
|
|
@@ -760,8 +766,8 @@ class Node {
|
|
|
760
766
|
* @param {WebSocketClosedEvent} payload - The event payload containing additional data about the WebSocket close event.
|
|
761
767
|
*/
|
|
762
768
|
socketClosed(player, payload) {
|
|
763
|
-
this.manager.emit(
|
|
764
|
-
this.manager.emit(
|
|
769
|
+
this.manager.emit(Manager_1.ManagerEventTypes.SocketClosed, player, payload);
|
|
770
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Websocket closed for player: ${player.guild} with payload: ${JSON.stringify(payload)}`);
|
|
765
771
|
}
|
|
766
772
|
/**
|
|
767
773
|
* Emitted when the segments for a track are loaded.
|
|
@@ -771,7 +777,7 @@ class Node {
|
|
|
771
777
|
* @param {SponsorBlockSegmentsLoaded} payload - The event payload containing additional data about the segments loaded event.
|
|
772
778
|
*/
|
|
773
779
|
sponsorBlockSegmentLoaded(player, track, payload) {
|
|
774
|
-
return this.manager.emit(
|
|
780
|
+
return this.manager.emit(Manager_1.ManagerEventTypes.SegmentsLoaded, player, track, payload);
|
|
775
781
|
}
|
|
776
782
|
/**
|
|
777
783
|
* Emitted when a segment of a track is skipped using the sponsorblock plugin.
|
|
@@ -781,7 +787,7 @@ class Node {
|
|
|
781
787
|
* @param {SponsorBlockSegmentSkipped} payload - The event payload containing additional data about the segment skipped event.
|
|
782
788
|
*/
|
|
783
789
|
sponsorBlockSegmentSkipped(player, track, payload) {
|
|
784
|
-
return this.manager.emit(
|
|
790
|
+
return this.manager.emit(Manager_1.ManagerEventTypes.SegmentSkipped, player, track, payload);
|
|
785
791
|
}
|
|
786
792
|
/**
|
|
787
793
|
* Emitted when chapters for a track are loaded using the sponsorblock plugin.
|
|
@@ -791,7 +797,7 @@ class Node {
|
|
|
791
797
|
* @param {SponsorBlockChaptersLoaded} payload - The event payload containing additional data about the chapters loaded event.
|
|
792
798
|
*/
|
|
793
799
|
sponsorBlockChaptersLoaded(player, track, payload) {
|
|
794
|
-
return this.manager.emit(
|
|
800
|
+
return this.manager.emit(Manager_1.ManagerEventTypes.ChaptersLoaded, player, track, payload);
|
|
795
801
|
}
|
|
796
802
|
/**
|
|
797
803
|
* Emitted when a chapter of a track is started using the sponsorblock plugin.
|
|
@@ -801,7 +807,7 @@ class Node {
|
|
|
801
807
|
* @param {SponsorBlockChapterStarted} payload - The event payload containing additional data about the chapter started event.
|
|
802
808
|
*/
|
|
803
809
|
sponsorBlockChapterStarted(player, track, payload) {
|
|
804
|
-
return this.manager.emit(
|
|
810
|
+
return this.manager.emit(Manager_1.ManagerEventTypes.ChapterStarted, player, track, payload);
|
|
805
811
|
}
|
|
806
812
|
/**
|
|
807
813
|
* Fetches Lavalink node information.
|
|
@@ -868,7 +874,7 @@ class Node {
|
|
|
868
874
|
const message = "Please do NOT delete the magmastream/ folder as it is used to store player data for autoresume etc.";
|
|
869
875
|
if (!fs_1.default.existsSync(readmeFilePath)) {
|
|
870
876
|
fs_1.default.writeFileSync(readmeFilePath, message, "utf-8");
|
|
871
|
-
this.manager.emit(
|
|
877
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[NODE] Created README file at: ${readmeFilePath}`);
|
|
872
878
|
}
|
|
873
879
|
}
|
|
874
880
|
}
|
|
@@ -121,7 +121,7 @@ class Player {
|
|
|
121
121
|
// Add the player to the manager's player collection.
|
|
122
122
|
this.manager.players.set(options.guild, this);
|
|
123
123
|
// Emit the playerCreate event.
|
|
124
|
-
this.manager.emit(
|
|
124
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerCreate, this);
|
|
125
125
|
// Set the initial volume.
|
|
126
126
|
this.setVolume(options.volume ?? 100);
|
|
127
127
|
// Initialize the filters.
|
|
@@ -158,8 +158,8 @@ class Player {
|
|
|
158
158
|
// Set the player state to connected
|
|
159
159
|
this.state = "CONNECTED";
|
|
160
160
|
// Emit the player state update event
|
|
161
|
-
this.manager.emit(
|
|
162
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
161
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
162
|
+
changeType: Manager_1.PlayerStateEventTypes.ConnectionChange,
|
|
163
163
|
details: {
|
|
164
164
|
changeType: "connect",
|
|
165
165
|
previousConnection: oldPlayer?.state === "CONNECTED",
|
|
@@ -174,9 +174,8 @@ class Player {
|
|
|
174
174
|
* @throws {TypeError} If the player is not connected.
|
|
175
175
|
*/
|
|
176
176
|
disconnect() {
|
|
177
|
-
if (this.voiceChannel === null)
|
|
178
|
-
|
|
179
|
-
}
|
|
177
|
+
if (this.voiceChannel === null)
|
|
178
|
+
return this;
|
|
180
179
|
this.state = "DISCONNECTING";
|
|
181
180
|
const oldPlayer = this ? { ...this } : null;
|
|
182
181
|
this.pause(true);
|
|
@@ -191,8 +190,8 @@ class Player {
|
|
|
191
190
|
});
|
|
192
191
|
this.voiceChannel = null;
|
|
193
192
|
this.state = "DISCONNECTED";
|
|
194
|
-
this.manager.emit(
|
|
195
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
193
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
194
|
+
changeType: Manager_1.PlayerStateEventTypes.ConnectionChange,
|
|
196
195
|
details: {
|
|
197
196
|
changeType: "disconnect",
|
|
198
197
|
previousConnection: oldPlayer.state === "CONNECTED",
|
|
@@ -210,18 +209,16 @@ class Player {
|
|
|
210
209
|
* @emits {playerStateUpdate} - The old and new player states after the destruction.
|
|
211
210
|
*/
|
|
212
211
|
destroy(disconnect = true) {
|
|
213
|
-
if (typeof disconnect !== "boolean")
|
|
214
|
-
throw new TypeError("Disconnect must be a boolean.");
|
|
215
212
|
const oldPlayer = this ? { ...this } : null;
|
|
216
213
|
this.state = "DESTROYING";
|
|
217
214
|
if (disconnect) {
|
|
218
215
|
this.disconnect();
|
|
219
216
|
}
|
|
220
217
|
this.node.rest.destroyPlayer(this.guild);
|
|
221
|
-
this.manager.emit(
|
|
218
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerDestroy, this);
|
|
222
219
|
this.manager.players.delete(this.guild);
|
|
223
|
-
this.manager.emit(
|
|
224
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
220
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
221
|
+
changeType: Manager_1.PlayerStateEventTypes.PlayerDestroy,
|
|
225
222
|
});
|
|
226
223
|
}
|
|
227
224
|
/**
|
|
@@ -240,8 +237,8 @@ class Player {
|
|
|
240
237
|
this.voiceChannel = channel;
|
|
241
238
|
this.connect();
|
|
242
239
|
// Emit a player state update event
|
|
243
|
-
this.manager.emit(
|
|
244
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
240
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
241
|
+
changeType: Manager_1.PlayerStateEventTypes.ChannelChange,
|
|
245
242
|
details: {
|
|
246
243
|
changeType: "voice",
|
|
247
244
|
previousChannel: oldPlayer.voiceChannel || null,
|
|
@@ -269,8 +266,8 @@ class Player {
|
|
|
269
266
|
// Update the text channel property
|
|
270
267
|
this.textChannel = channel;
|
|
271
268
|
// Emit a player state update event with channel change details
|
|
272
|
-
this.manager.emit(
|
|
273
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
269
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
270
|
+
changeType: Manager_1.PlayerStateEventTypes.ChannelChange,
|
|
274
271
|
details: {
|
|
275
272
|
changeType: "text",
|
|
276
273
|
previousChannel: oldPlayer.textChannel || null,
|
|
@@ -311,7 +308,7 @@ class Player {
|
|
|
311
308
|
this.queue.current = await Utils_1.TrackUtils.getClosestTrack(this.queue.current);
|
|
312
309
|
}
|
|
313
310
|
catch (error) {
|
|
314
|
-
this.manager.emit(
|
|
311
|
+
this.manager.emit(Manager_1.ManagerEventTypes.TrackError, this, this.queue.current, error);
|
|
315
312
|
if (this.queue[0])
|
|
316
313
|
return this.play(this.queue[0]);
|
|
317
314
|
return;
|
|
@@ -352,8 +349,8 @@ class Player {
|
|
|
352
349
|
this.isAutoplay = autoplayState;
|
|
353
350
|
this.autoplayTries = tries;
|
|
354
351
|
this.set("Internal_BotUser", botUser);
|
|
355
|
-
this.manager.emit(
|
|
356
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
352
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
353
|
+
changeType: Manager_1.PlayerStateEventTypes.AutoPlayChange,
|
|
357
354
|
details: {
|
|
358
355
|
previousAutoplay: oldPlayer.isAutoplay,
|
|
359
356
|
currentAutoplay: this.isAutoplay,
|
|
@@ -421,10 +418,10 @@ class Player {
|
|
|
421
418
|
}
|
|
422
419
|
const searchURI = `https://www.youtube.com/watch?v=${videoID}&list=RD${videoID}`;
|
|
423
420
|
const res = await this.manager.search(searchURI);
|
|
424
|
-
if (res.loadType ===
|
|
421
|
+
if (res.loadType === Utils_1.LoadTypes.Empty || res.loadType === Utils_1.LoadTypes.Error)
|
|
425
422
|
return;
|
|
426
423
|
let tracks = res.tracks;
|
|
427
|
-
if (res.loadType ===
|
|
424
|
+
if (res.loadType === Utils_1.LoadTypes.Playlist) {
|
|
428
425
|
tracks = res.playlist.tracks;
|
|
429
426
|
}
|
|
430
427
|
const filteredTracks = tracks.filter((track) => track.uri !== `https://www.youtube.com/watch?v=${videoID}`);
|
|
@@ -449,8 +446,6 @@ class Player {
|
|
|
449
446
|
setVolume(volume) {
|
|
450
447
|
if (isNaN(volume))
|
|
451
448
|
throw new TypeError("Volume must be a number.");
|
|
452
|
-
if (volume < 0 || volume > 100)
|
|
453
|
-
throw new RangeError("Volume must be between 0 and 100.");
|
|
454
449
|
const oldPlayer = this ? { ...this } : null;
|
|
455
450
|
this.node.rest.updatePlayer({
|
|
456
451
|
guildId: this.options.guild,
|
|
@@ -459,8 +454,8 @@ class Player {
|
|
|
459
454
|
},
|
|
460
455
|
});
|
|
461
456
|
this.volume = volume;
|
|
462
|
-
this.manager.emit(
|
|
463
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
457
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
458
|
+
changeType: Manager_1.PlayerStateEventTypes.VolumeChange,
|
|
464
459
|
details: { previousVolume: oldPlayer.volume || null, currentVolume: this.volume },
|
|
465
460
|
});
|
|
466
461
|
return this;
|
|
@@ -515,8 +510,8 @@ class Player {
|
|
|
515
510
|
this.dynamicRepeat = false;
|
|
516
511
|
}
|
|
517
512
|
// Emit an event indicating the repeat mode has changed
|
|
518
|
-
this.manager.emit(
|
|
519
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
513
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
514
|
+
changeType: Manager_1.PlayerStateEventTypes.RepeatChange,
|
|
520
515
|
detail: {
|
|
521
516
|
changeType: "track",
|
|
522
517
|
previousRepeat: this.getRepeatState(oldPlayer),
|
|
@@ -549,8 +544,8 @@ class Player {
|
|
|
549
544
|
this.dynamicRepeat = false;
|
|
550
545
|
}
|
|
551
546
|
// Emit the player state update event
|
|
552
|
-
this.manager.emit(
|
|
553
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
547
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
548
|
+
changeType: Manager_1.PlayerStateEventTypes.RepeatChange,
|
|
554
549
|
detail: {
|
|
555
550
|
changeType: "queue",
|
|
556
551
|
previousRepeat: this.getRepeatState(oldPlayer),
|
|
@@ -604,8 +599,8 @@ class Player {
|
|
|
604
599
|
this.dynamicRepeat = false;
|
|
605
600
|
}
|
|
606
601
|
// Emit a player state update event
|
|
607
|
-
this.manager.emit(
|
|
608
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
602
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
603
|
+
changeType: Manager_1.PlayerStateEventTypes.RepeatChange,
|
|
609
604
|
detail: {
|
|
610
605
|
changeType: "dynamic",
|
|
611
606
|
previousRepeat: this.getRepeatState(oldPlayer),
|
|
@@ -664,8 +659,8 @@ class Player {
|
|
|
664
659
|
encodedTrack: null,
|
|
665
660
|
},
|
|
666
661
|
});
|
|
667
|
-
this.manager.emit(
|
|
668
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
662
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
663
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
669
664
|
details: {
|
|
670
665
|
changeType: "remove",
|
|
671
666
|
tracks: removedTracks,
|
|
@@ -698,8 +693,8 @@ class Player {
|
|
|
698
693
|
},
|
|
699
694
|
});
|
|
700
695
|
// Emit an event indicating the pause state has changed.
|
|
701
|
-
this.manager.emit(
|
|
702
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
696
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
697
|
+
changeType: Manager_1.PlayerStateEventTypes.PauseChange,
|
|
703
698
|
details: {
|
|
704
699
|
previousPause: oldPlayer.paused,
|
|
705
700
|
currentPause: this.paused,
|
|
@@ -719,8 +714,8 @@ class Player {
|
|
|
719
714
|
// Stop the current track to allow playing the previous track.
|
|
720
715
|
this.stop();
|
|
721
716
|
// Emit a player state update event indicating the track change to previous.
|
|
722
|
-
this.manager.emit(
|
|
723
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
717
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
718
|
+
changeType: Manager_1.PlayerStateEventTypes.TrackChange,
|
|
724
719
|
details: {
|
|
725
720
|
changeType: "previous",
|
|
726
721
|
track: this.queue.previous,
|
|
@@ -758,8 +753,8 @@ class Player {
|
|
|
758
753
|
},
|
|
759
754
|
});
|
|
760
755
|
// Emit an event to notify the manager of the track change.
|
|
761
|
-
this.manager.emit(
|
|
762
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
756
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
|
|
757
|
+
changeType: Manager_1.PlayerStateEventTypes.TrackChange,
|
|
763
758
|
details: {
|
|
764
759
|
changeType: "timeUpdate",
|
|
765
760
|
previousTime: oldPlayer.position,
|
package/dist/structures/Queue.js
CHANGED
|
@@ -62,7 +62,7 @@ class Queue extends Array {
|
|
|
62
62
|
// Get the track info as a string
|
|
63
63
|
const trackInfo = Array.isArray(track) ? track.map((t) => JSON.stringify(t, null, 2)).join(", ") : JSON.stringify(track, null, 2);
|
|
64
64
|
// Emit a debug message
|
|
65
|
-
this.manager.emit(
|
|
65
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] Added ${Array.isArray(track) ? track.length : 1} track(s) to queue: ${trackInfo}`);
|
|
66
66
|
const oldPlayer = this.manager.players.get(this.guild) ? { ...this.manager.players.get(this.guild) } : null;
|
|
67
67
|
// Validate the track
|
|
68
68
|
if (!Utils_1.TrackUtils.validate(track)) {
|
|
@@ -111,8 +111,8 @@ class Queue extends Array {
|
|
|
111
111
|
}
|
|
112
112
|
}
|
|
113
113
|
// Emit a player state update event with the added track(s)
|
|
114
|
-
this.manager.emit(
|
|
115
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
114
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
115
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
116
116
|
details: {
|
|
117
117
|
changeType: "add",
|
|
118
118
|
tracks: Array.isArray(track) ? track : [track],
|
|
@@ -130,9 +130,9 @@ class Queue extends Array {
|
|
|
130
130
|
throw new RangeError("Invalid range: start should be less than end and within queue length.");
|
|
131
131
|
}
|
|
132
132
|
const removedTracks = this.splice(startOrPosition, end - startOrPosition);
|
|
133
|
-
this.manager.emit(
|
|
134
|
-
this.manager.emit(
|
|
135
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
133
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] Removed ${removedTracks.length} track(s) from player: ${this.guild} from position ${startOrPosition} to ${end}.`);
|
|
134
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
135
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
136
136
|
details: {
|
|
137
137
|
changeType: "remove",
|
|
138
138
|
tracks: removedTracks,
|
|
@@ -142,11 +142,11 @@ class Queue extends Array {
|
|
|
142
142
|
}
|
|
143
143
|
// Single item removal when no end specified
|
|
144
144
|
const removedTrack = this.splice(startOrPosition, 1);
|
|
145
|
-
this.manager.emit(
|
|
145
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] Removed 1 track from player: ${this.guild} from position ${startOrPosition}: ${JSON.stringify(removedTrack[0], null, 2)}`);
|
|
146
146
|
// Ensure removedTrack is an array for consistency
|
|
147
147
|
const tracksToEmit = removedTrack.length > 0 ? removedTrack : [];
|
|
148
|
-
this.manager.emit(
|
|
149
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
148
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
149
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
150
150
|
details: {
|
|
151
151
|
changeType: "remove",
|
|
152
152
|
tracks: tracksToEmit,
|
|
@@ -164,15 +164,15 @@ class Queue extends Array {
|
|
|
164
164
|
// Remove all items from the queue.
|
|
165
165
|
this.splice(0);
|
|
166
166
|
// Emit an event to update the player state indicating the queue has been cleared.
|
|
167
|
-
this.manager.emit(
|
|
168
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
167
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
168
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
169
169
|
details: {
|
|
170
170
|
changeType: "clear",
|
|
171
171
|
tracks: [], // No tracks are left after clearing
|
|
172
172
|
},
|
|
173
173
|
});
|
|
174
174
|
// Emit a debug message indicating the queue has been cleared for a specific guild.
|
|
175
|
-
this.manager.emit(
|
|
175
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] Cleared the queue for: ${this.guild}`);
|
|
176
176
|
}
|
|
177
177
|
/**
|
|
178
178
|
* Shuffles the queue.
|
|
@@ -187,14 +187,14 @@ class Queue extends Array {
|
|
|
187
187
|
[this[i], this[j]] = [this[j], this[i]];
|
|
188
188
|
}
|
|
189
189
|
// Emit an event to update the player state indicating the queue has been shuffled.
|
|
190
|
-
this.manager.emit(
|
|
191
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
190
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
191
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
192
192
|
details: {
|
|
193
193
|
changeType: "shuffle",
|
|
194
194
|
},
|
|
195
195
|
});
|
|
196
196
|
// Emit a debug message indicating the queue has been shuffled for a specific guild.
|
|
197
|
-
this.manager.emit(
|
|
197
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] Shuffled the queue for: ${this.guild}`);
|
|
198
198
|
}
|
|
199
199
|
/**
|
|
200
200
|
* Shuffles the queue to play tracks requested by each user one block at a time.
|
|
@@ -227,14 +227,14 @@ class Queue extends Array {
|
|
|
227
227
|
this.splice(0);
|
|
228
228
|
this.add(shuffledQueue);
|
|
229
229
|
// Emit an event to update the player state indicating the queue has been shuffled.
|
|
230
|
-
this.manager.emit(
|
|
231
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
230
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
231
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
232
232
|
details: {
|
|
233
233
|
changeType: "userBlock",
|
|
234
234
|
},
|
|
235
235
|
});
|
|
236
236
|
// Emit a debug message indicating the queue has been shuffled for a specific guild.
|
|
237
|
-
this.manager.emit(
|
|
237
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] userBlockShuffled the queue for: ${this.guild}`);
|
|
238
238
|
}
|
|
239
239
|
/**
|
|
240
240
|
* Shuffles the queue to play tracks requested by each user one by one.
|
|
@@ -275,14 +275,14 @@ class Queue extends Array {
|
|
|
275
275
|
this.splice(0);
|
|
276
276
|
this.add(shuffledQueue);
|
|
277
277
|
// Emit an event to update the player state indicating the queue has been shuffled.
|
|
278
|
-
this.manager.emit(
|
|
279
|
-
changeType: Manager_1.PlayerStateEventTypes.
|
|
278
|
+
this.manager.emit(Manager_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guild), {
|
|
279
|
+
changeType: Manager_1.PlayerStateEventTypes.QueueChange,
|
|
280
280
|
details: {
|
|
281
281
|
changeType: "roundRobin",
|
|
282
282
|
},
|
|
283
283
|
});
|
|
284
284
|
// Emit a debug message indicating the queue has been shuffled for a specific guild.
|
|
285
|
-
this.manager.emit(
|
|
285
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[QUEUE] roundRobinShuffled the queue for: ${this.guild}`);
|
|
286
286
|
}
|
|
287
287
|
}
|
|
288
288
|
exports.Queue = Queue;
|
package/dist/structures/Rest.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Rest = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
6
|
+
const Manager_1 = require("./Manager");
|
|
6
7
|
/** Handles the requests sent to the Lavalink REST API. */
|
|
7
8
|
class Rest {
|
|
8
9
|
/** The Node that this Rest instance is connected to. */
|
|
@@ -40,7 +41,7 @@ class Rest {
|
|
|
40
41
|
// Send a GET request to the Lavalink Node to retrieve all the players.
|
|
41
42
|
const result = await this.get(`/v4/sessions/${this.sessionId}/players`);
|
|
42
43
|
// Log the result of the request.
|
|
43
|
-
this.manager.emit(
|
|
44
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[REST] Getting all players on node: ${this.node.options.identifier} : ${JSON.stringify(result)}`);
|
|
44
45
|
// Return the result of the request.
|
|
45
46
|
return result;
|
|
46
47
|
}
|
|
@@ -51,7 +52,7 @@ class Rest {
|
|
|
51
52
|
*/
|
|
52
53
|
async updatePlayer(options) {
|
|
53
54
|
// Log the request.
|
|
54
|
-
this.manager.emit(
|
|
55
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[REST] Updating player: ${options.guildId}: ${JSON.stringify(options)}`);
|
|
55
56
|
// Send the PATCH request.
|
|
56
57
|
return await this.patch(`/v4/sessions/${this.sessionId}/players/${options.guildId}?noReplace=false`, options.data);
|
|
57
58
|
}
|
|
@@ -62,7 +63,7 @@ class Rest {
|
|
|
62
63
|
*/
|
|
63
64
|
async destroyPlayer(guildId) {
|
|
64
65
|
// Log the request.
|
|
65
|
-
this.manager.emit(
|
|
66
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[REST] Destroying player: ${guildId}`);
|
|
66
67
|
// Send the DELETE request.
|
|
67
68
|
return await this.delete(`/v4/sessions/${this.sessionId}/players/${guildId}`);
|
|
68
69
|
}
|
|
@@ -76,7 +77,7 @@ class Rest {
|
|
|
76
77
|
*/
|
|
77
78
|
async updateSession(resuming, timeout) {
|
|
78
79
|
// Emit a debug event with information about the session being updated
|
|
79
|
-
this.manager.emit(
|
|
80
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[REST] Updating session: ${this.sessionId}`);
|
|
80
81
|
// Send a PATCH request to update the session with the provided resuming status and timeout
|
|
81
82
|
return await this.patch(`/v4/sessions/${this.sessionId}`, { resuming, timeout });
|
|
82
83
|
}
|
|
@@ -88,7 +89,7 @@ class Rest {
|
|
|
88
89
|
* @returns {Promise<unknown>} The response data of the request.
|
|
89
90
|
*/
|
|
90
91
|
async request(method, endpoint, body) {
|
|
91
|
-
this.manager.emit(
|
|
92
|
+
this.manager.emit(Manager_1.ManagerEventTypes.Debug, `[REST] ${method} api call for endpoint: ${endpoint} with data: ${JSON.stringify(body)}`);
|
|
92
93
|
const config = {
|
|
93
94
|
method,
|
|
94
95
|
url: this.url + endpoint,
|
package/dist/structures/Utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Plugin = exports.Structure = exports.TrackUtils = void 0;
|
|
3
|
+
exports.LoadTypes = exports.Plugin = exports.Structure = exports.TrackUtils = void 0;
|
|
4
4
|
/** @hidden */
|
|
5
5
|
const TRACK_SYMBOL = Symbol("track"),
|
|
6
6
|
/** @hidden */
|
|
@@ -263,3 +263,11 @@ const structures = {
|
|
|
263
263
|
Queue: require("./Queue").Queue,
|
|
264
264
|
Node: require("./Node").Node,
|
|
265
265
|
};
|
|
266
|
+
var LoadTypes;
|
|
267
|
+
(function (LoadTypes) {
|
|
268
|
+
LoadTypes["Track"] = "track";
|
|
269
|
+
LoadTypes["Playlist"] = "playlist";
|
|
270
|
+
LoadTypes["Search"] = "search";
|
|
271
|
+
LoadTypes["Empty"] = "empty";
|
|
272
|
+
LoadTypes["Error"] = "error";
|
|
273
|
+
})(LoadTypes || (exports.LoadTypes = LoadTypes = {}));
|