ryanlink 1.0.1

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 (60) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +455 -0
  3. package/dist/index.d.mts +1335 -0
  4. package/dist/index.d.ts +1335 -0
  5. package/dist/index.js +4694 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.mjs +4604 -0
  8. package/dist/index.mjs.map +1 -0
  9. package/package.json +82 -0
  10. package/src/audio/AudioFilters.ts +316 -0
  11. package/src/audio/AudioQueue.ts +782 -0
  12. package/src/audio/AudioTrack.ts +242 -0
  13. package/src/audio/QueueController.ts +252 -0
  14. package/src/audio/TrackCollection.ts +138 -0
  15. package/src/audio/index.ts +9 -0
  16. package/src/config/defaults.ts +223 -0
  17. package/src/config/endpoints.ts +99 -0
  18. package/src/config/index.ts +9 -0
  19. package/src/config/patterns.ts +55 -0
  20. package/src/config/presets.ts +400 -0
  21. package/src/config/symbols.ts +31 -0
  22. package/src/core/PluginSystem.ts +50 -0
  23. package/src/core/RyanlinkPlayer.ts +403 -0
  24. package/src/core/index.ts +6 -0
  25. package/src/extensions/AutoplayExtension.ts +283 -0
  26. package/src/extensions/FairPlayExtension.ts +154 -0
  27. package/src/extensions/LyricsExtension.ts +187 -0
  28. package/src/extensions/PersistenceExtension.ts +182 -0
  29. package/src/extensions/SponsorBlockExtension.ts +81 -0
  30. package/src/extensions/index.ts +9 -0
  31. package/src/index.ts +19 -0
  32. package/src/lavalink/ConnectionPool.ts +326 -0
  33. package/src/lavalink/HttpClient.ts +316 -0
  34. package/src/lavalink/LavalinkConnection.ts +409 -0
  35. package/src/lavalink/index.ts +7 -0
  36. package/src/metadata.ts +88 -0
  37. package/src/types/api/Rest.ts +949 -0
  38. package/src/types/api/Websocket.ts +463 -0
  39. package/src/types/api/index.ts +6 -0
  40. package/src/types/audio/FilterManager.ts +29 -0
  41. package/src/types/audio/Queue.ts +4 -0
  42. package/src/types/audio/QueueManager.ts +30 -0
  43. package/src/types/audio/index.ts +7 -0
  44. package/src/types/common.ts +63 -0
  45. package/src/types/core/Player.ts +322 -0
  46. package/src/types/core/index.ts +5 -0
  47. package/src/types/index.ts +6 -0
  48. package/src/types/lavalink/Node.ts +173 -0
  49. package/src/types/lavalink/NodeManager.ts +34 -0
  50. package/src/types/lavalink/REST.ts +144 -0
  51. package/src/types/lavalink/index.ts +32 -0
  52. package/src/types/voice/VoiceManager.ts +176 -0
  53. package/src/types/voice/index.ts +5 -0
  54. package/src/utils/helpers.ts +169 -0
  55. package/src/utils/index.ts +6 -0
  56. package/src/utils/validators.ts +184 -0
  57. package/src/voice/RegionSelector.ts +184 -0
  58. package/src/voice/VoiceConnection.ts +451 -0
  59. package/src/voice/VoiceSession.ts +297 -0
  60. package/src/voice/index.ts +7 -0
@@ -0,0 +1,1335 @@
1
+ import { EventEmitter } from 'node:events';
2
+
3
+ declare const DefaultRestOptions: {
4
+ readonly version: 4;
5
+ readonly userAgent: `${string}/${string} (${string})`;
6
+ readonly stackTrace: false;
7
+ readonly requestTimeout: 10000;
8
+ };
9
+ declare const DefaultNodeOptions: {
10
+ readonly statsInterval: 60000;
11
+ readonly highestLatency: 2000;
12
+ readonly reconnectDelay: 10000;
13
+ readonly reconnectLimit: 3;
14
+ readonly handshakeTimeout: 5000;
15
+ };
16
+ declare const DefaultPlayerOptions: {
17
+ readonly autoInit: true;
18
+ readonly autoSync: true;
19
+ readonly queryPrefix: "ytsearch";
20
+ readonly relocateQueues: true;
21
+ readonly fetchRelatedTracks: () => Promise<never[]>;
22
+ };
23
+ declare const DefaultQueueOptions: {
24
+ readonly volume: 100;
25
+ readonly repeatMode: "none";
26
+ readonly autoplay: false;
27
+ readonly paused: false;
28
+ };
29
+ declare const DefaultFilterOptions: {
30
+ readonly volume: 1;
31
+ readonly equalizer: {
32
+ band: number;
33
+ gain: number;
34
+ }[];
35
+ readonly karaoke: {
36
+ level?: number | undefined;
37
+ monoLevel?: number | undefined;
38
+ filterBand?: number | undefined;
39
+ filterWidth?: number | undefined;
40
+ } | null;
41
+ readonly timescale: {
42
+ speed?: number | undefined;
43
+ pitch?: number | undefined;
44
+ rate?: number | undefined;
45
+ } | null;
46
+ readonly tremolo: {
47
+ frequency?: number | undefined;
48
+ depth?: number | undefined;
49
+ } | null;
50
+ readonly vibrato: {
51
+ frequency?: number | undefined;
52
+ depth?: number | undefined;
53
+ } | null;
54
+ readonly rotation: {
55
+ rotationHz?: number | undefined;
56
+ } | null;
57
+ readonly distortion: {
58
+ sinOffset?: number | undefined;
59
+ sinScale?: number | undefined;
60
+ cosOffset?: number | undefined;
61
+ cosScale?: number | undefined;
62
+ tanOffset?: number | undefined;
63
+ tanScale?: number | undefined;
64
+ offset?: number | undefined;
65
+ scale?: number | undefined;
66
+ } | null;
67
+ readonly channelMix: {
68
+ leftToLeft?: number | undefined;
69
+ leftToRight?: number | undefined;
70
+ rightToLeft?: number | undefined;
71
+ rightToRight?: number | undefined;
72
+ } | null;
73
+ readonly lowPass: {
74
+ smoothing?: number | undefined;
75
+ } | null;
76
+ };
77
+ declare const HttpStatusCodes: Readonly<{
78
+ readonly OK: 200;
79
+ readonly CREATED: 201;
80
+ readonly NO_CONTENT: 204;
81
+ readonly BAD_REQUEST: 400;
82
+ readonly UNAUTHORIZED: 401;
83
+ readonly FORBIDDEN: 403;
84
+ readonly NOT_FOUND: 404;
85
+ readonly METHOD_NOT_ALLOWED: 405;
86
+ readonly TOO_MANY_REQUESTS: 429;
87
+ readonly INTERNAL_SERVER_ERROR: 500;
88
+ readonly BAD_GATEWAY: 502;
89
+ readonly SERVICE_UNAVAILABLE: 503;
90
+ readonly GATEWAY_TIMEOUT: 504;
91
+ }>;
92
+ declare const WebSocketCloseCodes: Readonly<{
93
+ readonly NORMAL: 1000;
94
+ readonly GOING_AWAY: 1001;
95
+ readonly PROTOCOL_ERROR: 1002;
96
+ readonly UNSUPPORTED_DATA: 1003;
97
+ readonly NO_STATUS_RECEIVED: 1005;
98
+ readonly ABNORMAL_CLOSURE: 1006;
99
+ readonly INVALID_FRAME_PAYLOAD_DATA: 1007;
100
+ readonly POLICY_VIOLATION: 1008;
101
+ readonly MESSAGE_TOO_BIG: 1009;
102
+ readonly INTERNAL_ERROR: 1011;
103
+ }>;
104
+
105
+ interface EQBand {
106
+ band: number;
107
+ gain: number;
108
+ }
109
+ declare const EQPresets: {
110
+ readonly BassboostEarrape: EQBand[];
111
+ readonly BassboostHigh: EQBand[];
112
+ readonly BassboostMedium: EQBand[];
113
+ readonly BassboostLow: EQBand[];
114
+ readonly HighQuality: EQBand[];
115
+ readonly BetterMusic: EQBand[];
116
+ readonly Rock: EQBand[];
117
+ readonly Classic: EQBand[];
118
+ readonly Pop: EQBand[];
119
+ readonly Electronic: EQBand[];
120
+ readonly FullSound: EQBand[];
121
+ readonly Gaming: EQBand[];
122
+ readonly Nightcore: EQBand[];
123
+ readonly Vaporwave: EQBand[];
124
+ readonly TrebleBass: EQBand[];
125
+ readonly Soft: EQBand[];
126
+ readonly TV: EQBand[];
127
+ readonly Radio: EQBand[];
128
+ readonly Normalization: EQBand[];
129
+ };
130
+ type EQPresetName = keyof typeof EQPresets;
131
+ declare function getEQPreset(name: EQPresetName): readonly EQBand[];
132
+ declare function getEQPresetNames(): EQPresetName[];
133
+ declare function isValidEQPreset(name: string): name is EQPresetName;
134
+
135
+ declare const SnowflakeRegex: RegExp;
136
+ declare const VoiceRegionIdRegex: RegExp;
137
+ declare const UrlRegex: RegExp;
138
+ declare const YoutubeRegex: RegExp;
139
+ declare const SpotifyRegex: RegExp;
140
+ declare const SoundCloudRegex: RegExp;
141
+ declare const BandcampRegex: RegExp;
142
+ declare const TwitchRegex: RegExp;
143
+ declare const AppleMusicRegex: RegExp;
144
+ declare const DeezerRegex: RegExp;
145
+ declare const AudioFileRegex: RegExp;
146
+ declare const TidalRegex: RegExp;
147
+ declare const YandexMusicRegex: RegExp;
148
+ declare const AmazonMusicRegex: RegExp;
149
+ declare const JioSaavnRegex: RegExp;
150
+ declare const PandoraRegex: RegExp;
151
+ declare const QobuzRegex: RegExp;
152
+ declare const AudiomackRegex: RegExp;
153
+ declare const MixcloudRegex: RegExp;
154
+ declare const AnghamiRegex: RegExp;
155
+ declare const AudiusRegex: RegExp;
156
+ declare const GaanaRegex: RegExp;
157
+ declare const InstagramRegex: RegExp;
158
+ declare const ShazamRegex: RegExp;
159
+
160
+ declare const Routes: {
161
+ readonly websocket: () => "/websocket";
162
+ readonly trackLoading: () => "/loadtracks";
163
+ readonly trackDecoding: (multiple?: boolean) => "/decodetrack" | "/decodetracks";
164
+ readonly player: (sessionId: string, guildId?: string) => string;
165
+ readonly session: (sessionId: string) => string;
166
+ readonly info: () => "/info";
167
+ readonly stats: () => "/stats";
168
+ readonly routePlanner: (free?: "address" | "all") => string;
169
+ readonly version: () => "/version";
170
+ };
171
+ type RouteReturnType<T extends keyof typeof Routes> = ReturnType<(typeof Routes)[T]>;
172
+
173
+ declare const LookupSymbol: unique symbol;
174
+ declare const UpdateSymbol: unique symbol;
175
+ declare const OnPingUpdateSymbol: unique symbol;
176
+ declare const OnVoiceCloseSymbol: unique symbol;
177
+ declare const OnStateUpdateSymbol: unique symbol;
178
+ declare const OnEventUpdateSymbol: unique symbol;
179
+
180
+ declare const noop: () => void;
181
+ declare const formatDuration: (ms: number) => string;
182
+ declare const parseDuration: (duration: string) => number;
183
+ declare const clamp: (value: number, min: number, max: number) => number;
184
+ declare const sleep: (ms: number) => Promise<void>;
185
+ declare const retry: <T>(fn: () => Promise<T>, maxAttempts?: number, baseDelay?: number) => Promise<T>;
186
+ declare const shuffle: <T>(array: T[]) => T[];
187
+ declare const randomElement: <T>(array: T[]) => T | undefined;
188
+ declare const chunk: <T>(array: T[], size: number) => T[][];
189
+ declare const unique: <T>(array: T[], key?: (item: T) => unknown) => T[];
190
+
191
+ declare class REST {
192
+ #private;
193
+ readonly userAgent: string;
194
+ constructor(options: RESTOptions);
195
+ get origin(): string;
196
+ get sessionId(): string | null;
197
+ set sessionId(value: string | null);
198
+ loadTracks(identifier: string): Promise<LoadResult>;
199
+ decodeTrack(encoded: string): Promise<APITrack>;
200
+ decodeTracks(encoded: string[]): Promise<APITrack[]>;
201
+ fetchPlayers(): Promise<APIPlayer[]>;
202
+ fetchPlayer(guildId: string): Promise<APIPlayer>;
203
+ updatePlayer(guildId: string, data: PlayerUpdateRequestBody, params?: PlayerUpdateQueryParams): Promise<APIPlayer>;
204
+ destroyPlayer(guildId: string): Promise<void>;
205
+ updateSession(data: SessionUpdateRequestBody): Promise<SessionUpdateResponseBody>;
206
+ fetchInfo(): Promise<LavalinkInfo>;
207
+ fetchStats(): Promise<NodeStats>;
208
+ fetchVersion(): Promise<string>;
209
+ fetchRoutePlannerStatus(): Promise<RoutePlannerStatus>;
210
+ freeRoutePlannerAddress(address: string): Promise<void>;
211
+ freeAllRoutePlannerAddresses(): Promise<void>;
212
+ setSponsorBlock(guildId: string, segments: string[]): Promise<void>;
213
+ getSponsorBlock(guildId: string): Promise<string[]>;
214
+ deleteSponsorBlock(guildId: string): Promise<void>;
215
+ }
216
+
217
+ interface RESTOptions {
218
+ origin?: string;
219
+ host?: string;
220
+ port?: number;
221
+ secure?: boolean;
222
+ password: string;
223
+ version?: number;
224
+ userAgent?: string;
225
+ sessionId?: string;
226
+ stackTrace?: boolean;
227
+ requestTimeout?: number;
228
+ }
229
+
230
+ declare const enum Severity {
231
+ Common = "common",
232
+ Suspicious = "suspicious",
233
+ Fault = "fault"
234
+ }
235
+ declare const enum OPType {
236
+ Ready = "ready",
237
+ PlayerUpdate = "playerUpdate",
238
+ Stats = "stats",
239
+ Event = "event"
240
+ }
241
+ declare const enum EventType {
242
+ TrackStart = "TrackStartEvent",
243
+ TrackEnd = "TrackEndEvent",
244
+ TrackException = "TrackExceptionEvent",
245
+ TrackStuck = "TrackStuckEvent",
246
+ WebSocketClosed = "WebSocketClosedEvent"
247
+ }
248
+ declare const enum TrackEndReason {
249
+ Finished = "finished",
250
+ LoadFailed = "loadFailed",
251
+ Stopped = "stopped",
252
+ Replaced = "replaced",
253
+ Cleanup = "cleanup"
254
+ }
255
+ interface BaseMessagePayload {
256
+ op: OPType | string;
257
+ }
258
+ interface ReadyPayload extends BaseMessagePayload {
259
+ op: OPType.Ready;
260
+ resumed: boolean;
261
+ sessionId: string;
262
+ }
263
+ interface PlayerUpdatePayload extends BaseMessagePayload {
264
+ op: OPType.PlayerUpdate;
265
+ guildId: string;
266
+ state: PlayerState;
267
+ }
268
+ interface PlayerState {
269
+ time: number;
270
+ position: number;
271
+ connected: boolean;
272
+ ping: number;
273
+ }
274
+ interface StatsPayload extends BaseMessagePayload, NodeStats {
275
+ op: OPType.Stats;
276
+ }
277
+ interface NodeStats {
278
+ players: number;
279
+ playingPlayers: number;
280
+ uptime: number;
281
+ memory: NodeMemory;
282
+ cpu: NodeCPU;
283
+ frameStats: FrameStats | null;
284
+ }
285
+ interface NodeMemory {
286
+ free: number;
287
+ used: number;
288
+ allocated: number;
289
+ reservable: number;
290
+ }
291
+ interface NodeCPU {
292
+ cores: number;
293
+ systemLoad: number;
294
+ lavalinkLoad: number;
295
+ }
296
+ interface FrameStats {
297
+ sent: number;
298
+ nulled: number;
299
+ deficit: number;
300
+ }
301
+ interface BaseEventPayload extends BaseMessagePayload {
302
+ op: OPType.Event;
303
+ type: EventType | string;
304
+ guildId: string;
305
+ }
306
+ interface TrackStartEventPayload extends BaseEventPayload {
307
+ type: EventType.TrackStart;
308
+ track: APITrack;
309
+ }
310
+ interface TrackEndEventPayload extends BaseEventPayload {
311
+ type: EventType.TrackEnd;
312
+ track: APITrack;
313
+ reason: TrackEndReason;
314
+ }
315
+ interface TrackExceptionEventPayload extends BaseEventPayload {
316
+ type: EventType.TrackException;
317
+ track: APITrack;
318
+ exception: Exception;
319
+ }
320
+ interface Exception {
321
+ message: string | null;
322
+ severity: Severity;
323
+ cause: string;
324
+ causeStackTrace: string;
325
+ }
326
+ interface TrackStuckEventPayload extends BaseEventPayload {
327
+ type: EventType.TrackStuck;
328
+ track: APITrack;
329
+ thresholdMs: number;
330
+ }
331
+ interface WebSocketClosedEventPayload extends BaseEventPayload {
332
+ type: EventType.WebSocketClosed;
333
+ code: number;
334
+ reason: string;
335
+ byRemote: boolean;
336
+ }
337
+ type EventPayload = TrackStartEventPayload | TrackEndEventPayload | TrackExceptionEventPayload | TrackStuckEventPayload | WebSocketClosedEventPayload;
338
+ type MessagePayload = ReadyPayload | PlayerUpdatePayload | StatsPayload | EventPayload;
339
+
340
+ declare const enum LoadType {
341
+ Track = "track",
342
+ Playlist = "playlist",
343
+ Search = "search",
344
+ Empty = "empty",
345
+ Error = "error"
346
+ }
347
+ declare const enum RoutePlannerType {
348
+ Rotating = "RotatingIpRoutePlanner",
349
+ Nano = "NanoIpRoutePlanner",
350
+ RotatingNano = "RotatingNanoIpRoutePlanner",
351
+ Balancing = "BalancingIpRoutePlanner"
352
+ }
353
+ declare const enum IPBlockType {
354
+ V4 = "Inet4Address",
355
+ V6 = "Inet6Address"
356
+ }
357
+ interface APITrack<UserData extends JsonObject = CommonUserData, PluginInfo extends JsonObject = CommonPluginInfo> {
358
+ encoded: string;
359
+ info: TrackInfo;
360
+ pluginInfo: PluginInfo;
361
+ userData: UserData;
362
+ }
363
+ interface TrackInfo {
364
+ identifier: string;
365
+ isSeekable: boolean;
366
+ author: string;
367
+ length: number;
368
+ isStream: boolean;
369
+ position: number;
370
+ title: string;
371
+ uri: string | null;
372
+ artworkUrl: string | null;
373
+ isrc: string | null;
374
+ sourceName: string;
375
+ }
376
+ interface PlaylistInfo {
377
+ name: string;
378
+ selectedTrack: number;
379
+ }
380
+ interface TrackLoadResult {
381
+ loadType: LoadType.Track;
382
+ data: APITrack;
383
+ }
384
+ interface APIPlaylist<PluginInfo extends JsonObject = CommonPluginInfo> {
385
+ info: PlaylistInfo;
386
+ pluginInfo: PluginInfo;
387
+ tracks: APITrack[];
388
+ }
389
+ interface PlaylistLoadResult {
390
+ loadType: LoadType.Playlist;
391
+ data: APIPlaylist;
392
+ }
393
+ interface SearchLoadResult {
394
+ loadType: LoadType.Search;
395
+ data: APITrack[];
396
+ }
397
+ interface EmptyLoadResult {
398
+ loadType: LoadType.Empty;
399
+ data: EmptyObject;
400
+ }
401
+ interface ErrorLoadResult {
402
+ loadType: LoadType.Error;
403
+ data: Exception;
404
+ }
405
+ type LoadResult = TrackLoadResult | PlaylistLoadResult | SearchLoadResult | EmptyLoadResult | ErrorLoadResult;
406
+ interface APIPlayer {
407
+ guildId: string;
408
+ track: APITrack | null;
409
+ volume: number;
410
+ paused: boolean;
411
+ state: PlayerState;
412
+ voice: APIVoiceState;
413
+ filters: Filters;
414
+ }
415
+ interface APIVoiceState {
416
+ token: string;
417
+ endpoint: string;
418
+ sessionId: string;
419
+ channelId: string | null;
420
+ }
421
+ interface Filters<PluginFilters extends JsonObject = CommonPluginFilters> {
422
+ volume?: number;
423
+ equalizer?: EqualizerFilter;
424
+ karaoke?: KaraokeFilter;
425
+ timescale?: TimescaleFilter;
426
+ tremolo?: TremoloFilter;
427
+ vibrato?: VibratoFilter;
428
+ rotation?: RotationFilter;
429
+ distortion?: DistortionFilter;
430
+ channelMix?: ChannelMixFilter;
431
+ lowPass?: LowPassFilter;
432
+ pluginFilters?: PluginFilters;
433
+ }
434
+ interface EqualizerBand {
435
+ band: number;
436
+ gain: number;
437
+ }
438
+ type EqualizerFilter = EqualizerBand[];
439
+ interface KaraokeFilter {
440
+ level?: number;
441
+ monoLevel?: number;
442
+ filterBand?: number;
443
+ filterWidth?: number;
444
+ }
445
+ interface TimescaleFilter {
446
+ speed?: number;
447
+ pitch?: number;
448
+ rate?: number;
449
+ }
450
+ interface TremoloFilter {
451
+ frequency?: number;
452
+ depth?: number;
453
+ }
454
+ interface VibratoFilter {
455
+ frequency?: number;
456
+ depth?: number;
457
+ }
458
+ interface RotationFilter {
459
+ rotationHz?: number;
460
+ }
461
+ interface DistortionFilter {
462
+ sinOffset?: number;
463
+ sinScale?: number;
464
+ cosOffset?: number;
465
+ cosScale?: number;
466
+ tanOffset?: number;
467
+ tanScale?: number;
468
+ offset?: number;
469
+ scale?: number;
470
+ }
471
+ interface ChannelMixFilter {
472
+ leftToLeft?: number;
473
+ leftToRight?: number;
474
+ rightToLeft?: number;
475
+ rightToRight?: number;
476
+ }
477
+ interface LowPassFilter {
478
+ smoothing?: number;
479
+ }
480
+ interface PlayerUpdateQueryParams {
481
+ noReplace?: boolean;
482
+ }
483
+ interface PlayerUpdateRequestBody {
484
+ track?: PlayerUpdateTrackData;
485
+ position?: number;
486
+ endTime?: number | null;
487
+ volume?: number;
488
+ paused?: boolean;
489
+ filters?: Filters;
490
+ voice?: NonNullableProp<APIVoiceState, "channelId">;
491
+ }
492
+ interface PlayerUpdateTrackData<UserData extends JsonObject = CommonUserData> {
493
+ encoded?: string | null;
494
+ identifier?: string;
495
+ userData?: UserData;
496
+ }
497
+ interface SessionUpdateRequestBody {
498
+ resuming?: boolean;
499
+ timeout?: number;
500
+ }
501
+ type SessionUpdateResponseBody = Required<SessionUpdateRequestBody>;
502
+ interface LavalinkInfo {
503
+ version: LavalinkVersion;
504
+ buildTime: number;
505
+ git: LavalinkGit;
506
+ jvm: string;
507
+ lavaplayer: string;
508
+ sourceManagers: string[];
509
+ filters: string[];
510
+ plugins: LavalinkPlugin[];
511
+ }
512
+ interface LavalinkVersion {
513
+ semver: string;
514
+ major: number;
515
+ minor: number;
516
+ patch: number;
517
+ preRelease: string | null;
518
+ build: string | null;
519
+ }
520
+ interface LavalinkGit {
521
+ branch: string;
522
+ commit: string;
523
+ commitTime: number;
524
+ }
525
+ interface LavalinkPlugin {
526
+ name: string;
527
+ version: string;
528
+ }
529
+ interface IPBlock {
530
+ type: IPBlockType;
531
+ size: string;
532
+ }
533
+ interface FailingAddress {
534
+ failingAddress: string;
535
+ failingTimestamp: number;
536
+ failingTime: string;
537
+ }
538
+ interface BaseRoutePlannerDetails {
539
+ ipBlock: IPBlock;
540
+ failingAddresses: FailingAddress[];
541
+ }
542
+ interface RotatingRoutePlannerDetails extends BaseRoutePlannerDetails {
543
+ rotateIndex: string;
544
+ ipIndex: string;
545
+ currentAddress: string;
546
+ }
547
+ interface NanoRoutePlannerDetails extends BaseRoutePlannerDetails {
548
+ currentAddressIndex: string;
549
+ }
550
+ interface RotatingNanoRoutePlannerDetails extends BaseRoutePlannerDetails {
551
+ currentAddressIndex: string;
552
+ blockIndex: string;
553
+ }
554
+ interface BalancingRoutePlannerDetails extends BaseRoutePlannerDetails {
555
+ }
556
+ interface RotatingRoutePlannerStatus {
557
+ class: RoutePlannerType.Rotating;
558
+ details: RotatingRoutePlannerDetails;
559
+ }
560
+ interface NanoRoutePlannerStatus {
561
+ class: RoutePlannerType.Nano;
562
+ details: NanoRoutePlannerDetails;
563
+ }
564
+ interface RotatingNanoRoutePlannerStatus {
565
+ class: RoutePlannerType.RotatingNano;
566
+ details: RotatingNanoRoutePlannerDetails;
567
+ }
568
+ interface BalancingRoutePlannerStatus {
569
+ class: RoutePlannerType.Balancing;
570
+ details: BalancingRoutePlannerDetails;
571
+ }
572
+ interface NullishRoutePlannerStatus {
573
+ class: null;
574
+ details: null;
575
+ }
576
+ type RoutePlannerStatus = RotatingRoutePlannerStatus | NanoRoutePlannerStatus | RotatingNanoRoutePlannerStatus | BalancingRoutePlannerStatus | NullishRoutePlannerStatus;
577
+
578
+ interface NodeEventMap {
579
+ connect: [reconnects: number, name: string];
580
+ ready: [resumed: boolean, sessionId: string, name: string];
581
+ dispatch: [payload: MessagePayload, name: string];
582
+ error: [error: Error, name: string];
583
+ close: [code: number, reason: string, name: string];
584
+ disconnect: [code: number, reason: string, byLocal: boolean, name: string];
585
+ }
586
+ type NodeState = "connecting" | "connected" | "ready" | "reconnecting" | "disconnected";
587
+ interface NodeOptions extends RESTOptions {
588
+ name: string;
589
+ clientId: string;
590
+ statsInterval?: number;
591
+ highestLatency?: number;
592
+ reconnectDelay?: number;
593
+ reconnectLimit?: number;
594
+ handshakeTimeout?: number;
595
+ }
596
+ interface SponsorBlockSegment {
597
+ category: string;
598
+ start: number;
599
+ end: number;
600
+ }
601
+
602
+ type CreateNodeOptions = Omit<NodeOptions, "clientId">;
603
+
604
+ interface NodeManagerEvents {
605
+ create: [node: LavalinkNode];
606
+ destroy: [node: LavalinkNode];
607
+ connect: [node: LavalinkNode];
608
+ ready: [node: LavalinkNode, resumed: boolean, sessionId: string];
609
+ disconnect: [node: LavalinkNode, reason: {
610
+ code: number;
611
+ reason: string;
612
+ }];
613
+ reconnecting: [node: LavalinkNode];
614
+ error: [node: LavalinkNode, error: Error];
615
+ raw: [node: LavalinkNode, payload: unknown];
616
+ nodeInfo: [node: LavalinkNode, info: unknown];
617
+ }
618
+
619
+ declare enum CloseCodes {
620
+ Normal = 1000,
621
+ GoingAway = 1001,
622
+ ProtocolError = 1002,
623
+ UnsupportedData = 1003,
624
+ NoStatusReceived = 1005,
625
+ AbnormalClosure = 1006,
626
+ InvalidFramePayloadData = 1007,
627
+ PolicyViolation = 1008,
628
+ MessageTooBig = 1009,
629
+ InternalError = 1011
630
+ }
631
+ declare class LavalinkNode extends EventEmitter<NodeEventMap> {
632
+ #private;
633
+ readonly name: string;
634
+ readonly rest: REST;
635
+ constructor(options: NodeOptions);
636
+ get clientId(): string;
637
+ get sessionId(): string | null;
638
+ get ping(): number | null;
639
+ get stats(): StatsPayload | null;
640
+ get state(): NodeState;
641
+ get connecting(): boolean;
642
+ get connected(): boolean;
643
+ get ready(): boolean;
644
+ get reconnecting(): boolean;
645
+ get disconnected(): boolean;
646
+ get reconnectLimit(): number;
647
+ get reconnectAttempts(): number;
648
+ connect(): Promise<boolean>;
649
+ disconnect(code?: number, reason?: string): Promise<void>;
650
+ setSponsorBlock(player: {
651
+ guildId: string;
652
+ }, segments: string[]): Promise<void>;
653
+ getSponsorBlock(player: {
654
+ guildId: string;
655
+ }): Promise<string[]>;
656
+ deleteSponsorBlock(player: {
657
+ guildId: string;
658
+ }): Promise<void>;
659
+ toString(): string;
660
+ }
661
+
662
+ interface NodeMetrics {
663
+ total: number;
664
+ connected: number;
665
+ ready: number;
666
+ reconnecting: number;
667
+ players: number;
668
+ playingPlayers: number;
669
+ }
670
+ declare class NodeManager extends EventEmitter<NodeManagerEvents> {
671
+ #private;
672
+ readonly info: Map<string, LavalinkInfo>;
673
+ constructor(player: Player);
674
+ get(name: string): LavalinkNode | undefined;
675
+ has(name: string): boolean;
676
+ get all(): LavalinkNode[];
677
+ get size(): number;
678
+ create(options: NodeOptions): LavalinkNode;
679
+ delete(name: string): Promise<boolean>;
680
+ connect(): Promise<void>;
681
+ disconnect(): Promise<void>;
682
+ relevant(): LavalinkNode[];
683
+ get metrics(): NodeMetrics;
684
+ keys(): IterableIterator<string>;
685
+ values(): IterableIterator<LavalinkNode>;
686
+ entries(): IterableIterator<[string, LavalinkNode]>;
687
+ fetchInfo(name: string): Promise<LavalinkInfo>;
688
+ supports(type: "filter" | "source" | "plugin", value: string, nodeName?: string): boolean;
689
+ }
690
+
691
+ declare class VoiceRegion {
692
+ #private;
693
+ readonly id: string;
694
+ readonly player: Player;
695
+ constructor(player: Player, regionId: string);
696
+ inSync(): boolean;
697
+ forgetNode(name: string): boolean;
698
+ getAveragePing(name: string): number | null;
699
+ getAllPings(): Array<[string, number | null]>;
700
+ getRelevantNode(): LavalinkNode;
701
+ [OnPingUpdateSymbol](name: string, state: PlayerState): void;
702
+ clear(): void;
703
+ get nodeCount(): number;
704
+ toString(): string;
705
+ toJSON(): {
706
+ id: string;
707
+ inSync: boolean;
708
+ nodeCount: number;
709
+ pings: Array<{
710
+ node: string;
711
+ averagePing: number | null;
712
+ samples: number;
713
+ }>;
714
+ };
715
+ }
716
+
717
+ declare class VoiceState {
718
+ #private;
719
+ readonly guildId: string;
720
+ readonly player: Player;
721
+ constructor(player: Player, node: string, guildId: string);
722
+ get node(): LavalinkNode;
723
+ get ping(): number;
724
+ get regionId(): string | null;
725
+ get channelId(): string;
726
+ get selfDeaf(): boolean;
727
+ get selfMute(): boolean;
728
+ get serverDeaf(): boolean;
729
+ get serverMute(): boolean;
730
+ get suppressed(): boolean;
731
+ get destroyed(): boolean;
732
+ get connected(): boolean;
733
+ get reconnecting(): boolean;
734
+ get disconnected(): boolean;
735
+ get changingNode(): boolean;
736
+ get sessionId(): string | null;
737
+ get token(): string | null;
738
+ get endpoint(): string | null;
739
+ get nodeSessionId(): string | null;
740
+ destroy(reason?: string): Promise<void>;
741
+ connect(channelId?: string): Promise<void>;
742
+ disconnect(): Promise<void>;
743
+ changeNode(name: string): Promise<void>;
744
+ toString(): string;
745
+ }
746
+
747
+ declare class VoiceManager implements Partial<Map<string, VoiceState>> {
748
+ #private;
749
+ readonly regions: Map<string, VoiceRegion>;
750
+ readonly player: Player;
751
+ constructor(player: Player);
752
+ get size(): number;
753
+ get(guildId: string): VoiceState | undefined;
754
+ has(guildId: string): boolean;
755
+ keys(): IterableIterator<string>;
756
+ values(): IterableIterator<VoiceState>;
757
+ entries(): IterableIterator<[string, VoiceState]>;
758
+ destroy(guildId: string, reason?: string): Promise<void>;
759
+ connect(guildId: string, voiceId: string, options?: ConnectOptions): Promise<VoiceState>;
760
+ disconnect(guildId: string): Promise<void>;
761
+ handleDispatch(payload: DiscordDispatchPayload): void;
762
+ [LookupSymbol](guildId: string): BotVoiceState | undefined;
763
+ [UpdateSymbol](guildId: string, partial: Partial<BotVoiceState>): void;
764
+ [OnVoiceCloseSymbol](guildId: string, code: number, reason: string, byRemote: boolean): void;
765
+ }
766
+
767
+ declare class Track<UserData extends JsonObject = CommonUserData, PluginInfo extends JsonObject = CommonPluginInfo> {
768
+ id: string;
769
+ title: string;
770
+ author: string;
771
+ isLive: boolean;
772
+ isSeekable: boolean;
773
+ duration: number;
774
+ formattedDuration: string;
775
+ uri: string | null;
776
+ isrc: string | null;
777
+ url: string | null;
778
+ artworkUrl: string | null;
779
+ userData: UserData;
780
+ pluginInfo: PluginInfo;
781
+ encoded: string;
782
+ sourceName: string;
783
+ get identifier(): string;
784
+ get stream(): boolean;
785
+ get seekable(): boolean;
786
+ get durationFormatted(): string;
787
+ get source(): string;
788
+ get thumbnail(): string | null;
789
+ get info(): {
790
+ identifier: string;
791
+ position: number;
792
+ title: string;
793
+ author: string;
794
+ length: number;
795
+ isStream: boolean;
796
+ isSeekable: boolean;
797
+ uri: string | null;
798
+ isrc: string | null;
799
+ artworkUrl: string | null;
800
+ sourceName: string;
801
+ };
802
+ constructor(data: APITrack<UserData, PluginInfo>);
803
+ toString(): string;
804
+ toJSON(): Record<string, unknown>;
805
+ clone(): Track<UserData, PluginInfo>;
806
+ }
807
+
808
+ declare class Playlist<PluginInfo extends JsonObject = CommonPluginInfo> {
809
+ name: string;
810
+ selectedTrack: number;
811
+ tracks: Track[];
812
+ pluginInfo: PluginInfo;
813
+ duration: number;
814
+ formattedDuration: string;
815
+ constructor(data: APIPlaylist<PluginInfo>);
816
+ get selected(): Track | null;
817
+ getSelectedTrack(): Track | undefined;
818
+ get length(): number;
819
+ get trackCount(): number;
820
+ get durationFormatted(): string;
821
+ toString(): string;
822
+ toJSON(): Record<string, unknown>;
823
+ }
824
+
825
+ declare class FilterManager {
826
+ #private;
827
+ constructor(player: Player, guildId: string);
828
+ get data(): FilterData;
829
+ get<K extends FilterKey>(key: K): FilterData[K] | undefined;
830
+ set<K extends FilterKey>(key: K, value: FilterData[K]): Promise<void>;
831
+ setVolume(volume: number): Promise<void>;
832
+ get volume(): number;
833
+ setEqualizer(bands: EqualizerBand[]): Promise<void>;
834
+ get equalizer(): EqualizerBand[];
835
+ setKaraoke(karaoke: KaraokeFilter): Promise<void>;
836
+ get karaoke(): KaraokeFilter | undefined;
837
+ setTimescale(timescale: TimescaleFilter): Promise<void>;
838
+ get timescale(): TimescaleFilter | undefined;
839
+ setTremolo(tremolo: TremoloFilter): Promise<void>;
840
+ get tremolo(): TremoloFilter | undefined;
841
+ setVibrato(vibrato: VibratoFilter): Promise<void>;
842
+ get vibrato(): VibratoFilter | undefined;
843
+ setRotation(rotation: RotationFilter): Promise<void>;
844
+ get rotation(): RotationFilter | undefined;
845
+ clearEqualizer(): Promise<void>;
846
+ clearKaraoke(): Promise<void>;
847
+ clearTimescale(): Promise<void>;
848
+ clearTremolo(): Promise<void>;
849
+ clearVibrato(): Promise<void>;
850
+ clearRotation(): Promise<void>;
851
+ clearAll(): Promise<void>;
852
+ has(key: FilterKey): boolean;
853
+ delete(key: FilterKey): Promise<boolean>;
854
+ clear(type?: "native" | "plugin"): Promise<void>;
855
+ apply(filters: Partial<FilterData>): Promise<void>;
856
+ setEQPreset(preset: EQPresetName): Promise<void>;
857
+ getEQPresetNames(): EQPresetName[];
858
+ isValidEQPreset(name: string): name is EQPresetName;
859
+ }
860
+
861
+ declare class Queue<Context extends Record<string, unknown> = QueueContext> {
862
+ #private;
863
+ context: Context;
864
+ readonly voice: VoiceState;
865
+ readonly filters: FilterManager;
866
+ readonly player: Player;
867
+ constructor(player: Player, guildId: string, context?: Context);
868
+ get node(): LavalinkNode | undefined;
869
+ get rest(): REST | undefined;
870
+ get guildId(): string;
871
+ get volume(): number;
872
+ get paused(): boolean;
873
+ get stopped(): boolean;
874
+ get empty(): boolean;
875
+ get playing(): boolean;
876
+ get autoplay(): boolean;
877
+ get finished(): boolean;
878
+ get destroyed(): boolean;
879
+ get repeatMode(): RepeatMode;
880
+ get hasNext(): boolean;
881
+ get hasPrevious(): boolean;
882
+ get track(): Track | null;
883
+ get previousTrack(): Track | null;
884
+ get tracks(): Track[];
885
+ get previousTracks(): Track[];
886
+ get length(): number;
887
+ get totalLength(): number;
888
+ get duration(): number;
889
+ get formattedDuration(): string;
890
+ get currentTime(): number;
891
+ get formattedCurrentTime(): string;
892
+ sync(target?: "local" | "remote"): Promise<void>;
893
+ search(query: string, prefix?: string): Promise<SearchResult>;
894
+ add(source: Track | Track[] | Playlist, userData?: JsonObject): this;
895
+ addRelated(refTrack?: Track): Promise<Track[]>;
896
+ remove(index: number): Track | undefined;
897
+ remove(indices: number[]): Track[];
898
+ clear(type?: "current" | "previous"): void;
899
+ jump(index: number): Promise<Track>;
900
+ pause(): Promise<boolean>;
901
+ resume(): Promise<boolean>;
902
+ seek(ms: number): Promise<number>;
903
+ next(): Promise<Track | null>;
904
+ previous(): Promise<Track | null>;
905
+ shuffle(includePrevious?: boolean): this;
906
+ setVolume(volume: number): Promise<number>;
907
+ setAutoplay(autoplay?: boolean): boolean;
908
+ setRepeatMode(repeatMode?: RepeatMode): RepeatMode;
909
+ stop(): Promise<void>;
910
+ destroy(reason?: string): Promise<void>;
911
+ move(from: number, to: number): Track | null;
912
+ splice(index: number, amount: number, tracks?: Track | Track[]): Track[];
913
+ sortBy(sortBy: "duration" | "title" | "author" | ((a: Track, b: Track) => number), order?: "asc" | "desc"): this;
914
+ toSortedBy(sortBy: "duration" | "title" | "author" | ((a: Track, b: Track) => number), order?: "asc" | "desc"): Track[];
915
+ filterTracks(predicate: ((track: Track, index: number) => boolean) | {
916
+ title?: string;
917
+ author?: string;
918
+ duration?: number | {
919
+ min?: number;
920
+ max?: number;
921
+ };
922
+ uri?: string;
923
+ identifier?: string;
924
+ sourceName?: string;
925
+ isStream?: boolean;
926
+ isSeekable?: boolean;
927
+ }): Array<{
928
+ track: Track;
929
+ index: number;
930
+ }>;
931
+ findTrack(predicate: ((track: Track, index: number) => boolean) | {
932
+ title?: string;
933
+ author?: string;
934
+ duration?: number | {
935
+ min?: number;
936
+ max?: number;
937
+ };
938
+ uri?: string;
939
+ identifier?: string;
940
+ sourceName?: string;
941
+ isStream?: boolean;
942
+ isSeekable?: boolean;
943
+ }): {
944
+ track: Track;
945
+ index: number;
946
+ } | null;
947
+ getTracks(start: number, end?: number): Track[];
948
+ shiftPrevious(): Track | null;
949
+ }
950
+
951
+ declare class QueueManager<Context extends Record<string, unknown> = QueueContext> extends EventEmitter {
952
+ #private;
953
+ constructor(player: Player);
954
+ get(guildId: string): Queue<Context> | undefined;
955
+ has(guildId: string): boolean;
956
+ get all(): Queue<Context>[];
957
+ get size(): number;
958
+ keys(): IterableIterator<string>;
959
+ values(): IterableIterator<Queue<Context>>;
960
+ entries(): IterableIterator<[string, Queue<Context>]>;
961
+ create(options: CreateQueueOptions<Context>): Promise<Queue<Context>>;
962
+ destroy(guildId: string, reason?: string): Promise<void>;
963
+ relocate(guildId: string, nodeName: string): Promise<void>;
964
+ syncAll(): Promise<void>;
965
+ [LookupSymbol](guildId: string): APIPlayer | undefined;
966
+ [OnStateUpdateSymbol](guildId: string, state: PlayerState): void;
967
+ [OnEventUpdateSymbol](guildId: string, event: EventPayload): void;
968
+ }
969
+
970
+ type ConstrainEventMap<T> = {
971
+ [K in keyof T]: T[K] extends unknown[] ? T[K] : never;
972
+ };
973
+ declare class Player<Context extends Record<string, unknown> = QueueContext, Plugins extends PlayerPlugin[] = []> extends EventEmitter<ConstrainEventMap<PlayerEventMap & MergeUnionType<PluginEventMap<Plugins[number]>>>> {
974
+ #private;
975
+ readonly options: PlayerInstanceOptions;
976
+ readonly plugins: PluginRecord<Plugins>;
977
+ readonly nodes: NodeManager;
978
+ readonly voices: VoiceManager;
979
+ readonly queues: QueueManager<Context>;
980
+ constructor(options: PlayerOptions<Plugins>);
981
+ get ready(): boolean;
982
+ get clientId(): string | null;
983
+ init(clientId: string): Promise<void>;
984
+ getQueue(guildId: string): Queue<Context> | undefined;
985
+ createQueue(options: CreateQueueOptions<Context>): Promise<Queue<Context>>;
986
+ destroyQueue(guildId: string, reason?: string): Promise<void>;
987
+ search(query: string, options?: SearchOptions): Promise<SearchResult>;
988
+ play(source: string | Parameters<Queue["add"]>[0], options: PlayOptions<Context>): Promise<Queue<Context>>;
989
+ jump(guildId: string, index: number): Promise<Track>;
990
+ pause(guildId: string): Promise<boolean>;
991
+ previous(guildId: string): Promise<Track | null>;
992
+ resume(guildId: string): Promise<boolean>;
993
+ seek(guildId: string, ms: number): Promise<number>;
994
+ setAutoplay(guildId: string, autoplay?: boolean): boolean;
995
+ setRepeatMode(guildId: string, repeatMode: RepeatMode): RepeatMode;
996
+ setVolume(guildId: string, volume: number): Promise<number>;
997
+ shuffle(guildId: string, includePrevious?: boolean): Queue<Context>;
998
+ next(guildId: string): Promise<Track | null>;
999
+ stop(guildId: string): Promise<void>;
1000
+ }
1001
+
1002
+ declare abstract class PlayerPlugin<EventMap extends Record<string, unknown[]> = Record<string, unknown[]>> {
1003
+ protected _: EventMap;
1004
+ abstract readonly name: string;
1005
+ abstract init(player: Player): void;
1006
+ }
1007
+
1008
+ type EmptyObject = Record<never, never>;
1009
+ type JsonLike = string | number | null | boolean | JsonArray | JsonObject;
1010
+ type JsonArray = JsonLike[];
1011
+ type JsonObject = {
1012
+ [x: string]: JsonLike;
1013
+ };
1014
+ type RequiredProp<T, P extends keyof T> = Omit<T, P> & Required<Pick<T, P>>;
1015
+ type NonNullableProp<T, P extends keyof T> = {
1016
+ [K in keyof T]: K extends P ? NonNullable<T[K]> : T[K];
1017
+ };
1018
+ type MergeUnionType<U> = (U extends unknown ? (i: U) => void : never) extends (i: infer I) => void ? I : never;
1019
+ type PluginEventMap<Plugin> = Plugin extends PlayerPlugin<infer EventMap> ? EventMap : Record<string, unknown>;
1020
+ interface QueueContext extends Record<string, unknown> {
1021
+ }
1022
+ interface CommonUserData extends Record<string, JsonLike> {
1023
+ }
1024
+ interface CommonPluginInfo extends Record<string, JsonLike> {
1025
+ }
1026
+ interface CommonPluginFilters extends Record<string, JsonLike> {
1027
+ }
1028
+
1029
+ type FilterData = Filters;
1030
+ type FilterKey = keyof Filters;
1031
+
1032
+ type RepeatMode = "none" | "track" | "queue";
1033
+
1034
+ interface CreateQueueOptions<Context extends Record<string, unknown> = QueueContext> extends Pick<PlayerUpdateRequestBody, "filters" | "volume"> {
1035
+ guildId: string;
1036
+ voiceId: string;
1037
+ node?: string;
1038
+ context?: Context;
1039
+ }
1040
+
1041
+ interface CommonDispatchPayloadInfo {
1042
+ op: 0;
1043
+ s: number;
1044
+ }
1045
+ interface BotReadyPayload extends CommonDispatchPayloadInfo {
1046
+ t: "READY";
1047
+ d: {
1048
+ user: {
1049
+ id: string;
1050
+ };
1051
+ };
1052
+ }
1053
+ interface VoiceStateUpdatePayload extends CommonDispatchPayloadInfo {
1054
+ t: "VOICE_STATE_UPDATE";
1055
+ d: {
1056
+ guild_id?: string;
1057
+ channel_id: string | null;
1058
+ user_id: string;
1059
+ session_id: string;
1060
+ deaf: boolean;
1061
+ mute: boolean;
1062
+ self_deaf: boolean;
1063
+ self_mute: boolean;
1064
+ suppress: boolean;
1065
+ };
1066
+ }
1067
+ interface VoiceServerUpdatePayload extends CommonDispatchPayloadInfo {
1068
+ t: "VOICE_SERVER_UPDATE";
1069
+ d: {
1070
+ token: string;
1071
+ guild_id: string;
1072
+ endpoint: string | null;
1073
+ };
1074
+ }
1075
+ type DiscordDispatchPayload = BotReadyPayload | VoiceStateUpdatePayload | VoiceServerUpdatePayload;
1076
+ interface BotVoiceState extends Required<NonNullableProp<Omit<VoiceStateUpdatePayload["d"], "guild_id" | "user_id">, "channel_id">>, NonNullableProp<Omit<VoiceServerUpdatePayload["d"], "guild_id">, "endpoint"> {
1077
+ connected: boolean;
1078
+ node_session_id: string;
1079
+ reconnecting: boolean;
1080
+ region_id: string;
1081
+ }
1082
+ interface ConnectOptions extends Pick<CreateQueueOptions, "context" | "filters" | "node" | "volume"> {
1083
+ }
1084
+
1085
+ interface LyricsPluginEvents {
1086
+ lyricsFound: [player: Player, track: Track, lyrics: LyricsResult];
1087
+ lyricsNotFound: [player: Player, track: Track];
1088
+ }
1089
+ interface LyricsLine {
1090
+ timestamp: number;
1091
+ duration: number | null;
1092
+ line: string;
1093
+ }
1094
+ interface LyricsResult {
1095
+ sourceName: string;
1096
+ provider: string;
1097
+ text: string | null;
1098
+ lines: LyricsLine[];
1099
+ track: {
1100
+ title: string;
1101
+ artist: string;
1102
+ album?: string;
1103
+ duration: number;
1104
+ };
1105
+ }
1106
+ interface LyricsConfig {
1107
+ sources: {
1108
+ lavalink: boolean;
1109
+ lrclib: boolean;
1110
+ musixmatch: boolean;
1111
+ genius: boolean;
1112
+ };
1113
+ apiKeys?: {
1114
+ musixmatch?: string;
1115
+ genius?: string;
1116
+ };
1117
+ }
1118
+ declare class LyricsPlugin extends PlayerPlugin<LyricsPluginEvents & Record<string, unknown[]>> {
1119
+ #private;
1120
+ readonly name: "lyrics";
1121
+ init(player: Player): void;
1122
+ getLyrics(track: Track, config?: LyricsConfig): Promise<LyricsResult | null>;
1123
+ getCurrentLine(lyrics: LyricsResult, position: number): LyricsLine | null;
1124
+ formatLyrics(lyrics: LyricsResult, maxLength?: number): string;
1125
+ }
1126
+
1127
+ type ExcludeLast<T extends unknown[]> = T extends [...infer Items, unknown] ? Items : never;
1128
+ interface PlayerEventMap {
1129
+ init: [];
1130
+ nodeConnect: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["connect"]>];
1131
+ nodeReady: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["ready"]>];
1132
+ nodeDispatch: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["dispatch"]>];
1133
+ nodeError: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["error"]>];
1134
+ nodeClose: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["close"]>];
1135
+ nodeDisconnect: [node: LavalinkNode, ...ExcludeLast<NodeEventMap["disconnect"]>];
1136
+ voiceConnect: [voice: VoiceState];
1137
+ voiceClose: [voice: VoiceState, code: number, reason: string, byRemote: boolean];
1138
+ voiceChange: [voice: VoiceState, previousNode: LavalinkNode, wasPlaying: boolean];
1139
+ voiceDestroy: [voice: VoiceState, reason: string];
1140
+ queueCreate: [queue: Queue];
1141
+ queueUpdate: [queue: Queue, state: PlayerState];
1142
+ queueFinish: [queue: Queue];
1143
+ queueDestroy: [queue: Queue, reason: string];
1144
+ trackStart: [queue: Queue, track: Track];
1145
+ trackAdd: [player: Player, guildId: string, tracks: Track[]];
1146
+ trackStuck: [queue: Queue, track: Track, thresholdMs: number];
1147
+ trackError: [queue: Queue, track: Track, exception: Exception];
1148
+ trackFinish: [queue: Queue, track: Track, reason: TrackEndReason];
1149
+ debug: [name: string, info: unknown];
1150
+ segmentsLoaded: [queue: Queue, track: Track, payload: unknown];
1151
+ segmentSkipped: [queue: Queue, track: Track, payload: unknown];
1152
+ fairPlayApplied: [player: Player, guildId: string, count: number];
1153
+ lyricsFound: [player: Player, track: Track, result: LyricsResult];
1154
+ lyricsNotFound: [player: Player, track: Track];
1155
+ queueSaved: [guildId: string];
1156
+ queueLoaded: [guildId: string, count: number];
1157
+ }
1158
+ type PluginRecord<Plugins extends PlayerPlugin[]> = {
1159
+ [Name in Plugins[number]["name"]]: Extract<Plugins[number], {
1160
+ name: Name;
1161
+ }>;
1162
+ };
1163
+ interface PlayerOptions<Plugins extends PlayerPlugin[] = PlayerPlugin[]> {
1164
+ nodes: CreateNodeOptions[];
1165
+ plugins?: Plugins;
1166
+ autoInit?: boolean;
1167
+ autoSync?: boolean;
1168
+ queryPrefix?: string;
1169
+ relocateQueues?: boolean;
1170
+ forwardVoiceUpdate: (guildId: string, payload: VoiceUpdatePayload) => Promise<void>;
1171
+ fetchRelatedTracks?: (queue: Queue, track: Track) => Promise<Track[]>;
1172
+ }
1173
+ type PlayerInstanceOptions = Omit<RequiredProp<PlayerOptions, keyof typeof DefaultPlayerOptions>, "nodes" | "plugins">;
1174
+ interface VoiceUpdatePayload {
1175
+ op: 4;
1176
+ d: {
1177
+ guild_id: string;
1178
+ channel_id: string | null;
1179
+ self_deaf: boolean;
1180
+ self_mute: boolean;
1181
+ };
1182
+ }
1183
+ interface SearchOptions {
1184
+ node?: string;
1185
+ prefix?: string;
1186
+ }
1187
+ interface PlayOptions<Context extends Record<string, unknown> = QueueContext, UserData extends JsonObject = CommonUserData> extends SearchOptions, CreateQueueOptions<Context> {
1188
+ userData?: UserData;
1189
+ }
1190
+ interface TrackSearchResult {
1191
+ type: "track";
1192
+ data: Track;
1193
+ }
1194
+ interface PlaylistSearchResult {
1195
+ type: "playlist";
1196
+ data: Playlist;
1197
+ }
1198
+ interface QuerySearchResult {
1199
+ type: "query";
1200
+ data: Track[];
1201
+ }
1202
+ interface EmptySearchResult {
1203
+ type: "empty";
1204
+ data: [];
1205
+ }
1206
+ interface ErrorSearchResult {
1207
+ type: "error";
1208
+ data: Exception;
1209
+ }
1210
+ type SearchResult = TrackSearchResult | PlaylistSearchResult | QuerySearchResult | EmptySearchResult | ErrorSearchResult;
1211
+
1212
+ declare const isNumber: <T extends number>(input: unknown, check?: "integer" | "natural" | "whole" | "safe-int" | "positive") => input is T;
1213
+ declare const isString: <T extends string>(input: unknown, check?: "url" | "non-empty" | RegExp) => input is T;
1214
+ declare const isRecord: <T extends Record<string, unknown>>(input: unknown, check?: "non-empty") => input is T;
1215
+ declare const isArray: <T extends unknown[]>(input: unknown, check?: "non-empty" | Parameters<T["every"]>[0]) => input is T;
1216
+ declare const isBoolean: (input: unknown) => input is boolean;
1217
+ declare const isFunction: (input: unknown) => input is (...args: unknown[]) => unknown;
1218
+ declare const isNullish: (input: unknown) => input is null | undefined;
1219
+ declare const isSnowflake: (input: unknown) => input is string;
1220
+ declare const isUrl: (input: unknown) => input is string;
1221
+ declare const isError: (error: unknown) => error is Error;
1222
+ declare function assert(condition: unknown, message: string): asserts condition;
1223
+ declare function validateNodeOptions(options: CreateNodeOptions): void;
1224
+ declare function validatePlayerOptions(options: PlayerOptions): void;
1225
+
1226
+ interface AutoplayConfig {
1227
+ enabled: boolean;
1228
+ minPlayTime: number;
1229
+ sources: {
1230
+ spotify: boolean;
1231
+ youtube: boolean;
1232
+ youtubemusic: boolean;
1233
+ soundcloud: boolean;
1234
+ };
1235
+ limit: number;
1236
+ minDuration: number;
1237
+ maxDuration: number;
1238
+ excludeKeywords: string[];
1239
+ }
1240
+ declare class AutoplayPlugin extends PlayerPlugin {
1241
+ #private;
1242
+ readonly name: "autoplay";
1243
+ init(player: Player): void;
1244
+ }
1245
+
1246
+ interface SponsorBlockPluginEvents {
1247
+ segmentsLoaded: [queue: Queue, track: Track, segments: SponsorBlockSegment[]];
1248
+ segmentSkipped: [queue: Queue, track: Track, segment: SponsorBlockSegment];
1249
+ }
1250
+ declare class SponsorBlockPlugin extends PlayerPlugin<SponsorBlockPluginEvents & Record<string, unknown[]>> {
1251
+ #private;
1252
+ readonly name: "sponsorblock";
1253
+ init(player: Player): void;
1254
+ setSegments(queue: Queue, segments?: string[]): Promise<void>;
1255
+ getSegments(queue: Queue): Promise<string[]>;
1256
+ deleteSegments(queue: Queue): Promise<void>;
1257
+ }
1258
+
1259
+ interface FairPlayPluginEvents {
1260
+ fairPlayApplied: [player: Player, guildId: string, trackCount: number];
1261
+ }
1262
+ interface FairPlayConfig {
1263
+ enabled: boolean;
1264
+ minTracks: number;
1265
+ maxConsecutive: number;
1266
+ }
1267
+ declare class FairPlayPlugin extends PlayerPlugin<FairPlayPluginEvents & Record<string, unknown[]>> {
1268
+ #private;
1269
+ readonly name: "fairplay";
1270
+ config: FairPlayConfig;
1271
+ init(player: Player): void;
1272
+ applyFairPlay(guildId: string): void;
1273
+ }
1274
+
1275
+ interface QueuePersistencePluginEvents {
1276
+ queueSaved: [guildId: string];
1277
+ queueLoaded: [guildId: string, trackCount: number];
1278
+ }
1279
+ interface StoredQueue {
1280
+ guildId: string;
1281
+ tracks: Array<{
1282
+ encoded: string;
1283
+ info: unknown;
1284
+ pluginInfo?: unknown;
1285
+ userData?: unknown;
1286
+ }>;
1287
+ previousTracks: Array<{
1288
+ encoded: string;
1289
+ info: unknown;
1290
+ pluginInfo?: unknown;
1291
+ userData?: unknown;
1292
+ }>;
1293
+ currentTrack?: {
1294
+ encoded: string;
1295
+ info: unknown;
1296
+ position: number;
1297
+ };
1298
+ volume: number;
1299
+ repeatMode: RepeatMode;
1300
+ autoplay: boolean;
1301
+ paused: boolean;
1302
+ timestamp: number;
1303
+ }
1304
+ interface QueueStore {
1305
+ get(guildId: string): Promise<StoredQueue | null> | StoredQueue | null;
1306
+ set(guildId: string, data: StoredQueue): Promise<void> | void;
1307
+ delete(guildId: string): Promise<void> | void;
1308
+ }
1309
+ declare class MemoryQueueStore implements QueueStore {
1310
+ #private;
1311
+ get(guildId: string): StoredQueue | null;
1312
+ set(guildId: string, data: StoredQueue): void;
1313
+ delete(guildId: string): void;
1314
+ }
1315
+ declare class QueuePersistencePlugin extends PlayerPlugin<QueuePersistencePluginEvents & Record<string, unknown[]>> {
1316
+ #private;
1317
+ readonly name: "queue-persistence";
1318
+ constructor(store?: QueueStore, autoSave?: boolean);
1319
+ init(player: Player): void;
1320
+ saveQueue(guildId: string): Promise<void>;
1321
+ loadQueue(guildId: string): Promise<StoredQueue | null>;
1322
+ deleteQueue(guildId: string): Promise<void>;
1323
+ getAllQueues(): Promise<StoredQueue[]>;
1324
+ }
1325
+
1326
+ declare const CLIENT_NAME: string;
1327
+ declare const CLIENT_VERSION: string;
1328
+ declare const PACKAGE_INFO: Readonly<{
1329
+ name: string;
1330
+ version: string;
1331
+ repository: string;
1332
+ description: string | undefined;
1333
+ }>;
1334
+
1335
+ export { AmazonMusicRegex, AnghamiRegex, AppleMusicRegex, AudioFileRegex, AudiomackRegex, AudiusRegex, type AutoplayConfig, AutoplayPlugin, BandcampRegex, CloseCodes, DeezerRegex, DefaultFilterOptions, DefaultNodeOptions, DefaultPlayerOptions, DefaultQueueOptions, DefaultRestOptions, type EQBand, type EQPresetName, EQPresets, type FairPlayConfig, FairPlayPlugin, type FairPlayPluginEvents, FilterManager, GaanaRegex, HttpStatusCodes, InstagramRegex, JioSaavnRegex, LavalinkNode, LookupSymbol, type LyricsConfig, type LyricsLine, LyricsPlugin, type LyricsPluginEvents, type LyricsResult, MemoryQueueStore, MixcloudRegex, LavalinkNode as Node, NodeManager, type NodeMetrics, OnEventUpdateSymbol, OnPingUpdateSymbol, OnStateUpdateSymbol, OnVoiceCloseSymbol, PACKAGE_INFO, PandoraRegex, Player, PlayerPlugin, Playlist, QobuzRegex, Queue, QueueManager, QueuePersistencePlugin, type QueuePersistencePluginEvents, type QueueStore, REST, type RouteReturnType, Routes, ShazamRegex, SnowflakeRegex, SoundCloudRegex, SponsorBlockPlugin, type SponsorBlockPluginEvents, SpotifyRegex, type StoredQueue, TidalRegex, Track, TwitchRegex, UpdateSymbol, UrlRegex, VoiceManager, VoiceRegion, VoiceRegionIdRegex, VoiceState, WebSocketCloseCodes, YandexMusicRegex, YoutubeRegex, assert, chunk, clamp, formatDuration, getEQPreset, getEQPresetNames, isArray, isBoolean, isError, isFunction, isNullish, isNumber, isRecord, isSnowflake, isString, isUrl, isValidEQPreset, CLIENT_NAME as name, noop, parseDuration, randomElement, retry, shuffle, sleep, unique, validateNodeOptions, validatePlayerOptions, CLIENT_VERSION as version };