From 0544d80cbd0a0870ebc1651dd1ede836b8a51f9e Mon Sep 17 00:00:00 2001 From: Felipe Medeiros Date: Fri, 20 Sep 2024 17:32:39 -0300 Subject: [PATCH 1/2] =?UTF-8?q?refactor:=20padroniza=20retorno=20da=20fun?= =?UTF-8?q?=C3=A7=C3=A3o=20sendMessage=20no=20Baileys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ajusta o retorno da função "sendMessage" para usar a variável "messageRaw" em vez de "messageSent", garantindo consistência no retorno. --- .../whatsapp/whatsapp.baileys.service.ts | 108 +++++++++++++++++- 1 file changed, 103 insertions(+), 5 deletions(-) diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 89347790..6546db6e 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -620,7 +620,7 @@ export class BaileysStartupService extends ChannelStartupService { const existingChatIdSet = new Set(existingChatIds.map((chat) => chat.remoteJid)); const chatsToInsert = chats - .filter((chat) => !existingChatIdSet.has(chat.id)) + .filter((chat) => !existingChatIdSet?.has(chat.id)) .map((chat) => ({ remoteJid: chat.id, instanceId: this.instanceId, name: chat.name })); this.sendDataWebhook(Events.CHATS_UPSERT, chatsToInsert); @@ -757,6 +757,7 @@ export class BaileysStartupService extends ChannelStartupService { ); } } catch (error) { + console.error(error); this.logger.error('line 817'); this.logger.error(`Error: ${error.message}`); } @@ -849,7 +850,7 @@ export class BaileysStartupService extends ChannelStartupService { ); for (const chat of chats) { - if (chatsRepository.has(chat.id)) { + if (chatsRepository?.has(chat.id)) { continue; } @@ -906,7 +907,7 @@ export class BaileysStartupService extends ChannelStartupService { } } - if (messagesRepository.has(m.key.id)) { + if (messagesRepository?.has(m.key.id)) { continue; } @@ -1053,6 +1054,7 @@ export class BaileysStartupService extends ChannelStartupService { }; if (messageRaw.message.extendedTextMessage) { + messageRaw.messageType = 'conversation'; messageRaw.message.conversation = messageRaw.message.extendedTextMessage.text; delete messageRaw.message.extendedTextMessage; } @@ -1949,6 +1951,14 @@ export class BaileysStartupService extends ChannelStartupService { messageSent = await this.sendMessage(sender, message, mentions, linkPreview, quoted); } + const isMedia = + messageSent?.message?.imageMessage || + messageSent?.message?.videoMessage || + messageSent?.message?.stickerMessage || + messageSent?.message?.documentMessage || + messageSent?.message?.documentWithCaptionMessage || + messageSent?.message?.audioMessage; + const contentMsg = messageSent.message[getContentType(messageSent.message)] as any; if (Long.isLong(messageSent?.messageTimestamp)) { @@ -1967,10 +1977,98 @@ export class BaileysStartupService extends ChannelStartupService { }; if (messageRaw.message.extendedTextMessage) { + messageRaw.messageType = 'conversation'; messageRaw.message.conversation = messageRaw.message.extendedTextMessage.text; delete messageRaw.message.extendedTextMessage; } + if (this.configService.get('DATABASE').SAVE_DATA.NEW_MESSAGE) { + const msg = await this.prismaRepository.message.create({ + data: messageRaw, + }); + + if (isMedia && this.configService.get('S3').ENABLE) { + try { + const message: any = messageSent; + const media = await this.getBase64FromMediaMessage( + { + message, + }, + true, + ); + + const { buffer, mediaType, fileName, size } = media; + + const mimetype = mime.getType(fileName).toString(); + + const fullName = join(`${this.instance.id}`, messageSent.key.remoteJid, mediaType, fileName); + + await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { + 'Content-Type': mimetype, + }); + + await this.prismaRepository.media.create({ + data: { + messageId: msg.id, + instanceId: this.instanceId, + type: mediaType, + fileName: fullName, + mimetype, + }, + }); + + const mediaUrl = await s3Service.getObjectUrl(fullName); + + messageRaw.message.mediaUrl = mediaUrl; + + await this.prismaRepository.message.update({ + where: { id: msg.id }, + data: messageRaw, + }); + } catch (error) { + this.logger.error(['Error on upload file to minio', error?.message, error?.stack]); + } + } + } + + if (isMedia && !this.configService.get('S3').ENABLE) { + const buffer = await downloadMediaMessage( + { key: messageSent.key, message: messageSent?.message }, + 'buffer', + {}, + { + logger: P({ level: 'error' }) as any, + reuploadRequest: this.client.updateMediaMessage, + }, + ); + + messageRaw.message.base64 = buffer ? buffer.toString('base64') : undefined; + } + + if (this.configService.get('OPENAI').ENABLED) { + const openAiDefaultSettings = await this.prismaRepository.openaiSetting.findFirst({ + where: { + instanceId: this.instanceId, + }, + include: { + OpenaiCreds: true, + }, + }); + + if ( + openAiDefaultSettings && + openAiDefaultSettings.openaiCredsId && + openAiDefaultSettings.speechToText && + messageSent?.message?.audioMessage + ) { + messageRaw.message.speechToText = await this.openaiService.speechToText( + openAiDefaultSettings.OpenaiCreds, + messageSent, + this.client.updateMediaMessage, + ); + } + } + this.logger.log(messageRaw); this.sendDataWebhook(Events.SEND_MESSAGE, messageRaw); @@ -2052,7 +2150,7 @@ export class BaileysStartupService extends ChannelStartupService { } } - return messageSent; + return messageRaw; } catch (error) { this.logger.error('line 2081'); this.logger.error(error); @@ -3314,7 +3412,7 @@ export class BaileysStartupService extends ChannelStartupService { const cacheConf = configService.get('CACHE'); if ((cacheConf?.REDIS?.ENABLED && cacheConf?.REDIS?.URI !== '') || cacheConf?.LOCAL?.ENABLED) { - if (await groupMetadataCache.has(groupJid)) { + if (await groupMetadataCache?.has(groupJid)) { console.log(`Cache request for group: ${groupJid}`); const meta = await groupMetadataCache.get(groupJid); From 92373812c122f51908e7f7d2ef62c1e1dff746a4 Mon Sep 17 00:00:00 2001 From: Felipe Medeiros Date: Fri, 20 Sep 2024 17:37:37 -0300 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20simplifica=20fun=C3=A7=C3=A3o?= =?UTF-8?q?=20sendMessage=20no=20Baileys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove lógica duplicada de salvar mensagens no banco de dados e upload de mídia para o S3 - Padroniza o retorno da função, utilizando "messageRaw" - Simplifica a validação da instância - Elimina a verificação de configuração do S3 para envio de mídias --- .../whatsapp/whatsapp.baileys.service.ts | 51 +------------------ 1 file changed, 1 insertion(+), 50 deletions(-) diff --git a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts index 6546db6e..17ad028f 100644 --- a/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts +++ b/src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts @@ -1982,56 +1982,7 @@ export class BaileysStartupService extends ChannelStartupService { delete messageRaw.message.extendedTextMessage; } - if (this.configService.get('DATABASE').SAVE_DATA.NEW_MESSAGE) { - const msg = await this.prismaRepository.message.create({ - data: messageRaw, - }); - - if (isMedia && this.configService.get('S3').ENABLE) { - try { - const message: any = messageSent; - const media = await this.getBase64FromMediaMessage( - { - message, - }, - true, - ); - - const { buffer, mediaType, fileName, size } = media; - - const mimetype = mime.getType(fileName).toString(); - - const fullName = join(`${this.instance.id}`, messageSent.key.remoteJid, mediaType, fileName); - - await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { - 'Content-Type': mimetype, - }); - - await this.prismaRepository.media.create({ - data: { - messageId: msg.id, - instanceId: this.instanceId, - type: mediaType, - fileName: fullName, - mimetype, - }, - }); - - const mediaUrl = await s3Service.getObjectUrl(fullName); - - messageRaw.message.mediaUrl = mediaUrl; - - await this.prismaRepository.message.update({ - where: { id: msg.id }, - data: messageRaw, - }); - } catch (error) { - this.logger.error(['Error on upload file to minio', error?.message, error?.stack]); - } - } - } - - if (isMedia && !this.configService.get('S3').ENABLE) { + if (isMedia) { const buffer = await downloadMediaMessage( { key: messageSent.key, message: messageSent?.message }, 'buffer',