diff --git a/external_plugins/discord/server.ts b/external_plugins/discord/server.ts index 1752ebf..0595fc7 100644 --- a/external_plugins/discord/server.ts +++ b/external_plugins/discord/server.ts @@ -222,6 +222,8 @@ type GateResult = const recentSentIds = new Set() const RECENT_SENT_CAP = 200 +const dmChannelUsers = new Map() + function noteSent(id: string): void { recentSentIds.add(id) if (recentSentIds.size > RECENT_SENT_CAP) { @@ -404,7 +406,8 @@ async function fetchAllowedChannel(id: string) { const ch = await fetchTextChannel(id) const access = loadAccess() if (ch.type === ChannelType.DM) { - if (access.allowFrom.includes(ch.recipientId)) return ch + const userId = ch.recipientId ?? dmChannelUsers.get(id) + if (userId && access.allowFrom.includes(userId)) return ch } else { const key = ch.isThread() ? ch.parentId ?? ch.id : ch.id if (key in access.groups) return ch @@ -823,6 +826,10 @@ async function handleInbound(msg: Message): Promise { const chat_id = msg.channelId + if (msg.channel.type === ChannelType.DM) { + dmChannelUsers.set(chat_id, msg.author.id) + } + // Permission-reply intercept: if this looks like "yes xxxxx" for a // pending permission request, emit the structured event instead of // relaying as chat. The sender is already gate()-approved at this point