Skip to content

Commit 599560b

Browse files
committed
fix: It is now possible to send images via the Evolution Channel
1 parent 9f30c7b commit 599560b

File tree

3 files changed

+141
-17
lines changed

3 files changed

+141
-17
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
* Fix chatwoot reply quote with Cloud API
1616
* Use exchange name from .env on RabbitMQ
1717
* Fixed chatwoot screen
18+
* It is now possible to send images via the Evolution Channel
1819

1920
# 2.1.0 (2024-08-26 15:33)
2021

src/api/integrations/channel/evolution/evolution.channel.service.ts

Lines changed: 139 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Options, SendAudioDto, SendMediaDto, SendTextDto } from '@api/dto/sendMessage.dto';
1+
import { MediaMessage, Options, SendAudioDto, SendMediaDto, SendTextDto } from '@api/dto/sendMessage.dto';
22
import { ProviderFiles } from '@api/provider/sessions';
33
import { PrismaRepository } from '@api/repository/repository.service';
44
import { chatbotController } from '@api/server.module';
@@ -7,7 +7,9 @@ import { ChannelStartupService } from '@api/services/channel.service';
77
import { Events, wa } from '@api/types/wa.types';
88
import { Chatwoot, ConfigService, Openai } from '@config/env.config';
99
import { BadRequestException, InternalServerErrorException } from '@exceptions';
10+
import { isURL } from 'class-validator';
1011
import EventEmitter2 from 'eventemitter2';
12+
import mime from 'mime';
1113
import { v4 } from 'uuid';
1214

1315
export class EvolutionStartupService extends ChannelStartupService {
@@ -195,7 +197,7 @@ export class EvolutionStartupService extends ChannelStartupService {
195197
}
196198

197199
await this.prismaRepository.contact.updateMany({
198-
where: { remoteJid: contact.remoteJid },
200+
where: { remoteJid: contact.remoteJid, instanceId: this.instanceId },
199201
data: contactRaw,
200202
});
201203
return;
@@ -271,18 +273,74 @@ export class EvolutionStartupService extends ChannelStartupService {
271273

272274
const messageId = v4();
273275

274-
const messageRaw: any = {
275-
key: { fromMe: true, id: messageId, remoteJid: number },
276-
message: {
277-
...message,
278-
quoted,
279-
},
280-
messageType: 'conversation',
281-
messageTimestamp: Math.round(new Date().getTime() / 1000),
282-
webhookUrl,
283-
source: 'unknown',
284-
instanceId: this.instanceId,
285-
};
276+
let messageRaw: any;
277+
278+
if (message?.mediaType === 'image') {
279+
messageRaw = {
280+
key: { fromMe: true, id: messageId, remoteJid: number },
281+
message: {
282+
mediaUrl: message.media,
283+
quoted,
284+
},
285+
messageType: 'imageMessage',
286+
messageTimestamp: Math.round(new Date().getTime() / 1000),
287+
webhookUrl,
288+
source: 'unknown',
289+
instanceId: this.instanceId,
290+
};
291+
} else if (message?.mediaType === 'video') {
292+
messageRaw = {
293+
key: { fromMe: true, id: messageId, remoteJid: number },
294+
message: {
295+
mediaUrl: message.media,
296+
quoted,
297+
},
298+
messageType: 'videoMessage',
299+
messageTimestamp: Math.round(new Date().getTime() / 1000),
300+
webhookUrl,
301+
source: 'unknown',
302+
instanceId: this.instanceId,
303+
};
304+
} else if (message?.mediaType === 'audio') {
305+
messageRaw = {
306+
key: { fromMe: true, id: messageId, remoteJid: number },
307+
message: {
308+
mediaUrl: message.media,
309+
quoted,
310+
},
311+
messageType: 'audioMessage',
312+
messageTimestamp: Math.round(new Date().getTime() / 1000),
313+
webhookUrl,
314+
source: 'unknown',
315+
instanceId: this.instanceId,
316+
};
317+
} else if (message?.mediaType === 'document') {
318+
messageRaw = {
319+
key: { fromMe: true, id: messageId, remoteJid: number },
320+
message: {
321+
mediaUrl: message.media,
322+
quoted,
323+
},
324+
messageType: 'documentMessage',
325+
messageTimestamp: Math.round(new Date().getTime() / 1000),
326+
webhookUrl,
327+
source: 'unknown',
328+
instanceId: this.instanceId,
329+
};
330+
} else {
331+
messageRaw = {
332+
key: { fromMe: true, id: messageId, remoteJid: number },
333+
message: {
334+
...message,
335+
quoted,
336+
},
337+
messageType: 'conversation',
338+
messageTimestamp: Math.round(new Date().getTime() / 1000),
339+
webhookUrl,
340+
source: 'unknown',
341+
instanceId: this.instanceId,
342+
};
343+
}
286344

287345
this.logger.log(messageRaw);
288346

@@ -334,9 +392,51 @@ export class EvolutionStartupService extends ChannelStartupService {
334392
return res;
335393
}
336394

395+
protected async prepareMediaMessage(mediaMessage: MediaMessage) {
396+
try {
397+
if (mediaMessage.mediatype === 'document' && !mediaMessage.fileName) {
398+
const regex = new RegExp(/.*\/(.+?)\./);
399+
const arrayMatch = regex.exec(mediaMessage.media);
400+
mediaMessage.fileName = arrayMatch[1];
401+
}
402+
403+
if (mediaMessage.mediatype === 'image' && !mediaMessage.fileName) {
404+
mediaMessage.fileName = 'image.png';
405+
}
406+
407+
if (mediaMessage.mediatype === 'video' && !mediaMessage.fileName) {
408+
mediaMessage.fileName = 'video.mp4';
409+
}
410+
411+
let mimetype: string;
412+
413+
const prepareMedia: any = {
414+
caption: mediaMessage?.caption,
415+
fileName: mediaMessage.fileName,
416+
mediaType: mediaMessage.mediatype,
417+
media: mediaMessage.media,
418+
gifPlayback: false,
419+
};
420+
421+
if (isURL(mediaMessage.media)) {
422+
mimetype = mime.getType(mediaMessage.media);
423+
} else {
424+
mimetype = mime.getType(mediaMessage.fileName);
425+
}
426+
427+
prepareMedia.mimetype = mimetype;
428+
429+
return prepareMedia;
430+
} catch (error) {
431+
this.logger.error(error);
432+
throw new InternalServerErrorException(error?.toString() || error);
433+
}
434+
}
435+
337436
public async mediaMessage(data: SendMediaDto, isIntegration = false) {
338-
const message = data;
437+
const message = await this.prepareMediaMessage(data);
339438

439+
console.log('message', message);
340440
return await this.sendMessageWithTyping(
341441
data.number,
342442
{ ...message },
@@ -352,8 +452,31 @@ export class EvolutionStartupService extends ChannelStartupService {
352452
);
353453
}
354454

455+
public async processAudio(audio: string, number: string) {
456+
number = number.replace(/\D/g, '');
457+
const hash = `${number}-${new Date().getTime()}`;
458+
459+
let mimetype: string;
460+
461+
const prepareMedia: any = {
462+
fileName: `${hash}.mp4`,
463+
mediaType: 'audio',
464+
media: audio,
465+
};
466+
467+
if (isURL(audio)) {
468+
mimetype = mime.getType(audio);
469+
} else {
470+
mimetype = mime.getType(prepareMedia.fileName);
471+
}
472+
473+
prepareMedia.mimetype = mimetype;
474+
475+
return prepareMedia;
476+
}
477+
355478
public async audioWhatsapp(data: SendAudioDto, isIntegration = false) {
356-
const message = data;
479+
const message = await this.processAudio(data.audio, data.number);
357480

358481
return await this.sendMessageWithTyping(
359482
data.number,

src/api/integrations/chatbot/chatwoot/services/chatwoot.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,7 @@ export class ChatwootService {
635635
}
636636
}
637637
} else {
638-
const jid = isGroup ? null : body.key.remoteJid;
638+
const jid = body.key.remoteJid;
639639
contact = await this.createContact(
640640
instance,
641641
chatId,

0 commit comments

Comments
 (0)