72 lines
2.3 KiB
TypeScript
72 lines
2.3 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));
|
|
});
|
|
}
|