From 457fcde572c2ce3fcf35f07d9d4ec07c5a97fe85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leandro=20Gon=C3=A7alves?= Date: Thu, 7 Dec 2023 18:45:05 -0300 Subject: [PATCH] Refatory send message to typebox --- Docker/.env.example | 2 +- Dockerfile | 26 +- captain-definition | 4 + src/whatsapp/services/typebot.service.ts | 466 +++++++++++++---------- views/manager.hbs | 2 +- 5 files changed, 288 insertions(+), 212 deletions(-) create mode 100644 captain-definition diff --git a/Docker/.env.example b/Docker/.env.example index 88be79fe..5d604e71 100644 --- a/Docker/.env.example +++ b/Docker/.env.example @@ -106,7 +106,7 @@ QRCODE_COLOR=#198754 AUTHENTICATION_TYPE=apikey ## Define a global apikey to access all instances. ### OBS: This key must be inserted in the request header to create an instance. -AUTHENTICATION_API_KEY=B6D711FCDE4D4FD5936544120E713976 +AUTHENTICATION_API_KEY=xxx AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true ## Set the secret key to encrypt and decrypt your token and its expiration time # seconds - 3600s ===1h | zero (0) - never expires diff --git a/Dockerfile b/Dockerfile index dee414d6..d4b20c56 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,12 +24,12 @@ ENV LOG_LEVEL=ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS ENV LOG_COLOR=true ENV LOG_BAILEYS=error -ENV DEL_INSTANCE=false +ENV DEL_INSTANCE=true ENV STORE_MESSAGES=true ENV STORE_MESSAGE_UP=true -ENV STORE_CONTACTS=true -ENV STORE_CHATS=true +ENV STORE_CONTACTS=false +ENV STORE_CHATS=false ENV CLEAN_STORE_CLEANING_INTERVAL=7200 ENV CLEAN_STORE_MESSAGES=true @@ -37,22 +37,22 @@ ENV CLEAN_STORE_MESSAGE_UP=true ENV CLEAN_STORE_CONTACTS=true ENV CLEAN_STORE_CHATS=true -ENV DATABASE_ENABLED=false -ENV DATABASE_CONNECTION_URI=mongodb://root:root@mongodb:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true +ENV DATABASE_ENABLED=true +ENV DATABASE_CONNECTION_URI= ENV DATABASE_CONNECTION_DB_PREFIX_NAME=evolution -ENV DATABASE_SAVE_DATA_INSTANCE=false -ENV DATABASE_SAVE_DATA_NEW_MESSAGE=false -ENV DATABASE_SAVE_MESSAGE_UPDATE=false -ENV DATABASE_SAVE_DATA_CONTACTS=false -ENV DATABASE_SAVE_DATA_CHATS=false +ENV DATABASE_SAVE_DATA_INSTANCE=true +ENV DATABASE_SAVE_DATA_NEW_MESSAGE=true +ENV DATABASE_SAVE_MESSAGE_UPDATE=true +ENV DATABASE_SAVE_DATA_CONTACTS=true +ENV DATABASE_SAVE_DATA_CHATS=true ENV REDIS_ENABLED=false -ENV REDIS_URI=redis://redis:6379 +ENV REDIS_URI= ENV REDIS_PREFIX_KEY=evolution ENV RABBITMQ_ENABLED=false -ENV RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672 +ENV RABBITMQ_URI= ENV WEBSOCKET_ENABLED=false @@ -100,7 +100,7 @@ ENV QRCODE_COLOR=#198754 ENV AUTHENTICATION_TYPE=apikey -ENV AUTHENTICATION_API_KEY=B6D711FCDE4D4FD5936544120E713976 +ENV AUTHENTICATION_API_KEY= ENV AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true ENV AUTHENTICATION_JWT_EXPIRIN_IN=0 diff --git a/captain-definition b/captain-definition new file mode 100644 index 00000000..04859b54 --- /dev/null +++ b/captain-definition @@ -0,0 +1,4 @@ +{ + "schemaVersion": 2, + "dockerfilePath": "./Dockerfile" +} \ No newline at end of file diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index c329a169..4ea3153d 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -44,6 +44,7 @@ export class TypebotService { if (session) { if (status === 'closed') { + this.logger.verbose(`============== Closing Typebot session to Jid ${remoteJid}! =================`); findData.sessions.splice(findData.sessions.indexOf(session), 1); const typebotData = { @@ -65,6 +66,7 @@ export class TypebotService { findData.sessions.map((session) => { if (session.remoteJid === remoteJid) { + this.logger.verbose(`============== Updating Typebot session to Jid ${remoteJid}! =================`); session.status = status; } }); @@ -120,19 +122,21 @@ export class TypebotService { }); } + const createSessionData = { + url: url, + typebot: typebot, + remoteJid: remoteJid, + expire: expire, + keyword_finish: keyword_finish, + delay_message: delay_message, + unknown_message: unknown_message, + listening_from_me: listening_from_me, + sessions: sessions, + prefilledVariables: prefilledVariables, + }; + if (startSession) { - const response = await this.createNewSession(instance, { - url: url, - typebot: typebot, - remoteJid: remoteJid, - expire: expire, - keyword_finish: keyword_finish, - delay_message: delay_message, - unknown_message: unknown_message, - listening_from_me: listening_from_me, - sessions: sessions, - prefilledVariables: prefilledVariables, - }); + const response = await this.createNewSession(instance, createSessionData); if (response.sessionId) { await this.sendWAMessage(instance, remoteJid, response.messages, response.input, response.clientSideActions); @@ -157,23 +161,33 @@ export class TypebotService { }, }; - const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + try{ - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); + const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); - this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { - remoteJid: remoteJid, - url: url, - typebot: typebot, - variables: variables, - sessionId: id, - }); + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); + + this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { + remoteJid: remoteJid, + url: url, + typebot: typebot, + variables: variables, + sessionId: id, + }); + + }catch(e) { + this.logger.verbose('============== Erro Sending Typebot message! ================='); + this.logger.verbose(e); + + await this.recreateTypebot(instance, remoteJid, createSessionData, url, typebot, prefilledVariables); + + } } return { @@ -239,39 +253,45 @@ export class TypebotService { }, }; - const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + try { + const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); - if (request.data.sessionId) { - data.sessions.push({ - remoteJid: data.remoteJid, - sessionId: `${id}-${request.data.sessionId}`, - status: 'opened', - createdAt: Date.now(), - updateAt: Date.now(), - prefilledVariables: { - ...data.prefilledVariables, + if (request.data.sessionId) { + data.sessions.push({ remoteJid: data.remoteJid, - pushName: data.pushName || '', - instanceName: instance.instanceName, - }, - }); + sessionId: `${id}-${request.data.sessionId}`, + status: 'opened', + createdAt: Date.now(), + updateAt: Date.now(), + prefilledVariables: { + ...data.prefilledVariables, + remoteJid: data.remoteJid, + pushName: data.pushName || '', + instanceName: instance.instanceName, + }, + }); - const typebotData = { - enabled: true, - url: data.url, - typebot: data.typebot, - expire: data.expire, - keyword_finish: data.keyword_finish, - delay_message: data.delay_message, - unknown_message: data.unknown_message, - listening_from_me: data.listening_from_me, - sessions: data.sessions, - }; + const typebotData = { + enabled: true, + url: data.url, + typebot: data.typebot, + expire: data.expire, + keyword_finish: data.keyword_finish, + delay_message: data.delay_message, + unknown_message: data.unknown_message, + listening_from_me: data.listening_from_me, + sessions: data.sessions, + }; - this.create(instance, typebotData); + this.create(instance, typebotData); + } + + return request.data; + + }catch (e) { + this.logger.verbose('============== Erro Trying create new Typebot session! ================='); + this.logger.verbose(e); } - - return request.data; } public async sendWAMessage( @@ -433,19 +453,119 @@ export class TypebotService { const delay_message = findTypebot.delay_message; const unknown_message = findTypebot.unknown_message; const listening_from_me = findTypebot.listening_from_me; + + const prefilledVariables = { + remoteJid: remoteJid, + instanceName: instance.instanceName, + }; + + const createSessionData = { + url: url, + typebot: typebot, + remoteJid: remoteJid, + expire: expire, + keyword_finish: keyword_finish, + delay_message: delay_message, + unknown_message: unknown_message, + listening_from_me: listening_from_me, + sessions: sessions, + prefilledVariables: prefilledVariables, + }; const session = sessions.find((session) => session.remoteJid === remoteJid); + try { + if (session && expire && expire > 0) { + const now = Date.now(); - if (session && expire && expire > 0) { - const now = Date.now(); + const diff = now - session.updateAt; - const diff = now - session.updateAt; + const diffInMinutes = Math.floor(diff / 1000 / 60); - const diffInMinutes = Math.floor(diff / 1000 / 60); + if (diffInMinutes > expire) { + sessions.splice(sessions.indexOf(session), 1); - if (diffInMinutes > expire) { - sessions.splice(sessions.indexOf(session), 1); + const data = await this.createNewSession(instance, { + url: url, + typebot: typebot, + expire: expire, + keyword_finish: keyword_finish, + delay_message: delay_message, + unknown_message: unknown_message, + listening_from_me: listening_from_me, + sessions: sessions, + remoteJid: remoteJid, + pushName: msg.pushName, + }); + await this.sendWAMessage(instance, remoteJid, data.messages, data.input, data.clientSideActions); + + if (data.messages.length === 0) { + const content = this.getConversationMessage(msg.message); + + if (!content) { + if (unknown_message) { + this.waMonitor.waInstances[instance.instanceName].textMessage({ + number: remoteJid.split('@')[0], + options: { + delay: delay_message || 1000, + presence: 'composing', + }, + textMessage: { + text: unknown_message, + }, + }); + } + return; + } + + if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { + sessions.splice(sessions.indexOf(session), 1); + + const typebotData = { + enabled: true, + url: url, + typebot: typebot, + expire: expire, + keyword_finish: keyword_finish, + delay_message: delay_message, + unknown_message: unknown_message, + listening_from_me: listening_from_me, + sessions, + }; + + this.create(instance, typebotData); + + return; + } + + const reqData = { + message: content, + sessionId: data.sessionId, + }; + + const request = await axios.post(url + '/api/v1/sendMessage', reqData); + + console.log('request', request); + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); + } + + return; + } + } + + if (session && session.status !== 'opened') { + this.logger.verbose('====== Typebot session not opened ====='); + this.logger.verbose(session) + return; + } + + if (!session) { const data = await this.createNewSession(instance, { url: url, typebot: typebot, @@ -516,130 +636,15 @@ export class TypebotService { request.data.clientSideActions, ); } - return; } - } - if (session && session.status !== 'opened') { - return; - } - - if (!session) { - const data = await this.createNewSession(instance, { - url: url, - typebot: typebot, - expire: expire, - keyword_finish: keyword_finish, - delay_message: delay_message, - unknown_message: unknown_message, - listening_from_me: listening_from_me, - sessions: sessions, - remoteJid: remoteJid, - pushName: msg.pushName, + sessions.map((session) => { + if (session.remoteJid === remoteJid) { + session.updateAt = Date.now(); + } }); - await this.sendWAMessage(instance, remoteJid, data.messages, data.input, data.clientSideActions); - - if (data.messages.length === 0) { - const content = this.getConversationMessage(msg.message); - - if (!content) { - if (unknown_message) { - this.waMonitor.waInstances[instance.instanceName].textMessage({ - number: remoteJid.split('@')[0], - options: { - delay: delay_message || 1000, - presence: 'composing', - }, - textMessage: { - text: unknown_message, - }, - }); - } - return; - } - - if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { - sessions.splice(sessions.indexOf(session), 1); - - const typebotData = { - enabled: true, - url: url, - typebot: typebot, - expire: expire, - keyword_finish: keyword_finish, - delay_message: delay_message, - unknown_message: unknown_message, - listening_from_me: listening_from_me, - sessions, - }; - - this.create(instance, typebotData); - - return; - } - - const reqData = { - message: content, - sessionId: data.sessionId, - }; - - const request = await axios.post(url + '/api/v1/sendMessage', reqData); - - console.log('request', request); - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); - } - return; - } - - sessions.map((session) => { - if (session.remoteJid === remoteJid) { - session.updateAt = Date.now(); - } - }); - - const typebotData = { - enabled: true, - url: url, - typebot: typebot, - expire: expire, - keyword_finish: keyword_finish, - delay_message: delay_message, - unknown_message: unknown_message, - listening_from_me: listening_from_me, - sessions, - }; - - this.create(instance, typebotData); - - const content = this.getConversationMessage(msg.message); - - if (!content) { - if (unknown_message) { - this.waMonitor.waInstances[instance.instanceName].textMessage({ - number: remoteJid.split('@')[0], - options: { - delay: delay_message || 1000, - presence: 'composing', - }, - textMessage: { - text: unknown_message, - }, - }); - } - return; - } - - if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { - sessions.splice(sessions.indexOf(session), 1); - const typebotData = { enabled: true, url: url, @@ -654,24 +659,91 @@ export class TypebotService { this.create(instance, typebotData); - return; + const content = this.getConversationMessage(msg.message); + + if (!content) { + if (unknown_message) { + this.waMonitor.waInstances[instance.instanceName].textMessage({ + number: remoteJid.split('@')[0], + options: { + delay: delay_message || 1000, + presence: 'composing', + }, + textMessage: { + text: unknown_message, + }, + }); + } + return; + } + + if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { + sessions.splice(sessions.indexOf(session), 1); + + const typebotData = { + enabled: true, + url: url, + typebot: typebot, + expire: expire, + keyword_finish: keyword_finish, + delay_message: delay_message, + unknown_message: unknown_message, + listening_from_me: listening_from_me, + sessions, + }; + + this.create(instance, typebotData); + + return; + } + + const reqData = { + message: content, + sessionId: session.sessionId.split('-')[1], + }; + + const request = await axios.post(url + '/api/v1/sendMessage', reqData); + + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); + } catch(e) { + this.logger.verbose('============== Erro Sending message to Typebot! ================='); + this.logger.verbose(e); + + await this.recreateTypebot(instance, remoteJid, createSessionData, url, typebot, prefilledVariables) } - - const reqData = { - message: content, - sessionId: session.sessionId.split('-')[1], - }; - - const request = await axios.post(url + '/api/v1/sendMessage', reqData); - - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); - return; } + + public async recreateTypebot(instance, remoteJid, createSessionData, url, typebot, prefilledVariables) { + this.logger.verbose('============== Trying recreate session! ================='); + try{ + await this.changeStatus(instance, {remoteJid: remoteJid, status: "closed"}); + + const response = await this.createNewSession(instance, createSessionData); + + if (response.sessionId) { + await this.sendWAMessage(instance, remoteJid, response.messages, response.input, response.clientSideActions); + + this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { + remoteJid: remoteJid, + url: url, + typebot: typebot, + prefilledVariables: prefilledVariables, + sessionId: `${response.sessionId}`, + }); + this.logger.verbose('============== Session recreated! ================='); + } else { + throw new Error('Session ID not found in response'); + } + } catch (e) { + this.logger.verbose('============== Erro trying recreate typebot session! ================='); + this.logger.verbose(e); + } + } } diff --git a/views/manager.hbs b/views/manager.hbs index 57d5fca4..23d46ac9 100644 --- a/views/manager.hbs +++ b/views/manager.hbs @@ -11,7 +11,7 @@ - +