From 36456d6db68e20c234265bbc1ef8cc5b085daba4 Mon Sep 17 00:00:00 2001 From: canove Date: Wed, 23 Apr 2025 09:38:36 -0300 Subject: [PATCH] fix: proper send receipt to Meta Ia trigger messages to avoid offline pending notifications hang --- src/Utils/decode-wa-message.ts | 31 +++++++++---------------------- src/WABinary/jid-utils.ts | 2 ++ 2 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/Utils/decode-wa-message.ts b/src/Utils/decode-wa-message.ts index d3458c5..9586dec 100644 --- a/src/Utils/decode-wa-message.ts +++ b/src/Utils/decode-wa-message.ts @@ -1,7 +1,7 @@ import { Boom } from '@hapi/boom' import { proto } from '../../WAProto' import { SignalRepository, WAMessageKey } from '../Types' -import { areJidsSameUser, BinaryNode, isJidBroadcast, isJidGroup, isJidNewsletter, isJidStatusBroadcast, isJidUser, isLidUser } from '../WABinary' +import { areJidsSameUser, BinaryNode, isJidBroadcast, isJidGroup, isJidMetaIa, isJidNewsletter, isJidStatusBroadcast, isJidUser, isLidUser } from '../WABinary' import { unpadRandomMax16 } from './generics' import { ILogger } from './logger' @@ -47,27 +47,14 @@ export function decodeMessageNode( const isMe = (jid: string) => areJidsSameUser(jid, meId) const isMeLid = (jid: string) => areJidsSameUser(jid, meLid) - if(isJidUser(from)) { - if(recipient) { - if(!isMe(from)) { + if(isJidUser(from) || isLidUser(from)) { + if (recipient && !isJidMetaIa(recipient)) { + if(!isMe(from) && !isMeLid(from)) { throw new Boom('receipient present, but msg not from me', { data: stanza }) } chatId = recipient - } else { - chatId = from - } - - msgType = 'chat' - author = from - } else if(isLidUser(from)) { - if(recipient) { - if(!isMeLid(from)) { - throw new Boom('receipient present, but msg not from me', { data: stanza }) - } - - chatId = recipient - } else { + } else { chatId = from } @@ -122,8 +109,8 @@ export function decodeMessageNode( if(key.fromMe) { fullMessage.status = proto.WebMessageInfo.Status.SERVER_ACK - } - + } + return { fullMessage, author, @@ -183,7 +170,7 @@ export const decryptMessageNode = ( type: e2eType, ciphertext: content }) - break + break case 'plaintext': msgBuffer = content break @@ -209,7 +196,7 @@ export const decryptMessageNode = ( Object.assign(fullMessage.message, msg) } else { fullMessage.message = msg - } + } } catch(err) { logger.error( { key: fullMessage.key, err }, diff --git a/src/WABinary/jid-utils.ts b/src/WABinary/jid-utils.ts index a0e6139..202211e 100644 --- a/src/WABinary/jid-utils.ts +++ b/src/WABinary/jid-utils.ts @@ -46,6 +46,8 @@ export const jidDecode = (jid: string | undefined): FullJid | undefined => { export const areJidsSameUser = (jid1: string | undefined, jid2: string | undefined) => ( jidDecode(jid1)?.user === jidDecode(jid2)?.user ) +/** is the jid Meta IA */ +export const isJidMetaIa = (jid: string | undefined) => (jid?.endsWith('@bot')) /** is the jid a user */ export const isJidUser = (jid: string | undefined) => (jid?.endsWith('@s.whatsapp.net')) /** is the jid a group */