From 2db6bc5047ba68be311189a1f18128a16eb6b69e Mon Sep 17 00:00:00 2001 From: Darren Clarke Date: Thu, 15 Jan 2026 10:01:15 +0100 Subject: [PATCH] Fix: Use senderPn for phone number instead of LID from remoteJid Baileys 7 uses LIDs (Linked IDs) in remoteJid for some messages instead of phone numbers. This caused messages to be matched to wrong tickets because the LID was used as the sender identifier instead of the actual phone number. Now we: - Extract senderPn/participantPn from message key (Baileys 7 fields) - Prefer these phone number fields over remoteJid - Skip messages if we can't determine the phone number (LID with no phone) --- apps/bridge-whatsapp/src/service.ts | 38 ++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/apps/bridge-whatsapp/src/service.ts b/apps/bridge-whatsapp/src/service.ts index 69a1895..6b32600 100644 --- a/apps/bridge-whatsapp/src/service.ts +++ b/apps/bridge-whatsapp/src/service.ts @@ -175,18 +175,20 @@ export default class WhatsappService extends Service { } private async queueMessage(botID: string, webMessageInfo: proto.IWebMessageInfo) { - const { - key: { id, fromMe, remoteJid }, - message, - messageTimestamp, - } = webMessageInfo; - logger.info("Message type debug"); - for (const key in message) { - logger.info( - { key, exists: !!message[key as keyof proto.IMessage] }, - "Message field", - ); + const { key, message, messageTimestamp } = webMessageInfo; + if (!key) { + logger.warn("Message missing key, skipping"); + return; } + const { id, fromMe, remoteJid } = key; + // Baileys 7 uses LIDs (Linked IDs) instead of phone numbers in some cases. + // senderPn contains the actual phone number when available. + const senderPn = (key as any).senderPn as string | undefined; + const participantPn = (key as any).participantPn as string | undefined; + logger.info( + { remoteJid, senderPn, participantPn, fromMe }, + "Processing incoming message", + ); const isValidMessage = message && remoteJid !== "status@broadcast" && !fromMe; if (isValidMessage) { const { audioMessage, documentMessage, imageMessage, videoMessage } = message; @@ -244,9 +246,21 @@ export default class WhatsappService extends Service { videoMessage, ].find((text) => text && text !== ""); + // Prefer phone number fields (senderPn/participantPn) over remoteJid + // remoteJid may contain LIDs which are not phone numbers + const phoneFromJid = remoteJid?.split("@")[0]; + const isLidJid = remoteJid?.endsWith("@lid"); + // Use senderPn/participantPn if available, otherwise use remoteJid only if it's not a LID + const senderPhone = senderPn?.split("@")[0] || participantPn?.split("@")[0] || (!isLidJid ? phoneFromJid : undefined); + + if (!senderPhone) { + logger.warn({ remoteJid, senderPn, participantPn }, "Could not determine sender phone number, skipping message"); + return; + } + const payload = { to: botID, - from: remoteJid?.split("@")[0], + from: senderPhone, messageId: id, sentAt: new Date((messageTimestamp as number) * 1000).toISOString(), message: messageText,