75 lines
2.2 KiB
TypeScript
75 lines
2.2 KiB
TypeScript
import type { loadConfig } from "../../../config/config.js";
|
|
import { logVerbose } from "../../../globals.js";
|
|
import { sendReactionWhatsApp } from "../../outbound.js";
|
|
import { formatError } from "../../session.js";
|
|
import type { WebInboundMsg } from "../types.js";
|
|
import { resolveGroupActivationFor } from "./group-activation.js";
|
|
|
|
export function maybeSendAckReaction(params: {
|
|
cfg: ReturnType<typeof loadConfig>;
|
|
msg: WebInboundMsg;
|
|
agentId: string;
|
|
sessionKey: string;
|
|
conversationId: string;
|
|
verbose: boolean;
|
|
accountId?: string;
|
|
info: (obj: unknown, msg: string) => void;
|
|
warn: (obj: unknown, msg: string) => void;
|
|
}) {
|
|
if (!params.msg.id) return;
|
|
|
|
const ackConfig = params.cfg.channels?.whatsapp?.ackReaction;
|
|
const emoji = (ackConfig?.emoji ?? "").trim();
|
|
const directEnabled = ackConfig?.direct ?? true;
|
|
const groupMode = ackConfig?.group ?? "mentions";
|
|
const conversationIdForCheck = params.msg.conversationId ?? params.msg.from;
|
|
|
|
const shouldSendReaction = () => {
|
|
if (!emoji) return false;
|
|
|
|
if (params.msg.chatType === "direct") {
|
|
return directEnabled;
|
|
}
|
|
|
|
if (params.msg.chatType === "group") {
|
|
if (groupMode === "never") return false;
|
|
if (groupMode === "always") return true;
|
|
if (groupMode === "mentions") {
|
|
const activation = resolveGroupActivationFor({
|
|
cfg: params.cfg,
|
|
agentId: params.agentId,
|
|
sessionKey: params.sessionKey,
|
|
conversationId: conversationIdForCheck,
|
|
});
|
|
if (activation === "always") return true;
|
|
return params.msg.wasMentioned === true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
};
|
|
|
|
if (!shouldSendReaction()) return;
|
|
|
|
params.info(
|
|
{ chatId: params.msg.chatId, messageId: params.msg.id, emoji },
|
|
"sending ack reaction",
|
|
);
|
|
sendReactionWhatsApp(params.msg.chatId, params.msg.id, emoji, {
|
|
verbose: params.verbose,
|
|
fromMe: false,
|
|
participant: params.msg.senderJid,
|
|
accountId: params.accountId,
|
|
}).catch((err) => {
|
|
params.warn(
|
|
{
|
|
error: formatError(err),
|
|
chatId: params.msg.chatId,
|
|
messageId: params.msg.id,
|
|
},
|
|
"failed to send ack reaction",
|
|
);
|
|
logVerbose(`WhatsApp ack reaction failed for chat ${params.msg.chatId}: ${formatError(err)}`);
|
|
});
|
|
}
|