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.
- package/dist/index.d.ts +550 -91
- package/dist/index.js +6 -1
- package/dist/statestorage/JsonQueue.js +436 -0
- package/dist/{structures/Queue.js → statestorage/MemoryQueue.js} +87 -24
- package/dist/{structures → statestorage}/RedisQueue.js +127 -9
- package/dist/structures/Enums.js +2 -1
- package/dist/structures/Manager.js +287 -125
- package/dist/structures/Node.js +18 -10
- package/dist/structures/Player.js +49 -30
- package/dist/structures/Rest.js +2 -1
- package/dist/structures/Utils.js +5 -5
- package/dist/wrappers/seyfert.js +43 -0
- package/package.json +3 -3
package/dist/structures/Node.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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("
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
481
|
-
|
|
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
|
-
|
|
515
|
-
|
|
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
|
-
|
|
571
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
745
|
+
type: "track",
|
|
746
|
+
action: "timeUpdate",
|
|
728
747
|
previousTime: oldPlayer.position,
|
|
729
748
|
currentTime: this.position,
|
|
730
749
|
},
|
package/dist/structures/Rest.js
CHANGED
|
@@ -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(
|
|
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") {
|
package/dist/structures/Utils.js
CHANGED
|
@@ -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("
|
|
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.
|
|
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"
|