ryanlink 1.0.2 → 2.0.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 (62) hide show
  1. package/LICENSE +201 -37
  2. package/README.md +97 -370
  3. package/dist/index.cjs +4833 -0
  4. package/dist/index.d.cts +1703 -0
  5. package/dist/index.d.ts +1528 -1160
  6. package/dist/index.js +4262 -4197
  7. package/dist/index.mjs +4261 -4106
  8. package/package.json +87 -79
  9. package/dist/index.d.mts +0 -1335
  10. package/dist/index.js.map +0 -1
  11. package/dist/index.mjs.map +0 -1
  12. package/src/audio/AudioFilters.ts +0 -316
  13. package/src/audio/AudioQueue.ts +0 -782
  14. package/src/audio/AudioTrack.ts +0 -242
  15. package/src/audio/QueueController.ts +0 -252
  16. package/src/audio/TrackCollection.ts +0 -138
  17. package/src/audio/index.ts +0 -9
  18. package/src/config/defaults.ts +0 -223
  19. package/src/config/endpoints.ts +0 -99
  20. package/src/config/index.ts +0 -9
  21. package/src/config/patterns.ts +0 -55
  22. package/src/config/presets.ts +0 -400
  23. package/src/config/symbols.ts +0 -31
  24. package/src/core/PluginSystem.ts +0 -50
  25. package/src/core/RyanlinkPlayer.ts +0 -403
  26. package/src/core/index.ts +0 -6
  27. package/src/extensions/AutoplayExtension.ts +0 -283
  28. package/src/extensions/FairPlayExtension.ts +0 -154
  29. package/src/extensions/LyricsExtension.ts +0 -187
  30. package/src/extensions/PersistenceExtension.ts +0 -182
  31. package/src/extensions/SponsorBlockExtension.ts +0 -81
  32. package/src/extensions/index.ts +0 -9
  33. package/src/index.ts +0 -19
  34. package/src/lavalink/ConnectionPool.ts +0 -326
  35. package/src/lavalink/HttpClient.ts +0 -316
  36. package/src/lavalink/LavalinkConnection.ts +0 -409
  37. package/src/lavalink/index.ts +0 -7
  38. package/src/metadata.ts +0 -88
  39. package/src/types/api/Rest.ts +0 -949
  40. package/src/types/api/Websocket.ts +0 -463
  41. package/src/types/api/index.ts +0 -6
  42. package/src/types/audio/FilterManager.ts +0 -29
  43. package/src/types/audio/Queue.ts +0 -4
  44. package/src/types/audio/QueueManager.ts +0 -30
  45. package/src/types/audio/index.ts +0 -7
  46. package/src/types/common.ts +0 -63
  47. package/src/types/core/Player.ts +0 -322
  48. package/src/types/core/index.ts +0 -5
  49. package/src/types/index.ts +0 -6
  50. package/src/types/lavalink/Node.ts +0 -173
  51. package/src/types/lavalink/NodeManager.ts +0 -34
  52. package/src/types/lavalink/REST.ts +0 -144
  53. package/src/types/lavalink/index.ts +0 -32
  54. package/src/types/voice/VoiceManager.ts +0 -176
  55. package/src/types/voice/index.ts +0 -5
  56. package/src/utils/helpers.ts +0 -169
  57. package/src/utils/index.ts +0 -6
  58. package/src/utils/validators.ts +0 -184
  59. package/src/voice/RegionSelector.ts +0 -184
  60. package/src/voice/VoiceConnection.ts +0 -458
  61. package/src/voice/VoiceSession.ts +0 -297
  62. package/src/voice/index.ts +0 -7
package/dist/index.d.ts CHANGED
@@ -1,441 +1,655 @@
1
1
  import { EventEmitter } from 'node:events';
2
+ import { ReadableStream } from 'node:stream/web';
2
3
 
3
- declare const DefaultRestOptions: {
4
- readonly version: 4;
5
- readonly userAgent: `${string}/${string} (${string})`;
6
- readonly stackTrace: false;
7
- readonly requestTimeout: 10000;
4
+ declare enum DebugEvents {
5
+ SetSponsorBlock = "SetSponsorBlock",
6
+ DeleteSponsorBlock = "DeleteSponsorBlock",
7
+ TrackEndReplaced = "TrackEndReplaced",
8
+ AutoplayExecution = "AutoplayExecution",
9
+ AutoplayNoSongsAdded = "AutoplayNoSongsAdded",
10
+ AutoplayThresholdSpamLimiter = "AutoplayThresholdSpamLimiter",
11
+ TriggerQueueEmptyInterval = "TriggerQueueEmptyInterval",
12
+ QueueEnded = "QueueEnded",
13
+ TrackStartNewSongsOnly = "TrackStartNewSongsOnly",
14
+ TrackStartNoTrack = "TrackStartNoTrack",
15
+ ResumingFetchingError = "ResumingFetchingError",
16
+ PlayerUpdateNoPlayer = "PlayerUpdateNoPlayer",
17
+ PlayerUpdateFilterFixApply = "PlayerUpdateFilterFixApply",
18
+ PlayerUpdateSuccess = "PlayerUpdateSuccess",
19
+ HeartBeatTriggered = "HeartBeatTriggered",
20
+ NoSocketOnDestroy = "NoSocketOnDestroy",
21
+ SocketCleanupError = "SocketCleanupError",
22
+ SocketTerminateHeartBeatTimeout = "SocketTerminateHeartBeatTimeout",
23
+ TryingConnectWhileConnected = "TryingConnectWhileConnected",
24
+ SearchNothingFound = "SearchNothingFound",
25
+ ValidatingBlacklistLinks = "ValidatingBlacklistLinks",
26
+ ValidatingWhitelistLinks = "ValidatingWhitelistLinks",
27
+ TrackErrorMaxTracksErroredPerTime = "TrackErrorMaxTracksErroredPerTime",
28
+ TrackStuckMaxTracksErroredPerTime = "TrackStuckMaxTracksErroredPerTime",
29
+ PlayerDestroyingSomewhereElse = "PlayerDestroyingSomewhereElse",
30
+ PlayerCreateNodeNotFound = "PlayerCreateNodeNotFound",
31
+ PlayerPlayQueueEmptyTimeoutClear = "PlayerPlayQueueEmptyTimeoutClear",
32
+ PlayerPlayWithTrackReplace = "PlayerPlayWithTrackReplace",
33
+ PlayerPlayUnresolvedTrack = "PlayerPlayUnresolvedTrack",
34
+ PlayerPlayUnresolvedTrackFailed = "PlayerPlayUnresolvedTrackFailed",
35
+ PlayerVolumeAsFilter = "PlayerVolumeAsFilter",
36
+ BandcampSearchLokalEngine = "BandcampSearchLokalEngine",
37
+ PlayerChangeNode = "PlayerChangeNode",
38
+ BuildTrackError = "BuildTrackError",
39
+ TransformRequesterFunctionFailed = "TransformRequesterFunctionFailed",
40
+ GetClosestTrackFailed = "GetClosestTrackFailed",
41
+ PlayerDeleteInsteadOfDestroy = "PlayerDeleteInsteadOfDestroy",
42
+ FailedToConnectToNodes = "FailedToConnectToNodes",
43
+ NoAudioDebug = "NoAudioDebug",
44
+ PlayerAutoReconnect = "PlayerAutoReconnect",
45
+ PlayerDestroyFail = "PlayerDestroyFail",
46
+ PlayerChangeNodeFailNoEligibleNode = "PlayerChangeNodeFailNoEligibleNode",
47
+ PlayerChangeNodeFail = "PlayerChangeNodeFail"
48
+ }
49
+ declare enum DestroyReasons {
50
+ QueueEmpty = "QueueEmpty",
51
+ NodeDestroy = "NodeDestroy",
52
+ NodeDeleted = "NodeDeleted",
53
+ NodeNoVoice = "NodeNoVoice",
54
+ NodeReconnectFail = "NodeReconnectFail",
55
+ Disconnected = "Disconnected",
56
+ PlayerReconnectFail = "PlayerReconnectFail",
57
+ PlayerChangeNodeFail = "PlayerChangeNodeFail",
58
+ PlayerChangeNodeFailNoEligibleNode = "PlayerChangeNodeFailNoEligibleNode",
59
+ ChannelDeleted = "ChannelDeleted",
60
+ DisconnectAllNodes = "DisconnectAllNodes",
61
+ ReconnectAllNodes = "ReconnectAllNodes",
62
+ TrackErrorMaxTracksErroredPerTime = "TrackErrorMaxTracksErroredPerTime",
63
+ TrackStuckMaxTracksErroredPerTime = "TrackStuckMaxTracksErroredPerTime"
64
+ }
65
+ declare enum DisconnectReasons {
66
+ Disconnected = "Disconnected",
67
+ DisconnectAllNodes = "DisconnectAllNodes"
68
+ }
69
+ declare const validSponsorBlocks: string[];
70
+ declare const audioOutputsData: Record<AudioOutputs, ChannelMixFilter>;
71
+ declare const EQList: {
72
+ BassboostEarrape: EQBand[];
73
+ BassboostHigh: EQBand[];
74
+ BassboostMedium: EQBand[];
75
+ BassboostLow: EQBand[];
76
+ BetterMusic: EQBand[];
77
+ Rock: EQBand[];
78
+ Classic: EQBand[];
79
+ Pop: EQBand[];
80
+ Electronic: EQBand[];
81
+ FullSound: EQBand[];
82
+ Gaming: EQBand[];
8
83
  };
9
- declare const DefaultNodeOptions: {
10
- readonly statsInterval: 60000;
11
- readonly highestLatency: 2000;
12
- readonly reconnectDelay: 10000;
13
- readonly reconnectLimit: 3;
14
- readonly handshakeTimeout: 5000;
84
+ declare const RecommendationsStrings: {
85
+ highCPULoad: (cpuLoad: number) => string;
86
+ highSystemLoad: (systemLoad: number) => string;
87
+ highMemoryUsage: (memoryUsagePercent: number) => string;
88
+ frameDeficit: (frameDeficit: number) => string;
89
+ highLatency: (ping: number) => string;
90
+ nodeRestart: string;
91
+ highPlayercount: (players: number) => string;
92
+ nodeOffline: string;
93
+ checkConnectivity: string;
15
94
  };
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;
95
+ declare const NodeLinkExclusiveEvents: NodeLinkEventTypes[];
134
96
 
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;
97
+ interface StoredQueue {
98
+ current: Track | null;
99
+ previous: Track[];
100
+ tracks: (Track | UnresolvedTrack)[];
101
+ }
102
+ interface QueueStoreManager {
103
+ get: (guildId: string) => Awaitable<StoredQueue | string | undefined>;
104
+ set: (guildId: string, value: StoredQueue | string) => Awaitable<void | boolean>;
105
+ delete: (guildId: string) => Awaitable<void | boolean>;
106
+ stringify: (value: StoredQueue | string) => Awaitable<StoredQueue | string>;
107
+ parse: (value: StoredQueue | string) => Awaitable<Partial<StoredQueue>>;
108
+ }
109
+ interface ManagerQueueOptions {
110
+ maxPreviousTracks?: number;
111
+ queueStore?: QueueStoreManager;
112
+ queueChangesWatcher?: QueueChangesWatcher;
113
+ }
114
+ interface QueueChangesWatcher {
115
+ tracksAdd: (guildId: string, tracks: (Track | UnresolvedTrack)[], position: number, oldStoredQueue: StoredQueue, newStoredQueue: StoredQueue) => void;
116
+ tracksRemoved: (guildId: string, tracks: (Track | UnresolvedTrack)[], position: number | number[], oldStoredQueue: StoredQueue, newStoredQueue: StoredQueue) => void;
117
+ shuffled: (guildId: string, oldStoredQueue: StoredQueue, newStoredQueue: StoredQueue) => void;
118
+ }
159
119
 
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";
120
+ type DestroyReasonsType = keyof typeof DestroyReasons | string;
121
+ type DisconnectReasonsType = keyof typeof DisconnectReasons | string;
122
+ interface PlayerJson {
123
+ guildId: string;
124
+ options: PlayerOptions;
125
+ voiceChannelId: string;
126
+ textChannelId?: string;
127
+ position: number;
128
+ lastPosition: number;
129
+ lastPositionChange: number | null;
130
+ volume: number;
131
+ internalVolume: number;
132
+ repeatMode: RepeatMode;
133
+ paused: boolean;
134
+ playing: boolean;
135
+ createdTimeStamp?: number;
136
+ filters: FilterData;
137
+ ping: {
138
+ ws: number;
139
+ node: number;
140
+ };
141
+ equalizer: EQBand[];
142
+ nodeId?: string;
143
+ nodeSessionId?: string;
144
+ queue?: StoredQueue;
145
+ }
146
+ type RepeatMode = 'queue' | 'track' | 'off';
147
+ interface PlayerOptions {
148
+ guildId: string;
149
+ voiceChannelId: string;
150
+ textChannelId?: string;
151
+ volume?: number;
152
+ vcRegion?: string;
153
+ selfDeaf?: boolean;
154
+ selfMute?: boolean;
155
+ node?: RyanlinkNode | string;
156
+ instaFixFilter?: boolean;
157
+ autoPauseOnMute?: boolean;
158
+ applyVolumeAsFilter?: boolean;
159
+ customData?: anyObject;
160
+ }
161
+ type anyObject = {
162
+ [key: string | number]: string | number | null | anyObject;
170
163
  };
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>;
164
+ interface BasePlayOptions {
165
+ position?: number;
166
+ endTime?: number;
167
+ paused?: boolean;
168
+ volume?: number;
169
+ filters?: Partial<AudioFilters>;
170
+ voice?: VoiceConnectionOptions;
215
171
  }
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;
172
+ interface PlayConfiguration extends BasePlayOptions {
173
+ track?: {
174
+ encoded?: Base64 | null;
175
+ identifier?: string;
176
+ userData?: anyObject;
177
+ requester?: unknown;
178
+ audioTrackId?: string;
179
+ };
180
+ nextTrack?: {
181
+ encoded?: Base64 | null;
182
+ userData?: anyObject;
183
+ };
228
184
  }
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;
185
+ interface PlayOptions extends PlayConfiguration {
186
+ noReplace?: boolean;
187
+ clientTrack?: (Track | UnresolvedTrack) & {
188
+ audioTrackId?: string;
189
+ };
262
190
  }
263
- interface PlayerUpdatePayload extends BaseMessagePayload {
264
- op: OPType.PlayerUpdate;
265
- guildId: string;
266
- state: PlayerState;
191
+
192
+ type CoreSourceNames = 'youtube' | 'youtubemusic' | 'soundcloud' | 'bandcamp' | 'twitch' | 'jiosaavn';
193
+ type AudioSourceNames = 'deezer' | 'spotify' | 'applemusic' | 'yandexmusic' | 'flowery-tts' | 'vkmusic' | 'tidal' | 'qobuz' | 'pandora' | CoreSourceNames;
194
+ interface AudioTrackInfo {
195
+ identifier: string;
196
+ title: string;
197
+ author: string;
198
+ length: number;
199
+ artworkUrl: string | null;
200
+ uri: string;
201
+ sourceName: AudioSourceNames;
202
+ isSeekable: boolean;
203
+ isStream: boolean;
204
+ isrc: string | null;
267
205
  }
268
- interface PlayerState {
269
- time: number;
270
- position: number;
271
- connected: boolean;
272
- ping: number;
206
+ interface TrackInfo {
207
+ identifier: string;
208
+ title: string;
209
+ author: string;
210
+ duration: number;
211
+ artworkUrl: string | null;
212
+ uri: string;
213
+ sourceName: AudioSourceNames;
214
+ isSeekable: boolean;
215
+ isStream: boolean;
216
+ isrc: string | null;
273
217
  }
274
- interface StatsPayload extends BaseMessagePayload, NodeStats {
275
- op: OPType.Stats;
218
+ interface PluginInfo {
219
+ type?: 'album' | 'playlist' | 'artist' | 'recommendations' | string;
220
+ albumName?: string;
221
+ albumUrl?: string;
222
+ albumArtUrl?: string;
223
+ artistUrl?: string;
224
+ artistArtworkUrl?: string;
225
+ previewUrl?: string;
226
+ isPreview?: boolean;
227
+ totalTracks?: number;
228
+ identifier?: string;
229
+ artworkUrl?: string;
230
+ author?: string;
231
+ url?: string;
232
+ uri?: string;
233
+ clientData?: {
234
+ previousTrack?: boolean;
235
+ [key: string]: any;
236
+ };
276
237
  }
277
- interface NodeStats {
278
- players: number;
279
- playingPlayers: number;
280
- uptime: number;
281
- memory: NodeMemory;
282
- cpu: NodeCPU;
283
- frameStats: FrameStats | null;
238
+ interface AudioTrack {
239
+ encoded?: Base64;
240
+ info: AudioTrackInfo;
241
+ pluginInfo: Partial<PluginInfo>;
242
+ userData?: anyObject;
284
243
  }
285
- interface NodeMemory {
286
- free: number;
287
- used: number;
288
- allocated: number;
289
- reservable: number;
244
+ interface TrackRequester {
290
245
  }
291
- interface NodeCPU {
292
- cores: number;
293
- systemLoad: number;
294
- lavalinkLoad: number;
246
+ interface Track {
247
+ encoded?: Base64;
248
+ info: TrackInfo;
249
+ pluginInfo: Partial<PluginInfo>;
250
+ requester?: TrackRequester;
251
+ userData?: anyObject;
295
252
  }
296
- interface FrameStats {
297
- sent: number;
298
- nulled: number;
299
- deficit: number;
253
+ interface UnresolvedTrackInfo extends Partial<TrackInfo> {
254
+ title: string;
300
255
  }
301
- interface BaseEventPayload extends BaseMessagePayload {
302
- op: OPType.Event;
303
- type: EventType | string;
304
- guildId: string;
256
+ interface UnresolvedQuery extends UnresolvedTrackInfo {
257
+ encoded?: Base64;
305
258
  }
306
- interface TrackStartEventPayload extends BaseEventPayload {
307
- type: EventType.TrackStart;
308
- track: APITrack;
259
+ interface UnresolvedTrack {
260
+ resolve: (player: Player) => Promise<void>;
261
+ encoded?: Base64;
262
+ info: UnresolvedTrackInfo;
263
+ pluginInfo: Partial<PluginInfo>;
264
+ userData?: anyObject;
265
+ requester?: TrackRequester;
309
266
  }
310
- interface TrackEndEventPayload extends BaseEventPayload {
311
- type: EventType.TrackEnd;
312
- track: APITrack;
313
- reason: TrackEndReason;
267
+
268
+ declare const AudioTrackSymbol: unique symbol;
269
+ declare const UnresolvedAudioTrackSymbol: unique symbol;
270
+ declare const AudioQueueSymbol: unique symbol;
271
+ declare const AudioNodeSymbol: unique symbol;
272
+ declare function parseConnectionUrl(connectionUrl: string): {
273
+ authorization: string;
274
+ nodeType: NodeTypes;
275
+ id: string;
276
+ host: string;
277
+ port: number;
278
+ };
279
+ declare class RyanlinkUtils {
280
+ RyanlinkManager: RyanlinkManager | undefined;
281
+ constructor(RyanlinkManager?: RyanlinkManager);
282
+ buildPluginInfo(data: any, clientData?: any): any;
283
+ buildTrack(data: AudioTrack | Track, requester: unknown): Track;
284
+ buildUnresolvedTrack(query: UnresolvedQuery | UnresolvedTrack, requester: unknown): UnresolvedTrack;
285
+ isNode(data: RyanlinkNode): boolean;
286
+ getTransformedRequester(requester: unknown): unknown;
287
+ isNodeOptions(data: NodeConfiguration): boolean;
288
+ isNotBrokenTrack(data: Track | UnresolvedTrack, minDuration?: number): data is Track;
289
+ isTrack(data: Track | UnresolvedTrack): data is Track;
290
+ isUnresolvedTrack(data: UnresolvedTrack | Track): data is UnresolvedTrack;
291
+ isUnresolvedTrackQuery(data: UnresolvedQuery): boolean;
292
+ getClosestTrack(data: UnresolvedTrack, player: Player): Promise<Track | undefined>;
293
+ validateQueryString(node: RyanlinkNode, queryString: string, sourceString?: SearchPlatform): void;
294
+ findSourceOfQuery(queryString: string): SearchPlatform;
295
+ extractSourceOfQuery<T extends {
296
+ query: string;
297
+ source?: string;
298
+ }>(searchQuery: T): T;
299
+ typedLowerCase<T extends unknown>(input: T): T;
300
+ transformQuery(query: SearchQuery): {
301
+ query: string;
302
+ extraQueryUrlParams: any;
303
+ source: SearchPlatform;
304
+ };
305
+ transformAudioSearchQuery(query: AudioSearchQuery): {
306
+ query: never;
307
+ types: any[];
308
+ extraQueryUrlParams: any;
309
+ source: SearchPlatform;
310
+ } | {
311
+ query: string;
312
+ types: string[];
313
+ source: "ytsearch" | "ytmsearch" | "scsearch" | "bcsearch" | "spsearch" | "sprec" | "amsearch" | "dzsearch" | "dzisrc" | "dzrec" | "ymsearch" | "ymrec" | "vksearch" | "vkrec" | "tdsearch" | "tdrec" | "qbsearch" | "qbisrc" | "qbrec" | "pdsearch" | "pdisrc" | "pdrec" | "ftts" | "speak" | "phsearch" | "pornhub" | "porn" | "tts" | "jssearch" | "jsrec" | "admsearch" | "admrec" | "shsearch" | "igsearch" | "blsearch" | "lfsearch" | "amzsearch" | "amzrec" | "gnsearch" | "gnrec" | "local" | "http" | "https" | "link" | "uri" | "youtube" | "yt" | "youtube music" | "youtubemusic" | "ytm" | "musicyoutube" | "music youtube" | "soundcloud" | "sc" | "am" | "apple music" | "applemusic" | "apple" | "musicapple" | "music apple" | "sp" | "spsuggestion" | "spotify" | "spotify.com" | "spotifycom" | "dz" | "deezer" | "yandex" | "yandex music" | "yandexmusic" | "vk" | "vk music" | "vkmusic" | "tidal" | "tidal music" | "qobuz" | "pandora" | "pd" | "pandora music" | "pandoramusic" | "flowerytts" | "flowery" | "flowery.tts" | "bandcamp" | "bc" | "js" | "jiosaavn" | "td" | "audiomack" | "adm" | "shazam" | "sh" | "instagram" | "ig" | "bilibili" | "bl" | "lastfm" | "last.fm" | "lf" | "amazon music" | "amazonmusic" | "amz" | "gaana" | "gn";
314
+ };
315
+ validateSourceString(node: RyanlinkNode, sourceString: SearchPlatform): void;
316
+ }
317
+ interface MiniMap<K, V> extends Map<K, V> {
318
+ constructor: MiniMapConstructor;
319
+ }
320
+ declare class MiniMap<K, V> extends Map<K, V> {
321
+ constructor(data?: [K, V][]);
322
+ filter<K2 extends K>(fn: (value: V, key: K, miniMap: this) => key is K2): MiniMap<K2, V>;
323
+ filter<V2 extends V>(fn: (value: V, key: K, miniMap: this) => value is V2): MiniMap<K, V2>;
324
+ filter(fn: (value: V, key: K, miniMap: this) => boolean): MiniMap<K, V>;
325
+ filter<This, K2 extends K>(fn: (this: This, value: V, key: K, miniMap: this) => key is K2, thisArg: This): MiniMap<K2, V>;
326
+ filter<This, V2 extends V>(fn: (this: This, value: V, key: K, miniMap: this) => value is V2, thisArg: This): MiniMap<K, V2>;
327
+ filter<This>(fn: (this: This, value: V, key: K, miniMap: this) => boolean, thisArg: This): MiniMap<K, V>;
328
+ toJSON(): [K, V][];
329
+ map<T>(fn: (value: V, key: K, miniMap: this) => T): T[];
330
+ map<This, T>(fn: (this: This, value: V, key: K, miniMap: this) => T, thisArg: This): T[];
331
+ }
332
+ declare function queueTrackEnd(player: Player, dontShiftQueue?: boolean): Promise<Track>;
333
+ declare function safeStringify(obj: any, padding?: number): string;
334
+
335
+ type Opaque<T, K> = T & {
336
+ __opaque__: K;
337
+ };
338
+ type IntegerNumber = Opaque<number, 'Int'>;
339
+ type FloatNumber = Opaque<number, 'Float'>;
340
+ type SourceSearchPlatformBase = 'spsearch' | 'sprec' | 'amsearch' | 'dzsearch' | 'dzisrc' | 'dzrec' | 'ymsearch' | 'ymrec' | 'vksearch' | 'vkrec' | 'tdsearch' | 'tdrec' | 'qbsearch' | 'qbisrc' | 'qbrec' | 'pdsearch' | 'pdisrc' | 'pdrec';
341
+ type SourceSearchPlatform = SourceSearchPlatformBase | 'ftts';
342
+ type JioSaavnSearchPlatform = 'jssearch' | 'jsrec';
343
+ type DuncteSearchPlatform = 'speak' | 'phsearch' | 'pornhub' | 'porn' | 'tts';
344
+ type ExtendedSearchPlatform = 'admsearch' | 'admrec' | 'shsearch' | 'igsearch' | 'blsearch' | 'lfsearch' | 'amzsearch' | 'amzrec' | 'gnsearch' | 'gnrec';
345
+ type AudioClientSearchPlatform = 'bcsearch';
346
+ type AudioClientSearchPlatformResolve = 'bandcamp' | 'bc';
347
+ type RyanlinkSearchPlatform = 'ytsearch' | 'ytmsearch' | 'scsearch' | 'bcsearch' | SourceSearchPlatform | DuncteSearchPlatform | JioSaavnSearchPlatform | ExtendedSearchPlatform | AudioClientSearchPlatform;
348
+ type ClientCustomSearchPlatformUtils = 'local' | 'http' | 'https' | 'link' | 'uri';
349
+ type ClientSearchPlatform = ClientCustomSearchPlatformUtils | 'youtube' | 'yt' | 'youtube music' | 'youtubemusic' | 'ytm' | 'musicyoutube' | 'music youtube' | 'soundcloud' | 'sc' | 'am' | 'apple music' | 'applemusic' | 'apple' | 'musicapple' | 'music apple' | 'sp' | 'spsuggestion' | 'spotify' | 'spotify.com' | 'spotifycom' | 'dz' | 'deezer' | 'yandex' | 'yandex music' | 'yandexmusic' | 'vk' | 'vk music' | 'vkmusic' | 'tidal' | 'tidal music' | 'qobuz' | 'pandora' | 'pd' | 'pandora music' | 'pandoramusic' | 'flowerytts' | 'flowery' | 'flowery.tts' | AudioClientSearchPlatformResolve | AudioClientSearchPlatform | 'js' | 'jiosaavn' | 'td' | 'tidal' | 'tdrec' | 'audiomack' | 'adm' | 'admsearch' | 'shazam' | 'sh' | 'shsearch' | 'instagram' | 'ig' | 'igsearch' | 'bilibili' | 'bl' | 'blsearch' | 'lastfm' | 'last.fm' | 'lf' | 'lfsearch' | 'amazon music' | 'amazonmusic' | 'amz' | 'amzsearch' | 'gaana' | 'gn' | 'gnsearch' | 'td' | 'tidal' | 'tdrec';
350
+ type SearchPlatform = RyanlinkSearchPlatform | ClientSearchPlatform;
351
+ type SourcesRegex = 'YoutubeRegex' | 'YoutubeMusicRegex' | 'SoundCloudRegex' | 'SoundCloudMobileRegex' | 'DeezerTrackRegex' | 'DeezerArtistRegex' | 'DeezerEpisodeRegex' | 'DeezerMixesRegex' | 'DeezerPageLinkRegex' | 'DeezerPlaylistRegex' | 'DeezerAlbumRegex' | 'AllDeezerRegex' | 'AllDeezerRegexWithoutPageLink' | 'SpotifySongRegex' | 'SpotifyPlaylistRegex' | 'SpotifyArtistRegex' | 'SpotifyEpisodeRegex' | 'SpotifyShowRegex' | 'SpotifyAlbumRegex' | 'AllSpotifyRegex' | 'mp3Url' | 'm3uUrl' | 'm3u8Url' | 'mp4Url' | 'm4aUrl' | 'wavUrl' | 'aacpUrl' | 'tiktok' | 'mixcloud' | 'musicYandex' | 'radiohost' | 'bandcamp' | 'jiosaavn' | 'appleMusic' | 'tidal' | 'PandoraTrackRegex' | 'PandoraAlbumRegex' | 'PandoraArtistRegex' | 'PandoraPlaylistRegex' | 'AllPandoraRegex' | 'TwitchTv' | 'vimeo';
352
+ interface PlaylistInfo {
353
+ name: string;
354
+ title: string;
355
+ author?: string;
356
+ thumbnail?: string;
357
+ uri?: string;
358
+ selectedTrack: Track | null;
359
+ duration: number;
314
360
  }
315
- interface TrackExceptionEventPayload extends BaseEventPayload {
316
- type: EventType.TrackException;
317
- track: APITrack;
318
- exception: Exception;
361
+ interface SearchResult {
362
+ loadType: LoadTypes;
363
+ exception: Exception | null;
364
+ pluginInfo: PluginInfo;
365
+ playlist: PlaylistInfo | null;
366
+ tracks: Track[];
319
367
  }
368
+ interface UnresolvedSearchResult {
369
+ loadType: LoadTypes;
370
+ exception: Exception | null;
371
+ pluginInfo: PluginInfo;
372
+ playlist: PlaylistInfo | null;
373
+ tracks: UnresolvedTrack[];
374
+ }
375
+ interface MiniMapConstructor {
376
+ new (): MiniMap<unknown, unknown>;
377
+ new <K, V>(entries?: ReadonlyArray<readonly [K, V]> | null): MiniMap<K, V>;
378
+ new <K, V>(iterable: Iterable<readonly [K, V]>): MiniMap<K, V>;
379
+ readonly prototype: MiniMap<unknown, unknown>;
380
+ readonly [Symbol.species]: MiniMapConstructor;
381
+ }
382
+ type PlayerEvents = TrackStartEvent | TrackEndEvent | TrackStuckEvent | TrackExceptionEvent | WebSocketClosedEvent | SponsorBlockSegmentEvents | LyricsEvent;
383
+ type Severity = 'COMMON' | 'SUSPICIOUS' | 'FAULT';
320
384
  interface Exception {
321
- message: string | null;
322
385
  severity: Severity;
386
+ error?: Error;
387
+ message: string;
323
388
  cause: string;
324
389
  causeStackTrace: string;
325
390
  }
326
- interface TrackStuckEventPayload extends BaseEventPayload {
327
- type: EventType.TrackStuck;
328
- track: APITrack;
391
+ interface PlayerEvent {
392
+ op: 'event';
393
+ type: PlayerEventType;
394
+ guildId: string;
395
+ }
396
+ interface TrackStartEvent extends PlayerEvent {
397
+ type: 'TrackStartEvent';
398
+ track: AudioTrack;
399
+ }
400
+ interface TrackEndEvent extends PlayerEvent {
401
+ type: 'TrackEndEvent';
402
+ track: AudioTrack;
403
+ reason: TrackEndReason;
404
+ }
405
+ interface TrackExceptionEvent extends PlayerEvent {
406
+ type: 'TrackExceptionEvent';
407
+ exception?: Exception;
408
+ track: AudioTrack;
409
+ error: string;
410
+ }
411
+ interface TrackStuckEvent extends PlayerEvent {
412
+ type: 'TrackStuckEvent';
329
413
  thresholdMs: number;
414
+ track: AudioTrack;
330
415
  }
331
- interface WebSocketClosedEventPayload extends BaseEventPayload {
332
- type: EventType.WebSocketClosed;
416
+ interface WebSocketClosedEvent extends PlayerEvent {
417
+ type: 'WebSocketClosedEvent';
333
418
  code: number;
334
- reason: string;
335
419
  byRemote: boolean;
420
+ reason: string;
336
421
  }
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;
422
+ type SponsorBlockSegmentEvents = SponsorBlockSegmentSkipped | SponsorBlockSegmentsLoaded | SponsorBlockChapterStarted | SponsorBlockChaptersLoaded;
423
+ type SponsorBlockSegmentEventType = 'SegmentSkipped' | 'SegmentsLoaded' | 'ChaptersLoaded' | 'ChapterStarted';
424
+ interface SponsorBlockSegmentsLoaded extends PlayerEvent {
425
+ type: 'SegmentsLoaded';
426
+ segments: {
427
+ category: string;
428
+ start: number;
429
+ end: number;
430
+ }[];
362
431
  }
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;
432
+ interface SponsorBlockSegmentSkipped extends PlayerEvent {
433
+ type: 'SegmentSkipped';
434
+ segment: {
435
+ category: string;
436
+ start: number;
437
+ end: number;
438
+ };
375
439
  }
376
- interface PlaylistInfo {
377
- name: string;
378
- selectedTrack: number;
440
+ interface SponsorBlockChapterStarted extends PlayerEvent {
441
+ type: 'ChapterStarted';
442
+ chapter: {
443
+ name: string;
444
+ start: number;
445
+ end: number;
446
+ duration: number;
447
+ };
379
448
  }
380
- interface TrackLoadResult {
381
- loadType: LoadType.Track;
382
- data: APITrack;
449
+ interface SponsorBlockChaptersLoaded extends PlayerEvent {
450
+ type: 'ChaptersLoaded';
451
+ chapters: {
452
+ name: string;
453
+ start: number;
454
+ end: number;
455
+ duration: number;
456
+ }[];
383
457
  }
384
- interface APIPlaylist<PluginInfo extends JsonObject = CommonPluginInfo> {
385
- info: PlaylistInfo;
386
- pluginInfo: PluginInfo;
387
- tracks: APITrack[];
458
+ type LyricsEvent = LyricsFoundEvent | LyricsNotFoundEvent | LyricsLineEvent;
459
+ type LyricsEventType = 'LyricsFoundEvent' | 'LyricsNotFoundEvent' | 'LyricsLineEvent';
460
+ interface LyricsFoundEvent extends PlayerEvent {
461
+ type: 'LyricsFoundEvent';
462
+ guildId: string;
463
+ lyrics: LyricsResult;
464
+ }
465
+ interface LyricsNotFoundEvent extends PlayerEvent {
466
+ type: 'LyricsNotFoundEvent';
467
+ guildId: string;
388
468
  }
389
- interface PlaylistLoadResult {
390
- loadType: LoadType.Playlist;
391
- data: APIPlaylist;
469
+ interface LyricsLineEvent extends PlayerEvent {
470
+ type: 'LyricsLineEvent';
471
+ guildId: string;
472
+ lineIndex: number;
473
+ line: LyricsLine;
474
+ skipped: boolean;
475
+ }
476
+ type LoadTypes = 'track' | 'playlist' | 'search' | 'error' | 'empty';
477
+ type State = 'CONNECTED' | 'CONNECTING' | 'DISCONNECTED' | 'DISCONNECTING' | 'DESTROYING';
478
+ type PlayerEventType = 'TrackStartEvent' | 'TrackEndEvent' | 'TrackExceptionEvent' | 'TrackStuckEvent' | 'WebSocketClosedEvent' | SponsorBlockSegmentEventType | LyricsEventType;
479
+ type TrackEndReason = 'finished' | 'loadFailed' | 'stopped' | 'replaced' | 'cleanup';
480
+ interface InvalidRestRequest {
481
+ timestamp: number;
482
+ status: number;
483
+ error: string;
484
+ message?: string;
485
+ trace?: unknown;
486
+ path: string;
487
+ }
488
+ interface VoiceConnectionState {
489
+ token: string;
490
+ endpoint: string;
491
+ sessionId: string;
492
+ channelId?: string;
493
+ connected?: boolean;
494
+ ping?: number;
495
+ }
496
+ type VoiceConnectionOptions = Omit<VoiceConnectionState, 'connected' | 'ping'>;
497
+ interface FailingAddress {
498
+ failingAddress: string;
499
+ failingTimestamp: number;
500
+ failingTime: string;
501
+ }
502
+ type RoutePlannerTypes = 'RotatingIpRoutePlanner' | 'NanoIpRoutePlanner' | 'RotatingNanoIpRoutePlanner' | 'BalancingIpRoutePlanner';
503
+ interface RoutePlanner {
504
+ class?: RoutePlannerTypes;
505
+ details?: {
506
+ ipBlock: {
507
+ type: 'Inet4Address' | 'Inet6Address';
508
+ size: string;
509
+ };
510
+ failingAddresses: FailingAddress[];
511
+ rotateIndex?: string;
512
+ ipIndex?: string;
513
+ currentAddress?: string;
514
+ currentAddressIndex?: string;
515
+ blockIndex?: string;
516
+ };
392
517
  }
393
- interface SearchLoadResult {
394
- loadType: LoadType.Search;
395
- data: APITrack[];
518
+ interface Session {
519
+ resuming: boolean;
520
+ timeout: number;
396
521
  }
397
- interface EmptyLoadResult {
398
- loadType: LoadType.Empty;
399
- data: EmptyObject;
522
+ interface GuildShardPayload {
523
+ op: number;
524
+ d: {
525
+ guild_id: string;
526
+ channel_id: string | null;
527
+ self_mute: boolean;
528
+ self_deaf: boolean;
529
+ };
400
530
  }
401
- interface ErrorLoadResult {
402
- loadType: LoadType.Error;
403
- data: Exception;
531
+ interface PlayerUpdateInfo {
532
+ guildId: string;
533
+ playerOptions: PlayConfiguration;
534
+ noReplace?: boolean;
404
535
  }
405
- type LoadResult = TrackLoadResult | PlaylistLoadResult | SearchLoadResult | EmptyLoadResult | ErrorLoadResult;
406
- interface APIPlayer {
536
+ interface AudioPlayerState {
407
537
  guildId: string;
408
- track: APITrack | null;
538
+ track?: AudioTrack;
409
539
  volume: number;
410
540
  paused: boolean;
411
- state: PlayerState;
412
- voice: APIVoiceState;
413
- filters: Filters;
541
+ voice: VoiceConnectionState;
542
+ filters: Partial<AudioFilters>;
543
+ state: {
544
+ time: number;
545
+ position: number;
546
+ connected: boolean;
547
+ ping: number;
548
+ };
549
+ }
550
+ interface ChannelDeletePacket {
551
+ t: 'CHANNEL_DELETE';
552
+ d: {
553
+ guild_id: string;
554
+ id: string;
555
+ };
414
556
  }
415
- interface APIVoiceState {
557
+ interface VoiceState {
558
+ op: 'voiceUpdate';
559
+ guildId: string;
560
+ event: VoiceServer;
561
+ sessionId?: string;
562
+ guild_id: string;
563
+ user_id: string;
564
+ session_id: string;
565
+ channel_id: string;
566
+ mute: boolean;
567
+ deaf: boolean;
568
+ self_deaf: boolean;
569
+ self_mute: boolean;
570
+ self_video: boolean;
571
+ self_stream: boolean;
572
+ request_to_speak_timestamp: boolean;
573
+ suppress: boolean;
574
+ }
575
+ type Base64 = string;
576
+ interface VoiceServer {
416
577
  token: string;
578
+ guild_id: string;
417
579
  endpoint: string;
418
- sessionId: string;
419
- channelId: string | null;
580
+ channel_id?: string;
420
581
  }
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;
582
+ interface VoicePacket {
583
+ t?: 'VOICE_SERVER_UPDATE' | 'VOICE_STATE_UPDATE';
584
+ d: VoiceState | VoiceServer;
433
585
  }
434
- interface EqualizerBand {
435
- band: number;
436
- gain: number;
586
+ interface NodeMessage extends NodeStats {
587
+ type: PlayerEventType;
588
+ op: 'stats' | 'playerUpdate' | 'event';
589
+ guildId: string;
590
+ }
591
+ type AudioSearchType = 'track' | 'album' | 'artist' | 'playlist' | 'text' | 'tracks' | 'albums' | 'artists' | 'playlists' | 'texts';
592
+ interface AudioSearchFilteredResponse {
593
+ info: PlaylistInfo;
594
+ pluginInfo: PluginInfo;
595
+ tracks: Track[];
596
+ }
597
+ interface AudioSearchResponse {
598
+ tracks: Track[];
599
+ albums: AudioSearchFilteredResponse[];
600
+ artists: AudioSearchFilteredResponse[];
601
+ playlists: AudioSearchFilteredResponse[];
602
+ texts: {
603
+ text: string;
604
+ pluginInfo: PluginInfo;
605
+ }[];
606
+ pluginInfo: PluginInfo;
607
+ }
608
+ type SearchQuery = {
609
+ query: string;
610
+ extraQueryUrlParams?: URLSearchParams;
611
+ source?: SearchPlatform;
612
+ } | string;
613
+ type AudioSearchQuery = {
614
+ query: string;
615
+ source: SourceSearchPlatformBase;
616
+ types?: AudioSearchType[];
617
+ };
618
+ type Awaitable<T> = Promise<T> | T;
619
+
620
+ type AudioOutputs = 'mono' | 'stereo' | 'left' | 'right';
621
+ interface PlayerFilters {
622
+ custom: boolean;
623
+ nightcore: boolean;
624
+ vaporwave: boolean;
625
+ rotation: boolean;
626
+ karaoke: boolean;
627
+ tremolo: boolean;
628
+ vibrato: boolean;
629
+ lowPass: boolean;
630
+ audioOutput: AudioOutputs;
631
+ nodeLinkEcho: boolean;
632
+ nodeLinkChorus: boolean;
633
+ nodeLinkCompressor: boolean;
634
+ nodeLinkHighPass: boolean;
635
+ nodeLinkPhaser: boolean;
636
+ nodeLinkSpatial: boolean;
637
+ volume: boolean;
638
+ coreFilterPlugin: {
639
+ echo: boolean;
640
+ reverb: boolean;
641
+ };
642
+ dspxPlugin: {
643
+ lowPass: boolean;
644
+ highPass: boolean;
645
+ normalization: boolean;
646
+ echo: boolean;
647
+ };
648
+ }
649
+ interface EQBand {
650
+ band: IntegerNumber | number;
651
+ gain: FloatNumber | number;
437
652
  }
438
- type EqualizerFilter = EqualizerBand[];
439
653
  interface KaraokeFilter {
440
654
  level?: number;
441
655
  monoLevel?: number;
@@ -474,445 +688,589 @@ interface ChannelMixFilter {
474
688
  rightToLeft?: number;
475
689
  rightToRight?: number;
476
690
  }
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">;
691
+ interface NodeLink_EchoFilter {
692
+ delay?: number;
693
+ feedback?: number;
694
+ mix?: number;
491
695
  }
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;
696
+ interface NodeLink_ChorusFilter {
697
+ rate?: number;
698
+ depth?: number;
699
+ delay?: number;
700
+ mix?: number;
701
+ feedback?: number;
702
+ }
703
+ interface NodeLink_CompressorFilter {
704
+ threshold?: number;
705
+ ratio?: number;
706
+ attack?: number;
707
+ release?: number;
708
+ gain?: number;
709
+ }
710
+ interface NodeLink_HighPassFilter {
711
+ smoothing?: number;
500
712
  }
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[];
713
+ interface NodeLink_PhaserFilter {
714
+ stages?: number;
715
+ rate?: number;
716
+ depth?: number;
717
+ feedback?: number;
718
+ mix?: number;
719
+ minFrequency?: number;
720
+ maxFrequency?: number;
511
721
  }
512
- interface LavalinkVersion {
513
- semver: string;
514
- major: number;
515
- minor: number;
516
- patch: number;
517
- preRelease: string | null;
518
- build: string | null;
722
+ interface NodeLink_SpatialFilter {
723
+ depth?: number;
724
+ rate?: number;
519
725
  }
520
- interface LavalinkGit {
521
- branch: string;
522
- commit: string;
523
- commitTime: number;
726
+ interface LowPassFilter {
727
+ smoothing?: number;
524
728
  }
525
- interface LavalinkPlugin {
526
- name: string;
527
- version: string;
729
+ interface FilterData {
730
+ volume?: number;
731
+ karaoke?: KaraokeFilter;
732
+ timescale?: TimescaleFilter;
733
+ tremolo?: TremoloFilter;
734
+ vibrato?: VibratoFilter;
735
+ rotation?: RotationFilter;
736
+ distortion?: DistortionFilter;
737
+ channelMix?: ChannelMixFilter;
738
+ lowPass?: LowPassFilter;
739
+ echo?: NodeLink_EchoFilter;
740
+ chorus?: NodeLink_ChorusFilter;
741
+ compressor?: NodeLink_CompressorFilter;
742
+ highPass?: NodeLink_HighPassFilter;
743
+ phaser?: NodeLink_PhaserFilter;
744
+ spatial?: NodeLink_SpatialFilter;
745
+ pluginFilters?: {
746
+ 'filter-engine'?: {
747
+ echo?: {
748
+ delay?: number;
749
+ decay?: number;
750
+ };
751
+ reverb?: {
752
+ delays?: number[];
753
+ gains?: number[];
754
+ };
755
+ };
756
+ 'high-pass'?: {
757
+ cutoffFrequency?: number;
758
+ boostFactor?: number;
759
+ };
760
+ 'low-pass'?: {
761
+ cutoffFrequency?: number;
762
+ boostFactor?: number;
763
+ };
764
+ normalization?: {
765
+ maxAmplitude?: number;
766
+ adaptive?: boolean;
767
+ };
768
+ echo?: {
769
+ echoLength?: number;
770
+ decay?: number;
771
+ };
772
+ };
528
773
  }
529
- interface IPBlock {
530
- type: IPBlockType;
531
- size: string;
774
+ interface AudioFilters extends FilterData {
775
+ equalizer?: EQBand[];
532
776
  }
533
- interface FailingAddress {
534
- failingAddress: string;
535
- failingTimestamp: number;
536
- failingTime: string;
777
+
778
+ type NodeLinkEventTypes = 'PlayerCreatedEvent' | 'PlayerDestroyedEvent' | 'PlayerConnectedEvent' | 'PlayerReconnectingEvent' | 'VolumeChangedEvent' | 'FiltersChangedEvent' | 'SeekEvent' | 'PauseEvent' | 'ConnectionStatusEvent' | 'MixStartedEvent' | 'MixEndedEvent' | 'LyricsFoundEvent' | 'LyricsLineEvent' | 'LyricsNotFoundEvent';
779
+ interface NodeLinkBaseEvent {
780
+ op: 'event';
781
+ type: NodeLinkEventTypes;
782
+ guildId: string;
537
783
  }
538
- interface BaseRoutePlannerDetails {
539
- ipBlock: IPBlock;
540
- failingAddresses: FailingAddress[];
784
+ interface PlayerCreatedEvent extends NodeLinkBaseEvent {
785
+ type: 'PlayerCreatedEvent';
541
786
  }
542
- interface RotatingRoutePlannerDetails extends BaseRoutePlannerDetails {
543
- rotateIndex: string;
544
- ipIndex: string;
545
- currentAddress: string;
787
+ interface PlayerDestroyedEvent extends NodeLinkBaseEvent {
788
+ type: 'PlayerDestroyedEvent';
546
789
  }
547
- interface NanoRoutePlannerDetails extends BaseRoutePlannerDetails {
548
- currentAddressIndex: string;
790
+ interface PlayerConnectedEvent extends NodeLinkBaseEvent {
791
+ type: 'PlayerConnectedEvent';
549
792
  }
550
- interface RotatingNanoRoutePlannerDetails extends BaseRoutePlannerDetails {
551
- currentAddressIndex: string;
552
- blockIndex: string;
793
+ interface PlayerReconnectingEvent extends NodeLinkBaseEvent {
794
+ type: 'PlayerReconnectingEvent';
553
795
  }
554
- interface BalancingRoutePlannerDetails extends BaseRoutePlannerDetails {
796
+ interface VolumeChangedEvent extends NodeLinkBaseEvent {
797
+ type: 'VolumeChangedEvent';
798
+ volume: number;
555
799
  }
556
- interface RotatingRoutePlannerStatus {
557
- class: RoutePlannerType.Rotating;
558
- details: RotatingRoutePlannerDetails;
800
+ interface FiltersChangedEvent extends NodeLinkBaseEvent {
801
+ type: 'FiltersChangedEvent';
802
+ filters: AudioFilters;
559
803
  }
560
- interface NanoRoutePlannerStatus {
561
- class: RoutePlannerType.Nano;
562
- details: NanoRoutePlannerDetails;
804
+ interface SeekEvent extends NodeLinkBaseEvent {
805
+ type: 'SeekEvent';
806
+ position: number;
563
807
  }
564
- interface RotatingNanoRoutePlannerStatus {
565
- class: RoutePlannerType.RotatingNano;
566
- details: RotatingNanoRoutePlannerDetails;
808
+ interface PauseEvent extends NodeLinkBaseEvent {
809
+ type: 'PauseEvent';
810
+ paused: boolean;
567
811
  }
568
- interface BalancingRoutePlannerStatus {
569
- class: RoutePlannerType.Balancing;
570
- details: BalancingRoutePlannerDetails;
812
+ interface ConnectionStatusEvent extends NodeLinkBaseEvent {
813
+ type: 'ConnectionStatusEvent';
814
+ connected: boolean;
571
815
  }
572
- interface NullishRoutePlannerStatus {
573
- class: null;
574
- details: null;
816
+ interface MixStartedEvent extends NodeLinkBaseEvent {
817
+ type: 'MixStartedEvent';
818
+ mixId: string;
819
+ track: AudioTrack;
820
+ volume: number;
575
821
  }
576
- type RoutePlannerStatus = RotatingRoutePlannerStatus | NanoRoutePlannerStatus | RotatingNanoRoutePlannerStatus | BalancingRoutePlannerStatus | NullishRoutePlannerStatus;
822
+ interface MixEndedEvent extends NodeLinkBaseEvent {
823
+ type: 'MixEndedEvent';
824
+ mixId: string;
825
+ reason: 'FINISHED' | 'REMOVED' | 'ERROR' | 'MAIN_ENDED' | string;
826
+ }
827
+ type NodeLinkEventPayload<T extends NodeLinkEventTypes> = T extends 'PlayerCreatedEvent' ? PlayerCreatedEvent : T extends 'PlayerDestroyedEvent' ? PlayerDestroyedEvent : T extends 'PlayerConnectedEvent' ? PlayerConnectedEvent : T extends 'PlayerReconnectingEvent' ? PlayerReconnectingEvent : T extends 'VolumeChangedEvent' ? VolumeChangedEvent : T extends 'FiltersChangedEvent' ? FiltersChangedEvent : T extends 'SeekEvent' ? SeekEvent : T extends 'PauseEvent' ? PauseEvent : T extends 'ConnectionStatusEvent' ? ConnectionStatusEvent : T extends 'MixStartedEvent' ? MixStartedEvent : T extends 'MixEndedEvent' ? MixEndedEvent : never;
828
+ type HealthStatusThreshold = {
829
+ excellent: number;
830
+ good: number;
831
+ fair: number;
832
+ poor: number;
833
+ };
834
+ type HealthStatusThresholdOptions = {
835
+ cpu: Partial<HealthStatusThreshold>;
836
+ memory: Partial<HealthStatusThreshold>;
837
+ ping: Partial<HealthStatusThreshold>;
838
+ };
839
+ type NodeMetricSummary = {
840
+ cpuLoad: number;
841
+ systemLoad: number;
842
+ memoryUsage: number;
843
+ players: number;
844
+ playingPlayers: number;
845
+ uptime: number;
846
+ ping: number;
847
+ frameDeficit: number;
848
+ };
849
+ type HealthStatusObject = {
850
+ status: HealthStatusKeys;
851
+ performance: HealthPerformanceKeys;
852
+ isOverloaded: boolean;
853
+ needsRestart: boolean;
854
+ penaltyScore: number;
855
+ estimatedRemainingCapacity: number;
856
+ recommendations: string[];
857
+ metrics: {
858
+ cpuLoad: number;
859
+ memoryUsage: number;
860
+ players: number;
861
+ playingPlayers: number;
862
+ uptime: number;
863
+ ping: number;
864
+ frameDeficit: number;
865
+ };
866
+ };
867
+ type HealthPerformanceKeys = 'excellent' | 'good' | 'fair' | 'poor';
868
+ type HealthStatusKeys = 'healthy' | 'degraded' | 'critical' | 'offline';
869
+ type AddMixerLayerResponse = {
870
+ id: string;
871
+ track: AudioTrack;
872
+ volume: number;
873
+ };
874
+ type ListMixerLayersResponse = {
875
+ mixes: {
876
+ id: string;
877
+ track: AudioTrack;
878
+ volume: number;
879
+ position: number;
880
+ startTime: number;
881
+ }[];
882
+ };
883
+ type ConnectionMetricsResponse = {
884
+ status: string;
885
+ metrics: {
886
+ speed: {
887
+ bps: number;
888
+ kbps: number;
889
+ mbps: number;
890
+ };
891
+ downloadedBytes: number;
892
+ durationSeconds: number;
893
+ timestamp: number;
894
+ };
895
+ };
896
+ type NodeLinkLyricsSynced = {
897
+ loadType: string;
898
+ data: {
899
+ synced: true;
900
+ lang: string;
901
+ source: string;
902
+ lines: [
903
+ {
904
+ text: string;
905
+ time: number;
906
+ duration: number;
907
+ },
908
+ {
909
+ text: string;
910
+ time: number;
911
+ duration: number;
912
+ },
913
+ {
914
+ text: string;
915
+ time: number;
916
+ duration: number;
917
+ }
918
+ ];
919
+ };
920
+ };
921
+ type NodeLinkLyricsPlain = {
922
+ loadType: string;
923
+ data: {
924
+ synced: false;
925
+ lang: string;
926
+ source: string;
927
+ lines: [
928
+ {
929
+ text: string;
930
+ time: null;
931
+ duration: null;
932
+ },
933
+ {
934
+ text: string;
935
+ time: null;
936
+ duration: null;
937
+ },
938
+ {
939
+ text: string;
940
+ time: null;
941
+ duration: null;
942
+ }
943
+ ];
944
+ };
945
+ };
946
+ type NodeLinkLyrics = NodeLinkLyricsSynced | NodeLinkLyricsPlain;
947
+ type NodeLinkNoLyrics = {
948
+ loadType: string;
949
+ data: {};
950
+ };
951
+ type NodeLinkChapter = {
952
+ title: string;
953
+ startTime: number;
954
+ thumbnails: [
955
+ {
956
+ url: string;
957
+ width: number;
958
+ height: number;
959
+ }
960
+ ];
961
+ duration: number;
962
+ endTime: number;
963
+ };
964
+ type DirectStreamResponse = {
965
+ url: string;
966
+ protocol: string;
967
+ format: string;
968
+ hlsUrl: string | null;
969
+ formats: {
970
+ itag: number;
971
+ mimeType: string;
972
+ qualityLabel: string;
973
+ bitrate: number;
974
+ }[];
975
+ };
976
+ type YoutubeOAuthResponse = {
977
+ access_token: string;
978
+ expires_in: number;
979
+ scope: string;
980
+ token_type: string;
981
+ };
982
+ type MeaningResponse = {
983
+ loadType: 'meaning';
984
+ data: {
985
+ title: string;
986
+ description: string;
987
+ paragraphs: string[];
988
+ url: string;
989
+ provider: string;
990
+ type: string;
991
+ };
992
+ };
577
993
 
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;
994
+ type ModifyRequest = (options: RequestInit & {
995
+ path: string;
996
+ extraQueryUrlParams?: URLSearchParams;
997
+ }) => void;
998
+ type SponsorBlockSegment = 'sponsor' | 'selfpromo' | 'interaction' | 'intro' | 'outro' | 'preview' | 'music_offtopic' | 'filler';
999
+ interface NodeConfiguration {
1000
+ nodeType?: NodeTypes;
1001
+ host: string;
1002
+ port: number;
1003
+ authorization: string;
1004
+ secure?: boolean;
1005
+ sessionId?: string;
1006
+ id?: string;
1007
+ regions?: string[];
1008
+ retryAmount?: number;
1009
+ retryDelay?: number;
1010
+ retryTimespan?: number;
1011
+ requestSignalTimeoutMS?: number;
1012
+ closeOnError?: boolean;
1013
+ heartBeatInterval?: number;
1014
+ enablePingOnStatsCheck?: boolean;
1015
+ autoChecks?: {
1016
+ pluginValidations?: boolean;
1017
+ sourcesValidations?: boolean;
1018
+ };
600
1019
  }
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];
1020
+ interface MemoryStats {
1021
+ free: number;
1022
+ used: number;
1023
+ allocated: number;
1024
+ reservable: number;
617
1025
  }
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;
1026
+ interface CPUStats {
1027
+ cores: number;
1028
+ systemLoad: number;
1029
+ audioLoad: number;
660
1030
  }
661
-
662
- interface NodeMetrics {
663
- total: number;
664
- connected: number;
665
- ready: number;
666
- reconnecting: number;
1031
+ interface FrameStats {
1032
+ sent?: number;
1033
+ nulled?: number;
1034
+ deficit?: number;
1035
+ }
1036
+ interface BaseNodeStats {
667
1037
  players: number;
668
1038
  playingPlayers: number;
1039
+ uptime: number;
1040
+ memory: MemoryStats;
1041
+ cpu: CPUStats;
1042
+ frameStats: FrameStats;
1043
+ }
1044
+ interface NodeLinkConnectionMetrics {
1045
+ status: string;
1046
+ metrics: {
1047
+ speed: {
1048
+ bps: number;
1049
+ kbps: number;
1050
+ mbps: number;
1051
+ };
1052
+ downloadedBytes: number;
1053
+ durationSeconds: number;
1054
+ timestamp: number;
1055
+ };
669
1056
  }
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
- }>;
1057
+ interface NodeStats extends BaseNodeStats {
1058
+ frameStats: FrameStats;
1059
+ detailedStats?: {
1060
+ api: {
1061
+ requests: Record<string, number>;
1062
+ errors: unknown;
1063
+ };
1064
+ sources: Record<string, number>;
1065
+ playback: {
1066
+ events: Record<string, number>;
1067
+ };
1068
+ [key: string]: unknown;
714
1069
  };
715
1070
  }
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;
1071
+ interface NodeInfo {
1072
+ version: VersionObject;
1073
+ buildTime: number;
1074
+ git: GitObject;
1075
+ jvm: string;
1076
+ playerEngine: string;
1077
+ sourceManagers: string[];
1078
+ filters: string[];
1079
+ plugins: PluginObject[];
1080
+ isNodelink?: boolean;
745
1081
  }
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;
1082
+ interface VersionObject {
1083
+ semver: string;
1084
+ major: number;
1085
+ minor: number;
1086
+ patch: number;
1087
+ preRelease?: string;
1088
+ build?: string;
765
1089
  }
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>;
1090
+ interface GitObject {
1091
+ branch: string;
1092
+ commit: string;
1093
+ commitTime: string;
806
1094
  }
807
-
808
- declare class Playlist<PluginInfo extends JsonObject = CommonPluginInfo> {
1095
+ interface PluginObject {
809
1096
  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>;
1097
+ version: string;
823
1098
  }
1099
+ interface LyricsResult {
1100
+ sourceName: string;
1101
+ provider: string;
1102
+ text: string | null;
1103
+ lines: LyricsLine[];
1104
+ plugin: PluginInfo;
1105
+ }
1106
+ interface LyricsLine {
1107
+ timestamp: number;
1108
+ duration: number | null;
1109
+ line: string;
1110
+ plugin: PluginInfo;
1111
+ }
1112
+ type RyanlinkNodeIdentifier = string;
1113
+ interface NodeManagerEvents {
1114
+ create: (node: RyanlinkNode) => void;
1115
+ destroy: (node: RyanlinkNode, destroyReason?: DestroyReasonsType) => void;
1116
+ connect: (node: RyanlinkNode) => void;
1117
+ reconnecting: (node: RyanlinkNode) => void;
1118
+ reconnectinprogress: (node: RyanlinkNode) => void;
1119
+ disconnect: (node: RyanlinkNode, reason: {
1120
+ code?: number;
1121
+ reason?: string;
1122
+ }) => void;
1123
+ error: (node: RyanlinkNode, error: Error, payload?: unknown) => void;
1124
+ raw: (node: RyanlinkNode, payload: unknown) => void;
1125
+ resumed: (node: RyanlinkNode, payload: {
1126
+ resumed: true;
1127
+ sessionId: string;
1128
+ op: 'ready';
1129
+ }, players: AudioPlayerState[] | InvalidRestRequest) => void;
1130
+ nodeLinkEvent: (...args: {
1131
+ [K in NodeLinkEventTypes]: [node: RyanlinkNode, event: K, player: Player, track: Track | null, payload: NodeLinkEventPayload<K>];
1132
+ }[NodeLinkEventTypes]) => void;
1133
+ }
1134
+ declare enum ReconnectionState {
1135
+ IDLE = "IDLE",
1136
+ RECONNECTING = "RECONNECTING",
1137
+ PENDING = "PENDING",
1138
+ DESTROYING = "DESTROYING"
1139
+ }
1140
+ type NodeTypes = 'Core' | 'NodeLink';
824
1141
 
825
1142
  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;
1143
+ static EQList: {
1144
+ BassboostEarrape: EQBand[];
1145
+ BassboostHigh: EQBand[];
1146
+ BassboostMedium: EQBand[];
1147
+ BassboostLow: EQBand[];
1148
+ BetterMusic: EQBand[];
1149
+ Rock: EQBand[];
1150
+ Classic: EQBand[];
1151
+ Pop: EQBand[];
1152
+ Electronic: EQBand[];
1153
+ FullSound: EQBand[];
1154
+ Gaming: EQBand[];
1155
+ };
1156
+ equalizerBands: EQBand[];
1157
+ filterUpdatedState: boolean;
1158
+ filters: PlayerFilters;
1159
+ data: FilterData;
1160
+ player: Player;
1161
+ constructor(player: Player);
1162
+ applyPlayerFilters(): Promise<void>;
1163
+ private privateNot0;
1164
+ private getAudioFilters;
1165
+ checkFiltersState(oldFilterTimescale?: Partial<TimescaleFilter>): boolean;
1166
+ resetFilters(): Promise<FilterManager>;
1167
+ setVolume(volume: number): Promise<this>;
1168
+ setAudioOutput(type: AudioOutputs): Promise<FilterManager>;
1169
+ setSpeed(speed?: number): Promise<FilterManager>;
1170
+ setPitch(pitch?: number): Promise<FilterManager>;
1171
+ setRate(rate?: number): Promise<FilterManager>;
1172
+ toggleRotation(rotationHz?: number): Promise<FilterManager>;
1173
+ toggleVibrato(frequency?: number, depth?: number): Promise<FilterManager>;
1174
+ toggleTremolo(frequency?: number, depth?: number): Promise<FilterManager>;
1175
+ toggleLowPass(smoothing?: number): Promise<FilterManager>;
1176
+ dspxPlugin: {
1177
+ toggleLowPass: (boostFactor?: number, cutoffFrequency?: number) => Promise<FilterManager>;
1178
+ toggleHighPass: (boostFactor?: number, cutoffFrequency?: number) => Promise<FilterManager>;
1179
+ toggleNormalization: (maxAmplitude?: number, adaptive?: boolean) => Promise<FilterManager>;
1180
+ toggleEcho: (decay?: number, echoLength?: number) => Promise<FilterManager>;
1181
+ };
1182
+ coreFilterPlugin: {
1183
+ toggleEcho: (delay?: number, decay?: number) => Promise<FilterManager>;
1184
+ toggleReverb: (delays?: number[], gains?: number[]) => Promise<FilterManager>;
1185
+ };
1186
+ toggleNightcore(speed?: number, pitch?: number, rate?: number): Promise<FilterManager>;
1187
+ toggleVaporwave(speed?: number, pitch?: number, rate?: number): Promise<FilterManager>;
1188
+ toggleKaraoke(level?: number, monoLevel?: number, filterBand?: number, filterWidth?: number): Promise<FilterManager>;
1189
+ isCustomFilterActive(): boolean;
1190
+ setEQPreset(preset: keyof typeof EQList): Promise<this>;
1191
+ setEQ(bands: EQBand | EQBand[]): Promise<this>;
1192
+ clearEQ(): Promise<this>;
859
1193
  }
860
1194
 
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) | {
1195
+ declare class QueueSaver {
1196
+ private _;
1197
+ options: {
1198
+ maxPreviousTracks: number;
1199
+ };
1200
+ constructor(options: ManagerQueueOptions);
1201
+ get(guildId: string): Promise<Partial<StoredQueue>>;
1202
+ delete(guildId: string): Promise<boolean | void>;
1203
+ set(guildId: string, valueToStringify: StoredQueue): Promise<boolean | void>;
1204
+ sync(guildId: string): Promise<Partial<StoredQueue>>;
1205
+ }
1206
+ declare class DefaultQueueStore implements QueueStoreManager {
1207
+ private data;
1208
+ constructor();
1209
+ get(guildId: string): StoredQueue | undefined;
1210
+ set(guildId: string, valueToStringify: any): boolean;
1211
+ delete(guildId: string): boolean;
1212
+ stringify(value: StoredQueue | string): StoredQueue | string;
1213
+ parse(value: StoredQueue | string): Partial<StoredQueue>;
1214
+ }
1215
+ declare class Queue {
1216
+ readonly tracks: (Track | UnresolvedTrack)[];
1217
+ readonly previous: Track[];
1218
+ current: Track | null;
1219
+ options: {
1220
+ maxPreviousTracks: number;
1221
+ };
1222
+ private readonly guildId;
1223
+ private readonly QueueSaver;
1224
+ private managerUtils;
1225
+ private queueChanges;
1226
+ constructor(guildId: string, data?: Partial<StoredQueue>, QueueSaver?: QueueSaver, queueOptions?: ManagerQueueOptions);
1227
+ utils: {
1228
+ save: () => Promise<boolean | void>;
1229
+ sync: (override?: boolean, dontSyncCurrent?: boolean) => Promise<void>;
1230
+ destroy: () => Promise<boolean | void>;
1231
+ toJSON: () => StoredQueue;
1232
+ totalDuration: () => number;
1233
+ filterTracks: (predicate: ((track: Track | UnresolvedTrack, index: number) => boolean) | {
1234
+ title?: string;
1235
+ author?: string;
1236
+ duration?: number | {
1237
+ min?: number;
1238
+ max?: number;
1239
+ };
1240
+ uri?: string;
1241
+ identifier?: string;
1242
+ sourceName?: string;
1243
+ isStream?: boolean;
1244
+ isSeekable?: boolean;
1245
+ }) => Array<{
1246
+ track: Track | UnresolvedTrack;
1247
+ index: number;
1248
+ }>;
1249
+ findTrack: (predicate: ((track: Track | UnresolvedTrack, index: number) => boolean) | {
1250
+ title?: string;
1251
+ author?: string;
1252
+ duration?: number | {
1253
+ min?: number;
1254
+ max?: number;
1255
+ };
1256
+ uri?: string;
1257
+ identifier?: string;
1258
+ sourceName?: string;
1259
+ isStream?: boolean;
1260
+ isSeekable?: boolean;
1261
+ }) => {
1262
+ track: Track | UnresolvedTrack;
1263
+ index: number;
1264
+ } | null;
1265
+ };
1266
+ shuffle(): Promise<number>;
1267
+ add(TrackOrTracks: Track | UnresolvedTrack | (Track | UnresolvedTrack)[], index?: number): any;
1268
+ splice(index: number, amount: number, TrackOrTracks?: Track | UnresolvedTrack | (Track | UnresolvedTrack)[]): any;
1269
+ remove<T extends Track | UnresolvedTrack | number | Track[] | UnresolvedTrack[] | number[] | (number | Track | UnresolvedTrack)[]>(removeQueryTrack: T): Promise<{
1270
+ removed: (Track | UnresolvedTrack)[];
1271
+ } | null>;
1272
+ shiftPrevious(): Promise<Track>;
1273
+ filter(predicate: ((track: Track | UnresolvedTrack, index: number) => boolean) | {
916
1274
  title?: string;
917
1275
  author?: string;
918
1276
  duration?: number | {
@@ -925,10 +1283,10 @@ declare class Queue<Context extends Record<string, unknown> = QueueContext> {
925
1283
  isStream?: boolean;
926
1284
  isSeekable?: boolean;
927
1285
  }): Array<{
928
- track: Track;
1286
+ track: Track | UnresolvedTrack;
929
1287
  index: number;
930
1288
  }>;
931
- findTrack(predicate: ((track: Track, index: number) => boolean) | {
1289
+ find(predicate: ((track: Track | UnresolvedTrack, index: number) => boolean) | {
932
1290
  title?: string;
933
1291
  author?: string;
934
1292
  duration?: number | {
@@ -941,395 +1299,405 @@ declare class Queue<Context extends Record<string, unknown> = QueueContext> {
941
1299
  isStream?: boolean;
942
1300
  isSeekable?: boolean;
943
1301
  }): {
944
- track: Track;
1302
+ track: Track | UnresolvedTrack;
945
1303
  index: number;
946
1304
  } | null;
947
- getTracks(start: number, end?: number): Track[];
948
- shiftPrevious(): Track | null;
1305
+ sortBy(sortBy: 'duration' | 'title' | 'author' | ((a: Track | UnresolvedTrack, b: Track | UnresolvedTrack) => number), order?: 'asc' | 'desc'): Promise<this>;
1306
+ toSortedBy(sortBy: 'duration' | 'title' | 'author' | ((a: Track | UnresolvedTrack, b: Track | UnresolvedTrack) => number), order?: 'asc' | 'desc'): (Track | UnresolvedTrack)[];
1307
+ getTracks(start: number, end?: number): (Track | UnresolvedTrack)[];
949
1308
  }
950
1309
 
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"> {
1310
+ interface AutoplayConfig {
1311
+ enabled?: boolean;
1312
+ defaultSource?: 'ytsearch' | 'ytmsearch' | 'scsearch' | 'spsearch' | 'amsearch';
1313
+ limit?: number;
1314
+ minDuration?: number;
1315
+ maxDuration?: number;
1316
+ excludeKeywords?: string[];
1317
+ }
1318
+ declare class Player {
1319
+ filterManager: FilterManager;
1320
+ RyanlinkManager: RyanlinkManager;
1321
+ options: PlayerOptions;
1322
+ node: RyanlinkNode | NodeLinkNode;
1323
+ queue: Queue;
1035
1324
  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
- };
1325
+ voiceChannelId: string | null;
1326
+ textChannelId: string | null;
1327
+ playing: boolean;
1328
+ paused: boolean;
1329
+ repeatMode: RepeatMode;
1330
+ ping: {
1331
+ node: number;
1332
+ ws: number;
1051
1333
  };
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;
1334
+ volume: number;
1335
+ internalVolume: number;
1336
+ get position(): number;
1337
+ lastPositionChange: number | null;
1338
+ lastPosition: number;
1339
+ lastSavedPosition: number;
1340
+ createdTimeStamp: number;
1341
+ connected: boolean | undefined;
1342
+ voice: VoiceConnectionOptions;
1343
+ voiceState: {
1344
+ selfDeaf: boolean;
1345
+ selfMute: boolean;
1346
+ serverDeaf: boolean;
1347
+ serverMute: boolean;
1064
1348
  suppress: boolean;
1065
1349
  };
1350
+ private readonly data;
1351
+ private dispatchDebug;
1352
+ constructor(options: PlayerOptions, RyanlinkManager: RyanlinkManager, dontEmitPlayerCreateEvent?: boolean);
1353
+ set(key: string, value: unknown): this;
1354
+ get<T>(key: string): T;
1355
+ setData(key: string, value: unknown): this;
1356
+ getData<T>(key: string): T;
1357
+ deleteData(key: string): this;
1358
+ clearData(): this;
1359
+ getAllData(): Record<string, unknown>;
1360
+ play(options?: Partial<PlayOptions>): any;
1361
+ oldJSON: PlayerJson;
1362
+ syncState(): void;
1363
+ setVolume(volume: number, ignoreVolumeDecrementer?: boolean): Promise<this>;
1364
+ audioSearch(query: AudioSearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<AudioSearchResponse | SearchResult>;
1365
+ setSponsorBlock(segments?: SponsorBlockSegment[]): Promise<void>;
1366
+ getSponsorBlock(): Promise<SponsorBlockSegment[]>;
1367
+ deleteSponsorBlock(): Promise<void>;
1368
+ search(query: SearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<SearchResult | UnresolvedSearchResult>;
1369
+ private _bandCampSearch;
1370
+ pause(): Promise<this>;
1371
+ resume(): Promise<this>;
1372
+ seek(position: number): Promise<this>;
1373
+ setRepeatMode(repeatMode: RepeatMode): Promise<this>;
1374
+ skip(skipTo?: number, throwError?: boolean): Promise<this>;
1375
+ stopPlaying(clearQueue?: boolean, executeAutoplay?: boolean): Promise<this>;
1376
+ connect(): Promise<this>;
1377
+ changeVoiceState(data: {
1378
+ voiceChannelId?: string;
1379
+ selfDeaf?: boolean;
1380
+ selfMute?: boolean;
1381
+ }): Promise<this>;
1382
+ disconnect(force?: boolean): Promise<this>;
1383
+ destroy(reason?: DestroyReasons | string, disconnect?: boolean): Promise<this>;
1384
+ getCurrentLyrics(skipTrackSource?: boolean): Promise<LyricsResult>;
1385
+ getLyrics(track: Track, skipTrackSource?: boolean): Promise<LyricsResult>;
1386
+ subscribeLyrics(skipTrackSource?: boolean): Promise<unknown>;
1387
+ unsubscribeLyrics(): Promise<void>;
1388
+ changeNode(newNode: RyanlinkNode | string, checkSources?: boolean): Promise<string>;
1389
+ moveNode(node?: string): Promise<string | this>;
1390
+ toJSON(): PlayerJson;
1391
+ }
1392
+ declare class Autoplay {
1393
+ private static adding;
1394
+ static defaultAutoplay(player: Player, lastTrack: Track): Promise<void>;
1395
+ private static buildPlayedData;
1396
+ private static fetchRelatedTracks;
1397
+ private static filterTracks;
1398
+ private static getSpotifyRecommendations;
1399
+ private static getYouTubeSimilar;
1400
+ private static getArtistSearch;
1066
1401
  }
1067
- interface VoiceServerUpdatePayload extends CommonDispatchPayloadInfo {
1068
- t: "VOICE_SERVER_UPDATE";
1069
- d: {
1070
- token: string;
1071
- guild_id: string;
1072
- endpoint: string | null;
1402
+
1403
+ declare class NodeLinkNode extends RyanlinkNode {
1404
+ nodeType: "NodeLink";
1405
+ constructor(options: NodeConfiguration, manager: NodeManager);
1406
+ setNextTrackGapLess(player: Player, track?: Track | UnresolvedTrack): Promise<boolean>;
1407
+ removeNextTrackGapLess(player: Player): Promise<boolean>;
1408
+ getMeaning(track?: Track | UnresolvedTrack): Promise<MeaningResponse>;
1409
+ addMixerLayer(player: Player, trackToAdd: Track, volume: number): Promise<AddMixerLayerResponse>;
1410
+ listMixerLayers(player: Player): Promise<ListMixerLayersResponse>;
1411
+ updateMixerLayerVolume(player: Player, mixId: string, volume: number): Promise<boolean>;
1412
+ removeMixerLayer(player: Player, mixId: string): Promise<boolean>;
1413
+ specificFilters: {
1414
+ echo: (player: Player, options: NodeLink_EchoFilter, disableFilter?: boolean) => Promise<boolean>;
1415
+ chorus: (player: Player, options: NodeLink_ChorusFilter, disableFilter?: boolean) => Promise<boolean>;
1416
+ compressor: (player: Player, options: NodeLink_CompressorFilter, disableFilter?: boolean) => Promise<boolean>;
1417
+ highPass: (player: Player, options: NodeLink_HighPassFilter, disableFilter?: boolean) => Promise<boolean>;
1418
+ phaser: (player: Player, options: NodeLink_PhaserFilter, disableFilter?: boolean) => Promise<boolean>;
1419
+ spatial: (player: Player, options: NodeLink_SpatialFilter, disableFilter?: boolean) => Promise<boolean>;
1420
+ resetNodeLinkFilters: (player: Player) => Promise<boolean>;
1073
1421
  };
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"> {
1422
+ nodeLinkLyrics(player: Player, track?: Track | UnresolvedTrack, language?: string): Promise<NodeLinkLyrics | NodeLinkNoLyrics>;
1423
+ getChapters(player: Player, track?: Track | UnresolvedTrack): Promise<NodeLinkChapter[]>;
1424
+ getConnectionMetrics(): Promise<ConnectionMetricsResponse>;
1425
+ getDirectStream(track: Track | UnresolvedTrack): Promise<DirectStreamResponse>;
1426
+ loadDirectStream(track: Track | UnresolvedTrack, volume: number, position: number, filters: object | string): Promise<ReadableStream>;
1427
+ changeAudioTrackLanguage(player: Player, language_audioTrackId: string): Promise<any>;
1428
+ updateYoutubeConfig(refreshToken?: string, visitorData?: string): Promise<any>;
1429
+ getYoutubeConfig(validate?: boolean): Promise<{
1430
+ refreshToken: string;
1431
+ visitorData: string | null;
1432
+ isConfigured: boolean;
1433
+ isValid: boolean | null;
1434
+ }>;
1435
+ getYoutubeOAUTH(refreshToken: string): Promise<YoutubeOAuthResponse>;
1436
+ updateYoutubeOAUTH(refreshToken: string): Promise<YoutubeOAuthResponse>;
1083
1437
  }
1084
1438
 
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;
1439
+ declare class RyanlinkNode {
1440
+ private heartBeatPingTimestamp;
1441
+ private heartBeatPongTimestamp;
1442
+ private heartBeatInterval?;
1443
+ private pingTimeout?;
1444
+ nodeType: NodeTypes;
1445
+ isAlive: boolean;
1446
+ static _NodeLinkClass: unknown;
1447
+ options: NodeConfiguration;
1448
+ calls: number;
1449
+ stats: NodeStats;
1450
+ sessionId?: string | null;
1451
+ resuming: {
1452
+ enabled: boolean;
1453
+ timeout: number | null;
1104
1454
  };
1105
- }
1106
- interface LyricsConfig {
1107
- sources: {
1108
- lavalink: boolean;
1109
- lrclib: boolean;
1110
- musixmatch: boolean;
1111
- genius: boolean;
1455
+ info: NodeInfo | null;
1456
+ reconnectionState: ReconnectionState;
1457
+ private NodeManager;
1458
+ private reconnectTimeout?;
1459
+ private reconnectAttempts;
1460
+ private socket;
1461
+ private version;
1462
+ private get _LManager();
1463
+ get heartBeatPing(): number;
1464
+ get _checkForPlugins(): boolean;
1465
+ get _checkForSources(): boolean;
1466
+ private dispatchDebug;
1467
+ get connected(): boolean;
1468
+ get connectionStatus(): string;
1469
+ constructor(options: NodeConfiguration, manager: NodeManager);
1470
+ rawRequest(endpoint: string, modify?: ModifyRequest): Promise<{
1471
+ response: Response;
1472
+ options: RequestInit & {
1473
+ path: string;
1474
+ extraQueryUrlParams?: URLSearchParams;
1475
+ };
1476
+ }>;
1477
+ request(endpoint: string, modify: ModifyRequest | undefined, parseAsText: true): Promise<string>;
1478
+ request(endpoint: string, modify?: ModifyRequest, parseAsText?: false): Promise<any>;
1479
+ search(query: SearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<SearchResult>;
1480
+ audioSearch(query: AudioSearchQuery, requestUser: unknown, throwOnEmpty?: boolean): Promise<AudioSearchResponse | SearchResult>;
1481
+ updatePlayer(data: PlayerUpdateInfo): Promise<AudioPlayerState>;
1482
+ destroyPlayer(guildId: any): Promise<void>;
1483
+ connect(sessionId?: string): void;
1484
+ private heartBeat;
1485
+ get id(): string;
1486
+ destroy(destroyReason?: DestroyReasonsType, deleteNode?: boolean, movePlayers?: boolean): void;
1487
+ disconnect(disconnectReason?: DisconnectReasonsType): void;
1488
+ fetchAllPlayers(): Promise<AudioPlayerState[] | InvalidRestRequest | null>;
1489
+ fetchPlayer(guildId: string): Promise<AudioPlayerState | InvalidRestRequest | null>;
1490
+ updateSession(resuming?: boolean, timeout?: number): Promise<Session | InvalidRestRequest | null>;
1491
+ decode: {
1492
+ singleTrack: (encoded: Base64, requester: unknown) => Promise<Track>;
1493
+ multipleTracks: (encodeds: Base64[], requester: unknown) => Promise<Track[]>;
1112
1494
  };
1113
- apiKeys?: {
1114
- musixmatch?: string;
1115
- genius?: string;
1495
+ lyrics: {
1496
+ get: (track: Track, skipTrackSource?: boolean) => Promise<LyricsResult | null>;
1497
+ getCurrent: (guildId: string, skipTrackSource?: boolean) => Promise<LyricsResult | null>;
1498
+ subscribe: (guildId: string, skipTrackSource?: boolean) => Promise<unknown>;
1499
+ unsubscribe: (guildId: string) => Promise<void>;
1116
1500
  };
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;
1501
+ fetchStats(): Promise<BaseNodeStats>;
1502
+ fetchConnectionMetrics(): Promise<NodeLinkConnectionMetrics>;
1503
+ fetchVersion(): Promise<string>;
1504
+ fetchInfo(): Promise<NodeInfo>;
1505
+ nodeMetricSummary(): NodeMetricSummary;
1506
+ getHealthStatus(thresholds?: HealthStatusThresholdOptions): HealthStatusObject;
1507
+ routePlannerApi: {
1508
+ getStatus: () => Promise<RoutePlanner>;
1509
+ unmarkFailedAddress: (address: string) => Promise<unknown>;
1510
+ unmarkAllFailedAddresses: () => Promise<unknown>;
1181
1511
  };
1512
+ private validate;
1513
+ isNodeLink(): this is NodeLinkNode;
1514
+ isRyanlinkNode(): this is RyanlinkNode;
1515
+ private syncPlayerData;
1516
+ private get restAddress();
1517
+ get isNodeReconnecting(): boolean;
1518
+ private reconnect;
1519
+ get reconnectionAttemptCount(): number;
1520
+ private executeReconnect;
1521
+ private resetReconnectionAttempts;
1522
+ private resetAckTimeouts;
1523
+ private open;
1524
+ private close;
1525
+ private error;
1526
+ private message;
1527
+ private handleEvent;
1528
+ private nodeLinkEventHandler;
1529
+ private getTrackOfPayload;
1530
+ private trackStart;
1531
+ private trackEnd;
1532
+ private trackStuck;
1533
+ private trackError;
1534
+ private socketClosed;
1535
+ private SponsorBlockSegmentLoaded;
1536
+ private SponsorBlockSegmentSkipped;
1537
+ private SponsorBlockChaptersLoaded;
1538
+ private SponsorBlockChapterStarted;
1539
+ getSponsorBlock(player: Player): Promise<SponsorBlockSegment[]>;
1540
+ setSponsorBlock(player: Player, segments?: SponsorBlockSegment[]): Promise<void>;
1541
+ deleteSponsorBlock(player: Player): Promise<void>;
1542
+ private queueEnd;
1543
+ private LyricsLine;
1544
+ private LyricsFound;
1545
+ private LyricsNotFound;
1182
1546
  }
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
1547
 
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;
1548
+ declare class NodeManager extends EventEmitter {
1549
+ emit<Event extends keyof NodeManagerEvents>(event: Event, ...args: Parameters<NodeManagerEvents[Event]>): boolean;
1550
+ on<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
1551
+ once<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
1552
+ off<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
1553
+ removeListener<Event extends keyof NodeManagerEvents>(event: Event, listener: NodeManagerEvents[Event]): this;
1554
+ RyanlinkManager: RyanlinkManager;
1555
+ nodes: MiniMap<string, RyanlinkNode | NodeLinkNode>;
1556
+ constructor(RyanlinkManager: RyanlinkManager);
1557
+ disconnectAll(deleteAllNodes?: boolean, destroyPlayers?: boolean): Promise<number>;
1558
+ connectAll(): Promise<number>;
1559
+ reconnectAll(): Promise<number>;
1560
+ createNode<T extends RyanlinkNode | NodeLinkNode>(options: NodeConfiguration): T;
1561
+ leastUsedNodes(sortType?: 'memory' | 'cpuLavalink' | 'cpuSystem' | 'calls' | 'playingPlayers' | 'players'): RyanlinkNode[];
1562
+ deleteNode(node: RyanlinkNodeIdentifier | RyanlinkNode | NodeLinkNode, movePlayers?: boolean): void;
1563
+ getNode(node: RyanlinkNodeIdentifier | RyanlinkNode | NodeLinkNode): RyanlinkNode | NodeLinkNode | undefined;
1244
1564
  }
1245
1565
 
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>;
1566
+ interface ManagerEvents<CustomPlayerT extends Player = Player> {
1567
+ trackStart: (player: CustomPlayerT, track: Track | null, payload: TrackStartEvent) => void;
1568
+ trackEnd: (player: CustomPlayerT, track: Track | null, payload: TrackEndEvent) => void;
1569
+ trackStuck: (player: CustomPlayerT, track: Track | null, payload: TrackStuckEvent) => void;
1570
+ trackError: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: TrackExceptionEvent) => void;
1571
+ queueEnd: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: TrackEndEvent | TrackStuckEvent | TrackExceptionEvent) => void;
1572
+ playerCreate: (player: CustomPlayerT) => void;
1573
+ playerMove: (player: CustomPlayerT, oldVoiceChannelId: string, newVoiceChannelId: string) => void;
1574
+ playerDisconnect: (player: CustomPlayerT, voiceChannelId: string) => void;
1575
+ playerReconnect: (player: CustomPlayerT, voiceChannelId: string) => void;
1576
+ playerSocketClosed: (player: CustomPlayerT, payload: WebSocketClosedEvent) => void;
1577
+ playerDestroy: (player: CustomPlayerT, destroyReason?: DestroyReasonsType) => void;
1578
+ playerUpdate: (oldPlayerJson: PlayerJson, newPlayer: CustomPlayerT) => void;
1579
+ playerClientUpdate: (oldPlayerJson: PlayerJson, newPlayer: CustomPlayerT) => void;
1580
+ playerMuteChange: (player: CustomPlayerT, selfMuted: boolean, serverMuted: boolean) => void;
1581
+ playerDeafChange: (player: CustomPlayerT, selfDeafed: boolean, serverDeafed: boolean) => void;
1582
+ playerSuppressChange: (player: CustomPlayerT, suppress: boolean) => void;
1583
+ playerQueueEmptyStart: (player: CustomPlayerT, timeoutMs: number) => void;
1584
+ playerQueueEmptyEnd: (player: CustomPlayerT) => void;
1585
+ playerQueueEmptyCancel: (player: CustomPlayerT) => void;
1586
+ playerVoiceJoin: (player: CustomPlayerT, userId: string) => void;
1587
+ playerVoiceLeave: (player: CustomPlayerT, userId: string) => void;
1588
+ SegmentsLoaded: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: SponsorBlockSegmentsLoaded) => void;
1589
+ SegmentSkipped: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: SponsorBlockSegmentSkipped) => void;
1590
+ ChapterStarted: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: SponsorBlockChapterStarted) => void;
1591
+ ChaptersLoaded: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: SponsorBlockChaptersLoaded) => void;
1592
+ debug: (eventKey: DebugEvents, eventData: {
1593
+ message: string;
1594
+ state: 'log' | 'warn' | 'error';
1595
+ error?: Error | string;
1596
+ functionLayer: string;
1597
+ }) => void;
1598
+ LyricsLine: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: LyricsLineEvent) => void;
1599
+ LyricsFound: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: LyricsFoundEvent) => void;
1600
+ LyricsNotFound: (player: CustomPlayerT, track: Track | UnresolvedTrack | null, payload: LyricsNotFoundEvent) => void;
1601
+ playerResumed: (player: CustomPlayerT, track: Track | UnresolvedTrack | null) => void;
1602
+ playerPaused: (player: CustomPlayerT, track: Track | UnresolvedTrack | null) => void;
1603
+ }
1604
+ interface BotClientOptions {
1605
+ id: string;
1606
+ username?: string;
1607
+ [x: string | number | symbol]: unknown;
1608
+ }
1609
+ interface ManagerPlayerOptions<CustomPlayerT extends Player = Player> {
1610
+ volumeDecrementer?: number;
1611
+ clientBasedPositionUpdateInterval?: number;
1612
+ defaultSearchPlatform?: SearchPlatform;
1613
+ allowCustomSources?: boolean;
1614
+ applyVolumeAsFilter?: boolean;
1615
+ requesterTransformer?: (requester: unknown) => unknown;
1616
+ onDisconnect?: {
1617
+ autoReconnect?: boolean;
1618
+ autoReconnectOnlyWithTracks?: boolean;
1619
+ destroyPlayer?: boolean;
1620
+ };
1621
+ minAutoPlayMs?: number;
1622
+ maxErrorsPerTime?: {
1623
+ threshold: number;
1624
+ maxAmount: number;
1625
+ };
1626
+ onEmptyQueue?: {
1627
+ autoPlayFunction?: (player: CustomPlayerT, lastPlayedTrack: Track) => Promise<void>;
1628
+ destroyAfterMs?: number;
1629
+ };
1630
+ autoplayConfig?: AutoplayConfig;
1631
+ useUnresolvedData?: boolean;
1632
+ enforceSponsorBlockRequestForEventEnablement?: boolean;
1633
+ }
1634
+ type PlayerConstructor<T extends Player = Player> = new (options: PlayerOptions, RyanlinkManager: RyanlinkManager, dontEmitPlayerCreateEvent?: boolean) => T;
1635
+ interface RyanConfiguration<CustomPlayerT extends Player = Player> {
1636
+ nodes: NodeConfiguration[];
1637
+ sendToShard: (guildId: string, payload: GuildShardPayload) => void;
1638
+ client?: BotClientOptions;
1639
+ queueOptions?: ManagerQueueOptions;
1640
+ playerOptions?: ManagerPlayerOptions<CustomPlayerT>;
1641
+ playerClass?: PlayerConstructor<CustomPlayerT>;
1642
+ autoSkip?: boolean;
1643
+ autoMove?: boolean;
1644
+ autoSkipOnResolveError?: boolean;
1645
+ emitNewSongsOnly?: boolean;
1646
+ linksWhitelist?: (RegExp | string)[];
1647
+ linksBlacklist?: (RegExp | string)[];
1648
+ linksAllowed?: boolean;
1649
+ advancedOptions?: {
1650
+ maxFilterFixDuration?: number;
1651
+ enableDebugEvents?: boolean;
1652
+ debugOptions?: {
1653
+ logCustomSearches?: boolean;
1654
+ noAudio?: boolean;
1655
+ playerDestroy?: {
1656
+ debugLog?: boolean;
1657
+ dontThrowError?: boolean;
1658
+ };
1659
+ };
1660
+ };
1257
1661
  }
1258
1662
 
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;
1663
+ declare class RyanlinkManager<CustomPlayerT extends Player = Player> extends EventEmitter {
1664
+ emit<Event extends keyof ManagerEvents<CustomPlayerT>>(event: Event, ...args: Parameters<ManagerEvents<CustomPlayerT>[Event]>): boolean;
1665
+ on<Event extends keyof ManagerEvents<CustomPlayerT>>(event: Event, listener: ManagerEvents<CustomPlayerT>[Event]): this;
1666
+ once<Event extends keyof ManagerEvents<CustomPlayerT>>(event: Event, listener: ManagerEvents<CustomPlayerT>[Event]): this;
1667
+ off<Event extends keyof ManagerEvents<CustomPlayerT>>(event: Event, listener: ManagerEvents<CustomPlayerT>[Event]): this;
1668
+ removeListener<Event extends keyof ManagerEvents<CustomPlayerT>>(event: Event, listener: ManagerEvents<CustomPlayerT>[Event]): this;
1669
+ options: RyanConfiguration<CustomPlayerT>;
1670
+ nodeManager: NodeManager;
1671
+ utils: RyanlinkUtils;
1672
+ initiated: boolean;
1673
+ readonly players: MiniMap<string, CustomPlayerT>;
1674
+ private applyOptions;
1675
+ private validateOptions;
1676
+ private dispatchDebug;
1677
+ private static readonly _noAudioDebugPrefix;
1678
+ private _debugNoAudio;
1679
+ constructor(options: RyanConfiguration<CustomPlayerT>);
1680
+ getPlayer(guildId: string): CustomPlayerT | undefined;
1681
+ createPlayer(options: PlayerOptions): CustomPlayerT;
1682
+ destroyPlayer(guildId: string, destroyReason?: string): Promise<void | CustomPlayerT>;
1683
+ deletePlayer(guildId: string): boolean | void;
1684
+ get useable(): boolean;
1685
+ init(clientData: BotClientOptions): Promise<this>;
1686
+ provideVoiceUpdate(data: VoicePacket | VoiceServer | VoiceState | ChannelDeletePacket): Promise<void>;
1273
1687
  }
1274
1688
 
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
- }
1689
+ declare const SourceMappings: Record<SearchPlatform, RyanlinkSearchPlatform | ClientCustomSearchPlatformUtils>;
1690
+ declare const BuiltinSources: {
1691
+ DuncteBot_Plugin: string;
1692
+ LavaSrc: string;
1693
+ GoogleCloudTTS: string;
1694
+ LavaSearch: string;
1695
+ JioSaavn_Engine: string;
1696
+ Filter_Engine: string;
1697
+ TimedLyrics_Engine: string;
1698
+ };
1699
+ declare const LinkMatchers: Record<SourcesRegex, RegExp>;
1325
1700
 
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
- }>;
1701
+ declare const version: string;
1334
1702
 
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 };
1703
+ export { type AudioClientSearchPlatform, type AudioClientSearchPlatformResolve, type AudioFilters, AudioNodeSymbol, type AudioOutputs, type AudioPlayerState, AudioQueueSymbol, type AudioSearchFilteredResponse, type AudioSearchQuery, type AudioSearchResponse, type AudioSearchType, type AudioSourceNames, type AudioTrack, type AudioTrackInfo, AudioTrackSymbol, Autoplay, type AutoplayConfig, type Awaitable, type Base64, type BaseNodeStats, type BasePlayOptions, BuiltinSources, type CPUStats, type ChannelDeletePacket, type ChannelMixFilter, type ClientCustomSearchPlatformUtils, type ClientSearchPlatform, type CoreSourceNames, DebugEvents, DefaultQueueStore, DestroyReasons, type DestroyReasonsType, DisconnectReasons, type DisconnectReasonsType, type DistortionFilter, type DuncteSearchPlatform, type EQBand, EQList, type Exception, type ExtendedSearchPlatform, type FailingAddress, type FilterData, FilterManager, type FloatNumber, type FrameStats, type GitObject, type GuildShardPayload, type IntegerNumber, type InvalidRestRequest, type JioSaavnSearchPlatform, type KaraokeFilter, LinkMatchers, type LoadTypes, type LowPassFilter, type LyricsEvent, type LyricsEventType, type LyricsFoundEvent, type LyricsLine, type LyricsLineEvent, type LyricsNotFoundEvent, type LyricsResult, type ManagerQueueOptions, type MemoryStats, MiniMap, type MiniMapConstructor, type ModifyRequest, type NodeConfiguration, type NodeInfo, type NodeLinkConnectionMetrics, NodeLinkExclusiveEvents, NodeLinkNode, type NodeLink_ChorusFilter, type NodeLink_CompressorFilter, type NodeLink_EchoFilter, type NodeLink_HighPassFilter, type NodeLink_PhaserFilter, type NodeLink_SpatialFilter, NodeManager, type NodeManagerEvents, type NodeMessage, type NodeStats, type NodeTypes, type Opaque, type PlayConfiguration, type PlayOptions, Player, type PlayerEvent, type PlayerEventType, type PlayerEvents, type PlayerFilters, type PlayerJson, type PlayerOptions, type PlayerUpdateInfo, type PlaylistInfo, type PluginInfo, type PluginObject, Queue, type QueueChangesWatcher, QueueSaver, type QueueStoreManager, RecommendationsStrings, ReconnectionState, type RepeatMode, type RotationFilter, type RoutePlanner, type RoutePlannerTypes, RyanlinkManager, RyanlinkNode, type RyanlinkNodeIdentifier, type RyanlinkSearchPlatform, RyanlinkUtils, type SearchPlatform, type SearchQuery, type SearchResult, type Session, type Severity, SourceMappings, type SourceSearchPlatform, type SourceSearchPlatformBase, type SourcesRegex, type SponsorBlockChapterStarted, type SponsorBlockChaptersLoaded, type SponsorBlockSegment, type SponsorBlockSegmentEventType, type SponsorBlockSegmentEvents, type SponsorBlockSegmentSkipped, type SponsorBlockSegmentsLoaded, type State, type StoredQueue, type TimescaleFilter, type Track, type TrackEndEvent, type TrackEndReason, type TrackExceptionEvent, type TrackInfo, type TrackRequester, type TrackStartEvent, type TrackStuckEvent, type TremoloFilter, UnresolvedAudioTrackSymbol, type UnresolvedQuery, type UnresolvedSearchResult, type UnresolvedTrack, type UnresolvedTrackInfo, type VersionObject, type VibratoFilter, type VoiceConnectionOptions, type VoiceConnectionState, type VoicePacket, type VoiceServer, type VoiceState, type WebSocketClosedEvent, type anyObject, audioOutputsData, parseConnectionUrl, queueTrackEnd, safeStringify, validSponsorBlocks, version };