Skip to content

Commit ccd90a6

Browse files
add: initial support for preview and reference from messages with Ads metadata
1 parent c16f962 commit ccd90a6

1 file changed

Lines changed: 74 additions & 0 deletions

File tree

src/whatsapp/services/chatwoot.service.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,6 +1125,20 @@ export class ChatwootService {
11251125
return result;
11261126
}
11271127

1128+
private getAdsMessage(msg: any) {
1129+
interface AdsMessage {
1130+
title: string;
1131+
body: string;
1132+
thumbnailUrl: string;
1133+
sourceUrl: string;
1134+
}
1135+
let adsMessage: AdsMessage | undefined = msg.extendedTextMessage?.contextInfo.externalAdReply;
1136+
1137+
this.logger.verbose('Get ads message if it exist');
1138+
adsMessage && this.logger.verbose('Ads message: ' + adsMessage);
1139+
return adsMessage;
1140+
}
1141+
11281142
private getTypeMessage(msg: any) {
11291143
this.logger.verbose('get type message');
11301144

@@ -1278,6 +1292,8 @@ export class ChatwootService {
12781292

12791293
const isMedia = this.isMediaMessage(body.message);
12801294

1295+
const adsMessage = this.getAdsMessage(body.message);
1296+
12811297
if (!bodyMessage && !isMedia) {
12821298
this.logger.warn('no body message found');
12831299
return;
@@ -1378,6 +1394,64 @@ export class ChatwootService {
13781394
}
13791395
}
13801396

1397+
this.logger.verbose('check if has Ads Message');
1398+
if (adsMessage) {
1399+
this.logger.verbose('message is from Ads');
1400+
1401+
this.logger.verbose('get base64 from media ads message');
1402+
const getBase64AdMsg = await axios.get(adsMessage.thumbnailUrl, { responseType: 'arraybuffer' });
1403+
const base64 = getBase64AdMsg.data.toString('base64');
1404+
1405+
const contentType = getBase64AdMsg.headers['content-type'];
1406+
const extension = mimeTypes.extension(contentType);
1407+
const mimeType = extension && mimeTypes.lookup(extension);
1408+
1409+
if (!mimeType) {
1410+
this.logger.warn('mimetype of Ads message not found');
1411+
return;
1412+
}
1413+
1414+
const random = Math.random().toString(36).substring(7);
1415+
const nameFile = `${random}.${mimeTypes.extension(mimeType)}`;
1416+
const fileData = Buffer.from(base64, 'base64');
1417+
const fileName = `${path.join(waInstance?.storePath, 'temp', `${nameFile}`)}`;
1418+
1419+
this.logger.verbose('temp file name: ' + nameFile);
1420+
1421+
this.logger.verbose('create temp file');
1422+
writeFileSync(fileName, fileData, 'utf8');
1423+
const truncStr = (str: string, len: number) => {
1424+
return str.length > len ? str.substring(0, len) + '...' : str;
1425+
};
1426+
1427+
const title = truncStr(adsMessage.title, 40);
1428+
const description = truncStr(adsMessage.body, 75);
1429+
1430+
this.logger.verbose('send data to chatwoot');
1431+
const send = await this.sendData(
1432+
getConversation,
1433+
fileName,
1434+
messageType,
1435+
`${bodyMessage}\n\n\n**${title}**\n${description}\n${adsMessage.sourceUrl}`,
1436+
);
1437+
1438+
if (!send) {
1439+
this.logger.warn('message not sent');
1440+
return;
1441+
}
1442+
1443+
this.messageCacheFile = path.join(ROOT_DIR, 'store', 'chatwoot', `${instance.instanceName}_cache.txt`);
1444+
1445+
this.messageCache = this.loadMessageCache();
1446+
1447+
this.messageCache.add(send.id.toString());
1448+
1449+
this.logger.verbose('save message cache');
1450+
this.saveMessageCache();
1451+
1452+
return send;
1453+
}
1454+
13811455
this.logger.verbose('check if is group');
13821456
if (body.key.remoteJid.includes('@g.us')) {
13831457
this.logger.verbose('message is group');

0 commit comments

Comments
 (0)