@stella_project/stellalib 1.0.0

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.
Files changed (64) hide show
  1. package/LICENSE +213 -0
  2. package/README.md +285 -0
  3. package/THIRD-PARTY-NOTICES.md +84 -0
  4. package/dist/Structures/Filters.d.ts +140 -0
  5. package/dist/Structures/Filters.d.ts.map +1 -0
  6. package/dist/Structures/Filters.js +315 -0
  7. package/dist/Structures/Filters.js.map +1 -0
  8. package/dist/Structures/LRUCache.d.ts +36 -0
  9. package/dist/Structures/LRUCache.d.ts.map +1 -0
  10. package/dist/Structures/LRUCache.js +94 -0
  11. package/dist/Structures/LRUCache.js.map +1 -0
  12. package/dist/Structures/Manager.d.ts +146 -0
  13. package/dist/Structures/Manager.d.ts.map +1 -0
  14. package/dist/Structures/Manager.js +503 -0
  15. package/dist/Structures/Manager.js.map +1 -0
  16. package/dist/Structures/Node.d.ts +118 -0
  17. package/dist/Structures/Node.d.ts.map +1 -0
  18. package/dist/Structures/Node.js +927 -0
  19. package/dist/Structures/Node.js.map +1 -0
  20. package/dist/Structures/Player.d.ts +193 -0
  21. package/dist/Structures/Player.d.ts.map +1 -0
  22. package/dist/Structures/Player.js +598 -0
  23. package/dist/Structures/Player.js.map +1 -0
  24. package/dist/Structures/Queue.d.ts +48 -0
  25. package/dist/Structures/Queue.d.ts.map +1 -0
  26. package/dist/Structures/Queue.js +114 -0
  27. package/dist/Structures/Queue.js.map +1 -0
  28. package/dist/Structures/Rest.d.ts +105 -0
  29. package/dist/Structures/Rest.d.ts.map +1 -0
  30. package/dist/Structures/Rest.js +343 -0
  31. package/dist/Structures/Rest.js.map +1 -0
  32. package/dist/Structures/SessionStore.d.ts +42 -0
  33. package/dist/Structures/SessionStore.d.ts.map +1 -0
  34. package/dist/Structures/SessionStore.js +94 -0
  35. package/dist/Structures/SessionStore.js.map +1 -0
  36. package/dist/Structures/Types.d.ts +450 -0
  37. package/dist/Structures/Types.d.ts.map +1 -0
  38. package/dist/Structures/Types.js +13 -0
  39. package/dist/Structures/Types.js.map +1 -0
  40. package/dist/Structures/Utils.d.ts +61 -0
  41. package/dist/Structures/Utils.d.ts.map +1 -0
  42. package/dist/Structures/Utils.js +204 -0
  43. package/dist/Structures/Utils.js.map +1 -0
  44. package/dist/Utils/FiltersEqualizers.d.ts +20 -0
  45. package/dist/Utils/FiltersEqualizers.d.ts.map +1 -0
  46. package/dist/Utils/FiltersEqualizers.js +96 -0
  47. package/dist/Utils/FiltersEqualizers.js.map +1 -0
  48. package/dist/Utils/ManagerCheck.d.ts +9 -0
  49. package/dist/Utils/ManagerCheck.d.ts.map +1 -0
  50. package/dist/Utils/ManagerCheck.js +45 -0
  51. package/dist/Utils/ManagerCheck.js.map +1 -0
  52. package/dist/Utils/NodeCheck.d.ts +9 -0
  53. package/dist/Utils/NodeCheck.d.ts.map +1 -0
  54. package/dist/Utils/NodeCheck.js +31 -0
  55. package/dist/Utils/NodeCheck.js.map +1 -0
  56. package/dist/Utils/PlayerCheck.d.ts +9 -0
  57. package/dist/Utils/PlayerCheck.d.ts.map +1 -0
  58. package/dist/Utils/PlayerCheck.js +23 -0
  59. package/dist/Utils/PlayerCheck.js.map +1 -0
  60. package/dist/index.d.ts +12 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +28 -0
  63. package/dist/index.js.map +1 -0
  64. package/package.json +64 -0
@@ -0,0 +1,598 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.StellaPlayer = void 0;
7
+ const Filters_1 = require("./Filters");
8
+ const Utils_1 = require("./Utils");
9
+ const PlayerCheck_1 = __importDefault(require("../Utils/PlayerCheck"));
10
+ class StellaPlayer {
11
+ options;
12
+ /** The Queue for the Player. */
13
+ queue = new (Utils_1.Structure.get("Queue"))();
14
+ /** The filters applied to the audio. */
15
+ filters;
16
+ /** Whether the queue repeats the track. */
17
+ trackRepeat = false;
18
+ /** Whether the queue repeats the queue. */
19
+ queueRepeat = false;
20
+ /** Whether the queue repeats and shuffles after each song. */
21
+ dynamicRepeat = false;
22
+ /** The time the player is in the track. */
23
+ position = 0;
24
+ /** Whether the player is playing. */
25
+ playing = false;
26
+ /** Whether the player is paused. */
27
+ paused = false;
28
+ /** The volume for the player. */
29
+ volume;
30
+ /** The Node for the Player. */
31
+ node;
32
+ /** The guild for the player. */
33
+ guild;
34
+ /** The voice channel for the player. */
35
+ voiceChannel = null;
36
+ /** The text channel for the player. */
37
+ textChannel = null;
38
+ /** The current state of the player. */
39
+ state = "DISCONNECTED";
40
+ /** The equalizer bands array. */
41
+ bands = new Array(15).fill(0.0);
42
+ /** The voice state object from Discord. */
43
+ voiceState;
44
+ /** The Manager. */
45
+ manager;
46
+ /** The autoplay state of the player. */
47
+ isAutoplay = false;
48
+ /** History of recently auto-played track URIs (avoids repeats). */
49
+ autoplayHistory = [];
50
+ /** Max autoplay history size before it rotates. */
51
+ static AUTOPLAY_HISTORY_MAX = 50;
52
+ /** Seed pool: last N tracks used for multi-seed smart mix recommendations. */
53
+ autoplaySeedPool = [];
54
+ /** Max seed pool size. */
55
+ static SEED_POOL_MAX = 5;
56
+ /** Whether the voice connection is ready. */
57
+ connected = false;
58
+ /** The ping to the voice server in ms. */
59
+ ping = -1;
60
+ static _manager;
61
+ data = {};
62
+ dynamicLoopInterval;
63
+ /** Whether the voice connection handshake is complete. */
64
+ voiceReady = false;
65
+ /** @hidden */
66
+ voiceReadyResolvers = [];
67
+ /**
68
+ * Set custom data.
69
+ * @param key
70
+ * @param value
71
+ */
72
+ set(key, value) {
73
+ this.data[key] = value;
74
+ }
75
+ /**
76
+ * Get custom data.
77
+ * @param key
78
+ */
79
+ get(key) {
80
+ return this.data[key];
81
+ }
82
+ /** @hidden */
83
+ static init(manager) {
84
+ this._manager = manager;
85
+ }
86
+ /**
87
+ * Creates a new player, returns one if it already exists.
88
+ * @param options
89
+ */
90
+ constructor(options) {
91
+ this.options = options;
92
+ if (!this.manager)
93
+ this.manager = Utils_1.Structure.get("Player")._manager;
94
+ if (!this.manager)
95
+ throw new RangeError("Manager has not been initiated.");
96
+ if (this.manager.players.has(options.guild))
97
+ return this.manager.players.get(options.guild);
98
+ (0, PlayerCheck_1.default)(options);
99
+ this.guild = options.guild;
100
+ this.voiceState = Object.assign({
101
+ op: "voiceUpdate",
102
+ guildId: options.guild,
103
+ });
104
+ if (options.voiceChannel)
105
+ this.voiceChannel = options.voiceChannel;
106
+ if (options.textChannel)
107
+ this.textChannel = options.textChannel;
108
+ const node = this.manager.nodes.get(options.node);
109
+ this.node = node || this.manager.useableNodes;
110
+ if (!this.node)
111
+ throw new RangeError("No available nodes.");
112
+ this.manager.players.set(options.guild, this);
113
+ this.manager.emit("PlayerCreate", this);
114
+ this.setVolume(options.volume ?? 11);
115
+ this.filters = new Filters_1.Filters(this);
116
+ }
117
+ /**
118
+ * Same as Manager#search() but a shortcut on the player itself.
119
+ * @param query The query to search.
120
+ * @param requester The user who requested the search.
121
+ */
122
+ search(query, requester) {
123
+ return this.manager.search(query, requester);
124
+ }
125
+ /** Connect to the voice channel. */
126
+ connect() {
127
+ if (!this.voiceChannel)
128
+ throw new RangeError("No voice channel has been set.");
129
+ this.state = "CONNECTING";
130
+ this.manager.emit("Debug", `[Player:${this.guild}] Connecting to voice channel ${this.voiceChannel}`);
131
+ this.manager.options.send(this.guild, {
132
+ op: 4,
133
+ d: {
134
+ guild_id: this.guild,
135
+ channel_id: this.voiceChannel,
136
+ self_mute: this.options.selfMute || false,
137
+ self_deaf: this.options.selfDeafen || false,
138
+ },
139
+ });
140
+ this.state = "CONNECTED";
141
+ return this;
142
+ }
143
+ /**
144
+ * Waits for the voice connection to be ready before playing.
145
+ * @param timeout Timeout in ms (default: 15000).
146
+ */
147
+ waitForVoice(timeout = 15000) {
148
+ if (this.voiceReady)
149
+ return Promise.resolve();
150
+ this.manager.emit("Debug", `[Player:${this.guild}] Waiting for voice connection before playing...`);
151
+ return new Promise((resolve, reject) => {
152
+ const timer = setTimeout(() => {
153
+ const idx = this.voiceReadyResolvers.indexOf(resolve);
154
+ if (idx !== -1)
155
+ this.voiceReadyResolvers.splice(idx, 1);
156
+ reject(new Error("Voice connection timed out"));
157
+ }, timeout);
158
+ this.voiceReadyResolvers.push(() => {
159
+ clearTimeout(timer);
160
+ resolve();
161
+ });
162
+ });
163
+ }
164
+ /**
165
+ * Moves the player to a different node.
166
+ * @param node The ID of the node to move to.
167
+ */
168
+ async moveNode(node) {
169
+ const targetId = node ||
170
+ this.manager.leastLoadNode.values().next().value?.options.identifier ||
171
+ [...this.manager.nodes.values()].find((n) => n.connected)?.options.identifier;
172
+ if (!targetId || !this.manager.nodes.has(targetId))
173
+ throw new RangeError("No nodes available.");
174
+ if (this.node.options.identifier === targetId)
175
+ return this;
176
+ const currentNode = this.node;
177
+ const destinationNode = this.manager.nodes.get(targetId);
178
+ let position = this.position;
179
+ if (currentNode.connected) {
180
+ try {
181
+ const fetchedPlayer = (await currentNode.rest.getPlayer(this.guild));
182
+ position = fetchedPlayer?.track?.info?.position ?? this.position;
183
+ }
184
+ catch {
185
+ // Use local position
186
+ }
187
+ }
188
+ await destinationNode.rest.updatePlayer({
189
+ guildId: this.guild,
190
+ data: {
191
+ encodedTrack: this.queue.current?.track,
192
+ position,
193
+ volume: this.volume,
194
+ paused: this.paused,
195
+ filters: {
196
+ distortion: this.filters.distortion,
197
+ equalizer: this.filters.equalizer,
198
+ karaoke: this.filters.karaoke,
199
+ rotation: this.filters.rotation,
200
+ timescale: this.filters.timescale,
201
+ vibrato: this.filters.vibrato,
202
+ volume: this.filters.volume,
203
+ },
204
+ },
205
+ });
206
+ // Send voice state to the new node (with channelId)
207
+ if (this.voiceState?.sessionId) {
208
+ await destinationNode.rest.updatePlayer({
209
+ guildId: this.guild,
210
+ data: {
211
+ voice: {
212
+ token: this.voiceState.event?.token,
213
+ endpoint: this.voiceState.event?.endpoint,
214
+ sessionId: this.voiceState.sessionId,
215
+ channelId: this.voiceChannel ?? undefined,
216
+ },
217
+ },
218
+ });
219
+ }
220
+ this.node = destinationNode;
221
+ this.state = "MOVING";
222
+ // Destroy player on old node
223
+ if (currentNode.connected) {
224
+ currentNode.rest.destroyPlayer(this.guild).catch(() => { });
225
+ }
226
+ setTimeout(() => {
227
+ if (this.state === "MOVING")
228
+ this.state = "CONNECTED";
229
+ }, 5000);
230
+ return this;
231
+ }
232
+ /** Disconnect from the voice channel. */
233
+ disconnect() {
234
+ if (this.voiceChannel === null)
235
+ return this;
236
+ this.state = "DISCONNECTING";
237
+ this.pause(true);
238
+ this.manager.options.send(this.guild, {
239
+ op: 4,
240
+ d: {
241
+ guild_id: this.guild,
242
+ channel_id: null,
243
+ self_mute: false,
244
+ self_deaf: false,
245
+ },
246
+ });
247
+ this.voiceChannel = null;
248
+ this.voiceReady = false;
249
+ this.state = "DISCONNECTED";
250
+ return this;
251
+ }
252
+ /** Destroys the player, cleaning up all timers and resources. */
253
+ destroy(disconnect = true) {
254
+ this.state = "DESTROYING";
255
+ // Clean up dynamic repeat interval
256
+ if (this.dynamicLoopInterval) {
257
+ clearInterval(this.dynamicLoopInterval);
258
+ this.dynamicLoopInterval = undefined;
259
+ }
260
+ // Clear pending voice resolvers
261
+ this.voiceReadyResolvers = [];
262
+ this.voiceReady = false;
263
+ if (disconnect)
264
+ this.disconnect();
265
+ this.node.rest.destroyPlayer(this.guild).catch(() => { });
266
+ this.manager.emit("PlayerDestroy", this);
267
+ this.manager.players.delete(this.guild);
268
+ }
269
+ /**
270
+ * Sets the player voice channel.
271
+ * @param channel
272
+ */
273
+ setVoiceChannel(channel) {
274
+ if (typeof channel !== "string")
275
+ throw new TypeError("Channel must be a non-empty string.");
276
+ this.voiceChannel = channel;
277
+ this.connect();
278
+ return this;
279
+ }
280
+ /**
281
+ * Sets the player text channel.
282
+ * @param channel
283
+ */
284
+ setTextChannel(channel) {
285
+ if (typeof channel !== "string")
286
+ throw new TypeError("Channel must be a non-empty string.");
287
+ this.textChannel = channel;
288
+ return this;
289
+ }
290
+ async play(optionsOrTrack, playOptions) {
291
+ if (typeof optionsOrTrack !== "undefined" && Utils_1.TrackUtils.validate(optionsOrTrack)) {
292
+ if (this.queue.current)
293
+ this.queue.previous = this.queue.current;
294
+ this.queue.current = optionsOrTrack;
295
+ }
296
+ if (!this.queue.current)
297
+ throw new RangeError("No current track.");
298
+ const finalOptions = playOptions
299
+ ? playOptions
300
+ : ["startTime", "endTime", "noReplace"].every((v) => Object.keys(optionsOrTrack || {}).includes(v))
301
+ ? optionsOrTrack
302
+ : {};
303
+ if (Utils_1.TrackUtils.isUnresolvedTrack(this.queue.current)) {
304
+ try {
305
+ this.queue.current = await Utils_1.TrackUtils.getClosestTrack(this.queue.current);
306
+ }
307
+ catch (error) {
308
+ this.manager.emit("TrackError", this, this.queue.current, error);
309
+ if (this.queue[0])
310
+ return this.play(this.queue[0]);
311
+ return;
312
+ }
313
+ }
314
+ // Wait for voice connection to be ready before playing
315
+ if (!this.voiceReady) {
316
+ await this.waitForVoice();
317
+ }
318
+ await this.node.rest.updatePlayer({
319
+ guildId: this.guild,
320
+ data: {
321
+ encodedTrack: this.queue.current?.track,
322
+ ...finalOptions,
323
+ },
324
+ });
325
+ Object.assign(this, { position: 0, playing: true });
326
+ }
327
+ /**
328
+ * Sets the autoplay state of the player.
329
+ * @param autoplayState
330
+ * @param botUser
331
+ */
332
+ setAutoplay(autoplayState, botUser) {
333
+ if (typeof autoplayState !== "boolean")
334
+ throw new TypeError("autoplayState must be a boolean.");
335
+ if (typeof botUser !== "object")
336
+ throw new TypeError("botUser must be a user-object.");
337
+ this.isAutoplay = autoplayState;
338
+ this.set("Internal_BotUser", botUser);
339
+ return this;
340
+ }
341
+ /**
342
+ * Gets recommended tracks and returns an array of tracks.
343
+ * @param track
344
+ * @param requester
345
+ */
346
+ async getRecommended(track, requester) {
347
+ const node = this.manager.useableNodes;
348
+ if (!node)
349
+ throw new Error("No available nodes.");
350
+ const hasSpotifyURL = ["spotify.com", "open.spotify.com"].some((url) => track.uri?.includes(url));
351
+ const hasYouTubeURL = ["youtube.com", "youtu.be"].some((url) => track.uri?.includes(url));
352
+ if (hasSpotifyURL) {
353
+ try {
354
+ const info = await node.rest.getInfo();
355
+ const isSpotifyPluginEnabled = info.plugins?.some((plugin) => plugin.name === "lavasrc-plugin");
356
+ const isSpotifySourceManagerEnabled = info.sourceManagers?.includes("spotify");
357
+ if (isSpotifyPluginEnabled && isSpotifySourceManagerEnabled) {
358
+ const trackID = node.extractSpotifyTrackID(track.uri);
359
+ const artistID = track.pluginInfo?.artistUrl
360
+ ? node.extractSpotifyArtistID(track.pluginInfo.artistUrl)
361
+ : null;
362
+ let identifier = "";
363
+ if (trackID && artistID)
364
+ identifier = `sprec:seed_artists=${artistID}&seed_tracks=${trackID}`;
365
+ else if (trackID)
366
+ identifier = `sprec:seed_tracks=${trackID}`;
367
+ else if (artistID)
368
+ identifier = `sprec:seed_artists=${artistID}`;
369
+ if (identifier) {
370
+ const recommendedResult = await node.rest.loadTracks(identifier);
371
+ if (recommendedResult.loadType === "playlist") {
372
+ const playlistData = recommendedResult.data;
373
+ if (playlistData.tracks)
374
+ return playlistData.tracks.map((t) => Utils_1.TrackUtils.build(t, requester));
375
+ }
376
+ }
377
+ }
378
+ }
379
+ catch {
380
+ // Fall through
381
+ }
382
+ }
383
+ let videoID = track.uri?.substring(track.uri.indexOf("=") + 1);
384
+ if (!hasYouTubeURL) {
385
+ const res = await this.manager.search(`${track.author} - ${track.title}`);
386
+ videoID = res.tracks[0]?.uri?.substring(res.tracks[0].uri.indexOf("=") + 1);
387
+ }
388
+ if (!videoID)
389
+ return undefined;
390
+ const searchURI = `https://www.youtube.com/watch?v=${videoID}&list=RD${videoID}`;
391
+ const res = await this.manager.search(searchURI);
392
+ if (res.loadType === "empty" || res.loadType === "error")
393
+ return undefined;
394
+ let tracks = res.tracks;
395
+ if (res.loadType === "playlist")
396
+ tracks = res.playlist?.tracks ?? [];
397
+ const filteredTracks = tracks.filter((t) => t.uri !== `https://www.youtube.com/watch?v=${videoID}`);
398
+ if (this.manager.options.replaceYouTubeCredentials) {
399
+ for (const t of filteredTracks) {
400
+ t.author = t.author.replace("- Topic", "").trim();
401
+ t.title = t.title.replace("Topic -", "").trim();
402
+ if (t.title.includes("-")) {
403
+ const [author, title] = t.title.split("-").map((s) => s.trim());
404
+ t.author = author;
405
+ t.title = title;
406
+ }
407
+ }
408
+ }
409
+ return filteredTracks;
410
+ }
411
+ /**
412
+ * Sets the player volume.
413
+ * @param volume
414
+ */
415
+ setVolume(volume) {
416
+ if (isNaN(volume))
417
+ throw new TypeError("Volume must be a number.");
418
+ this.node.rest.updatePlayer({
419
+ guildId: this.options.guild,
420
+ data: { volume },
421
+ });
422
+ this.volume = volume;
423
+ return this;
424
+ }
425
+ /**
426
+ * Sets the track repeat.
427
+ * @param repeat
428
+ */
429
+ setTrackRepeat(repeat) {
430
+ if (typeof repeat !== "boolean")
431
+ throw new TypeError('Repeat can only be "true" or "false".');
432
+ const oldPlayer = { ...this };
433
+ this.trackRepeat = repeat;
434
+ this.queueRepeat = false;
435
+ this.dynamicRepeat = false;
436
+ this.manager.emit("PlayerStateUpdate", oldPlayer, this);
437
+ return this;
438
+ }
439
+ /**
440
+ * Sets the queue repeat.
441
+ * @param repeat
442
+ */
443
+ setQueueRepeat(repeat) {
444
+ if (typeof repeat !== "boolean")
445
+ throw new TypeError('Repeat can only be "true" or "false".');
446
+ const oldPlayer = { ...this };
447
+ this.trackRepeat = false;
448
+ this.queueRepeat = repeat;
449
+ this.dynamicRepeat = false;
450
+ this.manager.emit("PlayerStateUpdate", oldPlayer, this);
451
+ return this;
452
+ }
453
+ /**
454
+ * Sets the queue to repeat and shuffles the queue after each song.
455
+ * @param repeat Whether to enable dynamic repeat.
456
+ * @param ms After how many milliseconds to trigger dynamic repeat.
457
+ */
458
+ setDynamicRepeat(repeat, ms) {
459
+ if (typeof repeat !== "boolean")
460
+ throw new TypeError('Repeat can only be "true" or "false".');
461
+ if (this.queue.size <= 1)
462
+ throw new RangeError("The queue size must be greater than 1.");
463
+ const oldPlayer = { ...this };
464
+ if (repeat) {
465
+ this.trackRepeat = false;
466
+ this.queueRepeat = false;
467
+ this.dynamicRepeat = true;
468
+ this.dynamicLoopInterval = setInterval(() => {
469
+ if (!this.dynamicRepeat)
470
+ return;
471
+ const shuffled = [...this.queue].sort(() => Math.random() - 0.5);
472
+ this.queue.clear();
473
+ shuffled.forEach((track) => this.queue.add(track));
474
+ }, ms);
475
+ }
476
+ else {
477
+ if (this.dynamicLoopInterval)
478
+ clearInterval(this.dynamicLoopInterval);
479
+ this.trackRepeat = false;
480
+ this.queueRepeat = false;
481
+ this.dynamicRepeat = false;
482
+ }
483
+ this.manager.emit("PlayerStateUpdate", oldPlayer, this);
484
+ return this;
485
+ }
486
+ /** Restarts the current track to the start. */
487
+ restart() {
488
+ if (!this.queue.current?.track) {
489
+ if (this.queue.length)
490
+ this.play();
491
+ return;
492
+ }
493
+ this.node.rest.updatePlayer({
494
+ guildId: this.guild,
495
+ data: { position: 0, encodedTrack: this.queue.current?.track },
496
+ });
497
+ }
498
+ /** Stops the current track, optionally give an amount to skip to. */
499
+ stop(amount) {
500
+ if (typeof amount === "number" && amount > 1) {
501
+ if (amount > this.queue.length)
502
+ throw new RangeError("Cannot skip more than the queue length.");
503
+ this.queue.splice(0, amount - 1);
504
+ }
505
+ this.node.rest.updatePlayer({
506
+ guildId: this.guild,
507
+ data: { encodedTrack: null },
508
+ });
509
+ return this;
510
+ }
511
+ /**
512
+ * Pauses the current track.
513
+ * @param pause
514
+ */
515
+ pause(pause) {
516
+ if (typeof pause !== "boolean")
517
+ throw new RangeError('Pause can only be "true" or "false".');
518
+ if (this.paused === pause || !this.queue.totalSize)
519
+ return this;
520
+ const oldPlayer = { ...this };
521
+ this.playing = !pause;
522
+ this.paused = pause;
523
+ this.node.rest.updatePlayer({
524
+ guildId: this.guild,
525
+ data: { paused: pause },
526
+ });
527
+ this.manager.emit("PlayerStateUpdate", oldPlayer, this);
528
+ return this;
529
+ }
530
+ /** Go back to the previous song. */
531
+ previous() {
532
+ if (this.queue.previous) {
533
+ this.queue.unshift(this.queue.previous);
534
+ }
535
+ this.stop();
536
+ return this;
537
+ }
538
+ /**
539
+ * Seeks to the position in the current track.
540
+ * @param position
541
+ */
542
+ seek(position) {
543
+ if (!this.queue.current)
544
+ return undefined;
545
+ position = Number(position);
546
+ if (isNaN(position))
547
+ throw new RangeError("Position must be a number.");
548
+ if (position < 0 || position > this.queue.current.duration)
549
+ position = Math.max(Math.min(position, this.queue.current.duration), 0);
550
+ this.position = position;
551
+ this.node.rest.updatePlayer({
552
+ guildId: this.guild,
553
+ data: { position },
554
+ });
555
+ return this;
556
+ }
557
+ /**
558
+ * Called internally when voice state is flushed to Lavalink.
559
+ * Resolves all pending waitForVoice() callers.
560
+ */
561
+ resolveVoiceReady() {
562
+ this.voiceReady = true;
563
+ this.connected = true;
564
+ const resolvers = this.voiceReadyResolvers;
565
+ this.voiceReadyResolvers = [];
566
+ for (const resolve of resolvers)
567
+ resolve();
568
+ }
569
+ /**
570
+ * Returns a snapshot of the player's current state.
571
+ * Useful for persistence, debugging, or manual resume.
572
+ */
573
+ getStateSnapshot() {
574
+ return {
575
+ guildId: this.guild,
576
+ track: this.queue.current?.track ?? null,
577
+ position: this.position,
578
+ volume: this.volume,
579
+ paused: this.paused,
580
+ filters: {
581
+ distortion: this.filters.distortion,
582
+ equalizer: this.filters.equalizer,
583
+ karaoke: this.filters.karaoke,
584
+ rotation: this.filters.rotation,
585
+ timescale: this.filters.timescale,
586
+ vibrato: this.filters.vibrato,
587
+ volume: this.filters.volume,
588
+ },
589
+ voiceChannelId: this.voiceChannel,
590
+ textChannelId: this.textChannel,
591
+ trackRepeat: this.trackRepeat,
592
+ queueRepeat: this.queueRepeat,
593
+ dynamicRepeat: this.dynamicRepeat,
594
+ };
595
+ }
596
+ }
597
+ exports.StellaPlayer = StellaPlayer;
598
+ //# sourceMappingURL=Player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Player.js","sourceRoot":"","sources":["../../src/Structures/Player.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * StellaLib — Copyright (c) 2026 AntonyZ, x2sadddDM, SynX, Astel (OSL-3.0)
4
+ * Derived from LithiumX — Copyright (c) 2025 Anantix Network (MIT)
5
+ * See LICENSE and THIRD-PARTY-NOTICES.md for full license details.
6
+ */
7
+ import type { Track, UnresolvedTrack } from "./Types";
8
+ /**
9
+ * The player's queue. The `current` property is the currently playing track,
10
+ * think of the rest as the upcoming tracks.
11
+ */
12
+ export declare class StellaQueue extends Array<Track | UnresolvedTrack> {
13
+ /** The total duration of the queue including the current track. */
14
+ get duration(): number;
15
+ /** The total size of tracks in the queue including the current track. */
16
+ get totalSize(): number;
17
+ /** The size of tracks in the queue (excluding current). */
18
+ get size(): number;
19
+ /** The current track. */
20
+ current: Track | UnresolvedTrack | null;
21
+ /** The previous track. */
22
+ previous: Track | UnresolvedTrack | null;
23
+ /**
24
+ * Adds a track to the queue.
25
+ * @param track The track or array of tracks to add.
26
+ * @param offset Optional position to insert at.
27
+ */
28
+ add(track: (Track | UnresolvedTrack) | (Track | UnresolvedTrack)[], offset?: number): void;
29
+ /**
30
+ * Removes a track from the queue by position.
31
+ * Defaults to the first track, returning the removed track(s).
32
+ */
33
+ remove(position?: number): (Track | UnresolvedTrack)[];
34
+ /**
35
+ * Removes tracks using a start and end index, returning the removed tracks.
36
+ */
37
+ remove(start: number, end: number): (Track | UnresolvedTrack)[];
38
+ /** Clears the queue. */
39
+ clear(): void;
40
+ /** Shuffles the queue using the Fisher-Yates algorithm. */
41
+ shuffle(): void;
42
+ /**
43
+ * Shuffles the queue but distributes tracks evenly by requester,
44
+ * so no single user dominates the upcoming tracks.
45
+ */
46
+ equalizedShuffle(): void;
47
+ }
48
+ //# sourceMappingURL=Queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Queue.d.ts","sourceRoot":"","sources":["../../src/Structures/Queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAGtD;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK,CAAC,KAAK,GAAG,eAAe,CAAC;IAC9D,mEAAmE;IACnE,IAAW,QAAQ,IAAI,MAAM,CAG5B;IAED,yEAAyE;IACzE,IAAW,SAAS,IAAI,MAAM,CAE7B;IAED,2DAA2D;IAC3D,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,yBAAyB;IAClB,OAAO,EAAE,KAAK,GAAG,eAAe,GAAG,IAAI,CAAQ;IAEtD,0BAA0B;IACnB,QAAQ,EAAE,KAAK,GAAG,eAAe,GAAG,IAAI,CAAQ;IAEvD;;;;OAIG;IACI,GAAG,CACT,KAAK,EAAE,CAAC,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE,EAC9D,MAAM,CAAC,EAAE,MAAM,GACb,IAAI;IAiCP;;;OAGG;IACI,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE;IAE7D;;OAEG;IACI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,KAAK,GAAG,eAAe,CAAC,EAAE;IAatE,wBAAwB;IACjB,KAAK,IAAI,IAAI;IAIpB,2DAA2D;IACpD,OAAO,IAAI,IAAI;IAOtB;;;OAGG;IACI,gBAAgB,IAAI,IAAI;CAoB/B"}