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,