34 lines
1.1 KiB
TypeScript
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);
|
|
};
|
|
}
|