


























@@ -33,6 +33,49 @@ function supportsForcedDocumentDelivery(kind: "image" | "audio" | "video" | "doc
3333return kind === "image" || kind === "video";
3434}
353536+type PreparedWhatsAppOutboundMedia = Awaited<ReturnType<typeof prepareWhatsAppOutboundMedia>>;
37+38+type WhatsAppMediaSendState = {
39+mediaBuffer: Buffer;
40+mediaType: string;
41+text: string;
42+forceDocumentDelivery: boolean;
43+documentFileName?: string;
44+visibleTextAfterVoice?: string;
45+};
46+47+function buildWhatsAppMediaSendState(params: {
48+media: PreparedWhatsAppOutboundMedia;
49+caption?: string;
50+forceDocument?: boolean;
51+}): WhatsAppMediaSendState {
52+const { media, caption } = params;
53+const forceDocumentDelivery = Boolean(
54+params.forceDocument && supportsForcedDocumentDelivery(media.kind),
55+);
56+let text = caption ?? "";
57+let documentFileName = media.kind === "document" ? media.fileName : undefined;
58+let visibleTextAfterVoice: string | undefined;
59+if (media.kind === "audio" && caption) {
60+visibleTextAfterVoice = caption;
61+text = "";
62+}
63+if (forceDocumentDelivery) {
64+documentFileName ??= resolveWhatsAppDocumentFileName({
65+fileName: media.fileName,
66+mimetype: media.mimetype,
67+});
68+}
69+return {
70+mediaBuffer: media.buffer,
71+mediaType: media.mimetype,
72+ text,
73+ forceDocumentDelivery,
74+ ...(documentFileName ? { documentFileName } : {}),
75+ ...(visibleTextAfterVoice ? { visibleTextAfterVoice } : {}),
76+};
77+}
78+3679function resolveOutboundWhatsAppAccountId(params: {
3780cfg: OpenClawConfig;
3881accountId?: string;
@@ -148,31 +191,11 @@ export async function sendMessageWhatsApp(
148191let documentFileName: string | undefined;
149192let visibleTextAfterVoice: string | undefined;
150193let forceDocumentDelivery = false;
194+let media: PreparedWhatsAppOutboundMedia | undefined;
151195if (mediaPayload) {
152-const media = await prepareWhatsAppOutboundMedia(mediaPayload, primaryMediaUrl);
153-const caption = text || undefined;
154-mediaBuffer = media.buffer;
155-mediaType = media.mimetype;
156-forceDocumentDelivery = Boolean(
157-options.forceDocument && supportsForcedDocumentDelivery(media.kind),
158-);
159-if (media.kind === "audio" && caption) {
160-visibleTextAfterVoice = caption;
161-text = "";
162-} else if (media.kind === "document") {
163-text = caption ?? "";
164-documentFileName = media.fileName;
165-} else {
166-text = caption ?? "";
167-}
168-if (forceDocumentDelivery) {
169-documentFileName ??= resolveWhatsAppDocumentFileName({
170-fileName: media.fileName,
171-mimetype: media.mimetype,
172-});
173-}
196+media = await prepareWhatsAppOutboundMedia(mediaPayload, primaryMediaUrl);
174197} else if (primaryMediaUrl) {
175-const media = await prepareWhatsAppOutboundMedia(
198+media = await prepareWhatsAppOutboundMedia(
176199await loadOutboundMediaFromUrl(primaryMediaUrl, {
177200maxBytes: resolveWhatsAppMediaMaxBytes(account),
178201optimizeImages: options.forceDocument ? false : undefined,
@@ -182,27 +205,19 @@ export async function sendMessageWhatsApp(
182205}),
183206primaryMediaUrl,
184207);
185-const caption = text || undefined;
186-mediaBuffer = media.buffer;
187-mediaType = media.mimetype;
188-forceDocumentDelivery = Boolean(
189-options.forceDocument && supportsForcedDocumentDelivery(media.kind),
190-);
191-if (media.kind === "audio" && caption) {
192-visibleTextAfterVoice = caption;
193-text = "";
194-} else if (media.kind === "document") {
195-text = caption ?? "";
196-documentFileName = media.fileName;
197-} else {
198-text = caption ?? "";
199-}
200-if (forceDocumentDelivery) {
201-documentFileName ??= resolveWhatsAppDocumentFileName({
202-fileName: media.fileName,
203-mimetype: media.mimetype,
204-});
205-}
208+}
209+if (media) {
210+const mediaSendState = buildWhatsAppMediaSendState({
211+ media,
212+caption: text || undefined,
213+forceDocument: options.forceDocument,
214+});
215+mediaBuffer = mediaSendState.mediaBuffer;
216+mediaType = mediaSendState.mediaType;
217+documentFileName = mediaSendState.documentFileName;
218+visibleTextAfterVoice = mediaSendState.visibleTextAfterVoice;
219+forceDocumentDelivery = mediaSendState.forceDocumentDelivery;
220+text = mediaSendState.text;
206221}
207222outboundLog.info(`Sending message -> ${redactedJid}${hasMedia ? " (media)" : ""}`);
208223logger.info({ jid: redactedJid, hasMedia }, "sending message");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。