magmastream 2.9.0-dev.34 → 2.9.0-dev.36

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.
@@ -50,18 +50,23 @@ class Node {
50
50
  }
51
51
  (0, nodeCheck_1.default)(options);
52
52
  this.options = {
53
- port: 2333,
54
- password: "youshallnotpass",
55
- useSSL: false,
56
- maxRetryAttempts: 30,
57
- retryDelayMs: 60000,
58
- nodePriority: 0,
59
53
  ...options,
54
+ host: options.host ?? "localhost",
55
+ port: options.port ?? 2333,
56
+ password: options.password ?? "youshallnotpass",
57
+ useSSL: options.useSSL ?? false,
58
+ identifier: options.identifier ?? options.host,
59
+ maxRetryAttempts: options.maxRetryAttempts ?? 30,
60
+ retryDelayMs: options.retryDelayMs ?? 60000,
61
+ enableSessionResumeOption: options.enableSessionResumeOption ?? false,
62
+ sessionTimeoutMs: options.sessionTimeoutMs ?? 1000,
63
+ apiRequestTimeoutMs: options.apiRequestTimeoutMs ?? 10000,
64
+ nodePriority: options.nodePriority ?? 0,
65
+ isNodeLink: options.isNodeLink ?? false,
60
66
  };
61
67
  if (this.options.useSSL) {
62
68
  this.options.port = 443;
63
69
  }
64
- this.options.identifier = options.identifier || options.host;
65
70
  this.stats = {
66
71
  players: 0,
67
72
  playingPlayers: 0,
@@ -517,7 +522,8 @@ class Node {
517
522
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
518
523
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
519
524
  details: {
520
- changeType: "autoPlay",
525
+ type: "track",
526
+ action: "autoPlay",
521
527
  track: track,
522
528
  },
523
529
  });
@@ -526,7 +532,8 @@ class Node {
526
532
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
527
533
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
528
534
  details: {
529
- changeType: "start",
535
+ type: "track",
536
+ action: "start",
530
537
  track: track,
531
538
  },
532
539
  });
@@ -593,7 +600,8 @@ class Node {
593
600
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
594
601
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
595
602
  details: {
596
- changeType: "end",
603
+ type: "track",
604
+ action: "end",
597
605
  track: track,
598
606
  },
599
607
  });
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Player = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const Filters_1 = require("./Filters");
6
- const Queue_1 = require("./Queue");
6
+ const MemoryQueue_1 = require("../statestorage/MemoryQueue");
7
7
  const Utils_1 = require("./Utils");
8
8
  const _ = tslib_1.__importStar(require("lodash"));
9
9
  const playerCheck_1 = tslib_1.__importDefault(require("../utils/playerCheck"));
10
- const RedisQueue_1 = require("./RedisQueue");
11
- // import { IQueue, Lyrics, PlayerOptions, PlayerUpdateVoiceState, PlayOptions, SearchQuery, SearchResult, Track, VoiceState } from "./Types";
10
+ const RedisQueue_1 = require("../statestorage/RedisQueue");
12
11
  const Enums_1 = require("./Enums");
13
12
  const ws_1 = require("ws");
13
+ const JsonQueue_1 = require("../statestorage/JsonQueue");
14
14
  class Player {
15
15
  options;
16
16
  /** The Queue for the Player. */
@@ -98,15 +98,20 @@ class Player {
98
98
  if (!this.node)
99
99
  throw new RangeError("No available nodes.");
100
100
  // Initialize the queue with the guild ID and manager.
101
- if (this.manager.options.stateStorage.type === Enums_1.StateStorageType.Redis) {
102
- this.queue = new RedisQueue_1.RedisQueue(this.guildId, this.manager);
103
- }
104
- else {
105
- this.queue = new Queue_1.Queue(this.guildId, this.manager);
106
- }
107
- if (this.queue instanceof Queue_1.Queue) {
108
- this.queue.previous = [];
101
+ switch (this.manager.options.stateStorage.type) {
102
+ case Enums_1.StateStorageType.Redis:
103
+ this.queue = new RedisQueue_1.RedisQueue(this.guildId, this.manager);
104
+ break;
105
+ case Enums_1.StateStorageType.Memory:
106
+ this.queue = new MemoryQueue_1.MemoryQueue(this.guildId, this.manager);
107
+ break;
108
+ case Enums_1.StateStorageType.JSON:
109
+ this.queue = new JsonQueue_1.JsonQueue(this.guildId, this.manager);
110
+ break;
109
111
  }
112
+ // if (this.queue instanceof MemoryQueue) {
113
+ // this.queue.previous = [];
114
+ // }
110
115
  // Add the player to the manager's player collection.
111
116
  this.manager.players.set(options.guildId, this);
112
117
  // Set the initial volume.
@@ -181,7 +186,8 @@ class Player {
181
186
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
182
187
  changeType: Enums_1.PlayerStateEventTypes.ConnectionChange,
183
188
  details: {
184
- changeType: "connect",
189
+ type: "connection",
190
+ action: "connect",
185
191
  previousConnection: oldPlayer?.state === Enums_1.StateTypes.Connected,
186
192
  currentConnection: true,
187
193
  },
@@ -216,7 +222,8 @@ class Player {
216
222
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
217
223
  changeType: Enums_1.PlayerStateEventTypes.ConnectionChange,
218
224
  details: {
219
- changeType: "disconnect",
225
+ type: "connection",
226
+ action: "disconnect",
220
227
  previousConnection: oldPlayer.state === Enums_1.StateTypes.Connected,
221
228
  currentConnection: false,
222
229
  },
@@ -231,7 +238,6 @@ class Player {
231
238
  * @emits {PlayerStateUpdate} - Emitted when the player state is updated.
232
239
  */
233
240
  async destroy(disconnect = true) {
234
- const oldPlayer = this ? { ...this } : null;
235
241
  this.state = Enums_1.StateTypes.Destroying;
236
242
  if (disconnect) {
237
243
  await this.disconnect().catch((err) => {
@@ -244,11 +250,10 @@ class Player {
244
250
  await this.queue.clear();
245
251
  await this.queue.clearPrevious();
246
252
  await this.queue.setCurrent(null);
247
- this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, null, {
248
- changeType: Enums_1.PlayerStateEventTypes.PlayerDestroy,
249
- });
250
253
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerDestroy, this);
251
254
  const deleted = this.manager.players.delete(this.guildId);
255
+ if (this.manager.options.stateStorage.deleteInactivePlayers)
256
+ await this.manager.cleanupInactivePlayer(this.guildId);
252
257
  return deleted;
253
258
  }
254
259
  /**
@@ -270,7 +275,8 @@ class Player {
270
275
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
271
276
  changeType: Enums_1.PlayerStateEventTypes.ChannelChange,
272
277
  details: {
273
- changeType: "voice",
278
+ type: "channel",
279
+ action: "voice",
274
280
  previousChannel: oldPlayer.voiceChannelId || null,
275
281
  currentChannel: this.voiceChannelId,
276
282
  },
@@ -299,7 +305,8 @@ class Player {
299
305
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
300
306
  changeType: Enums_1.PlayerStateEventTypes.ChannelChange,
301
307
  details: {
302
- changeType: "text",
308
+ type: "channel",
309
+ action: "text",
303
310
  previousChannel: oldPlayer.textChannelId || null,
304
311
  currentChannel: this.textChannelId,
305
312
  },
@@ -378,6 +385,8 @@ class Player {
378
385
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
379
386
  changeType: Enums_1.PlayerStateEventTypes.AutoPlayChange,
380
387
  details: {
388
+ type: "autoplay",
389
+ action: "toggle",
381
390
  previousAutoplay: oldPlayer.isAutoplay,
382
391
  currentAutoplay: this.isAutoplay,
383
392
  },
@@ -410,17 +419,19 @@ class Player {
410
419
  if (volume < 0 || volume > 1000)
411
420
  throw new RangeError("Volume must be between 0 and 1000.");
412
421
  const oldVolume = this.volume;
422
+ const oldPlayer = { ...this };
413
423
  await this.node.rest.updatePlayer({
414
424
  guildId: this.options.guildId,
415
425
  data: { volume },
416
426
  });
417
427
  this.volume = volume;
418
- this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, {
428
+ this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
419
429
  changeType: Enums_1.PlayerStateEventTypes.VolumeChange,
420
430
  details: {
431
+ type: "volume",
432
+ action: "adjust",
421
433
  previousVolume: oldVolume,
422
434
  currentVolume: this.volume,
423
- isGradual: false,
424
435
  },
425
436
  });
426
437
  return this;
@@ -477,8 +488,9 @@ class Player {
477
488
  // Emit an event indicating the repeat mode has changed
478
489
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
479
490
  changeType: Enums_1.PlayerStateEventTypes.RepeatChange,
480
- detail: {
481
- changeType: "track",
491
+ details: {
492
+ type: "repeat",
493
+ action: "track",
482
494
  previousRepeat: this.getRepeatState(oldPlayer),
483
495
  currentRepeat: this.getRepeatState(this),
484
496
  },
@@ -511,8 +523,9 @@ class Player {
511
523
  // Emit the player state update event
512
524
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
513
525
  changeType: Enums_1.PlayerStateEventTypes.RepeatChange,
514
- detail: {
515
- changeType: "queue",
526
+ details: {
527
+ type: "repeat",
528
+ action: "queue",
516
529
  previousRepeat: this.getRepeatState(oldPlayer),
517
530
  currentRepeat: this.getRepeatState(this),
518
531
  },
@@ -567,8 +580,9 @@ class Player {
567
580
  // Emit a player state update event
568
581
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
569
582
  changeType: Enums_1.PlayerStateEventTypes.RepeatChange,
570
- detail: {
571
- changeType: "dynamic",
583
+ details: {
584
+ type: "repeat",
585
+ action: "dynamic",
572
586
  previousRepeat: this.getRepeatState(oldPlayer),
573
587
  currentRepeat: this.getRepeatState(this),
574
588
  },
@@ -622,7 +636,8 @@ class Player {
622
636
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
623
637
  changeType: Enums_1.PlayerStateEventTypes.QueueChange,
624
638
  details: {
625
- changeType: "remove",
639
+ type: "queue",
640
+ action: "remove",
626
641
  tracks: removedTracks,
627
642
  },
628
643
  });
@@ -657,6 +672,8 @@ class Player {
657
672
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
658
673
  changeType: Enums_1.PlayerStateEventTypes.PauseChange,
659
674
  details: {
675
+ type: "pause",
676
+ action: "pause",
660
677
  previousPause: oldPlayer.paused,
661
678
  currentPause: this.paused,
662
679
  },
@@ -684,7 +701,8 @@ class Player {
684
701
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
685
702
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
686
703
  details: {
687
- changeType: "previous",
704
+ type: "track",
705
+ action: "previous",
688
706
  track: lastTrack,
689
707
  },
690
708
  });
@@ -724,7 +742,8 @@ class Player {
724
742
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
725
743
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
726
744
  details: {
727
- changeType: "timeUpdate",
745
+ type: "track",
746
+ action: "timeUpdate",
728
747
  previousTime: oldPlayer.position,
729
748
  currentTime: this.position,
730
749
  },
@@ -101,6 +101,7 @@ class Rest {
101
101
  Authorization: this.password,
102
102
  },
103
103
  data: body,
104
+ timeout: this.node.options.apiRequestTimeoutMs,
104
105
  };
105
106
  try {
106
107
  const response = await (0, axios_1.default)(config);
@@ -108,7 +109,7 @@ class Rest {
108
109
  }
109
110
  catch (error) {
110
111
  if (!error.response) {
111
- console.error("No response from node:", error.message);
112
+ console.error(`[REST] No response from node: ${error.message}`);
112
113
  return null;
113
114
  }
114
115
  if (error.response.data?.message === "Guild not found") {
@@ -167,6 +167,10 @@ class AutoPlayUtils {
167
167
  throw new Error("No available nodes.");
168
168
  }
169
169
  const apiKey = this.manager.options.lastFmApiKey;
170
+ // Check if Last.fm API is available
171
+ if (apiKey) {
172
+ return await this.getRecommendedTracksFromLastFm(track, apiKey);
173
+ }
170
174
  const enabledSources = node.info.sourceManagers;
171
175
  const autoPlaySearchPlatforms = this.manager.options.autoPlaySearchPlatforms;
172
176
  // Iterate over autoplay platforms in order of priority
@@ -179,10 +183,6 @@ class AutoPlayUtils {
179
183
  }
180
184
  }
181
185
  }
182
- // Check if Last.fm API is available
183
- if (apiKey) {
184
- return await this.getRecommendedTracksFromLastFm(track, apiKey);
185
- }
186
186
  return [];
187
187
  }
188
188
  /**
@@ -685,7 +685,7 @@ class Structure {
685
685
  exports.Structure = Structure;
686
686
  const structures = {
687
687
  Player: require("./Player").Player,
688
- Queue: require("./Queue").Queue,
688
+ Queue: require("../statestorage/MemoryQueue").MemoryQueue,
689
689
  Node: require("./Node").Node,
690
690
  Filters: require("./Filters").Filters,
691
691
  Manager: require("./Manager").Manager,
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeyfertManager = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const Manager_1 = require("../structures/Manager");
6
+ const common_1 = require("seyfert/lib/common");
7
+ tslib_1.__exportStar(require("../index"), exports);
8
+ /**
9
+ * Seyfert wrapper for Magmastream.
10
+ *
11
+ * @note This wrapper does require the manual implementation of the "raw" and "ready" events, to call the `updateVoiceState` and `init` methods respectively.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const client = new Client();
16
+ * const manager = new SeyfertManager(client, options);
17
+ *
18
+ * client.events.values.RAW = {
19
+ * data: { name: "raw" },
20
+ * run: async (data) => {
21
+ * await manager.updateVoiceState(data);
22
+ * }
23
+ * }
24
+ *
25
+ * client.events.values.READY = {
26
+ * data: { name: "ready" },
27
+ * run: async (user, client) => {
28
+ * await manager.init({ clientId: client.botId });
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ class SeyfertManager extends Manager_1.Manager {
34
+ client;
35
+ constructor(client, options) {
36
+ super(options);
37
+ this.client = client;
38
+ }
39
+ send(packet) {
40
+ this.client.gateway.send((0, common_1.calculateShardId)(packet.d.guild_id), packet);
41
+ }
42
+ }
43
+ exports.SeyfertManager = SeyfertManager;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magmastream",
3
- "version": "2.9.0-dev.34",
3
+ "version": "2.9.0-dev.36",
4
4
  "description": "A user-friendly Lavalink client designed for NodeJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -30,7 +30,6 @@
30
30
  "dependencies": {
31
31
  "@discordjs/collection": "^2.1.1",
32
32
  "axios": "^1.9.0",
33
- "cheerio": "^1.1.0",
34
33
  "events": "^3.3.0",
35
34
  "ioredis": "^5.6.1",
36
35
  "jsdom": "^26.1.0",
@@ -42,7 +41,8 @@
42
41
  "detritus-client": "0.16.x",
43
42
  "discord.js": "14.x",
44
43
  "eris": "0.18.x",
45
- "oceanic.js": "1.12.0"
44
+ "oceanic.js": "1.12.0",
45
+ "seyfert": "3.2.x"
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=16.0.0"