sonatica 1.10.0 → 1.11.0-next.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.
Files changed (39) hide show
  1. package/@dist/classes/EventOpHandler.d.ts +20 -0
  2. package/@dist/classes/EventOpHandler.d.ts.map +1 -0
  3. package/@dist/classes/EventOpHandler.js +176 -0
  4. package/@dist/classes/EventOpHandler.js.map +1 -0
  5. package/@dist/classes/Lyrics.js +1 -1
  6. package/@dist/classes/Lyrics.js.map +1 -1
  7. package/@dist/classes/Node.d.ts +8 -15
  8. package/@dist/classes/Node.d.ts.map +1 -1
  9. package/@dist/classes/Node.js +63 -177
  10. package/@dist/classes/Node.js.map +1 -1
  11. package/@dist/classes/Player.d.ts.map +1 -1
  12. package/@dist/classes/Player.js +21 -25
  13. package/@dist/classes/Player.js.map +1 -1
  14. package/@dist/classes/Sonatica.d.ts +5 -6
  15. package/@dist/classes/Sonatica.d.ts.map +1 -1
  16. package/@dist/classes/Sonatica.js +14 -19
  17. package/@dist/classes/Sonatica.js.map +1 -1
  18. package/@dist/classes/database/Database.d.ts +1 -1
  19. package/@dist/classes/database/Database.d.ts.map +1 -1
  20. package/@dist/sorter/leastLoadNode.d.ts.map +1 -1
  21. package/@dist/sorter/leastLoadNode.js +9 -1
  22. package/@dist/sorter/leastLoadNode.js.map +1 -1
  23. package/@dist/sorter/leastUsedNode.d.ts.map +1 -1
  24. package/@dist/sorter/leastUsedNode.js +5 -4
  25. package/@dist/sorter/leastUsedNode.js.map +1 -1
  26. package/@dist/types/Player.d.ts +9 -1
  27. package/@dist/types/Player.d.ts.map +1 -1
  28. package/@dist/types/Player.js +11 -1
  29. package/@dist/types/Player.js.map +1 -1
  30. package/@dist/types/Sonatica.d.ts +12 -9
  31. package/@dist/types/Sonatica.d.ts.map +1 -1
  32. package/@dist/types/Sorter.d.ts +1 -2
  33. package/@dist/types/Sorter.d.ts.map +1 -1
  34. package/@dist/types/Utils.d.ts +2 -0
  35. package/@dist/types/Utils.d.ts.map +1 -0
  36. package/@dist/types/Utils.js +3 -0
  37. package/@dist/types/Utils.js.map +1 -0
  38. package/README.md +30 -30
  39. package/package.json +53 -53
@@ -0,0 +1,20 @@
1
+ import { EventOp } from "../types/Op";
2
+ import { Sonatica } from "./Sonatica";
3
+ import { Node } from "./Node";
4
+ export declare class EventOpHandler {
5
+ private node;
6
+ private sonatica;
7
+ constructor(node: Node, sonatica: Sonatica);
8
+ handleOp(payload: EventOp): void;
9
+ private trackStart;
10
+ private trackEnd;
11
+ private trackStuck;
12
+ private trackError;
13
+ private socketClosed;
14
+ private lyricsFound;
15
+ private lyricsNotFound;
16
+ private lyricsLine;
17
+ private queueEnd;
18
+ private handleAutoplay;
19
+ }
20
+ //# sourceMappingURL=EventOpHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventOpHandler.d.ts","sourceRoot":"","sources":["../../src/classes/EventOpHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAsJ,MAAM,aAAa,CAAC;AAG1L,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAO9B,qBAAa,cAAc;IACd,OAAO,CAAC,IAAI;IAAQ,OAAO,CAAC,QAAQ;gBAA5B,IAAI,EAAE,IAAI,EAAU,QAAQ,EAAE,QAAQ;IAMnD,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA6CvC,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,QAAQ;IA8DhB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,UAAU;YAUJ,QAAQ;YAeR,cAAc;CA6B5B"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EventOpHandler = void 0;
13
+ const Player_1 = require("../types/Player");
14
+ const sources_1 = require("../utils/sources");
15
+ class EventOpHandler {
16
+ constructor(node, sonatica) {
17
+ this.node = node;
18
+ this.sonatica = sonatica;
19
+ }
20
+ handleOp(payload) {
21
+ if (!payload.guildId)
22
+ return;
23
+ const player = this.sonatica.players.get(payload.guildId);
24
+ if (!player)
25
+ return;
26
+ const track = player.queue.current;
27
+ switch (payload.type) {
28
+ case "TrackStartEvent":
29
+ this.trackStart(player, track, payload);
30
+ break;
31
+ case "TrackStuckEvent":
32
+ player.position = 0;
33
+ this.trackStuck(player, track, payload);
34
+ break;
35
+ case "TrackExceptionEvent":
36
+ player.position = 0;
37
+ this.trackError(player, track, payload);
38
+ break;
39
+ case "WebSocketClosedEvent":
40
+ player.position = 0;
41
+ this.socketClosed(player, payload);
42
+ break;
43
+ case "TrackEndEvent":
44
+ player.save();
45
+ player.position = 0;
46
+ this.trackEnd(player, track, payload);
47
+ break;
48
+ case "LyricsFoundEvent":
49
+ this.lyricsFound(player, track, payload);
50
+ break;
51
+ case "LyricsNotFoundEvent":
52
+ this.lyricsNotFound(player, track, payload);
53
+ break;
54
+ case "LyricsLineEvent":
55
+ this.lyricsLine(player, track, payload);
56
+ break;
57
+ }
58
+ }
59
+ trackStart(player, track, payload) {
60
+ player.playing = true;
61
+ player.paused = false;
62
+ this.sonatica.emit("trackStart", player, track, payload);
63
+ }
64
+ trackEnd(player, track, payload) {
65
+ if (player.state === "MOVING" || player.state === "RESUMING")
66
+ return;
67
+ const { reason } = payload;
68
+ const { queue, repeatMode } = player;
69
+ const { autoPlay } = this.sonatica.options;
70
+ switch (reason) {
71
+ case "loadFailed":
72
+ case "cleanup":
73
+ {
74
+ queue.previous = queue.current;
75
+ queue.current = queue.shift();
76
+ if (!queue.current)
77
+ return this.queueEnd(player, track, payload);
78
+ this.sonatica.emit("trackEnd", player, track, payload);
79
+ if (autoPlay)
80
+ player.play();
81
+ }
82
+ break;
83
+ case "replaced":
84
+ {
85
+ this.sonatica.emit("trackEnd", player, track, payload);
86
+ queue.previous = queue.current;
87
+ }
88
+ break;
89
+ default:
90
+ {
91
+ if (track && (repeatMode === Player_1.RepeatMode.TRACK || repeatMode === Player_1.RepeatMode.QUEUE)) {
92
+ if (repeatMode === Player_1.RepeatMode.TRACK) {
93
+ queue.unshift(queue.current);
94
+ }
95
+ else if (repeatMode === Player_1.RepeatMode.QUEUE) {
96
+ queue.add(queue.current);
97
+ }
98
+ queue.previous = queue.current;
99
+ queue.current = queue.shift();
100
+ this.sonatica.emit("trackEnd", player, track, payload);
101
+ if (reason === "stopped" && !(queue.current = queue.shift()))
102
+ return this.queueEnd(player, track, payload);
103
+ if (autoPlay)
104
+ player.play();
105
+ }
106
+ else if (queue.length) {
107
+ queue.previous = queue.current;
108
+ queue.current = queue.shift();
109
+ this.sonatica.emit("trackEnd", player, track, payload);
110
+ if (autoPlay)
111
+ player.play();
112
+ }
113
+ else {
114
+ this.queueEnd(player, track, payload);
115
+ }
116
+ }
117
+ break;
118
+ }
119
+ }
120
+ trackStuck(player, track, payload) {
121
+ this.sonatica.emit("trackStuck", player, track, payload);
122
+ }
123
+ trackError(player, track, payload) {
124
+ this.sonatica.emit("trackError", player, track, payload);
125
+ }
126
+ socketClosed(player, payload) {
127
+ this.sonatica.emit("socketClosed", player, payload);
128
+ }
129
+ lyricsFound(player, track, payload) {
130
+ this.sonatica.emit("lyricsFound", player, track, payload);
131
+ }
132
+ lyricsNotFound(player, track, payload) {
133
+ this.sonatica.emit("lyricsNotFound", player, track, payload);
134
+ }
135
+ lyricsLine(player, track, payload) {
136
+ this.sonatica.emit("lyricsLine", player, track, payload);
137
+ }
138
+ queueEnd(player, track, payload) {
139
+ return __awaiter(this, void 0, void 0, function* () {
140
+ player.queue.current = null;
141
+ player.playing = player.isAutoplay;
142
+ if (player.isAutoplay)
143
+ return yield this.handleAutoplay(player, track);
144
+ this.sonatica.emit("queueEnd", player, track, payload);
145
+ });
146
+ }
147
+ handleAutoplay(player, track) {
148
+ return __awaiter(this, void 0, void 0, function* () {
149
+ var _a, _b, _c;
150
+ const fallbackVideo = "H58vbez_m4E";
151
+ const getMixUrl = (id) => `https://www.youtube.com/watch?v=${id}&list=RD${id}`;
152
+ const previousTrack = player.queue.previous || track;
153
+ let identifier = previousTrack.sourceName === "youtube" ? previousTrack.identifier : null;
154
+ if (!identifier) {
155
+ const baseSearch = yield player.search({ query: `${previousTrack.title} - ${previousTrack.author}`, source: sources_1.SearchPlatform["youtube"] }, previousTrack.requester);
156
+ identifier = (_a = baseSearch.tracks[0]) === null || _a === void 0 ? void 0 : _a.identifier;
157
+ }
158
+ if (!identifier)
159
+ identifier = fallbackVideo;
160
+ const mixUrl = getMixUrl(identifier);
161
+ let mixResult = yield player.search({ query: mixUrl }, previousTrack.requester);
162
+ if (mixResult.loadType === "error" || mixResult.loadType === "empty") {
163
+ const fallbackMixUrl = getMixUrl(fallbackVideo);
164
+ mixResult = yield player.search({ query: fallbackMixUrl }, previousTrack.requester);
165
+ }
166
+ const tracks = (_c = (_b = mixResult === null || mixResult === void 0 ? void 0 : mixResult.playlist) === null || _b === void 0 ? void 0 : _b.tracks) === null || _c === void 0 ? void 0 : _c.filter((t) => t.uri !== track.uri);
167
+ if (!(tracks === null || tracks === void 0 ? void 0 : tracks.length))
168
+ return;
169
+ const randomTrack = tracks[Math.floor(Math.random() * tracks.length)];
170
+ player.queue.add(randomTrack);
171
+ player.play();
172
+ });
173
+ }
174
+ }
175
+ exports.EventOpHandler = EventOpHandler;
176
+ //# sourceMappingURL=EventOpHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventOpHandler.js","sourceRoot":"","sources":["../../src/classes/EventOpHandler.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ class Lyrics {
30
30
  unsubscribe() {
31
31
  return __awaiter(this, void 0, void 0, function* () {
32
32
  this.hasLavaLyricsPlugin();
33
- return yield this.node.rest.request("GET", `/sessions/${this.node.sessionId}/players/${this.player.guild}/lyrics/unsubscribe`);
33
+ return yield this.node.rest.request("DELETE", `/sessions/${this.node.sessionId}/players/${this.player.guild}/lyrics/subscribe`);
34
34
  });
35
35
  }
36
36
  hasLavaLyricsPlugin() {
@@ -1 +1 @@
1
- {"version":3,"file":"Lyrics.js","sourceRoot":"","sources":["../../src/classes/Lyrics.ts"],"names":[],"mappings":";;;;;;;;;;;;AAQA,MAAa,MAAM;IAQlB,YAAmB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC;IAQY,GAAG;6DAAC,kBAA2B,KAAK;YAChD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAqB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,iCAAiC,eAAe,EAAE,CAAC,CAAC;QAC3K,CAAC;KAAA;IAOY,SAAS;;YACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnI,CAAC;KAAA;IAOY,WAAW;;YACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,qBAAqB,CAAC,CAAC;QAChI,CAAC;KAAA;IAOO,mBAAmB;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mBAAmB,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;CACD;AAxDD,wBAwDC"}
1
+ {"version":3,"file":"Lyrics.js","sourceRoot":"","sources":["../../src/classes/Lyrics.ts"],"names":[],"mappings":";;;;;;;;;;;;AAQA,MAAa,MAAM;IAQlB,YAAmB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAChC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,CAAC;IAQY,GAAG;6DAAC,kBAA2B,KAAK;YAChD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAqB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,iCAAiC,eAAe,EAAE,CAAC,CAAC;QAC3K,CAAC;KAAA;IAOY,SAAS;;YACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACnI,CAAC;KAAA;IAOY,WAAW;;YACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE3B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,YAAY,IAAI,CAAC,MAAM,CAAC,KAAK,mBAAmB,CAAC,CAAC;QACjI,CAAC;KAAA;IAOO,mBAAmB;QAC1B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,mBAAmB,CAAC,EAAE,CAAC;YACnF,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;CACD;AAxDD,wBAwDC"}
@@ -2,9 +2,6 @@ import { WebSocket } from "ws";
2
2
  import { NodeInfo, NodeOptions, NodeStats } from "../types/Node";
3
3
  import { Sonatica } from "./Sonatica";
4
4
  import { Rest } from "./Rest";
5
- import { EventOp, LyricsFoundEvent, LyricsLineEvent, LyricsNotFoundEvent, TrackEndEvent, TrackExceptionEvent, TrackStartEvent, TrackStuckEvent, WebSocketClosedEvent } from "../types/Op";
6
- import { Player } from "./Player";
7
- import { UnresolvedTrack, Track } from "../types/Player";
8
5
  export declare class Node {
9
6
  options: NodeOptions;
10
7
  private static _sonatica;
@@ -13,11 +10,16 @@ export declare class Node {
13
10
  sessionId: string;
14
11
  sonatica: Sonatica;
15
12
  ws: WebSocket;
13
+ ping: number;
16
14
  info: NodeInfo;
17
15
  stats: NodeStats;
18
16
  private reconnectTimeout?;
19
17
  private reconnectAttempts;
20
- private lastestOp;
18
+ private lastOp;
19
+ private missedPings;
20
+ private maxMissedPings;
21
+ private pingInterval?;
22
+ private eventHandler;
21
23
  get connected(): boolean;
22
24
  get address(): string;
23
25
  static init(sonatica: Sonatica): void;
@@ -27,19 +29,10 @@ export declare class Node {
27
29
  protected close(code: number, reason: string): void;
28
30
  protected error(error: Error): void;
29
31
  protected message(d: Buffer | string): Promise<boolean>;
30
- protected handleOp(payload: EventOp): void;
31
- protected trackStart(player: Player, track: Track, payload: TrackStartEvent): void;
32
- protected trackEnd(player: Player, track: Track, payload: TrackEndEvent): Promise<void>;
33
- protected trackStuck(player: Player, track: Track, payload: TrackStuckEvent): void;
34
- protected trackError(player: Player, track: Track | UnresolvedTrack, payload: TrackExceptionEvent): void;
35
- protected socketClosed(player: Player, payload: WebSocketClosedEvent): void;
36
- protected lyricsFound(player: Player, track: Track, payload: LyricsFoundEvent): void;
37
- protected lyricsNotFound(player: Player, track: Track, payload: LyricsNotFoundEvent): void;
38
- protected lyricsLine(player: Player, track: Track, payload: LyricsLineEvent): void;
39
- protected queueEnd(player: Player, track: Track, payload: TrackEndEvent): Promise<void>;
40
32
  private reconnect;
41
33
  setEnabled(enabled: boolean): void;
42
34
  destroy(): void;
43
- private handleAutoplay;
35
+ private startPingInterval;
36
+ private stopPingInterval;
44
37
  }
45
38
  //# sourceMappingURL=Node.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../src/classes/Node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAO,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAE/L,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAc,eAAe,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAOrE,qBAAa,IAAI;IA8EG,OAAO,EAAE,WAAW;IA7EvC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAW;IAC5B,SAAS,EAAE,OAAO,CAAQ;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,QAAQ,CAenB;IACK,KAAK,EAAE,SAAS,CAoBrB;IAEF,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAC1C,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,SAAS,CAAa;IAM9B,IAAW,SAAS,IAAI,OAAO,CAG9B;IAMD,IAAW,OAAO,IAAI,MAAM,CAE3B;WAMa,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;gBAQzB,OAAO,EAAE,WAAW;IA8B1B,OAAO;cAwBJ,IAAI;IAYpB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAmB5C,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;cASnB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAqH1C,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO;IA6CnC,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe;IAY3E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa;IA8DvE,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAUlF,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,eAAe,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IASxG,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAU3E,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAUpF,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAU1F,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;cAUlE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAY7F,OAAO,CAAC,SAAS;IAoBV,UAAU,CAAC,OAAO,EAAE,OAAO;IAO3B,OAAO;YAyBA,cAAc;CAmC5B"}
1
+ {"version":3,"file":"Node.d.ts","sourceRoot":"","sources":["../../src/classes/Node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAU9B,qBAAa,IAAI;IAmFG,OAAO,EAAE,WAAW;IAlFvC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAW;IAC5B,SAAS,EAAE,OAAO,CAAQ;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAM;IAClB,IAAI,EAAE,QAAQ,CAenB;IACK,KAAK,EAAE,SAAS,CAoBrB;IAEF,OAAO,CAAC,gBAAgB,CAAC,CAAiB;IAC1C,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAC,CAAiB;IACtC,OAAO,CAAC,YAAY,CAAiB;IAMrC,IAAW,SAAS,IAAI,OAAO,CAG9B;IAMD,IAAW,OAAO,IAAI,MAAM,CAE3B;WAMa,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;gBAQzB,OAAO,EAAE,WAAW;IA+B1B,OAAO;cAwBJ,IAAI;IAcpB,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA2B5C,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;cASnB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAkH1C,OAAO,CAAC,SAAS;IAoBV,UAAU,CAAC,OAAO,EAAE,OAAO;IAO3B,OAAO;IAsBd,OAAO,CAAC,iBAAiB;IA6BzB,OAAO,CAAC,gBAAgB;CAIxB"}
@@ -14,7 +14,7 @@ const ws_1 = require("ws");
14
14
  const Rest_1 = require("./Rest");
15
15
  const Player_1 = require("../types/Player");
16
16
  const utils_1 = require("../utils/utils");
17
- const sources_1 = require("../utils/sources");
17
+ const EventOpHandler_1 = require("./EventOpHandler");
18
18
  class Node {
19
19
  get connected() {
20
20
  if (!this.ws)
@@ -30,6 +30,7 @@ class Node {
30
30
  constructor(options) {
31
31
  this.options = options;
32
32
  this.isEnabled = true;
33
+ this.ping = -1;
33
34
  this.info = {
34
35
  version: {
35
36
  semver: "",
@@ -68,7 +69,9 @@ class Node {
68
69
  },
69
70
  };
70
71
  this.reconnectAttempts = 1;
71
- this.lastestOp = 0;
72
+ this.lastOp = 0;
73
+ this.missedPings = 0;
74
+ this.maxMissedPings = 3;
72
75
  if (!this.sonatica)
73
76
  this.sonatica = Node._sonatica;
74
77
  if (!this.sonatica)
@@ -83,6 +86,7 @@ class Node {
83
86
  this.sonatica.nodes.set(this.options.identifier, this);
84
87
  this.sonatica.emit("nodeCreate", this);
85
88
  this.rest = new Rest_1.Rest(this);
89
+ this.eventHandler = new EventOpHandler_1.EventOpHandler(this, this.sonatica);
86
90
  }
87
91
  connect() {
88
92
  return __awaiter(this, void 0, void 0, function* () {
@@ -109,24 +113,30 @@ class Node {
109
113
  return __awaiter(this, void 0, void 0, function* () {
110
114
  if (this.reconnectTimeout)
111
115
  clearTimeout(this.reconnectTimeout);
116
+ this.missedPings = 0;
112
117
  this.sonatica.emit("nodeConnect", this);
113
118
  this.info = (yield this.rest.request("GET", "/info"));
119
+ this.startPingInterval();
114
120
  });
115
121
  }
116
122
  close(code, reason) {
123
+ this.stopPingInterval();
117
124
  this.sonatica.emit("nodeDisconnect", this, { code, reason });
118
125
  if (code !== 1000 || reason !== "destroy")
119
126
  this.reconnect();
120
- this.sonatica.players
127
+ Array.from(this.sonatica.players.values())
121
128
  .filter((p) => { var _a, _b, _c; return ((_b = (_a = p === null || p === void 0 ? void 0 : p.node) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.identifier) === ((_c = this === null || this === void 0 ? void 0 : this.options) === null || _c === void 0 ? void 0 : _c.identifier); })
122
129
  .forEach((p) => {
123
- if (!this.sonatica.options.autoMove)
124
- return (p.playing = false);
125
- if (this.sonatica.options.autoMove) {
126
- if (this.sonatica.nodes.filter((n) => n.connected).size === 0)
127
- return (p.playing = false);
128
- p.moveNode();
130
+ if (!this.sonatica.options.autoMove) {
131
+ p.playing = false;
132
+ return;
133
+ }
134
+ const connectedNodes = Array.from(this.sonatica.nodes.values()).filter((n) => n.connected);
135
+ if (connectedNodes.length === 0) {
136
+ p.playing = false;
137
+ return;
129
138
  }
139
+ p.moveNode();
130
140
  });
131
141
  }
132
142
  error(error) {
@@ -144,8 +154,8 @@ class Node {
144
154
  const payload = JSON.parse(d.toString());
145
155
  if (!payload.op)
146
156
  return;
147
- this.sonatica.emit("nodeRaw", payload);
148
- this.lastestOp = Date.now();
157
+ this.sonatica.emit("nodeRaw", this, payload);
158
+ this.lastOp = Date.now();
149
159
  switch (payload.op) {
150
160
  case "stats":
151
161
  {
@@ -158,6 +168,7 @@ class Node {
158
168
  const player = this.sonatica.players.get(payload.guildId);
159
169
  if (player)
160
170
  player.position = payload.state.position || 0;
171
+ this.sonatica.emit("playerUpdate", player, payload);
161
172
  }
162
173
  break;
163
174
  case "ready":
@@ -187,7 +198,7 @@ class Node {
187
198
  });
188
199
  if (!previousPlayer.current)
189
200
  return;
190
- player.state = "RESUMING";
201
+ player.state = Player_1.State.RESUMING;
191
202
  const decoded = yield this.sonatica.decodeTracks(previousPlayer.queue.map((t) => t).concat(previousPlayer.current));
192
203
  player.queue.add(utils_1.TrackUtils.build(decoded.find((t) => t.encoded === previousPlayer.current, previousPlayer.requester)));
193
204
  const queue = decoded.filter((t) => t.encoded !== previousPlayer.current).map((t) => utils_1.TrackUtils.build(t, previousPlayer.requester));
@@ -215,14 +226,10 @@ class Node {
215
226
  }
216
227
  }
217
228
  player.playing = true;
218
- this.sonatica.emit("trackStart", player, player.queue.current, {
219
- type: "TrackStartEvent",
220
- guildId: player.guild,
221
- track: player.queue.current,
222
- });
229
+ this.sonatica.emit("trackStart", player, player.queue.current, null);
223
230
  }
224
231
  if (this.reconnectAttempts !== 1) {
225
- this.sonatica.players
232
+ Array.from(this.sonatica.players.values())
226
233
  .filter((p) => { var _a, _b, _c; return ((_b = (_a = p === null || p === void 0 ? void 0 : p.node) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.identifier) === ((_c = this === null || this === void 0 ? void 0 : this.options) === null || _c === void 0 ? void 0 : _c.identifier); })
227
234
  .forEach((p) => __awaiter(this, void 0, void 0, function* () {
228
235
  var _a;
@@ -242,138 +249,11 @@ class Node {
242
249
  }
243
250
  break;
244
251
  case "event":
245
- this.handleOp(payload);
252
+ this.eventHandler.handleOp(payload);
246
253
  break;
247
254
  }
248
255
  });
249
256
  }
250
- handleOp(payload) {
251
- if (!payload.guildId)
252
- return;
253
- const player = this.sonatica.players.get(payload.guildId);
254
- if (!player)
255
- return;
256
- const track = player.queue.current;
257
- switch (payload.type) {
258
- case "TrackStartEvent":
259
- this.trackStart(player, track, payload);
260
- break;
261
- case "TrackStuckEvent":
262
- player.position = 0;
263
- this.trackStuck(player, track, payload);
264
- break;
265
- case "TrackExceptionEvent":
266
- player.position = 0;
267
- this.trackError(player, track, payload);
268
- break;
269
- case "WebSocketClosedEvent":
270
- player.position = 0;
271
- this.socketClosed(player, payload);
272
- break;
273
- case "TrackEndEvent":
274
- player.save();
275
- player.position = 0;
276
- this.trackEnd(player, track, payload);
277
- break;
278
- case "LyricsFoundEvent":
279
- this.lyricsFound(player, track, payload);
280
- break;
281
- case "LyricsNotFoundEvent":
282
- this.lyricsNotFound(player, track, payload);
283
- break;
284
- case "LyricsLineEvent":
285
- this.lyricsLine(player, track, payload);
286
- break;
287
- }
288
- }
289
- trackStart(player, track, payload) {
290
- player.playing = true;
291
- player.paused = false;
292
- this.sonatica.emit("trackStart", player, track, payload);
293
- }
294
- trackEnd(player, track, payload) {
295
- if (player.state === "MOVING" || player.state === "RESUMING")
296
- return;
297
- const { reason } = payload;
298
- const { queue, repeatMode } = player;
299
- const { autoPlay } = this.sonatica.options;
300
- switch (reason) {
301
- case "loadFailed":
302
- case "cleanup":
303
- {
304
- queue.previous = queue.current;
305
- queue.current = queue.shift();
306
- if (!queue.current)
307
- return this.queueEnd(player, track, payload);
308
- this.sonatica.emit("trackEnd", player, track, payload);
309
- if (autoPlay)
310
- player.play();
311
- }
312
- break;
313
- case "replaced":
314
- {
315
- this.sonatica.emit("trackEnd", player, track, payload);
316
- queue.previous = queue.current;
317
- }
318
- break;
319
- default:
320
- {
321
- if (track && (repeatMode === Player_1.RepeatMode.TRACK || repeatMode === Player_1.RepeatMode.QUEUE)) {
322
- if (repeatMode === Player_1.RepeatMode.TRACK) {
323
- queue.unshift(queue.current);
324
- }
325
- else if (repeatMode === Player_1.RepeatMode.QUEUE) {
326
- queue.add(queue.current);
327
- }
328
- queue.previous = queue.current;
329
- queue.current = queue.shift();
330
- this.sonatica.emit("trackEnd", player, track, payload);
331
- if (reason === "stopped" && !(queue.current = queue.shift()))
332
- return this.queueEnd(player, track, payload);
333
- if (autoPlay)
334
- player.play();
335
- }
336
- else if (queue.length) {
337
- queue.previous = queue.current;
338
- queue.current = queue.shift();
339
- this.sonatica.emit("trackEnd", player, track, payload);
340
- if (autoPlay)
341
- player.play();
342
- }
343
- else {
344
- this.queueEnd(player, track, payload);
345
- }
346
- }
347
- break;
348
- }
349
- }
350
- trackStuck(player, track, payload) {
351
- this.sonatica.emit("trackStuck", player, track, payload);
352
- }
353
- trackError(player, track, payload) {
354
- this.sonatica.emit("trackError", player, track, payload);
355
- }
356
- socketClosed(player, payload) {
357
- this.sonatica.emit("socketClosed", player, payload);
358
- }
359
- lyricsFound(player, track, payload) {
360
- this.sonatica.emit("lyricsFound", player, track, payload);
361
- }
362
- lyricsNotFound(player, track, payload) {
363
- this.sonatica.emit("lyricsNotFound", player, track, payload);
364
- }
365
- lyricsLine(player, track, payload) {
366
- this.sonatica.emit("lyricsLine", player, track, payload);
367
- }
368
- queueEnd(player, track, payload) {
369
- return __awaiter(this, void 0, void 0, function* () {
370
- player.queue.current = null;
371
- player.playing = player.isAutoplay;
372
- if (player.isAutoplay)
373
- return yield this.handleAutoplay(player, track);
374
- this.sonatica.emit("queueEnd", player, track, payload);
375
- });
376
- }
377
257
  reconnect() {
378
258
  this.reconnectTimeout = setTimeout(() => {
379
259
  var _a;
@@ -394,51 +274,57 @@ class Node {
394
274
  }
395
275
  destroy() {
396
276
  var _a, _b;
397
- if (!this.connected)
398
- return;
399
- const players = this.sonatica.players.filter((p) => { var _a, _b, _c; return ((_b = (_a = p === null || p === void 0 ? void 0 : p.node) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.identifier) === ((_c = this === null || this === void 0 ? void 0 : this.options) === null || _c === void 0 ? void 0 : _c.identifier); });
400
- if (players.size) {
277
+ const players = Array.from(this.sonatica.players.values()).filter((p) => { var _a, _b, _c; return ((_b = (_a = p === null || p === void 0 ? void 0 : p.node) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.identifier) === ((_c = this === null || this === void 0 ? void 0 : this.options) === null || _c === void 0 ? void 0 : _c.identifier); });
278
+ if (players.length) {
401
279
  players.forEach((p) => {
402
- if (this.sonatica.options.autoMove)
280
+ if (this.sonatica.options.autoMove) {
403
281
  p.moveNode();
404
- else
282
+ }
283
+ else {
405
284
  p.destroy();
285
+ }
406
286
  });
407
287
  }
408
288
  (_a = this.ws) === null || _a === void 0 ? void 0 : _a.close(1000, "destroy");
409
289
  (_b = this.ws) === null || _b === void 0 ? void 0 : _b.removeAllListeners();
410
290
  this.ws = null;
411
291
  this.reconnectAttempts = 1;
292
+ this.stopPingInterval();
412
293
  clearTimeout(this.reconnectTimeout);
413
294
  this.sonatica.emit("nodeDestroy", this);
414
295
  this.sonatica.destroyNode(this.options.identifier);
415
296
  }
416
- handleAutoplay(player, track) {
417
- return __awaiter(this, void 0, void 0, function* () {
418
- const base = "https://www.youtube.com/watch?v=H58vbez_m4E";
419
- const getMixUrl = (identifier) => `https://www.youtube.com/watch?v=${identifier}&list=RD${identifier}`;
420
- const findMix = () => __awaiter(this, void 0, void 0, function* () {
421
- let mixUrl;
422
- let response;
423
- let base_response;
424
- const previousTrack = player.queue.previous || track;
425
- base_response = yield player.search({
426
- query: `${previousTrack.title} - ${previousTrack.author}`,
427
- source: sources_1.SearchPlatform["youtube"],
428
- }, previousTrack.requester);
429
- mixUrl = getMixUrl(previousTrack.sourceName === "youtube" ? previousTrack.identifier : base_response.tracks[0].identifier);
430
- response = yield player.search({ query: mixUrl }, previousTrack.requester);
431
- if (response.loadType === "error" || response.loadType === "empty") {
432
- base_response = yield player.search({ query: base }, previousTrack.requester);
433
- mixUrl = getMixUrl(base_response.tracks[0].identifier);
434
- response = yield player.search({ query: mixUrl }, previousTrack.requester);
297
+ startPingInterval() {
298
+ this.stopPingInterval();
299
+ this.pingInterval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
300
+ var _a, _b;
301
+ const start = Date.now();
302
+ if (this.lastOp + 120000 < start) {
303
+ this.stopPingInterval();
304
+ (_a = this.ws) === null || _a === void 0 ? void 0 : _a.close(4000, "missed op");
305
+ return;
306
+ }
307
+ try {
308
+ yield this.rest.request("GET", "/info", undefined);
309
+ this.ping = Date.now() - start;
310
+ this.missedPings = 0;
311
+ this.sonatica.emit("nodePing", this, this.ping);
312
+ }
313
+ catch (_c) {
314
+ this.missedPings++;
315
+ this.ping = -1;
316
+ this.sonatica.emit("nodePingFailed", this, this.missedPings);
317
+ if (this.missedPings >= this.maxMissedPings) {
318
+ this.stopPingInterval();
319
+ (_b = this.ws) === null || _b === void 0 ? void 0 : _b.close(4000, "missed pings");
435
320
  }
436
- return response;
437
- });
438
- const response = yield findMix();
439
- player.queue.add(response.playlist.tracks.filter((t) => t.uri !== track.uri)[Math.floor(Math.random() * response.playlist.tracks.length - 1)]);
440
- player.play();
441
- });
321
+ }
322
+ }), 60000);
323
+ }
324
+ stopPingInterval() {
325
+ if (this.pingInterval)
326
+ clearInterval(this.pingInterval);
327
+ this.pingInterval = undefined;
442
328
  }
443
329
  }
444
330
  exports.Node = Node;