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)
This commit is contained in:
Darren Clarke 2026-01-15 10:01:15 +01:00
parent 3b91c98d5e
commit 2db6bc5047

View file

@ -175,18 +175,20 @@ export default class WhatsappService extends Service {
} }
private async queueMessage(botID: string, webMessageInfo: proto.IWebMessageInfo) { private async queueMessage(botID: string, webMessageInfo: proto.IWebMessageInfo) {
const { const { key, message, messageTimestamp } = webMessageInfo;
key: { id, fromMe, remoteJid }, if (!key) {
message, logger.warn("Message missing key, skipping");
messageTimestamp, return;
} = webMessageInfo;
logger.info("Message type debug");
for (const key in message) {
logger.info(
{ key, exists: !!message[key as keyof proto.IMessage] },
"Message field",
);
} }
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; const isValidMessage = message && remoteJid !== "status@broadcast" && !fromMe;
if (isValidMessage) { if (isValidMessage) {
const { audioMessage, documentMessage, imageMessage, videoMessage } = message; const { audioMessage, documentMessage, imageMessage, videoMessage } = message;
@ -244,9 +246,21 @@ export default class WhatsappService extends Service {
videoMessage, videoMessage,
].find((text) => text && text !== ""); ].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 = { const payload = {
to: botID, to: botID,
from: remoteJid?.split("@")[0], from: senderPhone,
messageId: id, messageId: id,
sentAt: new Date((messageTimestamp as number) * 1000).toISOString(), sentAt: new Date((messageTimestamp as number) * 1000).toISOString(),
message: messageText, message: messageText,