magmastream 2.9.1-dev.2 → 2.9.1-dev.3

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.
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  import { Collection } from '@discordjs/collection';
2
2
  import { GatewayVoiceStateUpdate } from 'discord-api-types/v10';
3
3
  import { EventEmitter } from 'events';
4
- import { User, ClientUser, Message, Client } from 'discord.js';
4
+ import { Message, User, ClientUser, Client } from 'discord.js';
5
5
  import WebSocket$1, { WebSocket } from 'ws';
6
6
  import { Redis } from 'ioredis';
7
- import { Client as Client$1 } from 'eris';
7
+ import { Client as Client$1, User as User$1 } from 'eris';
8
8
  import { ClusterClient, ShardClient } from 'detritus-client';
9
- import { Client as Client$2 } from 'oceanic.js';
10
- import { Client as Client$3, WorkerClient } from 'seyfert';
9
+ import { Client as Client$2, User as User$2 } from 'oceanic.js';
10
+ import { Client as Client$3, WorkerClient, User as User$3 } from 'seyfert';
11
11
 
12
12
  /** Represents an equalizer band. */
13
13
  interface Band {
@@ -897,6 +897,13 @@ interface NodeOptions {
897
897
  */
898
898
  isBackup?: boolean;
899
899
  }
900
+ /**
901
+ * Portable User
902
+ */
903
+ interface PortableUser {
904
+ id: string;
905
+ username?: string;
906
+ }
900
907
  /**
901
908
  * Discord Packet
902
909
  */
@@ -1102,7 +1109,7 @@ interface Track {
1102
1109
  /** The thumbnail of the track or null if it's a unsupported source. */
1103
1110
  readonly thumbnail: string | null;
1104
1111
  /** The user that requested the track. */
1105
- requester?: User | ClientUser;
1112
+ requester?: PortableUser;
1106
1113
  /** Displays the track thumbnail with optional size or null if it's a unsupported source. */
1107
1114
  displayThumbnail(size?: Sizes): string;
1108
1115
  /** Additional track info provided by plugins. */
@@ -1287,7 +1294,7 @@ interface PlaylistData {
1287
1294
  /** The playlist name. */
1288
1295
  name: string;
1289
1296
  /** Requester of playlist. */
1290
- requester: User | ClientUser;
1297
+ requester: PortableUser;
1291
1298
  /** More playlist information. */
1292
1299
  playlistInfo: PlaylistInfoData[];
1293
1300
  /** The length of the playlist. */
@@ -2103,12 +2110,12 @@ declare class Player {
2103
2110
  * track when the current track ends.
2104
2111
  *
2105
2112
  * @param {boolean} autoplayState - Whether or not autoplay should be enabled.
2106
- * @param {object} botUser - The user-object that should be used as the bot-user.
2113
+ * @param {object} AutoplayUser - The user-object that should be used as the bot-user.
2107
2114
  * @param {number} [tries=3] - The number of times the player should try to find a
2108
2115
  * recommended track if the first one doesn't work.
2109
2116
  * @returns {this} - The player instance.
2110
2117
  */
2111
- setAutoplay<T = unknown>(autoplayState: boolean, botUser?: T, tries?: number): this;
2118
+ setAutoplay<T = unknown>(autoplayState: boolean, AutoplayUser?: T, tries?: number): this;
2112
2119
  /**
2113
2120
  * Gets recommended tracks and returns an array of tracks.
2114
2121
  * @param {Track} track - The track to find recommendations for.
@@ -2998,6 +3005,11 @@ declare class Manager extends EventEmitter {
2998
3005
  private get priorityNode();
2999
3006
  protected send(packet: GatewayVoiceStateUpdate): unknown;
3000
3007
  sendPacket(packet: GatewayVoiceStateUpdate): unknown;
3008
+ /**
3009
+ * Resolves a PortableUser or ID to a real user object.
3010
+ * Can be overridden by wrapper managers to return wrapper-specific User classes.
3011
+ */
3012
+ resolveUser(user: PortableUser | string): Promise<PortableUser>;
3001
3013
  }
3002
3014
 
3003
3015
  declare class Filters {
@@ -3376,7 +3388,7 @@ declare abstract class TrackUtils {
3376
3388
  * @param requester The user who requested the track, if any.
3377
3389
  * @returns The built Track.
3378
3390
  */
3379
- static build<T = User | ClientUser>(data: TrackData, requester?: T): Track;
3391
+ static build<T = PortableUser | User | ClientUser>(data: TrackData, requester?: T): Track;
3380
3392
  /**
3381
3393
  * Validates a search result.
3382
3394
  * @param result The search result to validate.
@@ -3495,6 +3507,7 @@ declare class DiscordJSManager extends Manager {
3495
3507
  readonly client: Client;
3496
3508
  constructor(client: Client, options?: ManagerOptions);
3497
3509
  protected send(packet: GatewayVoiceStateUpdate): void;
3510
+ resolveUser(user: PortableUser | string): Promise<User | PortableUser>;
3498
3511
  }
3499
3512
 
3500
3513
  /**
@@ -3504,6 +3517,7 @@ declare class ErisManager extends Manager {
3504
3517
  readonly client: Client$1;
3505
3518
  constructor(client: Client$1, options?: ManagerOptions);
3506
3519
  protected send(packet: GatewayVoiceStateUpdate): void;
3520
+ resolveUser(user: PortableUser | string): Promise<User$1 | PortableUser>;
3507
3521
  }
3508
3522
 
3509
3523
  /**
@@ -3513,6 +3527,7 @@ declare class DetritusManager extends Manager {
3513
3527
  readonly client: ClusterClient | ShardClient;
3514
3528
  constructor(client: ClusterClient | ShardClient, options?: ManagerOptions);
3515
3529
  protected send(packet: GatewayVoiceStateUpdate): void;
3530
+ resolveUser(user: PortableUser | string): Promise<PortableUser>;
3516
3531
  }
3517
3532
 
3518
3533
  /**
@@ -3522,6 +3537,7 @@ declare class OceanicManager extends Manager {
3522
3537
  readonly client: Client$2;
3523
3538
  constructor(client: Client$2, options?: ManagerOptions);
3524
3539
  protected send(packet: GatewayVoiceStateUpdate): void;
3540
+ resolveUser(user: PortableUser | string): Promise<User$2 | PortableUser>;
3525
3541
  }
3526
3542
 
3527
3543
  /**
@@ -3553,7 +3569,8 @@ declare class SeyfertManager extends Manager {
3553
3569
  readonly client: Client$3 | WorkerClient;
3554
3570
  constructor(client: Client$3 | WorkerClient, options?: ManagerOptions);
3555
3571
  protected send(packet: GatewayVoiceStateUpdate): void;
3572
+ resolveUser(user: PortableUser | string): Promise<User$3 | PortableUser>;
3556
3573
  }
3557
3574
 
3558
3575
  export { AutoPlayPlatform, AutoPlayUtils, AvailableFilters, DetritusManager, DiscordJSManager, ErisManager, Filters, JsonQueue, LoadTypes, Manager, ManagerEventTypes, MemoryQueue, Node, OceanicManager, Player, PlayerStateEventTypes, PlayerUtils, Plugin, RedisQueue, Rest, SearchPlatform, SeverityTypes, SeyfertManager, SponsorBlockSegment, StateStorageType, StateTypes, Structure, TrackEndReasonTypes, TrackPartial, TrackSourceTypes, TrackUtils, UseNodeOptions };
3559
- export type { AlbumSearchResult, ArtistSearchResult, CPUStats, DiscordPacket, DistortionOptions, EndSpeakingEventVoiceReceiver, EndSpeakingEventVoiceReceiverData, EqualizerBand, ErrorOrEmptySearchResult, Exception, Extendable, FrameStats, IQueue, JsonConfig, KaraokeOptions, LavaPlayer, LavalinkInfo, LavalinkResponse, LoadType, Lyrics, LyricsEvent, LyricsEventType, LyricsFoundEvent, LyricsLine, LyricsLineEvent, LyricsNotFoundEvent, ManagerEvents, ManagerInitOptions, ManagerOptions, MemoryStats, NodeLinkGetLyrics, NodeLinkGetLyricsEmpty, NodeLinkGetLyricsError, NodeLinkGetLyricsMultiple, NodeLinkGetLyricsSingle, NodeMessage, NodeOptions, NodeStats, PlayOptions, PlayerEvent, PlayerEventType, PlayerEvents, PlayerOptions, PlayerStateUpdateEvent, PlayerUpdateVoiceState, PlaylistData, PlaylistInfoData, PlaylistRawData, PlaylistSearchResult, PodcastSearchResult, RedisConfig, RestPlayOptions, ReverbOptions, RotationOptions, SearchQuery, SearchResult, SearchSearchResult, Severity, ShortSearchResult, ShowSearchResult, Sizes, SponsorBlockChapterStarted, SponsorBlockChaptersLoaded, SponsorBlockSegmentEventType, SponsorBlockSegmentEvents, SponsorBlockSegmentSkipped, SponsorBlockSegmentsLoaded, StartSpeakingEventVoiceReceiver, StartSpeakingEventVoiceReceiverData, StateStorageOptions, StationSearchResult, TimescaleOptions, Track, TrackData, TrackDataInfo, TrackEndEvent, TrackEndReason, TrackExceptionEvent, TrackPluginInfo, TrackSearchResult, TrackSourceName, TrackStartEvent, TrackStuckEvent, UseNodeOption, VibratoOptions, VoicePacket, VoiceReceiverEvent, VoiceServer, VoiceServerUpdate, VoiceState, WebSocketClosedEvent };
3576
+ export type { AlbumSearchResult, ArtistSearchResult, CPUStats, DiscordPacket, DistortionOptions, EndSpeakingEventVoiceReceiver, EndSpeakingEventVoiceReceiverData, EqualizerBand, ErrorOrEmptySearchResult, Exception, Extendable, FrameStats, IQueue, JsonConfig, KaraokeOptions, LavaPlayer, LavalinkInfo, LavalinkResponse, LoadType, Lyrics, LyricsEvent, LyricsEventType, LyricsFoundEvent, LyricsLine, LyricsLineEvent, LyricsNotFoundEvent, ManagerEvents, ManagerInitOptions, ManagerOptions, MemoryStats, NodeLinkGetLyrics, NodeLinkGetLyricsEmpty, NodeLinkGetLyricsError, NodeLinkGetLyricsMultiple, NodeLinkGetLyricsSingle, NodeMessage, NodeOptions, NodeStats, PlayOptions, PlayerEvent, PlayerEventType, PlayerEvents, PlayerOptions, PlayerStateUpdateEvent, PlayerUpdateVoiceState, PlaylistData, PlaylistInfoData, PlaylistRawData, PlaylistSearchResult, PodcastSearchResult, PortableUser, RedisConfig, RestPlayOptions, ReverbOptions, RotationOptions, SearchQuery, SearchResult, SearchSearchResult, Severity, ShortSearchResult, ShowSearchResult, Sizes, SponsorBlockChapterStarted, SponsorBlockChaptersLoaded, SponsorBlockSegmentEventType, SponsorBlockSegmentEvents, SponsorBlockSegmentSkipped, SponsorBlockSegmentsLoaded, StartSpeakingEventVoiceReceiver, StartSpeakingEventVoiceReceiverData, StateStorageOptions, StationSearchResult, TimescaleOptions, Track, TrackData, TrackDataInfo, TrackEndEvent, TrackEndReason, TrackExceptionEvent, TrackPluginInfo, TrackSearchResult, TrackSourceName, TrackStartEvent, TrackStuckEvent, UseNodeOption, VibratoOptions, VoicePacket, VoiceReceiverEvent, VoiceServer, VoiceServerUpdate, VoiceState, WebSocketClosedEvent };
@@ -53,8 +53,8 @@ class JsonQueue {
53
53
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[JSONQUEUE] Added ${tracks.length} track(s) to queue`);
54
54
  if (this.manager.players.has(this.guildId) && this.manager.players.get(this.guildId).isAutoplay) {
55
55
  if (!isArray) {
56
- const botUser = (await this.manager.players.get(this.guildId).get("Internal_BotUser"));
57
- if (botUser && botUser.id === track.requester.id) {
56
+ const AutoplayUser = (await this.manager.players.get(this.guildId).get("Internal_AutoplayUser"));
57
+ if (AutoplayUser && AutoplayUser.id === track.requester.id) {
58
58
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guildId), {
59
59
  changeType: Enums_1.PlayerStateEventTypes.QueueChange,
60
60
  details: {
@@ -81,8 +81,8 @@ class MemoryQueue extends Array {
81
81
  }
82
82
  if (this.manager.players.has(this.guildId) && this.manager.players.get(this.guildId).isAutoplay) {
83
83
  if (!isArray) {
84
- const botUser = this.manager.players.get(this.guildId).get("Internal_BotUser");
85
- if (botUser && botUser.id === track.requester.id) {
84
+ const AutoplayUser = this.manager.players.get(this.guildId).get("Internal_AutoplayUser");
85
+ if (AutoplayUser && AutoplayUser.id === track.requester.id) {
86
86
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guildId), {
87
87
  changeType: Enums_1.PlayerStateEventTypes.QueueChange,
88
88
  details: {
@@ -61,8 +61,8 @@ class RedisQueue {
61
61
  this.manager.emit(Enums_1.ManagerEventTypes.Debug, `[QUEUE] Added ${tracks.length} track(s) to queue`);
62
62
  if (this.manager.players.has(this.guildId) && this.manager.players.get(this.guildId).isAutoplay) {
63
63
  if (!Array.isArray(track)) {
64
- const botUser = (await this.manager.players.get(this.guildId).get("Internal_BotUser"));
65
- if (botUser && botUser.id === track.requester.id) {
64
+ const AutoplayUser = (await this.manager.players.get(this.guildId).get("Internal_AutoplayUser"));
65
+ if (AutoplayUser && AutoplayUser.id === track.requester.id) {
66
66
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this.manager.players.get(this.guildId), {
67
67
  changeType: Enums_1.PlayerStateEventTypes.QueueChange,
68
68
  details: {
@@ -180,22 +180,26 @@ class Manager extends events_1.EventEmitter {
180
180
  throw new Error("No available nodes.");
181
181
  const _query = typeof query === "string" ? { query } : query;
182
182
  const _source = _query.source ?? this.options.defaultSearchPlatform;
183
- let search = /^https?:\/\//.test(_query.query) ? _query.query : `${_source}:${_query.query}`;
184
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Performing ${_source} search for: ${_query.query}`);
183
+ const isUrl = /^https?:\/\//.test(_query.query);
184
+ const search = isUrl ? _query.query : `${_source}:${_query.query}`;
185
+ this.emit(Enums_1.ManagerEventTypes.Debug, isUrl ? `[MANAGER] Performing search for: ${_query.query}` : `[MANAGER] Performing ${_source} search for: ${_query.query}`);
185
186
  try {
186
187
  const res = (await node.rest.get(`/v4/loadtracks?identifier=${encodeURIComponent(search)}`));
187
188
  if (!res)
188
189
  throw new Error("Query not found.");
189
- let tracks = [];
190
- let playlist = null;
190
+ let result;
191
191
  switch (res.loadType) {
192
- case Enums_1.LoadTypes.Search:
193
- tracks = res.data.map((track) => Utils_1.TrackUtils.build(track, requester));
192
+ case Enums_1.LoadTypes.Search: {
193
+ const tracks = res.data.map((t) => Utils_1.TrackUtils.build(t, requester));
194
+ result = { loadType: res.loadType, tracks };
194
195
  break;
196
+ }
195
197
  case Enums_1.LoadTypes.Short:
196
- case Enums_1.LoadTypes.Track:
197
- tracks = [Utils_1.TrackUtils.build(res.data, requester)];
198
+ case Enums_1.LoadTypes.Track: {
199
+ const track = Utils_1.TrackUtils.build(res.data, requester);
200
+ result = { loadType: res.loadType, tracks: [track] };
198
201
  break;
202
+ }
199
203
  case Enums_1.LoadTypes.Album:
200
204
  case Enums_1.LoadTypes.Artist:
201
205
  case Enums_1.LoadTypes.Station:
@@ -203,18 +207,24 @@ class Manager extends events_1.EventEmitter {
203
207
  case Enums_1.LoadTypes.Show:
204
208
  case Enums_1.LoadTypes.Playlist: {
205
209
  const playlistData = res.data;
206
- tracks = playlistData.tracks.map((track) => Utils_1.TrackUtils.build(track, requester));
207
- playlist = {
208
- name: playlistData.info.name,
209
- playlistInfo: playlistData.pluginInfo,
210
- requester: requester,
210
+ const tracks = playlistData.tracks.map((t) => Utils_1.TrackUtils.build(t, requester));
211
+ result = {
212
+ loadType: res.loadType,
211
213
  tracks,
212
- duration: tracks.reduce((acc, cur) => acc + (cur.duration || 0), 0),
214
+ playlist: {
215
+ name: playlistData.info.name,
216
+ playlistInfo: playlistData.pluginInfo,
217
+ requester: requester,
218
+ tracks,
219
+ duration: tracks.reduce((acc, cur) => acc + (cur.duration || 0), 0),
220
+ },
213
221
  };
214
222
  break;
215
223
  }
224
+ default:
225
+ result = { loadType: res.loadType };
216
226
  }
217
- if (this.options.normalizeYouTubeTitles) {
227
+ if (this.options.normalizeYouTubeTitles && "tracks" in result) {
218
228
  const processTrack = (track) => {
219
229
  if (!/(youtube\.com|youtu\.be)/.test(track.uri))
220
230
  return track;
@@ -223,34 +233,15 @@ class Manager extends events_1.EventEmitter {
223
233
  track.author = cleanAuthor;
224
234
  return track;
225
235
  };
226
- if (playlist) {
227
- playlist.tracks = playlist.tracks.map(processTrack);
228
- }
229
- else {
230
- tracks = tracks.map(processTrack);
236
+ result.tracks = result.tracks.map(processTrack);
237
+ if ("playlist" in result && result.playlist) {
238
+ result.playlist.tracks = result.playlist.tracks.map(processTrack);
231
239
  }
232
240
  }
233
- let result;
234
- switch (res.loadType) {
235
- case Enums_1.LoadTypes.Album:
236
- case Enums_1.LoadTypes.Artist:
237
- case Enums_1.LoadTypes.Station:
238
- case Enums_1.LoadTypes.Podcast:
239
- case Enums_1.LoadTypes.Show:
240
- case Enums_1.LoadTypes.Playlist:
241
- result = { loadType: res.loadType, tracks, playlist };
242
- break;
243
- case Enums_1.LoadTypes.Search:
244
- result = { loadType: res.loadType, tracks };
245
- break;
246
- case Enums_1.LoadTypes.Short:
247
- case Enums_1.LoadTypes.Track:
248
- result = { loadType: res.loadType, tracks: [tracks[0]] };
249
- break;
250
- default:
251
- return { loadType: res.loadType };
252
- }
253
- this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Result ${_source} search for: ${_query.query}: ${JSON.stringify(result)}`);
241
+ const summary = "tracks" in result
242
+ ? result.tracks.map((t) => Object.fromEntries(Object.entries(t).filter(([key]) => key !== "requester")))
243
+ : [];
244
+ this.emit(Enums_1.ManagerEventTypes.Debug, `[MANAGER] Result search for ${_query.query}: ${JSON.stringify(summary, null, 2)}`);
254
245
  return result;
255
246
  }
256
247
  catch (err) {
@@ -514,8 +505,11 @@ class Manager extends events_1.EventEmitter {
514
505
  const currentTrack = state.queue.current;
515
506
  const queueTracks = state.queue.tracks;
516
507
  if (state.isAutoplay) {
517
- Object.setPrototypeOf(state.data.clientUser, { constructor: { name: "User" } });
518
- player.setAutoplay(true, state.data.clientUser, state.autoplayTries);
508
+ const savedUser = state.data.clientUser;
509
+ if (savedUser) {
510
+ const autoPlayUser = await player.manager.resolveUser(savedUser);
511
+ player.setAutoplay(true, autoPlayUser, state.autoplayTries);
512
+ }
519
513
  }
520
514
  if (lavaPlayer?.track) {
521
515
  tracks.push(...queueTracks);
@@ -705,8 +699,11 @@ class Manager extends events_1.EventEmitter {
705
699
  const currentTrack = state.queue.current;
706
700
  const queueTracks = state.queue.tracks;
707
701
  if (state.isAutoplay) {
708
- Object.setPrototypeOf(state.data.clientUser, { constructor: { name: "User" } });
709
- player.setAutoplay(true, state.data.clientUser, state.autoplayTries);
702
+ const savedUser = state.data.clientUser;
703
+ if (savedUser) {
704
+ const autoPlayUser = await player.manager.resolveUser(savedUser);
705
+ player.setAutoplay(true, autoPlayUser, state.autoplayTries);
706
+ }
710
707
  }
711
708
  if (lavaPlayer?.track) {
712
709
  // If lavaPlayer has a track, push all queue tracks
@@ -1310,5 +1307,16 @@ class Manager extends events_1.EventEmitter {
1310
1307
  sendPacket(packet) {
1311
1308
  return this.send(packet);
1312
1309
  }
1310
+ /**
1311
+ * Resolves a PortableUser or ID to a real user object.
1312
+ * Can be overridden by wrapper managers to return wrapper-specific User classes.
1313
+ */
1314
+ async resolveUser(user) {
1315
+ if (!user)
1316
+ return null;
1317
+ if (typeof user === "string")
1318
+ return { id: user }; // fallback by ID only
1319
+ return user; // default: just return the portable user
1320
+ }
1313
1321
  }
1314
1322
  exports.Manager = Manager;
@@ -601,8 +601,8 @@ class Node {
601
601
  player.playing = true;
602
602
  player.paused = false;
603
603
  this.manager.emit(Enums_1.ManagerEventTypes.TrackStart, player, track, payload);
604
- const botUser = player.get("Internal_BotUser");
605
- if (botUser && botUser.id === track.requester.id) {
604
+ const AutoplayUser = player.get("Internal_AutoplayUser");
605
+ if (AutoplayUser && AutoplayUser.id === track.requester.id) {
606
606
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, player, {
607
607
  changeType: Enums_1.PlayerStateEventTypes.TrackChange,
608
608
  details: {
@@ -702,7 +702,7 @@ class Node {
702
702
  return false;
703
703
  const PreviousQueue = await player.queue.getPrevious();
704
704
  const lastTrack = PreviousQueue?.at(-1);
705
- lastTrack.requester = player.get("Internal_BotUser");
705
+ lastTrack.requester = player.get("Internal_AutoplayUser");
706
706
  if (!lastTrack)
707
707
  return false;
708
708
  const tracks = await Utils_1.AutoPlayUtils.getRecommendedTracks(lastTrack);
@@ -355,30 +355,27 @@ class Player {
355
355
  * track when the current track ends.
356
356
  *
357
357
  * @param {boolean} autoplayState - Whether or not autoplay should be enabled.
358
- * @param {object} botUser - The user-object that should be used as the bot-user.
358
+ * @param {object} AutoplayUser - The user-object that should be used as the bot-user.
359
359
  * @param {number} [tries=3] - The number of times the player should try to find a
360
360
  * recommended track if the first one doesn't work.
361
361
  * @returns {this} - The player instance.
362
362
  */
363
- setAutoplay(autoplayState, botUser, tries) {
363
+ setAutoplay(autoplayState, AutoplayUser, tries) {
364
364
  if (typeof autoplayState !== "boolean") {
365
365
  throw new Error("autoplayState must be a boolean.");
366
366
  }
367
367
  if (autoplayState) {
368
- if (!botUser) {
369
- throw new Error("botUser must be provided when enabling autoplay.");
370
- }
371
- if (!["ClientUser", "User"].includes(botUser.constructor.name)) {
372
- throw new Error("botUser must be a user-object.");
368
+ if (!AutoplayUser) {
369
+ throw new Error("AutoplayUser must be provided when enabling autoplay.");
373
370
  }
374
371
  this.autoplayTries = tries && typeof tries === "number" && tries > 0 ? tries : 3; // Default to 3 if invalid
375
372
  this.isAutoplay = true;
376
- this.set("Internal_BotUser", botUser);
373
+ this.set("Internal_AutoplayUser", AutoplayUser);
377
374
  }
378
375
  else {
379
376
  this.isAutoplay = false;
380
377
  this.autoplayTries = null;
381
- this.set("Internal_BotUser", null);
378
+ this.set("Internal_AutoplayUser", null);
382
379
  }
383
380
  const oldPlayer = { ...this };
384
381
  this.manager.emit(Enums_1.ManagerEventTypes.PlayerStateUpdate, oldPlayer, this, {
@@ -852,7 +849,7 @@ class Player {
852
849
  queueRepeat: this.queueRepeat,
853
850
  dynamicRepeat: this.dynamicRepeat,
854
851
  dynamicRepeatIntervalMs: this.dynamicRepeatIntervalMs,
855
- ClientUser: this.get("Internal_BotUser"),
852
+ ClientUser: this.get("Internal_AutoplayUser"),
856
853
  filters: this.filters,
857
854
  nowPlayingMessage: this.nowPlayingMessage,
858
855
  isAutoplay: this.isAutoplay,
@@ -889,7 +886,7 @@ class Player {
889
886
  clonedPlayer.queueRepeat = oldPlayerProperties.queueRepeat;
890
887
  clonedPlayer.dynamicRepeat = oldPlayerProperties.dynamicRepeat;
891
888
  clonedPlayer.dynamicRepeatIntervalMs = oldPlayerProperties.dynamicRepeatIntervalMs;
892
- clonedPlayer.set("Internal_BotUser", oldPlayerProperties.ClientUser);
889
+ clonedPlayer.set("Internal_AutoplayUser", oldPlayerProperties.ClientUser);
893
890
  clonedPlayer.paused = oldPlayerProperties.paused;
894
891
  // Update filters for the cloned player
895
892
  await clonedPlayer.filters.updateFilters();
@@ -647,8 +647,11 @@ class PlayerUtils {
647
647
  };
648
648
  }
649
649
  if (key === "data") {
650
+ const AutoplayUser = value?.Internal_AutoplayUser;
651
+ const serializedUser = AutoplayUser ? { id: AutoplayUser.id, username: AutoplayUser.username } : null;
650
652
  return {
651
- clientUser: value?.Internal_BotUser ?? null,
653
+ clientUser: serializedUser,
654
+ autoplayTries: value?.autoplayTries ?? null,
652
655
  };
653
656
  }
654
657
  return serialize(value);
@@ -32,5 +32,21 @@ class DetritusManager extends Manager_1.Manager {
32
32
  shard.gateway.send(packet.op, packet.d);
33
33
  }
34
34
  }
35
+ async resolveUser(user) {
36
+ const id = typeof user === "string" ? user : user.id;
37
+ if (this.client instanceof detritus_client_1.ShardClient) {
38
+ const cached = this.client.users.get(id);
39
+ if (cached)
40
+ return { id: cached.id, username: cached.username };
41
+ }
42
+ else if (this.client instanceof detritus_client_1.ClusterClient) {
43
+ for (const [, shard] of this.client.shards) {
44
+ const cached = shard.users.get(id);
45
+ if (cached)
46
+ return { id: cached.id, username: cached.username };
47
+ }
48
+ }
49
+ return typeof user === "string" ? { id: user } : user;
50
+ }
35
51
  }
36
52
  exports.DetritusManager = DetritusManager;
@@ -38,5 +38,18 @@ class DiscordJSManager extends Manager_1.Manager {
38
38
  if (guild)
39
39
  guild.shard.send(packet);
40
40
  }
41
+ async resolveUser(user) {
42
+ const id = typeof user === "string" ? user : user.id;
43
+ const cached = this.client.users.cache.get(id);
44
+ if (cached)
45
+ return cached;
46
+ try {
47
+ const fetched = await this.client.users.fetch(id);
48
+ return fetched;
49
+ }
50
+ catch {
51
+ return { id, username: typeof user === "string" ? undefined : user.username };
52
+ }
53
+ }
41
54
  }
42
55
  exports.DiscordJSManager = DiscordJSManager;
@@ -25,5 +25,15 @@ class ErisManager extends Manager_1.Manager {
25
25
  if (guild)
26
26
  guild.shard.sendWS(packet.op, packet.d);
27
27
  }
28
+ async resolveUser(user) {
29
+ const id = typeof user === "string" ? user : user.id;
30
+ const cached = this.client.users.get(id);
31
+ if (cached)
32
+ return cached;
33
+ return {
34
+ id,
35
+ username: typeof user === "string" ? undefined : user.username,
36
+ };
37
+ }
28
38
  }
29
39
  exports.ErisManager = ErisManager;
@@ -25,5 +25,15 @@ class OceanicManager extends Manager_1.Manager {
25
25
  if (guild)
26
26
  guild.shard.send(packet.op, packet.d);
27
27
  }
28
+ async resolveUser(user) {
29
+ const id = typeof user === "string" ? user : user.id;
30
+ const cached = this.client.users.get(id);
31
+ if (cached)
32
+ return cached;
33
+ return {
34
+ id,
35
+ username: typeof user === "string" ? undefined : user.username,
36
+ };
37
+ }
28
38
  }
29
39
  exports.OceanicManager = OceanicManager;
@@ -38,11 +38,23 @@ class SeyfertManager extends Manager_1.Manager {
38
38
  this.client = client;
39
39
  }
40
40
  send(packet) {
41
- if (this.client instanceof seyfert_1.WorkerClient) {
42
- this.client.shards.get((0, common_1.calculateShardId)(packet.d.guild_id))?.send(true, packet);
41
+ if (this.client instanceof seyfert_1.Client) {
42
+ this.client.gateway.send((0, common_1.calculateShardId)(packet.d.guild_id), packet);
43
43
  }
44
44
  else {
45
- this.client.gateway.send((0, common_1.calculateShardId)(packet.d.guild_id), packet);
45
+ this.client.shards.get((0, common_1.calculateShardId)(packet.d.guild_id))?.send(true, packet);
46
+ }
47
+ }
48
+ async resolveUser(user) {
49
+ const id = typeof user === "string" ? user : user.id;
50
+ const cached = this.client.cache.users?.get(id);
51
+ if (cached)
52
+ return cached;
53
+ try {
54
+ return await this.client.users.fetch(id);
55
+ }
56
+ catch {
57
+ return { id, username: typeof user === "string" ? undefined : user.username };
46
58
  }
47
59
  }
48
60
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magmastream",
3
- "version": "2.9.1-dev.2",
3
+ "version": "2.9.1-dev.3",
4
4
  "description": "A user-friendly Lavalink client designed for NodeJS.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",