lavalink-client 2.2.2 → 2.3.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 (88) hide show
  1. package/README.md +95 -1
  2. package/dist/cjs/index.d.ts +7 -1
  3. package/dist/cjs/index.js +7 -1
  4. package/dist/cjs/structures/Constants.d.ts +40 -0
  5. package/dist/cjs/structures/Constants.js +244 -0
  6. package/dist/cjs/structures/CustomSearches/BandCampSearch.d.ts +2 -2
  7. package/dist/cjs/structures/Filters.d.ts +2 -217
  8. package/dist/cjs/structures/Filters.js +8 -232
  9. package/dist/cjs/structures/LavalinkManager.d.ts +31 -166
  10. package/dist/cjs/structures/LavalinkManager.js +59 -7
  11. package/dist/cjs/structures/LavalinkManagerStatics.d.ts +1 -1
  12. package/dist/cjs/structures/Node.d.ts +15 -156
  13. package/dist/cjs/structures/Node.js +131 -49
  14. package/dist/cjs/structures/NodeManager.d.ts +54 -52
  15. package/dist/cjs/structures/NodeManager.js +74 -4
  16. package/dist/cjs/structures/Player.d.ts +31 -124
  17. package/dist/cjs/structures/Player.js +77 -43
  18. package/dist/cjs/structures/Queue.d.ts +66 -42
  19. package/dist/cjs/structures/Queue.js +69 -11
  20. package/dist/cjs/structures/Types/Filters.d.ts +190 -0
  21. package/dist/cjs/structures/Types/Manager.d.ts +184 -0
  22. package/dist/cjs/structures/Types/Manager.js +2 -0
  23. package/dist/cjs/structures/Types/Node.d.ts +216 -0
  24. package/dist/cjs/structures/Types/Node.js +2 -0
  25. package/dist/cjs/structures/Types/Player.d.ts +108 -0
  26. package/dist/cjs/structures/Types/Player.js +2 -0
  27. package/dist/cjs/structures/Types/Queue.d.ts +34 -0
  28. package/dist/cjs/structures/Types/Queue.js +2 -0
  29. package/dist/cjs/structures/{Track.d.ts → Types/Track.d.ts} +3 -2
  30. package/dist/cjs/structures/Types/Track.js +2 -0
  31. package/dist/cjs/structures/Types/Utils.d.ts +367 -0
  32. package/dist/cjs/structures/Types/Utils.js +2 -0
  33. package/dist/cjs/structures/Utils.d.ts +13 -369
  34. package/dist/cjs/structures/Utils.js +35 -14
  35. package/dist/esm/index.d.ts +7 -1
  36. package/dist/esm/index.js +7 -1
  37. package/dist/esm/structures/Constants.d.ts +40 -0
  38. package/dist/esm/structures/Constants.js +241 -0
  39. package/dist/esm/structures/CustomSearches/BandCampSearch.d.ts +2 -2
  40. package/dist/esm/structures/Filters.d.ts +2 -217
  41. package/dist/esm/structures/Filters.js +3 -227
  42. package/dist/esm/structures/LavalinkManager.d.ts +31 -166
  43. package/dist/esm/structures/LavalinkManager.js +57 -5
  44. package/dist/esm/structures/LavalinkManagerStatics.d.ts +1 -1
  45. package/dist/esm/structures/Node.d.ts +15 -156
  46. package/dist/esm/structures/Node.js +122 -40
  47. package/dist/esm/structures/NodeManager.d.ts +54 -52
  48. package/dist/esm/structures/NodeManager.js +71 -1
  49. package/dist/esm/structures/Player.d.ts +31 -124
  50. package/dist/esm/structures/Player.js +76 -42
  51. package/dist/esm/structures/Queue.d.ts +66 -42
  52. package/dist/esm/structures/Queue.js +69 -11
  53. package/dist/esm/structures/Types/Filters.d.ts +190 -0
  54. package/dist/esm/structures/Types/Manager.d.ts +184 -0
  55. package/dist/esm/structures/Types/Manager.js +1 -0
  56. package/dist/esm/structures/Types/Node.d.ts +216 -0
  57. package/dist/esm/structures/Types/Node.js +1 -0
  58. package/dist/esm/structures/Types/Player.d.ts +108 -0
  59. package/dist/esm/structures/Types/Player.js +1 -0
  60. package/dist/esm/structures/Types/Queue.d.ts +34 -0
  61. package/dist/esm/structures/Types/Queue.js +1 -0
  62. package/dist/{types/structures → esm/structures/Types}/Track.d.ts +3 -2
  63. package/dist/esm/structures/Types/Track.js +1 -0
  64. package/dist/esm/structures/Types/Utils.d.ts +367 -0
  65. package/dist/esm/structures/Types/Utils.js +1 -0
  66. package/dist/esm/structures/Utils.d.ts +13 -369
  67. package/dist/esm/structures/Utils.js +35 -14
  68. package/dist/types/index.d.ts +7 -1
  69. package/dist/types/structures/Constants.d.ts +40 -0
  70. package/dist/types/structures/CustomSearches/BandCampSearch.d.ts +2 -2
  71. package/dist/types/structures/Filters.d.ts +2 -217
  72. package/dist/types/structures/LavalinkManager.d.ts +31 -166
  73. package/dist/types/structures/LavalinkManagerStatics.d.ts +1 -1
  74. package/dist/types/structures/Node.d.ts +15 -156
  75. package/dist/types/structures/NodeManager.d.ts +54 -52
  76. package/dist/types/structures/Player.d.ts +31 -124
  77. package/dist/types/structures/Queue.d.ts +66 -42
  78. package/dist/types/structures/Types/Filters.d.ts +190 -0
  79. package/dist/types/structures/Types/Manager.d.ts +184 -0
  80. package/dist/types/structures/Types/Node.d.ts +216 -0
  81. package/dist/types/structures/Types/Player.d.ts +108 -0
  82. package/dist/types/structures/Types/Queue.d.ts +34 -0
  83. package/dist/{esm/structures → types/structures/Types}/Track.d.ts +3 -2
  84. package/dist/types/structures/Types/Utils.d.ts +367 -0
  85. package/dist/types/structures/Utils.d.ts +13 -369
  86. package/package.json +1 -1
  87. /package/dist/cjs/structures/{Track.js → Types/Filters.js} +0 -0
  88. /package/dist/esm/structures/{Track.js → Types/Filters.js} +0 -0
@@ -1,68 +1,56 @@
1
1
  /// <reference types="node" />
2
2
  import { EventEmitter } from "stream";
3
- import { LavalinkManager } from "./LavalinkManager";
4
- import { LavalinkNode, LavalinkNodeOptions } from "./Node";
5
- import { DestroyReasonsType } from "./Player";
6
- import { LavalinkPlayer, MiniMap } from "./Utils";
7
- type LavalinkNodeIdentifier = string;
8
- export interface NodeManagerEvents {
3
+ import { LavalinkNode } from "./Node";
4
+ import { MiniMap } from "./Utils";
5
+ import type { LavalinkNodeIdentifier, LavalinkNodeOptions, NodeManagerEvents } from "./Types/Node";
6
+ import type { LavalinkManager } from "./LavalinkManager";
7
+ export declare class NodeManager extends EventEmitter {
9
8
  /**
10
- * Emitted when a Node is created.
11
- * @event Manager.nodeManager#create
9
+ * Emit an event
10
+ * @param event The event to emit
11
+ * @param args The arguments to pass to the event
12
+ * @returns
12
13
  */
13
- "create": (node: LavalinkNode) => void;
14
+ emit<Event extends keyof NodeManagerEvents>(event: Event, ...args: Parameters<NodeManagerEvents[Event]>): boolean;
14
15
  /**
15
- * Emitted when a Node is destroyed.
16
- * @event Manager.nodeManager#destroy
16
+ * Add an event listener
17
+ * @param event The event to listen to
18
+ * @param listener The listener to add
19
+ * @returns
17
20
  */
18
- "destroy": (node: LavalinkNode, destroyReason?: DestroyReasonsType) => void;
21
+ on<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
19
22
  /**
20
- * Emitted when a Node is connected.
21
- * @event Manager.nodeManager#connect
23
+ * Add an event listener that only fires once
24
+ * @param event The event to listen to
25
+ * @param listener The listener to add
26
+ * @returns
22
27
  */
23
- "connect": (node: LavalinkNode) => void;
24
- /**
25
- * Emitted when a Node is reconnecting.
26
- * @event Manager.nodeManager#reconnecting
27
- */
28
- "reconnecting": (node: LavalinkNode) => void;
29
- /**
30
- * Emitted when a Node is disconnects.
31
- * @event Manager.nodeManager#disconnect
32
- */
33
- "disconnect": (node: LavalinkNode, reason: {
34
- code?: number;
35
- reason?: string;
36
- }) => void;
28
+ once<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
37
29
  /**
38
- * Emitted when a Node is error.
39
- * @event Manager.nodeManager#error
40
- */
41
- "error": (node: LavalinkNode, error: Error, payload?: unknown) => void;
30
+ * Remove an event listener
31
+ * @param event The event to remove the listener from
32
+ * @param listener The listener to remove
33
+ * @returns
34
+ */
35
+ off<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
42
36
  /**
43
- * Emits every single Node event.
44
- * @event Manager.nodeManager#raw
45
- */
46
- "raw": (node: LavalinkNode, payload: unknown) => void;
37
+ * Remove an event listener
38
+ * @param event The event to remove the listener from
39
+ * @param listener The listener to remove
40
+ * @returns
41
+ */
42
+ removeListener<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
47
43
  /**
48
- * Emits when the node connects resumed. You then need to create all players within this event for your usecase.
49
- * Aka for that you need to be able to save player data like vc channel + text channel in a db and then sync it again
50
- * @event Manager.nodeManager#nodeResumed
44
+ * The LavalinkManager that created this NodeManager
51
45
  */
52
- "resumed": (node: LavalinkNode, paylaod: {
53
- resumed: true;
54
- sessionId: string;
55
- op: "ready";
56
- }, players: LavalinkPlayer[]) => void;
57
- }
58
- export declare interface NodeManager {
59
- on<U extends keyof NodeManagerEvents>(event: U, listener: NodeManagerEvents[U]): this;
60
- emit<U extends keyof NodeManagerEvents>(event: U, ...args: Parameters<NodeManagerEvents[U]>): boolean;
61
- /** @private */
62
46
  LavalinkManager: LavalinkManager;
63
- }
64
- export declare class NodeManager extends EventEmitter {
47
+ /**
48
+ * A map of all nodes in the nodeManager
49
+ */
65
50
  nodes: MiniMap<string, LavalinkNode>;
51
+ /**
52
+ * @param LavalinkManager The LavalinkManager that created this NodeManager
53
+ */
66
54
  constructor(LavalinkManager: LavalinkManager);
67
55
  /**
68
56
  * Disconnects all Nodes from lavalink ws sockets
@@ -80,8 +68,22 @@ export declare class NodeManager extends EventEmitter {
80
68
  * @returns amount of nodes
81
69
  */
82
70
  reconnectAll(): Promise<number>;
71
+ /**
72
+ * Create a node and add it to the nodeManager
73
+ * @param options The options for the node
74
+ * @returns The node that was created
75
+ */
83
76
  createNode(options: LavalinkNodeOptions): LavalinkNode;
77
+ /**
78
+ * Get the nodes sorted for the least usage, by a sorttype
79
+ * @param sortType The type of sorting to use
80
+ * @returns
81
+ */
84
82
  leastUsedNodes(sortType?: "memory" | "cpuLavalink" | "cpuSystem" | "calls" | "playingPlayers" | "players"): LavalinkNode[];
83
+ /**
84
+ * Delete a node from the nodeManager and destroy it
85
+ * @param node The node to delete
86
+ * @returns
87
+ */
85
88
  deleteNode(node: LavalinkNodeIdentifier | LavalinkNode): void;
86
89
  }
87
- export {};
@@ -1,9 +1,64 @@
1
1
  import { EventEmitter } from "stream";
2
+ import { DestroyReasons } from "./Constants";
2
3
  import { LavalinkNode } from "./Node";
3
- import { DestroyReasons } from "./Player";
4
4
  import { MiniMap } from "./Utils";
5
5
  export class NodeManager extends EventEmitter {
6
+ /**
7
+ * Emit an event
8
+ * @param event The event to emit
9
+ * @param args The arguments to pass to the event
10
+ * @returns
11
+ */
12
+ emit(event, ...args) {
13
+ return super.emit(event, ...args);
14
+ }
15
+ /**
16
+ * Add an event listener
17
+ * @param event The event to listen to
18
+ * @param listener The listener to add
19
+ * @returns
20
+ */
21
+ on(event, listener) {
22
+ return super.on(event, listener);
23
+ }
24
+ /**
25
+ * Add an event listener that only fires once
26
+ * @param event The event to listen to
27
+ * @param listener The listener to add
28
+ * @returns
29
+ */
30
+ once(event, listener) {
31
+ return super.once(event, listener);
32
+ }
33
+ /**
34
+ * Remove an event listener
35
+ * @param event The event to remove the listener from
36
+ * @param listener The listener to remove
37
+ * @returns
38
+ */
39
+ off(event, listener) {
40
+ return super.off(event, listener);
41
+ }
42
+ /**
43
+ * Remove an event listener
44
+ * @param event The event to remove the listener from
45
+ * @param listener The listener to remove
46
+ * @returns
47
+ */
48
+ removeListener(event, listener) {
49
+ return super.removeListener(event, listener);
50
+ }
51
+ /**
52
+ * The LavalinkManager that created this NodeManager
53
+ */
54
+ LavalinkManager;
55
+ /**
56
+ * A map of all nodes in the nodeManager
57
+ */
6
58
  nodes = new MiniMap();
59
+ /**
60
+ * @param LavalinkManager The LavalinkManager that created this NodeManager
61
+ */
7
62
  constructor(LavalinkManager) {
8
63
  super();
9
64
  this.LavalinkManager = LavalinkManager;
@@ -65,6 +120,11 @@ export class NodeManager extends EventEmitter {
65
120
  }
66
121
  return counter;
67
122
  }
123
+ /**
124
+ * Create a node and add it to the nodeManager
125
+ * @param options The options for the node
126
+ * @returns The node that was created
127
+ */
68
128
  createNode(options) {
69
129
  if (this.nodes.has(options.id || `${options.host}:${options.port}`))
70
130
  return this.nodes.get(options.id || `${options.host}:${options.port}`);
@@ -72,6 +132,11 @@ export class NodeManager extends EventEmitter {
72
132
  this.nodes.set(newNode.id, newNode);
73
133
  return newNode;
74
134
  }
135
+ /**
136
+ * Get the nodes sorted for the least usage, by a sorttype
137
+ * @param sortType The type of sorting to use
138
+ * @returns
139
+ */
75
140
  leastUsedNodes(sortType = "players") {
76
141
  switch (sortType) {
77
142
  case "memory":
@@ -125,6 +190,11 @@ export class NodeManager extends EventEmitter {
125
190
  break;
126
191
  }
127
192
  }
193
+ /**
194
+ * Delete a node from the nodeManager and destroy it
195
+ * @param node The node to delete
196
+ * @returns
197
+ */
128
198
  deleteNode(node) {
129
199
  const decodeNode = typeof node === "string" ? this.nodes.get(node) : node || this.leastUsedNodes()[0];
130
200
  if (!decodeNode)
@@ -1,123 +1,12 @@
1
- import { EQBand, FilterData, FilterManager, LavalinkFilterData } from "./Filters";
2
- import { LavalinkManager } from "./LavalinkManager";
3
- import { LavalinkNode, SponsorBlockSegment } from "./Node";
1
+ import { FilterManager } from "./Filters";
4
2
  import { Queue } from "./Queue";
5
- import { Track, UnresolvedTrack } from "./Track";
6
- import { Base64, LavalinkPlayerVoiceOptions, LavaSearchQuery, SearchQuery } from "./Utils";
7
- export declare enum DestroyReasons {
8
- QueueEmpty = "QueueEmpty",
9
- NodeDestroy = "NodeDestroy",
10
- NodeDeleted = "NodeDeleted",
11
- LavalinkNoVoice = "LavalinkNoVoice",
12
- NodeReconnectFail = "NodeReconnectFail",
13
- Disconnected = "Disconnected",
14
- PlayerReconnectFail = "PlayerReconnectFail",
15
- ChannelDeleted = "ChannelDeleted",
16
- DisconnectAllNodes = "DisconnectAllNodes",
17
- ReconnectAllNodes = "ReconnectAllNodes"
18
- }
19
- export type DestroyReasonsType = keyof typeof DestroyReasons | string;
20
- export interface PlayerJson {
21
- /** Guild Id where the player was playing in */
22
- guildId: string;
23
- /** Options provided to the player */
24
- options: PlayerOptions;
25
- /** Voice Channel Id the player was playing in */
26
- voiceChannelId: string;
27
- /** Text Channel Id the player was synced to */
28
- textChannelId?: string;
29
- /** Position the player was at */
30
- position: number;
31
- /** Lavalink's position the player was at */
32
- lastPosition: number;
33
- /** Last time the position was sent from lavalink */
34
- lastPositionChange: number;
35
- /** Volume in % from the player (without volumeDecrementer) */
36
- volume: number;
37
- /** Real Volume used in lavalink (with the volumeDecrementer) */
38
- lavalinkVolume: number;
39
- /** The repeatmode from the player */
40
- repeatMode: RepeatMode;
41
- /** Pause state */
42
- paused: boolean;
43
- /** Wether the player was playing or not */
44
- playing: boolean;
45
- /** When the player was created */
46
- createdTimeStamp?: number;
47
- /** All current used fitlers Data */
48
- filters: FilterData;
49
- /** The player's ping object */
50
- ping: {
51
- /** Ping to the voice websocket server */
52
- ws: number;
53
- /** Avg. calc. Ping to the lavalink server */
54
- lavalink: number;
55
- };
56
- /** Equalizer Bands used in lavalink */
57
- equalizer: EQBand[];
58
- /** The Id of the last used node */
59
- nodeId?: string;
60
- }
61
- export type RepeatMode = "queue" | "track" | "off";
62
- export interface PlayerOptions {
63
- /** Guild id of the player */
64
- guildId: string;
65
- /** The Voice Channel Id */
66
- voiceChannelId: string;
67
- /** The Text Channel Id of the Player */
68
- textChannelId?: string;
69
- /** instantly change volume with the one play request */
70
- volume?: number;
71
- /** VC Region for node selections */
72
- vcRegion?: string;
73
- /** if it should join deafened */
74
- selfDeaf?: boolean;
75
- /** If it should join muted */
76
- selfMute?: boolean;
77
- /** If it should use a specific lavalink node */
78
- node?: LavalinkNode | string;
79
- /** If when applying filters, it should use the insta apply filters fix */
80
- instaUpdateFiltersFix?: boolean;
81
- /** If a volume should be applied via filters instead of lavalink-volume */
82
- applyVolumeAsFilter?: boolean;
83
- }
84
- export type anyObject = {
85
- [key: string | number]: string | number | null | anyObject;
86
- };
87
- export interface BasePlayOptions {
88
- /** The position to start the track. */
89
- position?: number;
90
- /** The position to end the track. */
91
- endTime?: number;
92
- /** If to start "paused" */
93
- paused?: boolean;
94
- /** The Volume to start with */
95
- volume?: number;
96
- /** The Lavalink Filters to use | only with the new REST API */
97
- filters?: Partial<LavalinkFilterData>;
98
- /** Voice Update for Lavalink */
99
- voice?: LavalinkPlayerVoiceOptions;
100
- }
101
- export interface LavalinkPlayOptions extends BasePlayOptions {
102
- /** Which Track to play | don't provide, if it should pick from the Queue */
103
- track?: {
104
- /** The track encoded base64 string to use instead of the one from the queue system */
105
- encoded?: Base64 | null;
106
- /** The identifier of the track to use */
107
- identifier?: string;
108
- /** Custom User Data for the track to provide, will then be on the userData object from the track */
109
- userData?: anyObject;
110
- /** The Track requester for when u provide encodedTrack / identifer */
111
- requester?: unknown;
112
- };
113
- }
114
- export interface PlayOptions extends LavalinkPlayOptions {
115
- /** Whether to not replace the track if a play payload is sent. */
116
- noReplace?: boolean;
117
- /** Adds track on queue and skips to it */
118
- clientTrack?: Track | UnresolvedTrack;
119
- }
120
- export interface Player {
3
+ import type { DestroyReasons } from "./Constants";
4
+ import type { LavalinkNode } from "./Node";
5
+ import type { SponsorBlockSegment } from "./Types/Node";
6
+ import type { PlayerJson, PlayerOptions, PlayOptions, RepeatMode } from "./Types/Player";
7
+ import type { LavalinkManager } from "./LavalinkManager";
8
+ import type { LavalinkPlayerVoiceOptions, LavaSearchQuery, SearchQuery } from "./Types/Utils";
9
+ export declare class Player {
121
10
  /** Filter Manager per player */
122
11
  filterManager: FilterManager;
123
12
  /** circular reference to the lavalink Manager from the Player for easier use */
@@ -128,8 +17,6 @@ export interface Player {
128
17
  node: LavalinkNode;
129
18
  /** The queue from the player */
130
19
  queue: Queue;
131
- }
132
- export declare class Player {
133
20
  /** The Guild Id of the Player */
134
21
  guildId: string;
135
22
  /** The Voice Channel Id of the Player */
@@ -157,12 +44,14 @@ export declare class Player {
157
44
  lastPositionChange: number;
158
45
  /** The current Positin of the player (from Lavalink) */
159
46
  lastPosition: number;
47
+ lastSavedPosition: number;
160
48
  /** When the player was created [Timestamp in Ms] (from lavalink) */
161
49
  createdTimeStamp: number;
162
50
  /** The Player Connection's State (from Lavalink) */
163
51
  connected: boolean | undefined;
164
52
  /** Voice Server Data (from Lavalink) */
165
53
  voice: LavalinkPlayerVoiceOptions;
54
+ /** Custom data for the player */
166
55
  private readonly data;
167
56
  /**
168
57
  * Create a new Player
@@ -200,16 +89,33 @@ export declare class Player {
200
89
  * @param ignoreVolumeDecrementer If it should ignore the volumedecrementer option
201
90
  */
202
91
  setVolume(volume: number, ignoreVolumeDecrementer?: boolean): Promise<this>;
203
- lavaSearch(query: LavaSearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<import("./Utils").SearchResult | import("./Utils").LavaSearchResponse>;
92
+ /**
93
+ * Search for a track
94
+ * @param query The query to search for
95
+ * @param requestUser The user that requested the track
96
+ * @param throwOnEmpty If an error should be thrown if no track is found
97
+ * @returns The search result
98
+ */
99
+ lavaSearch(query: LavaSearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<import("./Types/Utils").SearchResult | import("./Types/Utils").LavaSearchResponse>;
100
+ /**
101
+ * Set the SponsorBlock
102
+ * @param segments The segments to set
103
+ */
204
104
  setSponsorBlock(segments?: SponsorBlockSegment[]): Promise<void>;
105
+ /**
106
+ * Get the SponsorBlock
107
+ */
205
108
  getSponsorBlock(): Promise<SponsorBlockSegment[]>;
109
+ /**
110
+ * Delete the SponsorBlock
111
+ */
206
112
  deleteSponsorBlock(): Promise<void>;
207
113
  /**
208
114
  *
209
115
  * @param query Query for your data
210
116
  * @param requestUser
211
117
  */
212
- search(query: SearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<import("./Utils").SearchResult | import("./Utils").UnresolvedSearchResult>;
118
+ search(query: SearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<import("./Types/Utils").UnresolvedSearchResult | import("./Types/Utils").SearchResult>;
213
119
  /**
214
120
  * Pause the player
215
121
  */
@@ -228,11 +134,12 @@ export declare class Player {
228
134
  * @param repeatMode
229
135
  */
230
136
  setRepeatMode(repeatMode: RepeatMode): Promise<this>;
137
+ 1: any;
231
138
  /**
232
139
  * Skip the current song, or a specific amount of songs
233
140
  * @param amount provide the index of the next track to skip to
234
141
  */
235
- skip(skipTo?: number, throwError?: boolean): any;
142
+ skip(skipTo?: number, throwError?: boolean): Promise<this>;
236
143
  /**
237
144
  * Clears the queue and stops playing. Does not destroy the Player and not leave the channel
238
145
  * @returns
@@ -2,21 +2,17 @@ import { bandCampSearch } from "./CustomSearches/BandCampSearch";
2
2
  import { FilterManager } from "./Filters";
3
3
  import { Queue, QueueSaver } from "./Queue";
4
4
  import { queueTrackEnd } from "./Utils";
5
- export var DestroyReasons;
6
- (function (DestroyReasons) {
7
- DestroyReasons["QueueEmpty"] = "QueueEmpty";
8
- DestroyReasons["NodeDestroy"] = "NodeDestroy";
9
- DestroyReasons["NodeDeleted"] = "NodeDeleted";
10
- DestroyReasons["LavalinkNoVoice"] = "LavalinkNoVoice";
11
- DestroyReasons["NodeReconnectFail"] = "NodeReconnectFail";
12
- DestroyReasons["Disconnected"] = "Disconnected";
13
- DestroyReasons["PlayerReconnectFail"] = "PlayerReconnectFail";
14
- DestroyReasons["ChannelDeleted"] = "ChannelDeleted";
15
- DestroyReasons["DisconnectAllNodes"] = "DisconnectAllNodes";
16
- DestroyReasons["ReconnectAllNodes"] = "ReconnectAllNodes";
17
- })(DestroyReasons || (DestroyReasons = {}));
18
- ;
19
5
  export class Player {
6
+ /** Filter Manager per player */
7
+ filterManager;
8
+ /** circular reference to the lavalink Manager from the Player for easier use */
9
+ LavalinkManager;
10
+ /** Player options currently used, mutation doesn't affect player's state */
11
+ options;
12
+ /** The lavalink node assigned the the player, don't change it manually */
13
+ node;
14
+ /** The queue from the player */
15
+ queue;
20
16
  /** The Guild Id of the Player */
21
17
  guildId;
22
18
  /** The Voice Channel Id of the Player */
@@ -48,6 +44,7 @@ export class Player {
48
44
  lastPositionChange = null;
49
45
  /** The current Positin of the player (from Lavalink) */
50
46
  lastPosition = 0;
47
+ lastSavedPosition = 0;
51
48
  /** When the player was created [Timestamp in Ms] (from lavalink) */
52
49
  createdTimeStamp;
53
50
  /** The Player Connection's State (from Lavalink) */
@@ -58,6 +55,7 @@ export class Player {
58
55
  sessionId: null,
59
56
  token: null
60
57
  };
58
+ /** Custom data for the player */
61
59
  data = {};
62
60
  /**
63
61
  * Create a new Player
@@ -130,39 +128,56 @@ export class Player {
130
128
  clearTimeout(this.get("internal_queueempty"));
131
129
  this.set("internal_queueempty", undefined);
132
130
  }
133
- let replaced = false;
134
- // if clientTrack provided, play it
131
+ // if clientTrack provided, override options.track object
135
132
  if (options?.clientTrack && (this.LavalinkManager.utils.isTrack(options?.clientTrack) || this.LavalinkManager.utils.isUnresolvedTrack(options.clientTrack))) {
136
133
  if (this.LavalinkManager.utils.isUnresolvedTrack(options.clientTrack))
137
134
  await options.clientTrack.resolve(this);
138
135
  if ((typeof options.track?.userData === "object" || typeof options.clientTrack?.userData === "object") && options.clientTrack)
139
136
  options.clientTrack.userData = { ...(options?.clientTrack.userData || {}), ...(options.track?.userData || {}) };
140
- await this.queue.add(options?.clientTrack, 0);
141
- return await this.skip();
137
+ options.track = {
138
+ encoded: options.clientTrack?.encoded,
139
+ requester: options.clientTrack?.requester,
140
+ userData: options.clientTrack?.userData,
141
+ };
142
142
  }
143
- else if (options?.track?.encoded) {
144
- // handle play encoded options manually // TODO let it resolve by lavalink!
145
- const track = await this.node.decode.singleTrack(options.track?.encoded, options.track?.requester || this.queue?.current?.requester || this.queue.previous?.[0]?.requester || this.queue.tracks?.[0]?.requester || this.LavalinkManager.options.client);
146
- if (track) {
147
- if (typeof options.track?.userData === "object")
148
- track.userData = { ...(track.userData || {}), ...(options.track.userData || {}) };
149
- replaced = true;
150
- this.queue.add(track, 0);
151
- await queueTrackEnd(this);
152
- }
153
- }
154
- else if (options?.track?.identifier) {
155
- // handle play identifier options manually // TODO let it resolve by lavalink!
156
- const res = await this.search({
157
- query: options?.track?.identifier
158
- }, options?.track?.requester || this.queue?.current?.requester || this.queue.previous?.[0]?.requester || this.queue.tracks?.[0]?.requester || this.LavalinkManager.options.client);
159
- if (res.tracks[0]) {
160
- if (typeof options.track?.userData === "object")
161
- res.tracks[0].userData = { ...(res.tracks[0].userData || {}), ...(options.track.userData || {}) };
162
- replaced = true;
163
- this.queue.add(res.tracks[0], 0);
164
- await queueTrackEnd(this);
143
+ // if either encoded or identifier is provided generate the data to play them
144
+ if (options?.track?.encoded || options?.track?.identifier) {
145
+ this.queue.current = options.clientTrack || null;
146
+ this.queue.utils.save();
147
+ if (typeof options?.volume === "number" && !isNaN(options?.volume)) {
148
+ this.volume = Math.max(Math.min(options?.volume, 500), 0);
149
+ let vol = Number(this.volume);
150
+ if (this.LavalinkManager.options.playerOptions.volumeDecrementer)
151
+ vol *= this.LavalinkManager.options.playerOptions.volumeDecrementer;
152
+ this.lavalinkVolume = Math.round(vol);
153
+ options.volume = this.lavalinkVolume;
165
154
  }
155
+ const track = Object.fromEntries(Object.entries({
156
+ encoded: options.track.encoded,
157
+ identifier: options.track.identifier,
158
+ }).filter(v => typeof v[1] !== "undefined"));
159
+ if (typeof options.track.userData === "object")
160
+ track.userData = {
161
+ ...(options.track.userData || {})
162
+ };
163
+ if (typeof options?.track?.requester === "object")
164
+ track.userData = {
165
+ ...(track.userData || {}),
166
+ requester: this.LavalinkManager.utils.getTransformedRequester(options?.track?.requester || {})
167
+ };
168
+ return this.node.updatePlayer({
169
+ guildId: this.guildId,
170
+ noReplace: false,
171
+ playerOptions: Object.fromEntries(Object.entries({
172
+ track,
173
+ position: options.position ?? undefined,
174
+ paused: options.paused ?? undefined,
175
+ endTime: options?.endTime ?? undefined,
176
+ filters: options?.filters ?? undefined,
177
+ volume: options.volume ?? this.lavalinkVolume ?? undefined,
178
+ voice: options.voice ?? undefined,
179
+ }).filter(v => typeof v[1] !== "undefined")),
180
+ });
166
181
  }
167
182
  if (!this.queue.current && this.queue.tracks.length)
168
183
  await queueTrackEnd(this);
@@ -219,7 +234,7 @@ export class Player {
219
234
  const now = performance.now();
220
235
  await this.node.updatePlayer({
221
236
  guildId: this.guildId,
222
- noReplace: replaced ? replaced : (options?.noReplace ?? false),
237
+ noReplace: (options?.noReplace ?? false),
223
238
  playerOptions: finalOptions,
224
239
  });
225
240
  this.ping.lavalink = Math.round((performance.now() - now) / 10) / 100;
@@ -248,15 +263,32 @@ export class Player {
248
263
  this.ping.lavalink = Math.round((performance.now() - now) / 10) / 100;
249
264
  return this;
250
265
  }
266
+ /**
267
+ * Search for a track
268
+ * @param query The query to search for
269
+ * @param requestUser The user that requested the track
270
+ * @param throwOnEmpty If an error should be thrown if no track is found
271
+ * @returns The search result
272
+ */
251
273
  async lavaSearch(query, requestUser, throwOnEmpty = false) {
252
274
  return this.node.lavaSearch(query, requestUser, throwOnEmpty);
253
275
  }
276
+ /**
277
+ * Set the SponsorBlock
278
+ * @param segments The segments to set
279
+ */
254
280
  async setSponsorBlock(segments = ["sponsor", "selfpromo"]) {
255
281
  return this.node.setSponsorBlock(this, segments);
256
282
  }
283
+ /**
284
+ * Get the SponsorBlock
285
+ */
257
286
  async getSponsorBlock() {
258
287
  return this.node.getSponsorBlock(this);
259
288
  }
289
+ /**
290
+ * Delete the SponsorBlock
291
+ */
260
292
  async deleteSponsorBlock() {
261
293
  return this.node.deleteSponsorBlock(this);
262
294
  }
@@ -327,6 +359,7 @@ export class Player {
327
359
  this.repeatMode = repeatMode;
328
360
  return this;
329
361
  }
362
+ 1;
330
363
  /**
331
364
  * Skip the current song, or a specific amount of songs
332
365
  * @param amount provide the index of the next track to skip to
@@ -340,7 +373,7 @@ export class Player {
340
373
  await this.queue.splice(0, skipTo - 1);
341
374
  }
342
375
  if (!this.playing)
343
- return await this.play();
376
+ return (this.play(), this);
344
377
  const now = performance.now();
345
378
  this.set("internal_skipped", true);
346
379
  await this.node.updatePlayer({ guildId: this.guildId, playerOptions: { track: { encoded: null } } });
@@ -502,6 +535,7 @@ export class Player {
502
535
  filters: this.filterManager?.data || {},
503
536
  equalizer: this.filterManager?.equalizerBands || [],
504
537
  nodeId: this.node?.id,
538
+ nodeSessionId: this.node?.sessionId,
505
539
  ping: this.ping,
506
540
  queue: this.queue.utils.toJSON(),
507
541
  };