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:
parent
3b91c98d5e
commit
2db6bc5047
1 changed files with 26 additions and 12 deletions
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue