From 374fd5a9c2c0d0ddd73fb3cfc3fbbc2a85901327 Mon Sep 17 00:00:00 2001 From: asepharyana Date: Mon, 31 Aug 2026 14:03:00 +0700 Subject: [PATCH] fix(gateway): use guild voice sessionId for watch RTC identify MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The previous code read the sessionId from the selfbot client's voice manager (client.voice.connection), which is no longer established since ensureSelfbotVoice was removed — it would have sent sessionId:'none' in the watch Networking identify and been rejected. Read the active session from the guild @discordjs/voice connection (getVoiceConnection(guildId).state.networking... connectionOptions.sessionId) instead. --- .../voice-recording/streamWatchReceiver.ts | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/services/discord-gateway/src/modules/voice-recording/streamWatchReceiver.ts b/services/discord-gateway/src/modules/voice-recording/streamWatchReceiver.ts index b19ea083..87899353 100644 --- a/services/discord-gateway/src/modules/voice-recording/streamWatchReceiver.ts +++ b/services/discord-gateway/src/modules/voice-recording/streamWatchReceiver.ts @@ -30,7 +30,11 @@ import { type WriteStream, } from "node:fs"; import path from "node:path"; -import { Networking, type NetworkingState } from "@discordjs/voice"; +import { + getVoiceConnection, + Networking, + type NetworkingState, +} from "@discordjs/voice"; import type Davey from "@snazzah/davey"; import { MediaType } from "@snazzah/davey"; import type { Client, VoiceChannel } from "discord.js-selfbot-v13"; @@ -193,14 +197,27 @@ function connectWatch( const botId = _client?.user?.id; if (!botId) return; - // The bot's ACTIVE voice-session id (from the selfbot client's voice manager — - // the same session the guild @discordjs/voice connection rides). - const voiceManager = ( - _client as unknown as { - voice?: { connection?: { authentication?: { sessionId?: string } } }; - } - ).voice; - const sessionId = voiceManager?.connection?.authentication?.sessionId; + // The bot's ACTIVE voice-session id, from the guild @discordjs/voice + // connection (the watch RTC identify must carry the SAME session the bot is + // joined in with). The gateway's audio connection is the voice session; the + // selfbot client's voice manager is NOT established anymore. + const guildConn = getVoiceConnection(guildId); + const sessionId = + ( + guildConn as unknown as { + state?: { + networking?: { + state?: { connectionOptions?: { sessionId?: string } }; + }; + connectionOptions?: { sessionId?: string }; + }; + } + )?.state?.networking?.state?.connectionOptions?.sessionId ?? + ( + guildConn as unknown as { + state?: { connectionOptions?: { sessionId?: string } }; + } + )?.state?.connectionOptions?.sessionId; logger.info( { userId: uid, endpoint, serverId, hasSession: !!sessionId },