From d047a004502c97def7fae80033c9573cdcaad119 Mon Sep 17 00:00:00 2001 From: execaman <151807496+execaman@users.noreply.github.com> Date: Mon, 18 May 2026 13:36:51 +0530 Subject: [PATCH] feat(Managers): expose queue and voice manager caches --- src/Constants/Symbols.ts | 2 -- src/Queue/FilterManager.ts | 3 +-- src/Queue/Queue.ts | 6 +++--- src/Queue/QueueManager.ts | 13 ++++++++----- src/Voice/VoiceManager.ts | 16 ++++++++++------ src/Voice/VoiceState.ts | 5 ++--- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/Constants/Symbols.ts b/src/Constants/Symbols.ts index 2ef44b3..d9ed02f 100644 --- a/src/Constants/Symbols.ts +++ b/src/Constants/Symbols.ts @@ -1,6 +1,4 @@ -export const LookupSymbol = Symbol("lookup"); export const UpdateSymbol = Symbol("update"); - export const LastTrackSymbol = Symbol("lastTrack"); export const OnPingUpdateSymbol = Symbol("onPingUpdate"); diff --git a/src/Queue/FilterManager.ts b/src/Queue/FilterManager.ts index 3e5b13d..6fdbd7f 100644 --- a/src/Queue/FilterManager.ts +++ b/src/Queue/FilterManager.ts @@ -1,4 +1,3 @@ -import { LookupSymbol } from "../Constants/Symbols"; import type { APIPlayer, FilterNames, FilterValue, JsonObject, Filters, CommonPluginFilters } from "../Typings"; import type { VoiceState } from "../Voice"; import type { Player } from "../Main"; @@ -13,7 +12,7 @@ export class FilterManager = QueueContext> { constructor(player: Player, guildId: string, context?: Context) { if (player.queues.has(guildId)) throw new Error("An identical queue already exists"); - const _player = player.queues[LookupSymbol](guildId); + const _player = player.queues.cache.get(guildId); if (!_player) throw new Error(`No player found for guild '${guildId}'`); const voice = player.voices.get(guildId); @@ -266,7 +266,7 @@ export class Queue = QueueContext> { return; } if (target !== "remote") throw new Error("Target must be 'local' or 'remote'"); - const voice = this.player.voices[LookupSymbol](this.guildId); + const voice = this.player.voices.cache.get(this.guildId); if (!voice) return; const player = this.#player; const request: PlayerUpdateRequestBody = { diff --git a/src/Queue/QueueManager.ts b/src/Queue/QueueManager.ts index f099625..30a9364 100644 --- a/src/Queue/QueueManager.ts +++ b/src/Queue/QueueManager.ts @@ -2,7 +2,6 @@ import { setImmediate } from "node:timers/promises"; import { EventType, TrackEndReason } from "../Typings"; import { LastTrackSymbol, - LookupSymbol, OnEventUpdateSymbol, OnPingUpdateSymbol, OnStateUpdateSymbol, @@ -54,6 +53,14 @@ export class QueueManager = QueueContext return this.#queues.size; } + /** + * Raw lavalink player objects. + * For reference or advanced usage only, do not `set` or `delete` + */ + get cache() { + return this.#cache as ReadonlyMap; + } + get(guildId: string) { return this.#queues.get(guildId); } @@ -306,10 +313,6 @@ export class QueueManager = QueueContext } } - [LookupSymbol](guildId: string) { - return this.#cache.get(guildId); - } - [UpdateSymbol](guildId: string, payload: Partial, partial = true) { const data = this.#cache.get(guildId); if (data !== undefined) Object.assign(data, payload); diff --git a/src/Voice/VoiceManager.ts b/src/Voice/VoiceManager.ts index cfa0831..479eaf8 100644 --- a/src/Voice/VoiceManager.ts +++ b/src/Voice/VoiceManager.ts @@ -1,7 +1,7 @@ import { setTimeout } from "node:timers/promises"; import { VoiceCloseCodes } from "../Typings"; import { SnowflakeRegex, VoiceRegionIdRegex } from "../Constants"; -import { LookupSymbol, OnVoiceCloseSymbol, UpdateSymbol } from "../Constants/Symbols"; +import { OnVoiceCloseSymbol, UpdateSymbol } from "../Constants/Symbols"; import { isString, noop } from "../Functions"; import { VoiceRegion, VoiceState } from "./index"; import { Queue } from "../Queue"; @@ -54,6 +54,14 @@ export class VoiceManager implements Partial> { return this.#voices.size; } + /** + * Raw voice state objects. + * For reference or advanced usage only, do not `set` or `delete` + */ + get cache() { + return this.#cache as ReadonlyMap; + } + get(guildId: string) { return this.#voices.get(guildId); } @@ -89,7 +97,7 @@ export class VoiceManager implements Partial> { const resolver = Promise.withResolvers(); this.#destroys.set(guildId, resolver.promise); - if (this[LookupSymbol](guildId)?.connected) await voice.disconnect().catch(noop); + if (this.#cache.get(guildId)?.connected) await voice.disconnect().catch(noop); this.#cache.delete(guildId); this.#voices.delete(guildId); @@ -341,10 +349,6 @@ export class VoiceManager implements Partial> { } } - [LookupSymbol](guildId: string) { - return this.#cache.get(guildId); - } - [UpdateSymbol](guildId: string, payload: Partial, partial = true) { const data = this.#cache.get(guildId); if (data !== undefined) Object.assign(data, payload); diff --git a/src/Voice/VoiceState.ts b/src/Voice/VoiceState.ts index e2e666d..0509bd2 100644 --- a/src/Voice/VoiceState.ts +++ b/src/Voice/VoiceState.ts @@ -1,4 +1,3 @@ -import { LookupSymbol } from "../Constants/Symbols"; import { noop } from "../Functions"; import type { APIPlayer, BotVoiceState, PlayerUpdateRequestBody } from "../Typings"; import type { Node } from "../Node"; @@ -28,10 +27,10 @@ export class VoiceState { if (!_node) throw new Error(`Node '${node}' not found`); if (!_node.ready) throw new Error(`Node '${node}' not ready`); - const state = player.voices[LookupSymbol](guildId); + const state = player.voices.cache.get(guildId); if (!state) throw new Error(`No connection found for guild '${guildId}'`); - const _player = player.queues[LookupSymbol](guildId); + const _player = player.queues.cache.get(guildId); if (!_player) throw new Error(`No player found for guild '${guildId}'`); this.#node = _node;