From bbe385908531949a331e3be466bd4fb7d59efff2 Mon Sep 17 00:00:00 2001 From: devlikepro Date: Fri, 10 Oct 2025 17:26:41 +0700 Subject: [PATCH] [core] ChatWoot - Facebook Ads Message Template closes #1461 (cherry picked from bergpinheiro/waha@5863590208f9704e4a23d513fcc7d48cae13d136) Thanks @bergpinheiro Co-authored-by: bergpinheiro --- .../chatwoot/consumers/waha/message.any.ts | 8 ++ src/apps/chatwoot/i18n/locales/ar-AE.yaml | 15 +++ src/apps/chatwoot/i18n/locales/bn-BD.yaml | 15 +++ src/apps/chatwoot/i18n/locales/de-DE.yaml | 15 +++ src/apps/chatwoot/i18n/locales/en-US.yaml | 15 +++ src/apps/chatwoot/i18n/locales/es-ES.yaml | 15 +++ src/apps/chatwoot/i18n/locales/fa-IR.yaml | 15 +++ src/apps/chatwoot/i18n/locales/fr-FR.yaml | 15 +++ src/apps/chatwoot/i18n/locales/he-IL.yaml | 15 +++ src/apps/chatwoot/i18n/locales/hi-IN.yaml | 15 +++ src/apps/chatwoot/i18n/locales/id-ID.yaml | 15 +++ src/apps/chatwoot/i18n/locales/pa-PK.yaml | 15 +++ src/apps/chatwoot/i18n/locales/pt-BR.yaml | 15 +++ src/apps/chatwoot/i18n/locales/ru-RU.yaml | 15 +++ src/apps/chatwoot/i18n/locales/tr-TR.yaml | 15 +++ src/apps/chatwoot/i18n/locales/uk-UA.yaml | 15 +++ src/apps/chatwoot/i18n/locales/ur-PK.yaml | 15 +++ src/apps/chatwoot/i18n/locales/zh-CN.yaml | 15 +++ src/apps/chatwoot/i18n/templates.ts | 14 +++ .../messages/to/chatwoot/FacebookAdMessage.ts | 91 +++++++++++++++++++ .../chatwoot/messages/to/chatwoot/index.ts | 1 + 21 files changed, 369 insertions(+) create mode 100644 src/apps/chatwoot/messages/to/chatwoot/FacebookAdMessage.ts diff --git a/src/apps/chatwoot/consumers/waha/message.any.ts b/src/apps/chatwoot/consumers/waha/message.any.ts index 4d4249ee..49d4aaab 100644 --- a/src/apps/chatwoot/consumers/waha/message.any.ts +++ b/src/apps/chatwoot/consumers/waha/message.any.ts @@ -18,6 +18,7 @@ import { WAHAWebhookMessageAny } from '@waha/structures/webhooks.dto'; import { Job } from 'bullmq'; import { PinoLogger } from 'nestjs-pino'; import { + FacebookAdMessage, LocationMessage, MessageToChatWootConverter, ShareContactMessage, @@ -69,6 +70,13 @@ class MessageAnyHandler extends MessageBaseHandler { let msg: ChatWootMessagePartial; const protoMessage = resolveProtoMessage(payload); + // Check for Facebook Ad first - but let it use the normal flow later + converter = new FacebookAdMessage(this.l, this.logger); + msg = await converter.convert(payload, protoMessage); + if (msg) { + return msg; + } + converter = new TextMessage(this.l, this.logger, this.waha); msg = await converter.convert(payload, null); if (msg) { diff --git a/src/apps/chatwoot/i18n/locales/ar-AE.yaml b/src/apps/chatwoot/i18n/locales/ar-AE.yaml index 30d56c05..cfcd75db 100644 --- a/src/apps/chatwoot/i18n/locales/ar-AE.yaml +++ b/src/apps/chatwoot/i18n/locales/ar-AE.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 يرجى فتح **WhatsApp** لعرضه. التفاصيل: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **إعلان فيسبوك** + + **العنوان:** {{{adData.title}}} + + **الوصف:** + {{{adData.body}}} + + **رابط الإعلان:** [عرض على فيسبوك]({{{adData.sourceUrl}}}) + **معرّف الإعلان:** {{{adData.sourceId}}} + + --- + 💬 **رسالة العميل:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/bn-BD.yaml b/src/apps/chatwoot/i18n/locales/bn-BD.yaml index cac344aa..c96cfae2 100644 --- a/src/apps/chatwoot/i18n/locales/bn-BD.yaml +++ b/src/apps/chatwoot/i18n/locales/bn-BD.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 এটি দেখতে অনুগ্রহ করে **WhatsApp** খুলুন। বিস্তারিত: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **ফেসবুক বিজ্ঞাপন** + + **শিরোনাম:** {{{adData.title}}} + + **বর্ণনা:** + {{{adData.body}}} + + **বিজ্ঞাপনের লিংক:** [ফেসবুকে দেখুন]({{{adData.sourceUrl}}}) + **বিজ্ঞাপনের আইডি:** {{{adData.sourceId}}} + + --- + 💬 **গ্রাহকের বার্তা:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/de-DE.yaml b/src/apps/chatwoot/i18n/locales/de-DE.yaml index bdd91b00..5c0cec0c 100644 --- a/src/apps/chatwoot/i18n/locales/de-DE.yaml +++ b/src/apps/chatwoot/i18n/locales/de-DE.yaml @@ -239,3 +239,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Bitte öffne **WhatsApp**, um ihn anzusehen. Details: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **FACEBOOK-ANZEIGE** + + **Titel:** {{{adData.title}}} + + **Beschreibung:** + {{{adData.body}}} + + **Anzeigenlink:** [Auf Facebook ansehen]({{{adData.sourceUrl}}}) + **Anzeigen-ID:** {{{adData.sourceId}}} + + --- + 💬 **Kundennachricht:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/en-US.yaml b/src/apps/chatwoot/i18n/locales/en-US.yaml index 0997881b..50602ffc 100644 --- a/src/apps/chatwoot/i18n/locales/en-US.yaml +++ b/src/apps/chatwoot/i18n/locales/en-US.yaml @@ -116,6 +116,21 @@ whatsapp.to.chatwoot.message.unsupported: |- Details: [{{{details.text}}}]({{{details.url}}}) +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **FACEBOOK AD** + + **Title:** {{{adData.title}}} + + **Description:** + {{{adData.body}}} + + **Ad Link:** [View on Facebook]({{{adData.sourceUrl}}}) + **Ad ID:** {{{adData.sourceId}}} + + --- + 💬 **CUSTOMER MESSAGE:** + {{{payload.body}}} + app.connected.message: |- 🔗 **CONNECTED: WhatsApp Session to ChatWoot Inbox** diff --git a/src/apps/chatwoot/i18n/locales/es-ES.yaml b/src/apps/chatwoot/i18n/locales/es-ES.yaml index 63392b93..84e43827 100644 --- a/src/apps/chatwoot/i18n/locales/es-ES.yaml +++ b/src/apps/chatwoot/i18n/locales/es-ES.yaml @@ -239,3 +239,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Por favor, abre **WhatsApp** para verlo. Detalles: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **ANUNCIO DE FACEBOOK** + + **Título:** {{{adData.title}}} + + **Descripción:** + {{{adData.body}}} + + **Enlace del anuncio:** [Ver en Facebook]({{{adData.sourceUrl}}}) + **ID del anuncio:** {{{adData.sourceId}}} + + --- + 💬 **Mensaje del cliente:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/fa-IR.yaml b/src/apps/chatwoot/i18n/locales/fa-IR.yaml index 55f9cf81..9f0f51f6 100644 --- a/src/apps/chatwoot/i18n/locales/fa-IR.yaml +++ b/src/apps/chatwoot/i18n/locales/fa-IR.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 لطفاً برای مشاهده آن **WhatsApp** را باز کنید. جزئیات: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **آگهی فیس‌بوک** + + **عنوان:** {{{adData.title}}} + + **توضیحات:** + {{{adData.body}}} + + **لینک آگهی:** [مشاهده در فیس‌بوک]({{{adData.sourceUrl}}}) + **شناسه آگهی:** {{{adData.sourceId}}} + + --- + 💬 **پیام مشتری:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/fr-FR.yaml b/src/apps/chatwoot/i18n/locales/fr-FR.yaml index 26afe5e0..bcd295b9 100644 --- a/src/apps/chatwoot/i18n/locales/fr-FR.yaml +++ b/src/apps/chatwoot/i18n/locales/fr-FR.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Veuillez ouvrir **WhatsApp** pour l’afficher. Détails: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **PUBLICITÉ FACEBOOK** + + **Titre:** {{{adData.title}}} + + **Description:** + {{{adData.body}}} + + **Lien de l'annonce :** [Voir sur Facebook]({{{adData.sourceUrl}}}) + **ID de l'annonce :** {{{adData.sourceId}}} + + --- + 💬 **Message du client :** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/he-IL.yaml b/src/apps/chatwoot/i18n/locales/he-IL.yaml index 68113c57..eb25f32c 100644 --- a/src/apps/chatwoot/i18n/locales/he-IL.yaml +++ b/src/apps/chatwoot/i18n/locales/he-IL.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 אנא פתח/י את **WhatsApp** כדי לצפות בזה. פרטים: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **מודעת פייסבוק** + + **כותרת:** {{{adData.title}}} + + **תיאור:** + {{{adData.body}}} + + **קישור למודעה:** [לצפייה בפייסבוק]({{{adData.sourceUrl}}}) + **מזהה המודעה:** {{{adData.sourceId}}} + + --- + 💬 **הודעת הלקוח:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/hi-IN.yaml b/src/apps/chatwoot/i18n/locales/hi-IN.yaml index 6154c086..9fe2fdb4 100644 --- a/src/apps/chatwoot/i18n/locales/hi-IN.yaml +++ b/src/apps/chatwoot/i18n/locales/hi-IN.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 इसे देखने के लिए कृपया **WhatsApp** खोलें। विवरण: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **फेसबुक विज्ञापन** + + **शीर्षक:** {{{adData.title}}} + + **विवरण:** + {{{adData.body}}} + + **विज्ञापन लिंक:** [फेसबुक पर देखें]({{{adData.sourceUrl}}}) + **विज्ञापन आईडी:** {{{adData.sourceId}}} + + --- + 💬 **ग्राहक संदेश:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/id-ID.yaml b/src/apps/chatwoot/i18n/locales/id-ID.yaml index be920841..d20dd9dd 100644 --- a/src/apps/chatwoot/i18n/locales/id-ID.yaml +++ b/src/apps/chatwoot/i18n/locales/id-ID.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Silakan buka **WhatsApp** untuk melihatnya. Detail: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **IKLAN FACEBOOK** + + **Judul:** {{{adData.title}}} + + **Deskripsi:** + {{{adData.body}}} + + **Tautan Iklan:** [Lihat di Facebook]({{{adData.sourceUrl}}}) + **ID Iklan:** {{{adData.sourceId}}} + + --- + 💬 **Pesan Pelanggan:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/pa-PK.yaml b/src/apps/chatwoot/i18n/locales/pa-PK.yaml index fbfc324c..9c2c6fba 100644 --- a/src/apps/chatwoot/i18n/locales/pa-PK.yaml +++ b/src/apps/chatwoot/i18n/locales/pa-PK.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 ਇਸਨੂੰ ਦੇਖਣ ਲਈ ਕਿਰਪਾ ਕਰਕੇ **WhatsApp** ਖੋਲ੍ਹੋ। ਵੇਰਵੇ: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **ਫੇਸਬੁੱਕ ਵਿਗਿਆਪਨ** + + **ਸਿਰਲੇਖ:** {{{adData.title}}} + + **ਵੇਰਵਾ:** + {{{adData.body}}} + + **ਵਿਗਿਆਪਨ ਲਿੰਕ:** [ਫੇਸਬੁੱਕ 'ਤੇ ਵੇਖੋ]({{{adData.sourceUrl}}}) + **ਵਿਗਿਆਪਨ ਆਈਡੀ:** {{{adData.sourceId}}} + + --- + 💬 **ਗਾਹਕ ਦਾ ਸੁਨੇਹਾ:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/pt-BR.yaml b/src/apps/chatwoot/i18n/locales/pt-BR.yaml index 9022bfbb..d1b44e79 100644 --- a/src/apps/chatwoot/i18n/locales/pt-BR.yaml +++ b/src/apps/chatwoot/i18n/locales/pt-BR.yaml @@ -239,3 +239,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Por favor, abra o **WhatsApp** para visualizá-la. Detalhes: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **ANÚNCIO DO FACEBOOK** + + **Título:** {{{adData.title}}} + + **Descrição:** + {{{adData.body}}} + + **Link do Anúncio:** [Ver no Facebook]({{{adData.sourceUrl}}}) + **ID do Anúncio:** {{{adData.sourceId}}} + + --- + 💬 **MENSAGEM DO CLIENTE:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/ru-RU.yaml b/src/apps/chatwoot/i18n/locales/ru-RU.yaml index b62935fa..4f50c9c7 100644 --- a/src/apps/chatwoot/i18n/locales/ru-RU.yaml +++ b/src/apps/chatwoot/i18n/locales/ru-RU.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Пожалуйста, откройте **WhatsApp**, чтобы просмотреть. Подробности: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **РЕКЛАМА FACEBOOK** + + **Заголовок:** {{{adData.title}}} + + **Описание:** + {{{adData.body}}} + + **Ссылка на объявление:** [Посмотреть в Facebook]({{{adData.sourceUrl}}}) + **Идентификатор объявления:** {{{adData.sourceId}}} + + --- + 💬 **Сообщение клиента:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/tr-TR.yaml b/src/apps/chatwoot/i18n/locales/tr-TR.yaml index 7386c691..b826b853 100644 --- a/src/apps/chatwoot/i18n/locales/tr-TR.yaml +++ b/src/apps/chatwoot/i18n/locales/tr-TR.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Görüntülemek için lütfen **WhatsApp’ı** açın. Ayrıntılar: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **FACEBOOK İLANI** + + **Başlık:** {{{adData.title}}} + + **Açıklama:** + {{{adData.body}}} + + **İlan Bağlantısı:** [Facebook’ta Görüntüle]({{{adData.sourceUrl}}}) + **İlan Kimliği:** {{{adData.sourceId}}} + + --- + 💬 **Müşteri Mesajı:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/uk-UA.yaml b/src/apps/chatwoot/i18n/locales/uk-UA.yaml index d12be65e..82517895 100644 --- a/src/apps/chatwoot/i18n/locales/uk-UA.yaml +++ b/src/apps/chatwoot/i18n/locales/uk-UA.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 Будь ласка, відкрийте **WhatsApp**, щоб переглянути. Подробиці: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **РЕКЛАМА FACEBOOK** + + **Заголовок:** {{{adData.title}}} + + **Опис:** + {{{adData.body}}} + + **Посилання на рекламу:** [Переглянути у Facebook]({{{adData.sourceUrl}}}) + **Ідентифікатор реклами:** {{{adData.sourceId}}} + + --- + 💬 **Повідомлення клієнта:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/ur-PK.yaml b/src/apps/chatwoot/i18n/locales/ur-PK.yaml index 3961318a..1524cc43 100644 --- a/src/apps/chatwoot/i18n/locales/ur-PK.yaml +++ b/src/apps/chatwoot/i18n/locales/ur-PK.yaml @@ -236,3 +236,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 اسے دیکھنے کے لیے براہ کرم **WhatsApp** کھولیں۔ تفصیلات: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **فیس بک اشتہار** + + **عنوان:** {{{adData.title}}} + + **تفصیل:** + {{{adData.body}}} + + **اشتہار کا لنک:** [فیس بک پر دیکھیں]({{{adData.sourceUrl}}}) + **اشتہار کا شناختی نمبر:** {{{adData.sourceId}}} + + --- + 💬 **گاہک کا پیغام:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/locales/zh-CN.yaml b/src/apps/chatwoot/i18n/locales/zh-CN.yaml index 708e0c2e..2f65d4e3 100644 --- a/src/apps/chatwoot/i18n/locales/zh-CN.yaml +++ b/src/apps/chatwoot/i18n/locales/zh-CN.yaml @@ -238,3 +238,18 @@ whatsapp.to.chatwoot.message.unsupported: |- 📱 请打开 **WhatsApp** 查看。 详情: [{{{details.text}}}]({{{details.url}}}) + +whatsapp.to.chatwoot.message.facebook.ad: |- + 📢 **Facebook 广告** + + **标题:** {{{adData.title}}} + + **描述:** + {{{adData.body}}} + + **广告链接:** [在 Facebook 查看]({{{adData.sourceUrl}}}) + **广告 ID:** {{{adData.sourceId}}} + + --- + 💬 **客户消息:** + {{{payload.body}}} diff --git a/src/apps/chatwoot/i18n/templates.ts b/src/apps/chatwoot/i18n/templates.ts index 10982bc1..8c26d813 100644 --- a/src/apps/chatwoot/i18n/templates.ts +++ b/src/apps/chatwoot/i18n/templates.ts @@ -52,6 +52,7 @@ export enum TKey { WA_TO_CW_MESSAGE_CONTACTS = 'whatsapp.to.chatwoot.message.contacts', WA_TO_CW_MESSAGE_LOCATION = 'whatsapp.to.chatwoot.message.location', WA_TO_CW_MESSAGE_UNSUPPORTED = 'whatsapp.to.chatwoot.message.unsupported', + WA_TO_CW_MESSAGE_FACEBOOK_AD = 'whatsapp.to.chatwoot.message.facebook.ad', // // App Inbox @@ -99,6 +100,15 @@ interface Link { url: string; } +export interface FacebookAdTemplateData { + title: string; + body: string; + thumbnailUrl: string; + originalImageUrl: string; + sourceUrl: string; + sourceId: string; +} + export type TemplatePayloads = { [TKey.LOCALE_NAME]: void; [TKey.APP_INBOX_CONTACT_NAME]: void; @@ -132,6 +142,10 @@ export type TemplatePayloads = { [TKey.WA_TO_CW_MESSAGE_CONTACTS]: { contacts: SimpleVCardInfo[] }; [TKey.WA_TO_CW_MESSAGE_LOCATION]: { payload: any; message: proto.Message }; [TKey.WA_TO_CW_MESSAGE_UNSUPPORTED]: { details: Link }; + [TKey.WA_TO_CW_MESSAGE_FACEBOOK_AD]: { + payload: WAMessage; + adData: FacebookAdTemplateData; + }; [TKey.JOB_SCHEDULED_ERROR_HEADER]: void; [TKey.JOB_REPORT_ERROR]: { header: string; diff --git a/src/apps/chatwoot/messages/to/chatwoot/FacebookAdMessage.ts b/src/apps/chatwoot/messages/to/chatwoot/FacebookAdMessage.ts new file mode 100644 index 00000000..173daa83 --- /dev/null +++ b/src/apps/chatwoot/messages/to/chatwoot/FacebookAdMessage.ts @@ -0,0 +1,91 @@ +import { ILogger } from '@waha/apps/app_sdk/ILogger'; +import { SendAttachment } from '@waha/apps/chatwoot/client/types'; +import { ChatWootMessagePartial } from '@waha/apps/chatwoot/consumers/waha/base'; +import { Locale } from '@waha/apps/chatwoot/i18n/locale'; +import { + FacebookAdTemplateData, + TKey, +} from '@waha/apps/chatwoot/i18n/templates'; +import { MessageToChatWootConverter } from '@waha/apps/chatwoot/messages/to/chatwoot'; +import { WhatsappToMarkdown } from '@waha/apps/chatwoot/messages/to/chatwoot/utils/markdown'; +import { WAMessage } from '@waha/structures/responses.dto'; +import type { proto } from '@adiwajshing/baileys'; +import * as lodash from 'lodash'; +import { fetchBuffer } from '@waha/core/abc/session.abc'; + +export class FacebookAdMessage implements MessageToChatWootConverter { + constructor( + private readonly locale: Locale, + private readonly logger: ILogger, + ) {} + + async convert( + payload: WAMessage, + protoMessage: proto.Message | null, + ): Promise { + const adData = this.extractAdData(protoMessage); + if (!adData) { + return null; + } + const content = this.locale.key(TKey.WA_TO_CW_MESSAGE_FACEBOOK_AD).render({ + payload, + adData, + }); + const attachments = await this.getAttachments(adData); + + return { + content: WhatsappToMarkdown(content), + attachments, + private: undefined, + }; + } + + private extractAdData(protoMessage: proto.Message): FacebookAdTemplateData { + if ( + lodash.isEmpty( + protoMessage?.extendedTextMessage?.contextInfo?.externalAdReply, + ) + ) { + return null; + } + const adReply = + protoMessage?.extendedTextMessage?.contextInfo?.externalAdReply; + return { + title: adReply.title ?? '', + body: adReply.body ?? '', + thumbnailUrl: adReply.thumbnailUrl ?? '', + originalImageUrl: adReply.originalImageUrl ?? '', + sourceUrl: adReply.sourceUrl ?? '', + sourceId: adReply.sourceId ?? '', + }; + } + + private async getAttachments( + adData: FacebookAdTemplateData, + ): Promise { + const imageUrl = adData.originalImageUrl || adData.thumbnailUrl; + if (!imageUrl) { + return []; + } + + try { + this.logger.info(`Downloading Facebook Ad image from '${imageUrl}'...`); + const buffer = await fetchBuffer(imageUrl); + const attachment: SendAttachment = { + content: buffer.toString('base64'), + filename: 'facebook-ad-image.jpg', + encoding: 'base64', + }; + this.logger.info( + `Downloaded Facebook Ad image from '${imageUrl}' as '${attachment.filename}'`, + ); + return [attachment]; + } catch (error) { + const reason = error instanceof Error ? error.message : `${error}`; + this.logger.error( + `Failed to download Facebook Ad image from '${imageUrl}': ${reason}`, + ); + return []; + } + } +} diff --git a/src/apps/chatwoot/messages/to/chatwoot/index.ts b/src/apps/chatwoot/messages/to/chatwoot/index.ts index 4b11008f..a091cf6d 100644 --- a/src/apps/chatwoot/messages/to/chatwoot/index.ts +++ b/src/apps/chatwoot/messages/to/chatwoot/index.ts @@ -8,6 +8,7 @@ export { LocationMessage } from './LocationMessage'; export { ShareContactMessage } from './ShareContactMessage'; export { UnsupportedMessage } from './UnsupportedMessage'; export { MessageEdited } from './MessageEdited'; +export { FacebookAdMessage } from './FacebookAdMessage'; export type Awaitable = T | Promise;