From 586de997a5566001ec59f06564186a853e9edc0c Mon Sep 17 00:00:00 2001 From: oraran Date: Mon, 23 Mar 2026 08:47:59 +0900 Subject: [PATCH] =?UTF-8?q?fix(voice):=20correct=20ssrc=E2=86=94user=5Fid?= =?UTF-8?q?=20cache=20direction=20in=20DAVE=20decrypt=20fallback?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `user_ssrc_map[uid] = ssrc` was written instead of `ssrc_user_map[ssrc] = uid`, causing the inferred mapping to be stored in the wrong dict and never hit on subsequent packets. - Added a for/else fallback that returns OPUS_SILENCE when every candidate user_id fails to decrypt, preventing encrypted bytes from reaching sinks. Co-Authored-By: Claude Sonnet 4.6 --- discord/voice/receive/reader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/discord/voice/receive/reader.py b/discord/voice/receive/reader.py index 0163858826..1ae3a70e13 100644 --- a/discord/voice/receive/reader.py +++ b/discord/voice/receive/reader.py @@ -288,7 +288,7 @@ def decrypt_rtp(self, packet: RTPPacket) -> bytes: raw_payload, ) # Successfully decrypted - cache the mapping for next time - self.client._connection.user_ssrc_map[int_uid] = packet.ssrc + self.client._connection.ssrc_user_map[packet.ssrc] = int_uid uid = int_uid raw_payload = decrypted_audio _log.debug( @@ -299,6 +299,10 @@ def decrypt_rtp(self, packet: RTPPacket) -> bytes: break except ValueError: continue + else: + # All candidates failed to decrypt; return silence to avoid + # passing encrypted audio data downstream. + return OPUS_SILENCE elif uid: try: raw_payload = dave.decrypt(