



























@@ -40,6 +40,12 @@ import {
4040} from "./extract.js";
4141import { attachEmitterListener, closeInboundMonitorSocket } from "./lifecycle.js";
4242import { downloadInboundMedia, downloadQuotedInboundMedia } from "./media.js";
43+import {
44+addWhatsAppOutboundMentionsToContent,
45+mayContainWhatsAppOutboundMention,
46+resolveWhatsAppOutboundMentions,
47+type WhatsAppOutboundMentionParticipant,
48+} from "./outbound-mentions.js";
4349import { DisconnectReason, isJidGroup, saveMediaBuffer } from "./runtime-api.js";
4450import { createWebSendApi } from "./send-api.js";
4551import { normalizeWhatsAppSendResult } from "./send-result.js";
@@ -57,6 +63,7 @@ type WhatsAppGroupMetadataCacheEntry = {
5763export type WhatsAppGroupMetadataCache = Map<string, WhatsAppGroupMetadataCacheEntry>;
5864type LocalGroupMetadataCacheEntry = WhatsAppGroupMetadataCacheEntry & {
5965participants?: string[];
66+mentionParticipants?: WhatsAppOutboundMentionParticipant[];
6067};
61686269function rememberGroupMetadataCacheEntry<T extends WhatsAppGroupMetadataCacheEntry>(
@@ -355,18 +362,26 @@ export async function attachWebInboxToSocket(
355362};
356363357364const summarizeGroupMeta = async (meta: GroupMetadata) => {
358-const participants =
359-(
360-await Promise.all(
361-meta.participants?.map(async (p) => {
362-const mapped = await resolveInboundJid(p.id);
363-return mapped ?? p.id;
364-}) ?? [],
365-)
366-).filter(Boolean) ?? [];
365+const participantEntries = await Promise.all(
366+meta.participants?.map(async (p) => {
367+const mapped = await resolveInboundJid(p.id);
368+return {
369+display: mapped ?? p.id,
370+mention: {
371+id: p.id,
372+lid: p.lid,
373+phoneNumber: p.phoneNumber,
374+e164: mapped,
375+} satisfies WhatsAppOutboundMentionParticipant,
376+};
377+}) ?? [],
378+);
379+const participants = participantEntries.map((entry) => entry.display).filter(Boolean);
380+const mentionParticipants = participantEntries.map((entry) => entry.mention);
367381return {
368382subject: meta.subject,
369383 participants,
384+ mentionParticipants,
370385expires: Date.now() + GROUP_META_TTL_MS,
371386};
372387};
@@ -384,7 +399,7 @@ export async function attachWebInboxToSocket(
384399return cached;
385400}
386401try {
387-const meta = await sock.groupMetadata(jid);
402+const meta = await (getCurrentSock() ?? sock).groupMetadata(jid);
388403const entry = await summarizeGroupMeta(meta);
389404rememberGroupMetadataCacheEntry(groupMetadataCache, jid, {
390405subject: entry.subject,
@@ -410,6 +425,43 @@ export async function attachWebInboxToSocket(
410425}
411426};
412427428+const resolveOutboundMentionsForGroup = async (
429+jid: string,
430+text: string,
431+): Promise<{ text: string; mentionedJids: string[] }> => {
432+if (!isGroupJid(jid) || !mayContainWhatsAppOutboundMention(text)) {
433+return { text, mentionedJids: [] };
434+}
435+const meta = await getGroupMeta(jid);
436+return resolveWhatsAppOutboundMentions({
437+chatJid: jid,
438+ text,
439+participants: meta.mentionParticipants,
440+});
441+};
442+443+const applyOutboundMentionsToContent = async (
444+jid: string,
445+content: AnyMessageContent,
446+): Promise<AnyMessageContent> => {
447+if ("text" in content && typeof content.text === "string") {
448+const resolved = await resolveOutboundMentionsForGroup(jid, content.text);
449+return addWhatsAppOutboundMentionsToContent(
450+{ ...content, text: resolved.text } as AnyMessageContent,
451+resolved.mentionedJids,
452+);
453+}
454+const caption = (content as { caption?: unknown }).caption;
455+if (typeof caption === "string") {
456+const resolved = await resolveOutboundMentionsForGroup(jid, caption);
457+return addWhatsAppOutboundMentionsToContent(
458+{ ...content, caption: resolved.text } as AnyMessageContent,
459+resolved.mentionedJids,
460+);
461+}
462+return content;
463+};
464+413465type NormalizedInboundMessage = {
414466id?: string;
415467remoteJid: string;
@@ -632,14 +684,23 @@ export async function attachWebInboxToSocket(
632684}
633685};
634686const reply = async (text: string, options?: MiscMessageGenerationOptions) => {
635-const result = await sendTrackedMessage(chatJid, { text }, options);
687+const resolved = await resolveOutboundMentionsForGroup(chatJid, text);
688+const result = await sendTrackedMessage(
689+chatJid,
690+addWhatsAppOutboundMentionsToContent({ text: resolved.text }, resolved.mentionedJids),
691+options,
692+);
636693return normalizeWhatsAppSendResult(result, "text");
637694};
638695const sendMedia = async (
639696payload: AnyMessageContent,
640697options?: MiscMessageGenerationOptions,
641698) => {
642-const result = await sendTrackedMessage(chatJid, payload, options);
699+const result = await sendTrackedMessage(
700+chatJid,
701+await applyOutboundMentionsToContent(chatJid, payload),
702+options,
703+);
643704return normalizeWhatsAppSendResult(result, "media");
644705};
645706const timestamp = inbound.messageTimestampMs;
@@ -856,6 +917,7 @@ export async function attachWebInboxToSocket(
856917},
857918},
858919defaultAccountId: options.accountId,
920+resolveOutboundMentions: ({ jid, text }) => resolveOutboundMentionsForGroup(jid, text),
859921});
860922861923return {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。