openclaw/src/slack/monitor/message-handler.ts
2026-01-14 01:17:56 +00:00

34 lines
1.1 KiB
TypeScript

import type { ResolvedSlackAccount } from "../accounts.js";
import type { SlackMessageEvent } from "../types.js";
import type { SlackMonitorContext } from "./context.js";
import { dispatchPreparedSlackMessage } from "./message-handler/dispatch.js";
import { prepareSlackMessage } from "./message-handler/prepare.js";
export type SlackMessageHandler = (
message: SlackMessageEvent,
opts: { source: "message" | "app_mention"; wasMentioned?: boolean },
) => Promise<void>;
export function createSlackMessageHandler(params: {
ctx: SlackMonitorContext;
account: ResolvedSlackAccount;
}): SlackMessageHandler {
const { ctx, account } = params;
return async (message, opts) => {
if (opts.source === "message" && message.type !== "message") return;
if (
opts.source === "message" &&
message.subtype &&
message.subtype !== "file_share" &&
message.subtype !== "bot_message"
) {
return;
}
if (ctx.markMessageSeen(message.channel, message.ts)) return;
const prepared = await prepareSlackMessage({ ctx, account, message, opts });
if (!prepared) return;
await dispatchPreparedSlackMessage(prepared);
};
}