lavacord 2.2.0 → 3.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 (59) hide show
  1. package/LICENSE +24 -201
  2. package/README.md +473 -69
  3. package/dist/cjs/index.cjs +44 -0
  4. package/dist/cjs/index.cjs.map +1 -0
  5. package/dist/cjs/index.d.cts +1211 -0
  6. package/dist/cjs/lib/LavalinkNode.cjs +423 -0
  7. package/dist/cjs/lib/LavalinkNode.cjs.map +1 -0
  8. package/dist/cjs/lib/Manager.cjs +405 -0
  9. package/dist/cjs/lib/Manager.cjs.map +1 -0
  10. package/dist/cjs/lib/Player.cjs +220 -0
  11. package/dist/cjs/lib/Player.cjs.map +1 -0
  12. package/dist/cjs/lib/Rest.cjs +192 -0
  13. package/dist/cjs/lib/Rest.cjs.map +1 -0
  14. package/dist/cjs/lib/Types.cjs +4 -0
  15. package/dist/cjs/lib/Types.cjs.map +1 -0
  16. package/dist/cjs/wrappers/cloudstorm.cjs +54 -0
  17. package/dist/cjs/wrappers/cloudstorm.cjs.map +1 -0
  18. package/dist/cjs/wrappers/detritus.cjs +57 -0
  19. package/dist/cjs/wrappers/detritus.cjs.map +1 -0
  20. package/dist/cjs/wrappers/discord.js.cjs +37 -0
  21. package/dist/cjs/wrappers/discord.js.cjs.map +1 -0
  22. package/dist/cjs/wrappers/eris.cjs +51 -0
  23. package/dist/cjs/wrappers/eris.cjs.map +1 -0
  24. package/dist/cjs/wrappers/oceanic.cjs +52 -0
  25. package/dist/cjs/wrappers/oceanic.cjs.map +1 -0
  26. package/dist/esm/chunk-PAWJFY3S.mjs +6 -0
  27. package/dist/esm/chunk-PAWJFY3S.mjs.map +1 -0
  28. package/dist/esm/index.d.mts +1211 -0
  29. package/dist/esm/index.mjs +12 -0
  30. package/dist/esm/index.mjs.map +1 -0
  31. package/dist/esm/lib/LavalinkNode.mjs +420 -0
  32. package/dist/esm/lib/LavalinkNode.mjs.map +1 -0
  33. package/dist/esm/lib/Manager.mjs +402 -0
  34. package/dist/esm/lib/Manager.mjs.map +1 -0
  35. package/dist/esm/lib/Player.mjs +217 -0
  36. package/dist/esm/lib/Player.mjs.map +1 -0
  37. package/dist/esm/lib/Rest.mjs +188 -0
  38. package/dist/esm/lib/Rest.mjs.map +1 -0
  39. package/dist/esm/lib/Types.mjs +3 -0
  40. package/dist/esm/lib/Types.mjs.map +1 -0
  41. package/dist/esm/wrappers/cloudstorm.mjs +45 -0
  42. package/dist/esm/wrappers/cloudstorm.mjs.map +1 -0
  43. package/dist/esm/wrappers/detritus.mjs +48 -0
  44. package/dist/esm/wrappers/detritus.mjs.map +1 -0
  45. package/dist/esm/wrappers/discord.js.mjs +28 -0
  46. package/dist/esm/wrappers/discord.js.mjs.map +1 -0
  47. package/dist/esm/wrappers/eris.mjs +42 -0
  48. package/dist/esm/wrappers/eris.mjs.map +1 -0
  49. package/dist/esm/wrappers/oceanic.mjs +43 -0
  50. package/dist/esm/wrappers/oceanic.mjs.map +1 -0
  51. package/dist/lib/LavalinkNode.d.ts +3 -3
  52. package/dist/lib/LavalinkNode.js +16 -26
  53. package/dist/lib/LavalinkNode.js.map +1 -1
  54. package/dist/lib/Manager.d.ts +2 -2
  55. package/dist/lib/Manager.js.map +1 -1
  56. package/dist/lib/Rest.js +5 -7
  57. package/dist/lib/Rest.js.map +1 -1
  58. package/dist/tsconfig.tsbuildinfo +1 -1
  59. package/package.json +109 -64
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/Player.ts"],"names":[],"mappings":"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","file":"Player.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { EventEmitter } from \"events\";\nimport { Rest } from \"./Rest\";\nimport type { LavalinkNode } from \"./LavalinkNode\";\nimport type { Manager } from \"./Manager\";\nimport type { PlayerUpdateVoiceState, JoinOptions, PlayerEvents } from \"./Types\";\nimport {\n\tPlayerState,\n\tTrack,\n\tVoiceState,\n\tFilters,\n\tUpdatePlayerData,\n\tUpdatePlayerResult,\n\tEqualizer,\n\tDestroyPlayerResult,\n\tPlayer as APIPlayer\n} from \"lavalink-types\";\n\n/**\n * The Player class that handles playback and audio manipulation for a specific guild.\n *\n * @remarks\n * This class is responsible for audio playback operations, including playing, stopping,\n * pausing, resuming, and applying audio filters. Each instance represents a player\n * for a specific guild.\n */\nexport class Player extends EventEmitter<PlayerEvents> {\n\t/**\n\t * The current state of this Player\n\t *\n\t * @remarks\n\t * Contains information about the player state from Lavalink, including position, filters, etc.\n\t */\n\tpublic state: PlayerState = {\n\t\ttime: 0,\n\t\tposition: 0,\n\t\tconnected: false,\n\t\tping: 0\n\t};\n\t/**\n\t * The timestamp when the current track started playing\n\t *\n\t * @remarks\n\t * This is a client-side timestamp, not synchronized with Lavalink.\n\t * Can be used to calculate approximate playback position.\n\t */\n\tpublic timestamp: number | null = null;\n\t/**\n\t * Whether the audio playback is currently paused\n\t */\n\tpublic paused = false;\n\t/**\n\t * The current volume level (0-1000)\n\t */\n\tpublic volume = 100;\n\t/**\n\t * The current track in Lavalink's base64 string form\n\t *\n\t * @remarks\n\t * This is null when no track is loaded or when playback has ended.\n\t */\n\tpublic track: Track | null = null;\n\t/**\n\t * The voice connection state from Lavalink API\n\t */\n\tpublic voice: VoiceState | null = null;\n\t/**\n\t * The current audio filters applied to this player\n\t *\n\t * @remarks\n\t * This includes effects like equalizer, karaoke, etc.\n\t */\n\tpublic filters: Filters = {};\n\n\t/**\n\t * Creates a new player instance.\n\t *\n\t * @param node - The Lavalink node this player is connected to.\n\t * @param guildId - The guild ID that this player is associated with.\n\t */\n\tpublic constructor(\n\t\t/**\n\t\t * The Lavalink node this player is connected to\n\t\t */\n\t\tpublic node: LavalinkNode,\n\t\t/**\n\t\t * The guild ID for this player\n\t\t */\n\t\tpublic guildId: string\n\t) {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Updates the current player on the Lavalink node.\n\t * @see {@link https://lavalink.dev/api/rest#update-player}\n\t *\n\t * @param options - The update options to apply to the player.\n\t * @param noReplace - If true, the event will be dropped if there's a currently playing track.\n\t * @returns {Promise<APIPlayer>} The updated player information from Lavalink.\n\t */\n\tpublic async update(options: UpdatePlayerData, noReplace = false): Promise<APIPlayer> {\n\t\tconst d = await Rest.updatePlayer(this.node, this.guildId, options, noReplace);\n\n\t\t// Update local state with response data\n\t\tif (\"track\" in d) this.track = d.track;\n\t\tif (\"volume\" in d) this.volume = d.volume;\n\t\tif (\"paused\" in d) this.paused = d.paused;\n\t\tif (\"state\" in d) this.state = d.state;\n\t\tif (\"filters\" in d) this.filters = d.filters;\n\t\tif (\"voice\" in d) this.voice = d.voice;\n\n\t\treturn d;\n\t}\n\n\t/**\n\t * Plays a track using its base64 encoded string.\n\t *\n\t * @param track - The base64 encoded track string from Lavalink.\n\t * @param options - Additional options for playback.\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic async play(\n\t\ttrack: string,\n\t\toptions?: Omit<UpdatePlayerData, \"track\"> & {\n\t\t\tnoReplace?: boolean;\n\t\t\tuserData?: Record<any, any>;\n\t\t}\n\t): Promise<UpdatePlayerResult> {\n\t\tconst { userData, noReplace, ...opts } = options || {};\n\n\t\tconst d = await this.update({ track: { encoded: track, userData }, ...opts }, noReplace ?? false);\n\t\tthis.timestamp = Date.now();\n\n\t\treturn d;\n\t}\n\n\t/**\n\t * Stops the currently playing track.\n\t *\n\t * @remarks\n\t * This will trigger a \"TrackEndEvent\" with reason \"STOPPED\".\n\t *\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic stop(): Promise<UpdatePlayerResult> {\n\t\treturn this.update({ track: { encoded: null } });\n\t}\n\n\t/**\n\t * Pauses or resumes the current track.\n\t *\n\t * @param pause - Whether to pause (true) or resume (false) playback.\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic async pause(pause: boolean): Promise<UpdatePlayerResult> {\n\t\tconst d = await this.update({ paused: pause });\n\t\tif (this.listenerCount(\"pause\")) this.emit(\"pause\", pause);\n\t\tif (this.manager.listenerCount(\"playerPause\")) this.manager.emit(\"playerPause\", this, pause);\n\t\treturn d;\n\t}\n\n\t/**\n\t * Changes the volume of the current playback.\n\t *\n\t * @param volume - The volume level as a number between 0 and 1000\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic async setVolume(volume: number): Promise<UpdatePlayerResult> {\n\t\tconst d = await this.update({ volume });\n\t\tif (this.listenerCount(\"volume\")) this.emit(\"volume\", volume);\n\t\tif (this.manager.listenerCount(\"playerVolume\")) this.manager.emit(\"playerVolume\", this, volume);\n\t\treturn d;\n\t}\n\n\t/**\n\t * Seeks to a specific position in the current track.\n\t *\n\t * @param position - The position to seek to in milliseconds.\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic async seek(position: number): Promise<UpdatePlayerResult> {\n\t\tconst d = await this.update({ position });\n\t\tif (this.listenerCount(\"seek\")) this.emit(\"seek\", position);\n\t\tif (this.manager.listenerCount(\"playerSeek\")) this.manager.emit(\"playerSeek\", this, position);\n\t\treturn d;\n\t}\n\n\t/**\n\t * Applies audio filters to the current playback.\n\t *\n\t * @param options - The filter options to apply.\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic async setFilters(options: Filters): Promise<UpdatePlayerResult> {\n\t\tconst d = await this.update({ filters: options });\n\t\tif (this.listenerCount(\"filters\")) this.emit(\"filters\", options);\n\t\tif (this.manager.listenerCount(\"playerFilters\")) this.manager.emit(\"playerFilters\", this, options);\n\t\treturn d;\n\t}\n\n\t/**\n\t * Sets the equalizer effect for the current playback.\n\t *\n\t * @param bands - An array of equalizer bands to adjust.\n\t * @returns A promise resolving to the updated player information.\n\t *\n\t * @remarks\n\t * Each band is an object with 'band' (0-14) and 'gain' (-0.25 to 1.0) properties.\n\t */\n\tpublic async setEqualizer(bands: Equalizer[]): Promise<UpdatePlayerResult> {\n\t\treturn this.setFilters({ equalizer: bands });\n\t}\n\n\t/**\n\t * Destroys the player on the Lavalink node.\n\t *\n\t * @remarks\n\t * This sends a destroy signal to Lavalink to clean up resources for this guild ID.\n\t * It doesn't affect the Discord voice connection - use {@link Manager.leave} for that.\n\t *\n\t * @returns {Promise<DestroyPlayerResult>} A promise resolving to the destroy result.\n\t */\n\tpublic async destroy(): Promise<DestroyPlayerResult> {\n\t\treturn Rest.destroyPlayer(this.node, this.guildId);\n\t}\n\n\t/**\n\t * Provides voice server update information to Lavalink to establish a connection.\n\t *\n\t * @param data - The voice update state containing session ID and voice server information.\n\t * @returns A promise resolving to the updated player information.\n\t */\n\tpublic connect(data: PlayerUpdateVoiceState): Promise<UpdatePlayerResult> {\n\t\treturn this.update({\n\t\t\tvoice: {\n\t\t\t\ttoken: data.event.token,\n\t\t\t\tendpoint: data.event.endpoint,\n\t\t\t\tsessionId: data.sessionId\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Switches the player to a different voice channel.\n\t *\n\t * @param channel - The ID of the voice channel to switch to.\n\t * @param options - Options for joining the channel (selfMute, selfDeaf).\n\t * @returns Does not return anything, but sends a WebSocket message to the Lavalink node.\n\t */\n\tpublic switchChannel(channel: string, options: JoinOptions = {}): unknown {\n\t\treturn this.manager.sendWS(this.guildId, channel, options);\n\t}\n\n\t/**\n\t * Gets the manager instance that created this player.\n\t *\n\t * @returns {Manager} The manager instance.\n\t */\n\tpublic get manager(): Manager {\n\t\treturn this.node.manager;\n\t}\n}\n"]}
@@ -0,0 +1,188 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { URLSearchParams } from 'url';
3
+ import { VERSION } from '../index.mjs';
4
+
5
+ var RestError = class extends Error {
6
+ constructor(error, data) {
7
+ super(error.message);
8
+ this.error = error;
9
+ this.data = data;
10
+ this.name = "RestError";
11
+ }
12
+ static {
13
+ __name(this, "RestError");
14
+ }
15
+ };
16
+ var Rest = class _Rest {
17
+ static {
18
+ __name(this, "Rest");
19
+ }
20
+ /**
21
+ * Base request function that handles communication with Lavalink REST API.
22
+ *
23
+ * @internal
24
+ * @param node - The Lavalink node to send the request to.
25
+ * @param path - The API route path, starting with /.
26
+ * @param init - Optional request initialization options.
27
+ * @param requiresSessionId - Whether the request requires a valid session ID.
28
+ * @returns A promise resolving to the response data.
29
+ * @throws {@link RestError} If Lavalink returns an error response.
30
+ */
31
+ static async baseRequest(node, path, init, requiresSessionId) {
32
+ const headers = new Headers(init?.headers);
33
+ headers.set("Authorization", node.password);
34
+ headers.set("User-Agent", `Lavacord/${VERSION}`);
35
+ const fetchConfig = {
36
+ method: init?.method ?? "GET",
37
+ headers,
38
+ body: init?.body
39
+ };
40
+ if (init?.query) path += `?${new URLSearchParams(init.query)}`;
41
+ if (requiresSessionId && !node.sessionId) {
42
+ throw new RestError({
43
+ timestamp: Date.now(),
44
+ status: 400,
45
+ error: "Bad Request",
46
+ message: `Node ${node.id} requires a session ID for this route. Did you forget to connect?`,
47
+ path
48
+ }, fetchConfig);
49
+ }
50
+ const response = await fetch(node.restURL + path, fetchConfig).catch((error) => {
51
+ throw new RestError({
52
+ timestamp: Date.now(),
53
+ status: 503,
54
+ error: "Network Error",
55
+ message: `Failed to connect to ${node.id}: ${error.message}`,
56
+ path
57
+ }, fetchConfig);
58
+ });
59
+ if (response.status === 204) return void 0;
60
+ const contentType = response.headers.get("content-type");
61
+ const body = await (contentType?.includes("application/json") ? response.json() : response.text());
62
+ if (!response.ok || body?.error) throw new RestError(body, fetchConfig);
63
+ return body;
64
+ }
65
+ /**
66
+ * Loads tracks from various sources using Lavalink's loadtracks endpoint.
67
+ *
68
+ * @param node - The Lavalink node to use.
69
+ * @param identifer - The identifier to load tracks from (URL, search query, etc.)
70
+ * @returns A promise resolving to the track loading result.
71
+ * @throws {@link RestError} If Lavalink encounters an error.
72
+ *
73
+ * @public
74
+ */
75
+ static load(node, identifer) {
76
+ return _Rest.baseRequest(node, `/v${node.version}/loadtracks`, { query: { identifier: identifer } });
77
+ }
78
+ static decode(node, tracks) {
79
+ if (!Array.isArray(tracks)) return _Rest.baseRequest(node, `/v4/decodetrack`, { query: { track: tracks } });
80
+ return _Rest.baseRequest(node, `/v${node.version}/decodetracks`, {
81
+ method: "POST",
82
+ body: JSON.stringify(tracks),
83
+ headers: { "Content-Type": "application/json" }
84
+ });
85
+ }
86
+ /**
87
+ * Retrieves the version from the Lavalink server.
88
+ *
89
+ * @param node - The Lavalink node to query.
90
+ * @returns A promise resolving to the version of lavalink.
91
+ * @throws {@link RestError} If Lavalink encounters an error.
92
+ *
93
+ * @public
94
+ */
95
+ static version(node) {
96
+ return _Rest.baseRequest(node, `/version`);
97
+ }
98
+ /**
99
+ * Retrieves the information of the Lavalink server.
100
+ *
101
+ * @param node - The Lavalink node to query.
102
+ * @returns A promise resolving to the information of lavalink.
103
+ * @throws {@link RestError} If Lavalink encounters an error.
104
+ *
105
+ * @public
106
+ */
107
+ static info(node) {
108
+ return _Rest.baseRequest(node, `/v${node.version}/info`);
109
+ }
110
+ /**
111
+ * Retrieves the statistics of the Lavalink node.
112
+ *
113
+ * @param node - The Lavalink node to query.
114
+ * @returns A promise resolving to the statistics of lavalink.
115
+ * @throws {@link RestError} If Lavalink encounters an error.
116
+ *
117
+ * @public
118
+ */
119
+ static stats(node) {
120
+ return _Rest.baseRequest(node, `/v${node.version}/stats`);
121
+ }
122
+ /**
123
+ * Updates the session properties of a Lavalink node.
124
+ *
125
+ * @param node - The Lavalink node to update.
126
+ * @returns A promise resolving to the update session result.
127
+ * @throws {@link RestError} If Lavalink encounters an error.
128
+ *
129
+ * @public
130
+ */
131
+ static updateSession(node) {
132
+ return _Rest.baseRequest(
133
+ node,
134
+ `/v${node.version}/sessions/${node.sessionId}`,
135
+ {
136
+ method: "PATCH",
137
+ body: JSON.stringify({
138
+ resuming: node.resuming,
139
+ timeout: node.resumeTimeout
140
+ }),
141
+ headers: { "Content-Type": "application/json" }
142
+ },
143
+ true
144
+ );
145
+ }
146
+ /**
147
+ * Updates a player on a Lavalink node.
148
+ *
149
+ * @param node - The Lavalink node hosting the player.
150
+ * @param guildId - The guild ID associated with the player.
151
+ * @param data - The player update data.
152
+ * @param noReplace - If true, the event will be dropped if there's a currently playing track.
153
+ * @returns A promise resolving to the updated player information.
154
+ * @throws {@link RestError} If Lavalink encounters an error.
155
+
156
+ * @public
157
+ */
158
+ static updatePlayer(node, guildId, data, noReplace = false) {
159
+ return _Rest.baseRequest(
160
+ node,
161
+ `/v${node.version}/sessions/${node.sessionId}/players/${guildId}`,
162
+ {
163
+ method: "PATCH",
164
+ body: JSON.stringify(data),
165
+ headers: { "Content-Type": "application/json" },
166
+ query: noReplace ? { noReplace: "true" } : void 0
167
+ },
168
+ true
169
+ );
170
+ }
171
+ /**
172
+ * Destroys a player on a Lavalink node.
173
+ *
174
+ * @param node - The Lavalink node hosting the player.
175
+ * @param guildId - The guild ID associated with the player to destroy.
176
+ * @returns A promise resolving to the destroy player result.
177
+ * @throws {@link RestError} If Lavalink encounters an error.
178
+ *
179
+ * @public
180
+ */
181
+ static destroyPlayer(node, guildId) {
182
+ return _Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}/players/${guildId}`, { method: "DELETE" }, true);
183
+ }
184
+ };
185
+
186
+ export { Rest, RestError };
187
+ //# sourceMappingURL=Rest.mjs.map
188
+ //# sourceMappingURL=Rest.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/Rest.ts"],"names":[],"mappings":";;;;AAyBO,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EACpC,WAAA,CAAmB,OAA6B,IAAA,EAAmB;AAClE,IAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AADD,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAA6B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAE/C,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA;AACb,EA7BD;AAyBqC,IAAA,MAAA,CAAA,IAAA,EAAA,WAAA,CAAA;AAAA;AAKrC;AAYO,IAAM,IAAA,GAAN,MAAM,KAAA,CAAK;AAAA,EA1ClB;AA0CkB,IAAA,MAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYjB,aAAqB,WAAA,CAAe,IAAA,EAAoB,IAAA,EAAc,MAAwB,iBAAA,EAAyC;AACtI,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,IAAA,CAAK,QAAQ,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAA,EAAc,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAE/C,IAAA,MAAM,WAAA,GAA2B;AAAA,MAChC,MAAA,EAAQ,MAAM,MAAA,IAAU,KAAA;AAAA,MACxB,OAAA;AAAA,MACA,MAAM,IAAA,EAAM;AAAA,KACb;AACA,IAAA,IAAI,IAAA,EAAM,OAAO,IAAA,IAAQ,CAAA,CAAA,EAAI,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAE5D,IAAA,IAAI,iBAAA,IAAqB,CAAC,IAAA,CAAK,SAAA,EAAW;AACzC,MAAA,MAAM,IAAI,SAAA,CAAU;AAAA,QACnB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,aAAA;AAAA,QACP,OAAA,EAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,EAAE,CAAA,iEAAA,CAAA;AAAA,QACxB;AAAA,SACE,WAAW,CAAA;AAAA;AAGf,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAA,GAAU,MAAM,WAAW,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC/E,MAAA,MAAM,IAAI,SAAA,CAAU;AAAA,QACnB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,MAAA,EAAQ,GAAA;AAAA,QACR,KAAA,EAAO,eAAA;AAAA,QACP,SAAS,CAAA,qBAAA,EAAwB,IAAA,CAAK,EAAE,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA,CAAA;AAAA,QAC1D;AAAA,SACE,WAAW,CAAA;AAAA,KACd,CAAA;AAED,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAEpC,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AACvD,IAAA,MAAM,IAAA,GAAO,OAAO,WAAA,EAAa,QAAA,CAAS,kBAAkB,IAAI,QAAA,CAAS,IAAA,EAAK,GAAI,QAAA,CAAS,IAAA,EAAK,CAAA;AAEhG,IAAA,IAAI,CAAC,SAAS,EAAA,IAAO,IAAA,EAAwB,OAAO,MAAM,IAAI,SAAA,CAAU,IAAA,EAAuB,WAAW,CAAA;AAE1G,IAAA,OAAO,IAAA;AAAA;AACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,IAAA,CAAK,IAAA,EAAoB,SAAA,EAAgD;AAC/E,IAAA,OAAO,KAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,WAAA,CAAA,EAAe,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,SAAA,IAAa,CAAA;AAAA;AACnG,EAwBA,OAAO,MAAA,CAAO,IAAA,EAAoB,MAAA,EAA4E;AAC7G,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,SAAU,KAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,eAAA,CAAA,EAAmB,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,IAAU,CAAA;AACzG,IAAA,OAAO,MAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,aAAA,CAAA,EAAiB;AAAA,MAC/D,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,KAC9C,CAAA;AAAA;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,QAAQ,IAAA,EAAuD;AACrE,IAAA,OAAO,KAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,QAAA,CAAU,CAAA;AAAA;AACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,KAAK,IAAA,EAAoD;AAC/D,IAAA,OAAO,MAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,KAAA,CAAO,CAAA;AAAA;AACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,MAAM,IAAA,EAAqD;AACjE,IAAA,OAAO,MAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,MAAA,CAAQ,CAAA;AAAA;AACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,cAAc,IAAA,EAAkD;AACtE,IAAA,OAAO,KAAA,CAAK,WAAA;AAAA,MACX,IAAA;AAAA,MACA,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,UAAA,EAAa,KAAK,SAAS,CAAA,CAAA;AAAA,MAC5C;AAAA,QACC,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,UACpB,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,SAAS,IAAA,CAAK;AAAA,SACO,CAAA;AAAA,QACtB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA;AAAmB,OAC/C;AAAA,MACA;AAAA,KACD;AAAA;AACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,OAAO,YAAA,CAAa,IAAA,EAAoB,OAAA,EAAiB,IAAA,EAAwB,YAAY,KAAA,EAAoC;AAChI,IAAA,OAAO,KAAA,CAAK,WAAA;AAAA,MACX,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,OAAO,aAAa,IAAA,CAAK,SAAS,YAAY,OAAO,CAAA,CAAA;AAAA,MAC/D;AAAA,QACC,MAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,QAC9C,KAAA,EAAO,SAAA,GAAY,EAAE,SAAA,EAAW,QAAO,GAAI;AAAA,OAC5C;AAAA,MACA;AAAA,KACD;AAAA;AACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,OAAO,aAAA,CAAc,IAAA,EAAoB,OAAA,EAA+C;AACvF,IAAA,OAAO,MAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,QAAA,IAAY,IAAI,CAAA;AAAA;AAE7H","file":"Rest.mjs","sourcesContent":["import { URLSearchParams } from \"url\";\nimport type { LavalinkNode } from \"./LavalinkNode\";\nimport { VERSION } from \"../index\";\nimport {\n\tErrorResponse,\n\tTrackLoadingResult,\n\tDecodeTrackResult,\n\tDecodeTracksResult,\n\tGetLavalinkVersionResult,\n\tGetLavalinkInfoResult,\n\tGetLavalinkStatsResult,\n\tUpdateSessionResult,\n\tUpdateSessionData,\n\tUpdatePlayerData,\n\tUpdatePlayerResult,\n\tDestroyPlayerResult\n} from \"lavalink-types\";\n\n/**\n * Error class for Lavalink REST API errors.\n * @remarks\n * Contains the full error response from the Lavalink server.\n * See {@link https://lavalink.dev/api/rest#error-responses}\n * @public\n */\nexport class RestError extends Error {\n\tconstructor(public error: ErrorResponse, public data: RequestInit) {\n\t\tsuper(error.message);\n\t\tthis.name = \"RestError\";\n\t}\n}\n\n/**\n * A utility class for interacting with the Lavalink REST API.\n *\n * @remarks\n * Provides methods to perform various operations on a Lavalink server through its REST API,\n * including loading tracks, decoding tracks, and controlling players.\n *\n * @public\n * @sealed\n */\nexport class Rest {\n\t/**\n\t * Base request function that handles communication with Lavalink REST API.\n\t *\n\t * @internal\n\t * @param node - The Lavalink node to send the request to.\n\t * @param path - The API route path, starting with /.\n\t * @param init - Optional request initialization options.\n\t * @param requiresSessionId - Whether the request requires a valid session ID.\n\t * @returns A promise resolving to the response data.\n\t * @throws {@link RestError} If Lavalink returns an error response.\n\t */\n\tprivate static async baseRequest<T>(node: LavalinkNode, path: string, init?: BaseRequestInit, requiresSessionId?: boolean): Promise<T> {\n\t\tconst headers = new Headers(init?.headers);\n\t\theaders.set(\"Authorization\", node.password);\n\t\theaders.set(\"User-Agent\", `Lavacord/${VERSION}`);\n\n\t\tconst fetchConfig: RequestInit = {\n\t\t\tmethod: init?.method ?? \"GET\",\n\t\t\theaders,\n\t\t\tbody: init?.body\n\t\t};\n\t\tif (init?.query) path += `?${new URLSearchParams(init.query)}`;\n\n\t\tif (requiresSessionId && !node.sessionId) {\n\t\t\tthrow new RestError({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstatus: 400,\n\t\t\t\terror: \"Bad Request\",\n\t\t\t\tmessage: `Node ${node.id} requires a session ID for this route. Did you forget to connect?`,\n\t\t\t\tpath\n\t\t\t}, fetchConfig);\n\t\t}\n\n\t\tconst response = await fetch(node.restURL + path, fetchConfig).catch((error) => {\n\t\t\tthrow new RestError({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tstatus: 503,\n\t\t\t\terror: \"Network Error\",\n\t\t\t\tmessage: `Failed to connect to ${node.id}: ${error.message}`,\n\t\t\t\tpath\n\t\t\t}, fetchConfig);\n\t\t});\n\n\t\tif (response.status === 204) return undefined as T;\n\n\t\tconst contentType = response.headers.get(\"content-type\");\n\t\tconst body = await (contentType?.includes(\"application/json\") ? response.json() : response.text());\n\n\t\tif (!response.ok || (body as ErrorResponse)?.error) throw new RestError(body as ErrorResponse, fetchConfig);\n\n\t\treturn body as T;\n\t}\n\n\t/**\n\t * Loads tracks from various sources using Lavalink's loadtracks endpoint.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param identifer - The identifier to load tracks from (URL, search query, etc.)\n\t * @returns A promise resolving to the track loading result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic load(node: LavalinkNode, identifer: string): Promise<TrackLoadingResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/loadtracks`, { query: { identifier: identifer } });\n\t}\n\n\t/**\n\t * Decodes track(s) from their base64 encoded form.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param track - A single track to decode.\n\t * @returns A promise resolving to the decoded track information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\n\t * @public\n\t */\n\tstatic decode(node: LavalinkNode, track: string): Promise<DecodeTrackResult>;\n\t/**\n\t * Decodes multiple tracks from their base64 encoded form.\n\t *\n\t * @param node - The Lavalink node to use.\n\t * @param tracks - An array of tracks to decode.\n\t * @returns A promise resolving to an array of decoded track information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic decode(node: LavalinkNode, tracks: string[]): Promise<DecodeTracksResult>;\n\tstatic decode(node: LavalinkNode, tracks: string | string[]): Promise<DecodeTrackResult | DecodeTracksResult> {\n\t\tif (!Array.isArray(tracks)) return Rest.baseRequest(node, `/v4/decodetrack`, { query: { track: tracks } });\n\t\treturn Rest.baseRequest(node, `/v${node.version}/decodetracks`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify(tracks),\n\t\t\theaders: { \"Content-Type\": \"application/json\" }\n\t\t});\n\t}\n\n\t/**\n\t * Retrieves the version from the Lavalink server.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the version of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic version(node: LavalinkNode): Promise<GetLavalinkVersionResult> {\n\t\treturn Rest.baseRequest(node, `/version`);\n\t}\n\n\t/**\n\t * Retrieves the information of the Lavalink server.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the information of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic info(node: LavalinkNode): Promise<GetLavalinkInfoResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/info`);\n\t}\n\n\t/**\n\t * Retrieves the statistics of the Lavalink node.\n\t *\n\t * @param node - The Lavalink node to query.\n\t * @returns A promise resolving to the statistics of lavalink.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic stats(node: LavalinkNode): Promise<GetLavalinkStatsResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/stats`);\n\t}\n\n\t/**\n\t * Updates the session properties of a Lavalink node.\n\t *\n\t * @param node - The Lavalink node to update.\n\t * @returns A promise resolving to the update session result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic updateSession(node: LavalinkNode): Promise<UpdateSessionResult> {\n\t\treturn Rest.baseRequest(\n\t\t\tnode,\n\t\t\t`/v${node.version}/sessions/${node.sessionId}`,\n\t\t\t{\n\t\t\t\tmethod: \"PATCH\",\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tresuming: node.resuming,\n\t\t\t\t\ttimeout: node.resumeTimeout\n\t\t\t\t} as UpdateSessionData),\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" }\n\t\t\t},\n\t\t\ttrue\n\t\t);\n\t}\n\n\t/**\n\t * Updates a player on a Lavalink node.\n\t *\n\t * @param node - The Lavalink node hosting the player.\n\t * @param guildId - The guild ID associated with the player.\n\t * @param data - The player update data.\n\t * @param noReplace - If true, the event will be dropped if there's a currently playing track.\n\t * @returns A promise resolving to the updated player information.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\n\t * @public\n\t */\n\tstatic updatePlayer(node: LavalinkNode, guildId: string, data: UpdatePlayerData, noReplace = false): Promise<UpdatePlayerResult> {\n\t\treturn Rest.baseRequest(\n\t\t\tnode,\n\t\t\t`/v${node.version}/sessions/${node.sessionId}/players/${guildId}`,\n\t\t\t{\n\t\t\t\tmethod: \"PATCH\",\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tquery: noReplace ? { noReplace: \"true\" } : undefined\n\t\t\t},\n\t\t\ttrue\n\t\t);\n\t}\n\n\t/**\n\t * Destroys a player on a Lavalink node.\n\t *\n\t * @param node - The Lavalink node hosting the player.\n\t * @param guildId - The guild ID associated with the player to destroy.\n\t * @returns A promise resolving to the destroy player result.\n\t * @throws {@link RestError} If Lavalink encounters an error.\n\t *\n\t * @public\n\t */\n\tstatic destroyPlayer(node: LavalinkNode, guildId: string): Promise<DestroyPlayerResult> {\n\t\treturn Rest.baseRequest(node, `/v${node.version}/sessions/${node.sessionId}/players/${guildId}`, { method: \"DELETE\" }, true);\n\t}\n}\n\nexport interface BaseRequestInit extends RequestInit {\n\tquery?: string | URLSearchParams | Record<string, string> | [string, string][];\n}\n"]}
@@ -0,0 +1,3 @@
1
+
2
+ //# sourceMappingURL=Types.mjs.map
3
+ //# sourceMappingURL=Types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"Types.mjs"}
@@ -0,0 +1,45 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { Manager as Manager$1 } from '../lib/Manager.mjs';
3
+ import { GatewayDispatchEvents } from 'discord-api-types/v10';
4
+ export * from '../index.mjs';
5
+
6
+ var Manager = class extends Manager$1 {
7
+ constructor(client, nodes, options) {
8
+ super(nodes, options);
9
+ this.client = client;
10
+ client.on("event", (packet) => {
11
+ switch (packet.t) {
12
+ case GatewayDispatchEvents.VoiceServerUpdate:
13
+ this.voiceServerUpdate(packet.d);
14
+ break;
15
+ case GatewayDispatchEvents.VoiceStateUpdate:
16
+ this.voiceStateUpdate(packet.d);
17
+ break;
18
+ case GatewayDispatchEvents.GuildCreate:
19
+ for (const state of packet.d.voice_states ?? [])
20
+ this.voiceStateUpdate({
21
+ ...state,
22
+ guild_id: packet.d.id
23
+ });
24
+ break;
25
+ case GatewayDispatchEvents.Ready: {
26
+ if (!this.userId) this.userId = packet.d.user.id;
27
+ break;
28
+ }
29
+ }
30
+ });
31
+ }
32
+ static {
33
+ __name(this, "Manager");
34
+ }
35
+ send(packet) {
36
+ if (!this.client.options.totalShards) return;
37
+ const shardID = Number((BigInt(packet.d.guild_id) >> BigInt(22)) % BigInt(this.client.options.totalShards));
38
+ const s = Object.entries(this.client.shardManager.shards).find((e) => String(e[0]) === String(shardID))?.[1];
39
+ if (s) s.connector.sendMessage(packet);
40
+ }
41
+ };
42
+
43
+ export { Manager };
44
+ //# sourceMappingURL=cloudstorm.mjs.map
45
+ //# sourceMappingURL=cloudstorm.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/wrappers/cloudstorm.ts"],"names":["BaseManager"],"mappings":";;;;;AAQO,IAAM,OAAA,GAAN,cAAsBA,SAAA,CAAY;AAAA,EACjC,WAAA,CACU,MAAA,EAChB,KAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMhB,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,MAAA,KAA4B;AAC/C,MAAA,QAAQ,OAAO,CAAA;AAAG,QACjB,KAAK,qBAAA,CAAsB,iBAAA;AAC1B,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAC/B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,gBAAA;AAC1B,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC9B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,WAAA;AAC1B,UAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,CAAA,CAAE,YAAA,IAAgB,EAAC;AAC7C,YAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,cACrB,GAAG,KAAA;AAAA,cACH,QAAA,EAAU,OAAO,CAAA,CAAE;AAAA,aACnB,CAAA;AACF,UAAA;AAAA,QACD,KAAK,sBAAsB,KAAA,EAAO;AACjC,UAAA,IAAI,CAAC,IAAA,CAAK,MAAA,OAAa,MAAA,GAAS,MAAA,CAAO,EAAE,IAAA,CAAK,EAAA;AAC9C,UAAA;AAAA;AAGA;AACF,KACA,CAAA;AAAA;AACF,EAzCD;AAQyC,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,EAmCrB,KAAK,MAAA,EAAiC;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa;AAEtC,IAAA,MAAM,OAAA,GAAU,MAAA,CAAA,CAAQ,MAAA,CAAO,MAAA,CAAO,EAAE,QAAQ,CAAA,IAAK,MAAA,CAAO,EAAE,KAAK,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAC1G,IAAA,MAAM,CAAA,GAAI,OAAO,OAAA,CAAQ,IAAA,CAAK,OAAO,YAAA,CAAa,MAAM,EAAE,IAAA,CAAK,CAAC,MAAM,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA,KAAM,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;AAE3G,IAAA,IAAI,CAAA,EAAG,CAAA,CAAE,SAAA,CAAU,WAAA,CAAY,MAAM,CAAA;AAAA;AAEvC","file":"cloudstorm.mjs","sourcesContent":["import { Manager as BaseManager } from \"../lib/Manager\";\nimport type { ManagerOptions, LavalinkNodeOptions } from \"../lib/Types\";\nimport { GatewayDispatchEvents, GatewayVoiceStateUpdate } from \"discord-api-types/v10\";\n\nimport { Client, IGatewayMessage } from \"cloudstorm\";\n\nexport * from \"../index\";\n\nexport class Manager extends BaseManager {\n\tpublic constructor(\n\t\tpublic readonly client: Client,\n\t\tnodes: LavalinkNodeOptions[],\n\t\toptions?: ManagerOptions\n\t) {\n\t\tsuper(nodes, options);\n\n\t\tclient.on(\"event\", (packet: IGatewayMessage) => {\n\t\t\tswitch (packet.t) {\n\t\t\t\tcase GatewayDispatchEvents.VoiceServerUpdate:\n\t\t\t\t\tthis.voiceServerUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.VoiceStateUpdate:\n\t\t\t\t\tthis.voiceStateUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.GuildCreate:\n\t\t\t\t\tfor (const state of packet.d.voice_states ?? [])\n\t\t\t\t\t\tthis.voiceStateUpdate({\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tguild_id: packet.d.id\n\t\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tcase GatewayDispatchEvents.Ready: {\n\t\t\t\t\tif (!this.userId) this.userId = packet.d.user.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected override send(packet: GatewayVoiceStateUpdate) {\n\t\tif (!this.client.options.totalShards) return;\n\n\t\tconst shardID = Number((BigInt(packet.d.guild_id) >> BigInt(22)) % BigInt(this.client.options.totalShards));\n\t\tconst s = Object.entries(this.client.shardManager.shards).find((e) => String(e[0]) === String(shardID))?.[1];\n\n\t\tif (s) s.connector.sendMessage(packet);\n\t}\n}\n"]}
@@ -0,0 +1,48 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { GatewayDispatchEvents } from 'discord-api-types/v10';
3
+ import { Manager as Manager$1 } from '../lib/Manager.mjs';
4
+ import { ClusterClient } from 'detritus-client';
5
+ export * from '../index.mjs';
6
+
7
+ var Manager = class extends Manager$1 {
8
+ constructor(client, nodes, options) {
9
+ super(nodes, options);
10
+ this.client = client;
11
+ client.once("ready", () => {
12
+ if (!this.userId) this.userId = client instanceof ClusterClient ? client.applicationId : client.clientId;
13
+ });
14
+ client.on("raw", (packet) => {
15
+ switch (packet.t) {
16
+ case GatewayDispatchEvents.VoiceServerUpdate:
17
+ this.voiceServerUpdate(packet.d);
18
+ break;
19
+ case GatewayDispatchEvents.VoiceStateUpdate:
20
+ this.voiceStateUpdate(packet.d);
21
+ break;
22
+ case GatewayDispatchEvents.GuildCreate:
23
+ for (const state of packet.d.voice_states ?? [])
24
+ this.voiceStateUpdate({
25
+ ...state,
26
+ guild_id: packet.d.id
27
+ });
28
+ break;
29
+ }
30
+ });
31
+ }
32
+ static {
33
+ __name(this, "Manager");
34
+ }
35
+ send(packet) {
36
+ const asCluster = this.client;
37
+ const asShard = this.client;
38
+ if (asShard.guilds) return asShard.gateway.send(packet.op, packet.d);
39
+ if (asCluster.shards) {
40
+ const shard = asCluster.shards.find((c) => c.guilds.has(packet.d.guild_id));
41
+ if (shard) shard.gateway.send(packet.op, packet.d);
42
+ }
43
+ }
44
+ };
45
+
46
+ export { Manager };
47
+ //# sourceMappingURL=detritus.mjs.map
48
+ //# sourceMappingURL=detritus.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/wrappers/detritus.ts"],"names":["BaseManager"],"mappings":";;;;;;AAQO,IAAM,OAAA,GAAN,cAAsBA,SAAA,CAAY;AAAA,EACjC,WAAA,CACU,MAAA,EAChB,KAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMhB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM;AAC1B,MAAA,IAAI,CAAC,KAAK,MAAA,EAAQ,IAAA,CAAK,SAAS,MAAA,YAAkB,aAAA,GAAgB,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,QAAA;AAAA,KAChG,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,CAAC,MAAA,KAAkC;AACnD,MAAA,QAAQ,OAAO,CAAA;AAAG,QACjB,KAAK,qBAAA,CAAsB,iBAAA;AAC1B,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAC/B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,gBAAA;AAC1B,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC9B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,WAAA;AAC1B,UAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,CAAA,CAAE,YAAA,IAAgB,EAAC;AAC7C,YAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,cACrB,GAAG,KAAA;AAAA,cACH,QAAA,EAAU,OAAO,CAAA,CAAE;AAAA,aACnB,CAAA;AACF,UAAA;AAGA;AACF,KACA,CAAA;AAAA;AACF,EA1CD;AAQyC,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,EAoCrB,KAAK,MAAA,EAAiC;AACxD,IAAA,MAAM,YAAY,IAAA,CAAK,MAAA;AACvB,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA;AAErB,IAAA,IAAI,OAAA,CAAQ,QAAQ,OAAO,OAAA,CAAQ,QAAQ,IAAA,CAAK,MAAA,CAAO,EAAA,EAAI,MAAA,CAAO,CAAC,CAAA;AACnE,IAAA,IAAI,UAAU,MAAA,EAAQ;AACrB,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAC1E,MAAA,IAAI,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,MAAA,CAAO,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA;AAClD;AAEF","file":"detritus.mjs","sourcesContent":["import { GatewayDispatchEvents, GatewayReceivePayload, GatewayVoiceStateUpdate } from \"discord-api-types/v10\";\nimport { Manager as BaseManager } from \"../lib/Manager\";\nimport type { ManagerOptions, LavalinkNodeOptions } from \"../lib/Types\";\n\nimport { ClusterClient, ShardClient } from \"detritus-client\";\n\nexport * from \"../index\";\n\nexport class Manager extends BaseManager {\n\tpublic constructor(\n\t\tpublic readonly client: ClusterClient | ShardClient,\n\t\tnodes: LavalinkNodeOptions[],\n\t\toptions?: ManagerOptions\n\t) {\n\t\tsuper(nodes, options);\n\n\t\tclient.once(\"ready\", () => {\n\t\t\tif (!this.userId) this.userId = client instanceof ClusterClient ? client.applicationId : client.clientId;\n\t\t});\n\n\t\tclient.on(\"raw\", (packet: GatewayReceivePayload) => {\n\t\t\tswitch (packet.t) {\n\t\t\t\tcase GatewayDispatchEvents.VoiceServerUpdate:\n\t\t\t\t\tthis.voiceServerUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.VoiceStateUpdate:\n\t\t\t\t\tthis.voiceStateUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.GuildCreate:\n\t\t\t\t\tfor (const state of packet.d.voice_states ?? [])\n\t\t\t\t\t\tthis.voiceStateUpdate({\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tguild_id: packet.d.id\n\t\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected override send(packet: GatewayVoiceStateUpdate) {\n\t\tconst asCluster = this.client as ClusterClient;\n\t\tconst asShard = this.client as ShardClient;\n\n\t\tif (asShard.guilds) return asShard.gateway.send(packet.op, packet.d);\n\t\tif (asCluster.shards) {\n\t\t\tconst shard = asCluster.shards.find((c) => c.guilds.has(packet.d.guild_id));\n\t\t\tif (shard) shard.gateway.send(packet.op, packet.d);\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { Manager as Manager$1 } from '../lib/Manager.mjs';
3
+ import { GatewayDispatchEvents } from 'discord.js';
4
+ export * from '../index.mjs';
5
+
6
+ var Manager = class extends Manager$1 {
7
+ constructor(client, nodes, options) {
8
+ super(nodes, options);
9
+ this.client = client;
10
+ client.once("ready", () => {
11
+ if (!this.userId) this.userId = client.user.id;
12
+ });
13
+ client.ws.on(GatewayDispatchEvents.VoiceServerUpdate, (packet) => this.voiceServerUpdate(packet.d)).on(GatewayDispatchEvents.VoiceStateUpdate, (packet) => this.voiceStateUpdate(packet.d)).on(GatewayDispatchEvents.GuildCreate, (data) => {
14
+ for (const state of data.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: data.id });
15
+ });
16
+ }
17
+ static {
18
+ __name(this, "Manager");
19
+ }
20
+ send(packet) {
21
+ const guild = this.client.guilds.cache.get(packet.d.guild_id);
22
+ if (guild) guild.shard.send(packet);
23
+ }
24
+ };
25
+
26
+ export { Manager };
27
+ //# sourceMappingURL=discord.js.mjs.map
28
+ //# sourceMappingURL=discord.js.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/wrappers/discord.js.ts"],"names":["BaseManager"],"mappings":";;;;;AAQO,IAAM,OAAA,GAAN,cAAsBA,SAAA,CAAY;AAAA,EACjC,WAAA,CACU,MAAA,EAChB,KAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMhB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,OAAO,IAAA,CAAM,EAAA;AAAA,KAC7C,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CACL,EAAA,CAAG,qBAAA,CAAsB,iBAAA,EAAmB,CAAC,MAAA,KAA6C,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,CAAC,CAAC,CAAA,CAC1H,EAAA,CAAG,qBAAA,CAAsB,gBAAA,EAAkB,CAAC,MAAA,KAA4C,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,CAAC,CAAC,CAAA,CACvH,EAAA,CAAG,qBAAA,CAAsB,WAAA,EAAa,CAAC,IAAA,KAAyC;AAChF,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,YAAA,IAAgB,EAAC,EAAG,IAAA,CAAK,gBAAA,CAAiB,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,IAAA,CAAK,IAAI,CAAA;AAAA,KAClG,CAAA;AAAA;AACH,EA1BD;AAQyC,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,EAoBrB,KAAK,MAAA,EAAiC;AACxD,IAAA,MAAM,KAAA,GAAQ,KAAK,MAAA,CAAO,MAAA,CAAO,MAAM,GAAA,CAAI,MAAA,CAAO,EAAE,QAAQ,CAAA;AAC5D,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA;AAEpC","file":"discord.js.mjs","sourcesContent":["import { Manager as BaseManager } from \"../lib/Manager\";\nimport type { ManagerOptions, LavalinkNodeOptions } from \"../lib/Types\";\nimport type { GatewayVoiceServerUpdateDispatch, GatewayVoiceStateUpdate, GatewayVoiceStateUpdateDispatch } from \"discord-api-types/v10\";\nimport { Client, GatewayDispatchEvents } from \"discord.js\";\nimport type { GatewayGuildCreateDispatchData } from \"discord-api-types/v10\";\n\nexport * from \"../index\";\n\nexport class Manager extends BaseManager {\n\tpublic constructor(\n\t\tpublic readonly client: Client,\n\t\tnodes: LavalinkNodeOptions[],\n\t\toptions?: ManagerOptions\n\t) {\n\t\tsuper(nodes, options);\n\n\t\tclient.once(\"ready\", () => {\n\t\t\tif (!this.userId) this.userId = client.user!.id;\n\t\t});\n\n\t\tclient.ws\n\t\t\t.on(GatewayDispatchEvents.VoiceServerUpdate, (packet: GatewayVoiceServerUpdateDispatch) => this.voiceServerUpdate(packet.d))\n\t\t\t.on(GatewayDispatchEvents.VoiceStateUpdate, (packet: GatewayVoiceStateUpdateDispatch) => this.voiceStateUpdate(packet.d))\n\t\t\t.on(GatewayDispatchEvents.GuildCreate, (data: GatewayGuildCreateDispatchData) => {\n\t\t\t\tfor (const state of data.voice_states ?? []) this.voiceStateUpdate({ ...state, guild_id: data.id });\n\t\t\t});\n\t}\n\n\tprotected override send(packet: GatewayVoiceStateUpdate) {\n\t\tconst guild = this.client.guilds.cache.get(packet.d.guild_id);\n\t\tif (guild) guild.shard.send(packet);\n\t}\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { GatewayDispatchEvents } from 'discord-api-types/v10';
3
+ import { Manager as Manager$1 } from '../lib/Manager.mjs';
4
+ export * from '../index.mjs';
5
+
6
+ var Manager = class extends Manager$1 {
7
+ constructor(client, nodes, options) {
8
+ super(nodes, options);
9
+ this.client = client;
10
+ client.once("ready", () => {
11
+ if (!this.userId) this.userId = client.user.id;
12
+ });
13
+ client.on("rawWS", (packet) => {
14
+ switch (packet.t) {
15
+ case GatewayDispatchEvents.VoiceServerUpdate:
16
+ this.voiceServerUpdate(packet.d);
17
+ break;
18
+ case GatewayDispatchEvents.VoiceStateUpdate:
19
+ this.voiceStateUpdate(packet.d);
20
+ break;
21
+ case GatewayDispatchEvents.GuildCreate:
22
+ for (const state of packet.d.voice_states ?? [])
23
+ this.voiceStateUpdate({
24
+ ...state,
25
+ guild_id: packet.d.id
26
+ });
27
+ break;
28
+ }
29
+ });
30
+ }
31
+ static {
32
+ __name(this, "Manager");
33
+ }
34
+ send(packet) {
35
+ const guild = this.client.guilds.get(packet.d.guild_id);
36
+ if (guild) guild.shard.sendWS(packet.op, packet.d);
37
+ }
38
+ };
39
+
40
+ export { Manager };
41
+ //# sourceMappingURL=eris.mjs.map
42
+ //# sourceMappingURL=eris.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/wrappers/eris.ts"],"names":["BaseManager"],"mappings":";;;;;AAQO,IAAM,OAAA,GAAN,cAAsBA,SAAA,CAAY;AAAA,EACjC,WAAA,CACU,MAAA,EAChB,KAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMhB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,OAAO,IAAA,CAAK,EAAA;AAAA,KAC5C,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,MAAA,KAAkC;AACrD,MAAA,QAAQ,OAAO,CAAA;AAAG,QACjB,KAAK,qBAAA,CAAsB,iBAAA;AAC1B,UAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAC/B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,gBAAA;AAC1B,UAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,CAAC,CAAA;AAC9B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,WAAA;AAC1B,UAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,CAAA,CAAE,YAAA,IAAgB,EAAC;AAC7C,YAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,cACrB,GAAG,KAAA;AAAA,cACH,QAAA,EAAU,OAAO,CAAA,CAAE;AAAA,aACnB,CAAA;AACF,UAAA;AAEA;AACF,KACA,CAAA;AAAA;AACF,EAzCD;AAQyC,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,EAmCrB,KAAK,MAAA,EAAiC;AACxD,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,OAAO,GAAA,CAAI,MAAA,CAAO,EAAE,QAAQ,CAAA;AACtD,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,CAAM,OAAO,MAAA,CAAO,EAAA,EAAI,OAAO,CAAuC,CAAA;AAAA;AAEzF","file":"eris.mjs","sourcesContent":["import { GatewayDispatchEvents, GatewayReceivePayload, GatewayVoiceStateUpdate } from \"discord-api-types/v10\";\nimport { Manager as BaseManager } from \"../lib/Manager\";\nimport type { ManagerOptions, LavalinkNodeOptions } from \"../lib/Types\";\n\nimport type { Client } from \"eris\";\n\nexport * from \"../index\";\n\nexport class Manager extends BaseManager {\n\tpublic constructor(\n\t\tpublic readonly client: Client,\n\t\tnodes: LavalinkNodeOptions[],\n\t\toptions?: ManagerOptions\n\t) {\n\t\tsuper(nodes, options);\n\n\t\tclient.once(\"ready\", () => {\n\t\t\tif (!this.userId) this.userId = client.user.id;\n\t\t});\n\n\t\tclient.on(\"rawWS\", (packet: GatewayReceivePayload) => {\n\t\t\tswitch (packet.t) {\n\t\t\t\tcase GatewayDispatchEvents.VoiceServerUpdate:\n\t\t\t\t\tthis.voiceServerUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.VoiceStateUpdate:\n\t\t\t\t\tthis.voiceStateUpdate(packet.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.GuildCreate:\n\t\t\t\t\tfor (const state of packet.d.voice_states ?? [])\n\t\t\t\t\t\tthis.voiceStateUpdate({\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tguild_id: packet.d.id\n\t\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected override send(packet: GatewayVoiceStateUpdate) {\n\t\tconst guild = this.client.guilds.get(packet.d.guild_id);\n\t\tif (guild) guild.shard.sendWS(packet.op, packet.d as unknown as Record<string, unknown>);\n\t}\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { __name } from '../chunk-PAWJFY3S.mjs';
2
+ import { GatewayDispatchEvents } from 'discord-api-types/v10';
3
+ import { Manager as Manager$1 } from '../lib/Manager.mjs';
4
+ export * from '../index.mjs';
5
+
6
+ var Manager = class extends Manager$1 {
7
+ constructor(client, nodes, options) {
8
+ super(nodes, options);
9
+ this.client = client;
10
+ client.once("ready", () => {
11
+ if (!this.userId) this.userId = client.user.id;
12
+ });
13
+ client.on("packet", (d) => {
14
+ const data = d;
15
+ switch (data.t) {
16
+ case GatewayDispatchEvents.VoiceServerUpdate:
17
+ this.voiceServerUpdate(data.d);
18
+ break;
19
+ case GatewayDispatchEvents.VoiceStateUpdate:
20
+ this.voiceStateUpdate(data.d);
21
+ break;
22
+ case GatewayDispatchEvents.GuildCreate:
23
+ for (const state of data.d.voice_states ?? [])
24
+ this.voiceStateUpdate({
25
+ ...state,
26
+ guild_id: data.d.id
27
+ });
28
+ break;
29
+ }
30
+ });
31
+ }
32
+ static {
33
+ __name(this, "Manager");
34
+ }
35
+ send(packet) {
36
+ const guild = this.client.guilds.get(packet.d.guild_id);
37
+ if (guild) guild.shard.send(packet.op, packet.d);
38
+ }
39
+ };
40
+
41
+ export { Manager };
42
+ //# sourceMappingURL=oceanic.mjs.map
43
+ //# sourceMappingURL=oceanic.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/wrappers/oceanic.ts"],"names":["BaseManager"],"mappings":";;;;;AAOO,IAAM,OAAA,GAAN,cAAsBA,SAAA,CAAY;AAAA,EACjC,WAAA,CACU,MAAA,EAChB,KAAA,EACA,OAAA,EACC;AACD,IAAA,KAAA,CAAM,OAAO,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMhB,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,MAAM;AAC1B,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,OAAO,IAAA,CAAK,EAAA;AAAA,KAC5C,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,CAAC,CAAA,KAAM;AAC1B,MAAA,MAAM,IAAA,GAAO,CAAA;AACb,MAAA,QAAQ,KAAK,CAAA;AAAG,QACf,KAAK,qBAAA,CAAsB,iBAAA;AAC1B,UAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAC,CAAA;AAC7B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,gBAAA;AAC1B,UAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAC5B,UAAA;AAAA,QAED,KAAK,qBAAA,CAAsB,WAAA;AAC1B,UAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,CAAA,CAAE,YAAA,IAAgB,EAAC;AAC3C,YAAA,IAAA,CAAK,gBAAA,CAAiB;AAAA,cACrB,GAAG,KAAA;AAAA,cACH,QAAA,EAAU,KAAK,CAAA,CAAE;AAAA,aACjB,CAAA;AACF,UAAA;AAEA;AACF,KACA,CAAA;AAAA;AACF,EAzCD;AAOyC,IAAA,MAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAAA;AAAA,EAoCrB,KAAK,MAAA,EAAiC;AACxD,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,OAAO,GAAA,CAAI,MAAA,CAAO,EAAE,QAAQ,CAAA;AACtD,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,CAAM,KAAK,MAAA,CAAO,EAAA,EAAc,OAAO,CAAC,CAAA;AAAA;AAE3D","file":"oceanic.mjs","sourcesContent":["import { GatewayDispatchEvents, GatewayReceivePayload, GatewayVoiceStateUpdate } from \"discord-api-types/v10\";\nimport { Manager as BaseManager } from \"../lib/Manager\";\nimport type { ManagerOptions, LavalinkNodeOptions } from \"../lib/Types\";\nimport type { Client } from \"oceanic.js\";\n\nexport * from \"../index\";\n\nexport class Manager extends BaseManager {\n\tpublic constructor(\n\t\tpublic readonly client: Client,\n\t\tnodes: LavalinkNodeOptions[],\n\t\toptions?: ManagerOptions\n\t) {\n\t\tsuper(nodes, options);\n\n\t\tclient.once(\"ready\", () => {\n\t\t\tif (!this.userId) this.userId = client.user.id;\n\t\t});\n\n\t\tclient.on(\"packet\", (d) => {\n\t\t\tconst data = d as unknown as GatewayReceivePayload;\n\t\t\tswitch (data.t) {\n\t\t\t\tcase GatewayDispatchEvents.VoiceServerUpdate:\n\t\t\t\t\tthis.voiceServerUpdate(data.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.VoiceStateUpdate:\n\t\t\t\t\tthis.voiceStateUpdate(data.d);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GatewayDispatchEvents.GuildCreate:\n\t\t\t\t\tfor (const state of data.d.voice_states ?? [])\n\t\t\t\t\t\tthis.voiceStateUpdate({\n\t\t\t\t\t\t\t...state,\n\t\t\t\t\t\t\tguild_id: data.d.id\n\t\t\t\t\t\t});\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected override send(packet: GatewayVoiceStateUpdate) {\n\t\tconst guild = this.client.guilds.get(packet.d.guild_id);\n\t\tif (guild) guild.shard.send(packet.op as number, packet.d);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import WebSocket from "ws";
1
+ import { BetterWs } from "cloudstorm";
2
2
  import type { Manager } from "./Manager";
3
3
  import type { LavalinkNodeOptions } from "./Types";
4
4
  import type { Stats } from "lavalink-types/v4";
@@ -30,7 +30,7 @@ export declare class LavalinkNode {
30
30
  /**
31
31
  * The WebSocket instance for this LavalinkNode
32
32
  */
33
- ws: WebSocket | null;
33
+ ws: BetterWs | null;
34
34
  /**
35
35
  * The statistics of the LavalinkNode
36
36
  */
@@ -70,7 +70,7 @@ export declare class LavalinkNode {
70
70
  /**
71
71
  * Connects the node to Lavalink
72
72
  */
73
- connect(): Promise<WebSocket>;
73
+ connect(): Promise<BetterWs>;
74
74
  /**
75
75
  * Destroys the connection to the Lavalink Websocket
76
76
  */
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.LavalinkNode = void 0;
7
- const ws_1 = __importDefault(require("ws"));
8
4
  const Rest_1 = require("./Rest");
5
+ const cloudstorm_1 = require("cloudstorm");
9
6
  // eslint-disable-next-line @typescript-eslint/no-var-requires
10
7
  const { version } = require("../../package.json");
11
8
  /**
@@ -119,12 +116,12 @@ class LavalinkNode {
119
116
  async connect() {
120
117
  return new Promise((resolve, reject) => {
121
118
  if (this.connected)
122
- this.ws.close();
119
+ this.ws.close(1000);
123
120
  return Rest_1.Rest.version(this)
124
121
  .then(nodeVersion => {
125
122
  // defaults to v4 which is reasonable. Actually supports snapshot versions now
126
- const major = typeof nodeVersion === "string" && nodeVersion.indexOf(".") !== -1 ? nodeVersion.split(".")[0] : "4";
127
- if (!major || isNaN(Number(major)))
123
+ const major = typeof nodeVersion === "string" && nodeVersion.includes(".") ? nodeVersion.split(".")[0] : "4";
124
+ if (!major || Number.isNaN(Number(major)))
128
125
  return reject(new Error("Node didn't respond to /version with a major.minor.patch version string"));
129
126
  const numMajor = Number(major);
130
127
  this.version = numMajor;
@@ -135,23 +132,23 @@ class LavalinkNode {
135
132
  };
136
133
  if (this.sessionId && this.resuming)
137
134
  headers["Session-Id"] = this.sessionId;
138
- const ws = new ws_1.default(`ws://${this.host}:${this.port}/v${numMajor}/websocket`, { headers });
135
+ const ws = new cloudstorm_1.BetterWs(`ws://${this.host}:${this.port}/v${numMajor}/websocket`, { headers, encoding: "json" });
139
136
  const onEvent = (event) => {
140
137
  ws.removeAllListeners();
141
- reject(event instanceof Error ? event : new Error("Premature close"));
138
+ reject(typeof event === "string" ? new Error(event) : new Error(`Close code ${event} received`));
142
139
  };
143
140
  const onOpen = () => {
144
141
  this.ws = ws;
145
142
  this.onOpen();
146
- ws.removeListener("open", onOpen)
143
+ ws.removeListener("ws_open", onOpen)
147
144
  .removeListener("error", onEvent)
148
- .removeListener("close", onEvent)
149
- .on("error", error => this.onError(error))
150
- .on("close", (code, reason) => this.onClose(code, reason));
145
+ .removeListener("ws_close", onEvent)
146
+ .on("error", this.onError.bind(this))
147
+ .on("ws_close", this.onClose.bind(this));
151
148
  resolve(ws);
152
149
  };
153
150
  ws
154
- .on("message", data => this.onMessage(data))
151
+ .on("ws_receive", this.onMessage.bind(this))
155
152
  .once("open", onOpen)
156
153
  .once("error", onEvent)
157
154
  .once("close", onEvent);
@@ -173,7 +170,7 @@ class LavalinkNode {
173
170
  get connected() {
174
171
  if (!this.ws)
175
172
  return false;
176
- return this.ws.readyState === ws_1.default.OPEN;
173
+ return this.ws.sm.currentStateName === "connected";
177
174
  }
178
175
  /**
179
176
  * A private function for handling the open event from WebSocket
@@ -191,15 +188,7 @@ class LavalinkNode {
191
188
  * Private function for handling the message event from WebSocket
192
189
  * @param data The data that came from lavalink
193
190
  */
194
- onMessage(data) {
195
- let str = "";
196
- if (Array.isArray(data))
197
- str = Buffer.concat(data).toString();
198
- else if (data instanceof ArrayBuffer)
199
- str = Buffer.from(data).toString();
200
- else
201
- str = data.toString();
202
- const msg = JSON.parse(str);
191
+ onMessage(msg) {
203
192
  switch (msg.op) {
204
193
  case "ready":
205
194
  if (msg.sessionId)
@@ -240,8 +229,8 @@ class LavalinkNode {
240
229
  */
241
230
  onClose(code, reason) {
242
231
  this._sessionUpdated = false;
243
- this.manager.emit("disconnect", code, reason.toString(), this);
244
- if (code !== 1000 || reason.toString() !== "destroy")
232
+ this.manager.emit("disconnect", code, reason, this);
233
+ if (code !== 1000 || reason !== "destroy")
245
234
  return this.reconnect();
246
235
  }
247
236
  /**
@@ -250,6 +239,7 @@ class LavalinkNode {
250
239
  reconnect() {
251
240
  this._reconnect = setTimeout(() => {
252
241
  this.ws.removeAllListeners();
242
+ this.destroy();
253
243
  this.ws = null;
254
244
  this.manager.emit("reconnecting", this);
255
245
  this.connect();