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 +27 -10
- package/dist/statestorage/JsonQueue.js +2 -2
- package/dist/statestorage/MemoryQueue.js +2 -2
- package/dist/statestorage/RedisQueue.js +2 -2
- package/dist/structures/Manager.js +53 -45
- package/dist/structures/Node.js +3 -3
- package/dist/structures/Player.js +8 -11
- package/dist/structures/Utils.js +4 -1
- package/dist/wrappers/detritus.js +16 -0
- package/dist/wrappers/discord.js.js +13 -0
- package/dist/wrappers/eris.js +10 -0
- package/dist/wrappers/oceanic.js +10 -0
- package/dist/wrappers/seyfert.js +15 -3
- package/package.json +1 -1
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,
|
|
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?:
|
|
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:
|
|
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}
|
|
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,
|
|
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
|
|
57
|
-
if (
|
|
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
|
|
85
|
-
if (
|
|
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
|
|
65
|
-
if (
|
|
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
|
-
|
|
184
|
-
|
|
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
|
|
190
|
-
let playlist = null;
|
|
190
|
+
let result;
|
|
191
191
|
switch (res.loadType) {
|
|
192
|
-
case Enums_1.LoadTypes.Search:
|
|
193
|
-
tracks = res.data.map((
|
|
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
|
-
|
|
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((
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
-
|
|
227
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
-
|
|
518
|
-
|
|
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
|
-
|
|
709
|
-
|
|
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;
|
package/dist/structures/Node.js
CHANGED
|
@@ -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
|
|
605
|
-
if (
|
|
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("
|
|
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}
|
|
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,
|
|
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 (!
|
|
369
|
-
throw new Error("
|
|
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("
|
|
373
|
+
this.set("Internal_AutoplayUser", AutoplayUser);
|
|
377
374
|
}
|
|
378
375
|
else {
|
|
379
376
|
this.isAutoplay = false;
|
|
380
377
|
this.autoplayTries = null;
|
|
381
|
-
this.set("
|
|
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("
|
|
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("
|
|
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();
|
package/dist/structures/Utils.js
CHANGED
|
@@ -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:
|
|
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;
|
package/dist/wrappers/eris.js
CHANGED
|
@@ -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;
|
package/dist/wrappers/oceanic.js
CHANGED
|
@@ -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;
|
package/dist/wrappers/seyfert.js
CHANGED
|
@@ -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.
|
|
42
|
-
this.client.
|
|
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.
|
|
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
|
}
|