From ebfe942db9534c307d227957fc1c347209a0e019 Mon Sep 17 00:00:00 2001 From: MythEclipse Date: Fri, 12 Jun 2026 17:00:02 +0700 Subject: [PATCH] fix(capture): skip age-restricted/NSFW channels entirely Auto-filter all age-restricted and NSFW channels at capture layer so messages never enter the database or reach frontend. Co-Authored-By: Claude --- .../modules/message-capture/messageCapture.ts | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/services/discord-gateway/src/modules/message-capture/messageCapture.ts b/services/discord-gateway/src/modules/message-capture/messageCapture.ts index 21b1dbd..42e998b 100644 --- a/services/discord-gateway/src/modules/message-capture/messageCapture.ts +++ b/services/discord-gateway/src/modules/message-capture/messageCapture.ts @@ -39,6 +39,34 @@ export interface MessageLocationInput { channelId?: string | null; } +function isAgeRestrictedChannel(message: Message): boolean { + try { + const channel = message.channel as { + nsfw?: boolean; + nsfwLevel?: string | number | null; + isThread?: () => boolean; + parent?: { nsfw?: boolean; nsfwLevel?: string | number | null } | null; + }; + if (channel.nsfw) return true; + if ( + typeof channel.nsfwLevel === "string" && + channel.nsfwLevel.toUpperCase() === "AGE_RESTRICTED" + ) + return true; + if (channel.isThread?.() && channel.parent) { + if (channel.parent.nsfw) return true; + if ( + typeof channel.parent.nsfwLevel === "string" && + channel.parent.nsfwLevel.toUpperCase() === "AGE_RESTRICTED" + ) + return true; + } + } catch { + // Can't determine → allow capture + } + return false; +} + export function shouldCaptureMessageLocation( message: MessageLocationInput, target: TextCaptureTarget, @@ -214,6 +242,7 @@ export function registerMessageCapture(client: Client): void { client.on("messageCreate", async (message) => { if (!shouldCaptureMessageLocation(message, getTextCaptureTarget())) return; if (message.author?.bot) return; + if (isAgeRestrictedChannel(message)) return; try { await captureMessage(message, "text"); @@ -232,6 +261,7 @@ export function registerMessageCapture(client: Client): void { if (!shouldCaptureMessageLocation(newMessage, getTextCaptureTarget())) return; if (newMessage.author?.bot) return; + if (isAgeRestrictedChannel(newMessage as Message)) return; try { const existing = await getMessageById(newMessage.id);