mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-04 03:20:23 +00:00
104 lines
2.4 KiB
TypeScript
104 lines
2.4 KiB
TypeScript
export type AckReactionScope = "all" | "direct" | "group-all" | "group-mentions" | "off" | "none";
|
|
|
|
export type WhatsAppAckReactionMode = "always" | "mentions" | "never";
|
|
|
|
export type AckReactionGateParams = {
|
|
scope: AckReactionScope | undefined;
|
|
isDirect: boolean;
|
|
isGroup: boolean;
|
|
isMentionableGroup: boolean;
|
|
requireMention: boolean;
|
|
canDetectMention: boolean;
|
|
effectiveWasMentioned: boolean;
|
|
shouldBypassMention?: boolean;
|
|
};
|
|
|
|
export function shouldAckReaction(params: AckReactionGateParams): boolean {
|
|
const scope = params.scope ?? "group-mentions";
|
|
if (scope === "off" || scope === "none") {
|
|
return false;
|
|
}
|
|
if (scope === "all") {
|
|
return true;
|
|
}
|
|
if (scope === "direct") {
|
|
return params.isDirect;
|
|
}
|
|
if (scope === "group-all") {
|
|
return params.isGroup;
|
|
}
|
|
if (scope === "group-mentions") {
|
|
if (!params.isMentionableGroup) {
|
|
return false;
|
|
}
|
|
if (!params.requireMention) {
|
|
return false;
|
|
}
|
|
if (!params.canDetectMention) {
|
|
return false;
|
|
}
|
|
return params.effectiveWasMentioned || params.shouldBypassMention === true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function shouldAckReactionForWhatsApp(params: {
|
|
emoji: string;
|
|
isDirect: boolean;
|
|
isGroup: boolean;
|
|
directEnabled: boolean;
|
|
groupMode: WhatsAppAckReactionMode;
|
|
wasMentioned: boolean;
|
|
groupActivated: boolean;
|
|
}): boolean {
|
|
if (!params.emoji) {
|
|
return false;
|
|
}
|
|
if (params.isDirect) {
|
|
return params.directEnabled;
|
|
}
|
|
if (!params.isGroup) {
|
|
return false;
|
|
}
|
|
if (params.groupMode === "never") {
|
|
return false;
|
|
}
|
|
if (params.groupMode === "always") {
|
|
return true;
|
|
}
|
|
return shouldAckReaction({
|
|
scope: "group-mentions",
|
|
isDirect: false,
|
|
isGroup: true,
|
|
isMentionableGroup: true,
|
|
requireMention: true,
|
|
canDetectMention: true,
|
|
effectiveWasMentioned: params.wasMentioned,
|
|
shouldBypassMention: params.groupActivated,
|
|
});
|
|
}
|
|
|
|
export function removeAckReactionAfterReply(params: {
|
|
removeAfterReply: boolean;
|
|
ackReactionPromise: Promise<boolean> | null;
|
|
ackReactionValue: string | null;
|
|
remove: () => Promise<void>;
|
|
onError?: (err: unknown) => void;
|
|
}) {
|
|
if (!params.removeAfterReply) {
|
|
return;
|
|
}
|
|
if (!params.ackReactionPromise) {
|
|
return;
|
|
}
|
|
if (!params.ackReactionValue) {
|
|
return;
|
|
}
|
|
void params.ackReactionPromise.then((didAck) => {
|
|
if (!didAck) {
|
|
return;
|
|
}
|
|
params.remove().catch((err) => params.onError?.(err));
|
|
});
|
|
}
|