From fb8e6156ec6c1ddeb060a43d74015be9bb030d14 Mon Sep 17 00:00:00 2001 From: Shadow Date: Thu, 12 Feb 2026 16:42:04 -0600 Subject: [PATCH] fix: handle discord dm reaction allowlist --- src/discord/monitor.test.ts | 18 +++++++++++++++++- src/discord/monitor/listeners.ts | 17 +++++++++++------ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/discord/monitor.test.ts b/src/discord/monitor.test.ts index bd0b04b73f..46e0f09525 100644 --- a/src/discord/monitor.test.ts +++ b/src/discord/monitor.test.ts @@ -836,6 +836,22 @@ describe("discord DM reaction handling", () => { expect(opts.sessionKey).toBe("discord:acc-1:dm:user-1"); }); + it("does not drop DM reactions when guild allowlist is configured", async () => { + enqueueSystemEventSpy.mockClear(); + resolveAgentRouteMock.mockClear(); + + const data = makeReactionEvent({ botAsAuthor: true }); + const client = makeReactionClient(ChannelType.DM); + const guildEntries = makeEntries({ + "guild-123": { slug: "guild-123" }, + }); + const listener = new DiscordReactionListener(makeReactionListenerParams({ guildEntries })); + + await listener.handle(data, client); + + expect(enqueueSystemEventSpy).toHaveBeenCalledOnce(); + }); + it("still processes guild reactions (no regression)", async () => { enqueueSystemEventSpy.mockClear(); resolveAgentRouteMock.mockClear(); @@ -877,7 +893,7 @@ describe("discord DM reaction handling", () => { expect(text).not.toContain("undefined"); }); - it("routes DM reactions with peer kind 'dm' and user id", async () => { + it("routes DM reactions with peer kind 'direct' and user id", async () => { enqueueSystemEventSpy.mockClear(); resolveAgentRouteMock.mockClear(); diff --git a/src/discord/monitor/listeners.ts b/src/discord/monitor/listeners.ts index f888954295..ea51c45352 100644 --- a/src/discord/monitor/listeners.ts +++ b/src/discord/monitor/listeners.ts @@ -188,11 +188,14 @@ async function handleDiscordReactionEvent(params: { if (!user || user.bot) { return; } - const guildInfo = resolveDiscordGuildEntry({ - guild: data.guild ?? undefined, - guildEntries, - }); - if (guildEntries && Object.keys(guildEntries).length > 0 && !guildInfo) { + const isGuildMessage = Boolean(data.guild_id); + const guildInfo = isGuildMessage + ? resolveDiscordGuildEntry({ + guild: data.guild ?? undefined, + guildEntries, + }) + : null; + if (isGuildMessage && guildEntries && Object.keys(guildEntries).length > 0 && !guildInfo) { return; } @@ -261,7 +264,9 @@ async function handleDiscordReactionEvent(params: { const actorLabel = formatDiscordUserTag(user); const guildSlug = guildInfo?.slug || - (data.guild?.name ? normalizeDiscordSlug(data.guild.name) : (data.guild_id ?? "dm")); + (data.guild?.name + ? normalizeDiscordSlug(data.guild.name) + : (data.guild_id ?? (isGroupDm ? "group-dm" : "dm"))); const channelLabel = channelSlug ? `#${channelSlug}` : channelName