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));
});
}
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland