feat(whatsapp): extract mentions from text and captions
WhatsApp's Baileys library requires a separate mentions array in the message payload for @mentions to work properly. Without this array, text like '@5511999999999' appears as plain text instead of a clickable mention. This change automatically extracts phone numbers in the format @<10-15 digits> from the message text AND media captions, adding them to the mentions array as JIDs (e.g., '5511999999999@s.whatsapp.net'). Supported message types: - Text messages - Image with caption - Video with caption - Document with caption Fixes mentions in group chats when using the message tool.
This commit is contained in:
parent
260f6e2c00
commit
c3cb338937
@ -19,6 +19,17 @@ export function createWebSendApi(params: {
|
||||
sendOptions?: ActiveWebSendOptions,
|
||||
): Promise<{ messageId: string }> => {
|
||||
const jid = toWhatsappJid(to);
|
||||
|
||||
const mentions: string[] = [];
|
||||
if (text) {
|
||||
const phoneRegex = /@(\d{10,15})/g;
|
||||
let match: RegExpExecArray | null;
|
||||
while ((match = phoneRegex.exec(text)) !== null) {
|
||||
mentions.push(`${match[1]}@s.whatsapp.net`);
|
||||
}
|
||||
}
|
||||
const mentionSpread = mentions.length > 0 ? { mentions } : {};
|
||||
|
||||
let payload: AnyMessageContent;
|
||||
if (mediaBuffer && mediaType) {
|
||||
if (mediaType.startsWith("image/")) {
|
||||
@ -26,7 +37,8 @@ export function createWebSendApi(params: {
|
||||
image: mediaBuffer,
|
||||
caption: text || undefined,
|
||||
mimetype: mediaType,
|
||||
};
|
||||
...mentionSpread,
|
||||
} as AnyMessageContent;
|
||||
} else if (mediaType.startsWith("audio/")) {
|
||||
payload = { audio: mediaBuffer, ptt: true, mimetype: mediaType };
|
||||
} else if (mediaType.startsWith("video/")) {
|
||||
@ -36,17 +48,19 @@ export function createWebSendApi(params: {
|
||||
caption: text || undefined,
|
||||
mimetype: mediaType,
|
||||
...(gifPlayback ? { gifPlayback: true } : {}),
|
||||
};
|
||||
...mentionSpread,
|
||||
} as AnyMessageContent;
|
||||
} else {
|
||||
payload = {
|
||||
document: mediaBuffer,
|
||||
fileName: "file",
|
||||
caption: text || undefined,
|
||||
mimetype: mediaType,
|
||||
};
|
||||
...mentionSpread,
|
||||
} as AnyMessageContent;
|
||||
}
|
||||
} else {
|
||||
payload = { text };
|
||||
payload = mentions.length > 0 ? ({ text, mentions } as AnyMessageContent) : { text };
|
||||
}
|
||||
const result = await params.sock.sendMessage(jid, payload);
|
||||
const accountId = sendOptions?.accountId ?? params.defaultAccountId;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user