1- import { Options , SendAudioDto , SendMediaDto , SendTextDto } from '@api/dto/sendMessage.dto' ;
1+ import { MediaMessage , Options , SendAudioDto , SendMediaDto , SendTextDto } from '@api/dto/sendMessage.dto' ;
22import { ProviderFiles } from '@api/provider/sessions' ;
33import { PrismaRepository } from '@api/repository/repository.service' ;
44import { chatbotController } from '@api/server.module' ;
@@ -7,7 +7,9 @@ import { ChannelStartupService } from '@api/services/channel.service';
77import { Events , wa } from '@api/types/wa.types' ;
88import { Chatwoot , ConfigService , Openai } from '@config/env.config' ;
99import { BadRequestException , InternalServerErrorException } from '@exceptions' ;
10+ import { isURL } from 'class-validator' ;
1011import EventEmitter2 from 'eventemitter2' ;
12+ import mime from 'mime' ;
1113import { v4 } from 'uuid' ;
1214
1315export 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 ,
0 commit comments