From 2ff5c179178917fa5a0637364048017960ed2ff1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sun, 15 Feb 2026 01:13:11 +0000 Subject: [PATCH] refactor(slack): dedupe member join/leave handlers --- src/slack/monitor/events/members.ts | 119 ++++++++++++---------------- 1 file changed, 51 insertions(+), 68 deletions(-) diff --git a/src/slack/monitor/events/members.ts b/src/slack/monitor/events/members.ts index cf7b5b03e..1b7decdfd 100644 --- a/src/slack/monitor/events/members.ts +++ b/src/slack/monitor/events/members.ts @@ -8,83 +8,66 @@ import { resolveSlackChannelLabel } from "../channel-config.js"; export function registerSlackMemberEvents(params: { ctx: SlackMonitorContext }) { const { ctx } = params; + const handleMemberChannelEvent = async (params: { + verb: "joined" | "left"; + event: SlackMemberChannelEvent; + body: unknown; + }) => { + try { + if (ctx.shouldDropMismatchedSlackEvent(params.body)) { + return; + } + const payload = params.event; + const channelId = payload.channel; + const channelInfo = channelId ? await ctx.resolveChannelName(channelId) : {}; + const channelType = payload.channel_type ?? channelInfo?.type; + if ( + !ctx.isChannelAllowed({ + channelId, + channelName: channelInfo?.name, + channelType, + }) + ) { + return; + } + const userInfo = payload.user ? await ctx.resolveUserName(payload.user) : {}; + const userLabel = userInfo?.name ?? payload.user ?? "someone"; + const label = resolveSlackChannelLabel({ + channelId, + channelName: channelInfo?.name, + }); + const sessionKey = ctx.resolveSlackSystemEventSessionKey({ + channelId, + channelType, + }); + enqueueSystemEvent(`Slack: ${userLabel} ${params.verb} ${label}.`, { + sessionKey, + contextKey: `slack:member:${params.verb}:${channelId ?? "unknown"}:${payload.user ?? "unknown"}`, + }); + } catch (err) { + ctx.runtime.error?.(danger(`slack ${params.verb} handler failed: ${String(err)}`)); + } + }; + ctx.app.event( "member_joined_channel", async ({ event, body }: SlackEventMiddlewareArgs<"member_joined_channel">) => { - try { - if (ctx.shouldDropMismatchedSlackEvent(body)) { - return; - } - const payload = event as SlackMemberChannelEvent; - const channelId = payload.channel; - const channelInfo = channelId ? await ctx.resolveChannelName(channelId) : {}; - const channelType = payload.channel_type ?? channelInfo?.type; - if ( - !ctx.isChannelAllowed({ - channelId, - channelName: channelInfo?.name, - channelType, - }) - ) { - return; - } - const userInfo = payload.user ? await ctx.resolveUserName(payload.user) : {}; - const userLabel = userInfo?.name ?? payload.user ?? "someone"; - const label = resolveSlackChannelLabel({ - channelId, - channelName: channelInfo?.name, - }); - const sessionKey = ctx.resolveSlackSystemEventSessionKey({ - channelId, - channelType, - }); - enqueueSystemEvent(`Slack: ${userLabel} joined ${label}.`, { - sessionKey, - contextKey: `slack:member:joined:${channelId ?? "unknown"}:${payload.user ?? "unknown"}`, - }); - } catch (err) { - ctx.runtime.error?.(danger(`slack join handler failed: ${String(err)}`)); - } + await handleMemberChannelEvent({ + verb: "joined", + event: event as SlackMemberChannelEvent, + body, + }); }, ); ctx.app.event( "member_left_channel", async ({ event, body }: SlackEventMiddlewareArgs<"member_left_channel">) => { - try { - if (ctx.shouldDropMismatchedSlackEvent(body)) { - return; - } - const payload = event as SlackMemberChannelEvent; - const channelId = payload.channel; - const channelInfo = channelId ? await ctx.resolveChannelName(channelId) : {}; - const channelType = payload.channel_type ?? channelInfo?.type; - if ( - !ctx.isChannelAllowed({ - channelId, - channelName: channelInfo?.name, - channelType, - }) - ) { - return; - } - const userInfo = payload.user ? await ctx.resolveUserName(payload.user) : {}; - const userLabel = userInfo?.name ?? payload.user ?? "someone"; - const label = resolveSlackChannelLabel({ - channelId, - channelName: channelInfo?.name, - }); - const sessionKey = ctx.resolveSlackSystemEventSessionKey({ - channelId, - channelType, - }); - enqueueSystemEvent(`Slack: ${userLabel} left ${label}.`, { - sessionKey, - contextKey: `slack:member:left:${channelId ?? "unknown"}:${payload.user ?? "unknown"}`, - }); - } catch (err) { - ctx.runtime.error?.(danger(`slack leave handler failed: ${String(err)}`)); - } + await handleMemberChannelEvent({ + verb: "left", + event: event as SlackMemberChannelEvent, + body, + }); }, ); }