From 8a99386b33d970297a012fd9351c653bca6256d6 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sat, 28 Oct 2023 21:21:12 -0300 Subject: [PATCH 1/5] handle erros --- src/whatsapp/services/typebot.service.ts | 44 +++++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 659309e1..f9a07de3 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -96,6 +96,8 @@ export class TypebotService { } public async startTypebot(instance: InstanceDto, data: any) { + if (data.remoteJid === 'status@broadcast') return; + const remoteJid = data.remoteJid; const url = data.url; const typebot = data.typebot; @@ -155,7 +157,13 @@ export class TypebotService { }, }; - const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + let request: any; + try { + request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + } catch (error) { + this.logger.error(error); + return; + } await this.sendWAMessage( instance, @@ -224,7 +232,9 @@ export class TypebotService { } public async createNewSession(instance: InstanceDto, data: any) { + if (data.remoteJid === 'status@broadcast') return; const id = Math.floor(Math.random() * 10000000000).toString(); + const reqData = { startParams: { typebot: data.typebot, @@ -237,7 +247,13 @@ export class TypebotService { }, }; - const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + let request: any; + try { + request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + } catch (error) { + this.logger.error(error); + return; + } if (request.data.sessionId) { data.sessions.push({ @@ -503,7 +519,13 @@ export class TypebotService { sessionId: data.sessionId, }; - const request = await axios.post(url + '/api/v1/sendMessage', reqData); + let request: any; + try { + request = await axios.post(url + '/api/v1/sendMessage', reqData); + } catch (error) { + this.logger.error(error); + return; + } console.log('request', request); await this.sendWAMessage( @@ -583,7 +605,13 @@ export class TypebotService { sessionId: data.sessionId, }; - const request = await axios.post(url + '/api/v1/sendMessage', reqData); + let request: any; + try { + request = await axios.post(url + '/api/v1/sendMessage', reqData); + } catch (error) { + this.logger.error(error); + return; + } console.log('request', request); await this.sendWAMessage( @@ -660,7 +688,13 @@ export class TypebotService { sessionId: session.sessionId.split('-')[1], }; - const request = await axios.post(url + '/api/v1/sendMessage', reqData); + let request: any; + try { + request = await axios.post(url + '/api/v1/sendMessage', reqData); + } catch (error) { + this.logger.error(error); + return; + } await this.sendWAMessage( instance, From 0817c2589fc3b5763afcecdc962345ae776e7003 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sun, 29 Oct 2023 12:49:26 -0300 Subject: [PATCH 2/5] expand try catch for all function --- src/whatsapp/services/typebot.service.ts | 92 ++++++++++++------------ 1 file changed, 45 insertions(+), 47 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index f9a07de3..6a8052e4 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -157,29 +157,28 @@ export class TypebotService { }, }; - let request: any; try { - request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + const request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + + 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 (error) { this.logger.error(error); return; } - - 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, - }); } return { @@ -255,7 +254,7 @@ export class TypebotService { return; } - if (request.data.sessionId) { + if (request?.data?.sessionId) { data.sessions.push({ remoteJid: data.remoteJid, sessionId: `${id}-${request.data.sessionId}`, @@ -519,22 +518,21 @@ export class TypebotService { sessionId: data.sessionId, }; - let request: any; try { - request = await axios.post(url + '/api/v1/sendMessage', reqData); + 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, + ); } catch (error) { this.logger.error(error); return; } - - console.log('request', request); - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); } return; @@ -608,19 +606,19 @@ export class TypebotService { let request: any; try { 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, + ); } catch (error) { this.logger.error(error); return; } - - console.log('request', request); - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); } return; } @@ -691,19 +689,19 @@ export class TypebotService { let request: any; try { request = await axios.post(url + '/api/v1/sendMessage', reqData); + + await this.sendWAMessage( + instance, + remoteJid, + request.data.messages, + request.data.input, + request.data.clientSideActions, + ); } catch (error) { this.logger.error(error); return; } - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); - return; } } From f71089884486fcddea0db41fa378df584efb9ef8 Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sun, 29 Oct 2023 12:59:29 -0300 Subject: [PATCH 3/5] fix: in error catch in createNewSession --- .vscode/settings.json | 4 +- src/whatsapp/services/typebot.service.ts | 118 ++++++++++++++--------- 2 files changed, 78 insertions(+), 44 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 5bc52817..20b82443 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,5 +7,7 @@ "editor.codeActionsOnSave": { "source.fixAll.eslint": true, "source.fixAll": true - } + }, + "prisma-smart-formatter.typescript.defaultFormatter": "esbenp.prettier-vscode", + "prisma-smart-formatter.prisma.defaultFormatter": "Prisma.prisma" } \ No newline at end of file diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index 6a8052e4..c9894f75 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -47,7 +47,7 @@ export class TypebotService { findData.sessions.splice(findData.sessions.indexOf(session), 1); const typebotData = { - enabled: true, + enabled: findData.enabled, url: findData.url, typebot: findData.typebot, expire: findData.expire, @@ -71,7 +71,7 @@ export class TypebotService { } const typebotData = { - enabled: true, + enabled: findData.enabled, url: findData.url, typebot: findData.typebot, expire: findData.expire, @@ -104,7 +104,6 @@ export class TypebotService { const startSession = data.startSession; const variables = data.variables; const findTypebot = await this.find(instance); - const sessions = (findTypebot.sessions as Session[]) ?? []; const expire = findTypebot.expire; const keyword_finish = findTypebot.keyword_finish; const delay_message = findTypebot.delay_message; @@ -116,12 +115,17 @@ export class TypebotService { instanceName: instance.instanceName, }; - variables.forEach((variable) => { - prefilledVariables[variable.name] = variable.value; - }); + if (variables?.length) { + variables.forEach((variable: { name: string | number; value: string }) => { + prefilledVariables[variable.name] = variable.value; + }); + } if (startSession) { + const newSessions = await this.clearSessions(instance, remoteJid); + const response = await this.createNewSession(instance, { + enabled: findTypebot.enabled, url: url, typebot: typebot, remoteJid: remoteJid, @@ -130,7 +134,7 @@ export class TypebotService { delay_message: delay_message, unknown_message: unknown_message, listening_from_me: listening_from_me, - sessions: sessions, + sessions: newSessions, prefilledVariables: prefilledVariables, }); @@ -246,45 +250,74 @@ export class TypebotService { }, }; - let request: any; try { - request = await axios.post(data.url + '/api/v1/sendMessage', reqData); + 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, + remoteJid: data.remoteJid, + pushName: data.pushName || '', + instanceName: instance.instanceName, + }, + }); + + const typebotData = { + enabled: data.enabled, + 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); + } + return request.data; } catch (error) { this.logger.error(error); return; } + } - 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, - remoteJid: data.remoteJid, - pushName: data.pushName || '', - instanceName: instance.instanceName, - }, + public async clearSessions(instance: InstanceDto, remoteJid: string) { + const findTypebot = await this.find(instance); + const sessions = (findTypebot.sessions as Session[]) ?? []; + + const sessionWithRemoteJid = sessions.filter((session) => session.remoteJid === remoteJid); + + if (sessionWithRemoteJid.length > 0) { + sessionWithRemoteJid.forEach((session) => { + sessions.splice(sessions.indexOf(session), 1); }); 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, + enabled: findTypebot.enabled, + url: findTypebot.url, + typebot: findTypebot.typebot, + expire: findTypebot.expire, + keyword_finish: findTypebot.keyword_finish, + delay_message: findTypebot.delay_message, + unknown_message: findTypebot.unknown_message, + listening_from_me: findTypebot.listening_from_me, + sessions, }; this.create(instance, typebotData); + + return sessions; } - return request.data; + return sessions; } public async sendWAMessage( @@ -457,9 +490,10 @@ export class TypebotService { const diffInMinutes = Math.floor(diff / 1000 / 60); if (diffInMinutes > expire) { - sessions.splice(sessions.indexOf(session), 1); + const newSessions = await this.clearSessions(instance, remoteJid); const data = await this.createNewSession(instance, { + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, @@ -467,7 +501,7 @@ export class TypebotService { delay_message: delay_message, unknown_message: unknown_message, listening_from_me: listening_from_me, - sessions: sessions, + sessions: newSessions, remoteJid: remoteJid, pushName: msg.pushName, }); @@ -494,10 +528,10 @@ export class TypebotService { } if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { - sessions.splice(sessions.indexOf(session), 1); + const newSessions = await this.clearSessions(instance, remoteJid); const typebotData = { - enabled: true, + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, @@ -505,7 +539,7 @@ export class TypebotService { delay_message: delay_message, unknown_message: unknown_message, listening_from_me: listening_from_me, - sessions, + sessions: newSessions, }; this.create(instance, typebotData); @@ -521,7 +555,6 @@ export class TypebotService { try { const request = await axios.post(url + '/api/v1/sendMessage', reqData); - console.log('request', request); await this.sendWAMessage( instance, remoteJid, @@ -545,6 +578,7 @@ export class TypebotService { if (!session) { const data = await this.createNewSession(instance, { + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, @@ -582,7 +616,7 @@ export class TypebotService { sessions.splice(sessions.indexOf(session), 1); const typebotData = { - enabled: true, + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, @@ -606,8 +640,6 @@ export class TypebotService { let request: any; try { request = await axios.post(url + '/api/v1/sendMessage', reqData); - - console.log('request', request); await this.sendWAMessage( instance, remoteJid, @@ -630,7 +662,7 @@ export class TypebotService { }); const typebotData = { - enabled: true, + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, @@ -665,7 +697,7 @@ export class TypebotService { sessions.splice(sessions.indexOf(session), 1); const typebotData = { - enabled: true, + enabled: findTypebot.enabled, url: url, typebot: typebot, expire: expire, From e30f196dad49e6d34095a49e7086263ac0871fca Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Sun, 29 Oct 2023 13:22:41 -0300 Subject: [PATCH 4/5] remove duplicate --- src/whatsapp/services/typebot.service.ts | 31 ------------------------ 1 file changed, 31 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index fe5cd2c1..c9894f75 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -320,37 +320,6 @@ export class TypebotService { return sessions; } - public async clearSessions(instance: InstanceDto, remoteJid: string) { - const findTypebot = await this.find(instance); - const sessions = (findTypebot.sessions as Session[]) ?? []; - - const sessionWithRemoteJid = sessions.filter((session) => session.remoteJid === remoteJid); - - if (sessionWithRemoteJid.length > 0) { - sessionWithRemoteJid.forEach((session) => { - sessions.splice(sessions.indexOf(session), 1); - }); - - const typebotData = { - enabled: findTypebot.enabled, - url: findTypebot.url, - typebot: findTypebot.typebot, - expire: findTypebot.expire, - keyword_finish: findTypebot.keyword_finish, - delay_message: findTypebot.delay_message, - unknown_message: findTypebot.unknown_message, - listening_from_me: findTypebot.listening_from_me, - sessions, - }; - - this.create(instance, typebotData); - - return sessions; - } - - return sessions; - } - public async sendWAMessage( instance: InstanceDto, remoteJid: string, From ac5fc2204328d46d34b4a81ba64a2005b88ff64b Mon Sep 17 00:00:00 2001 From: Gabriel Pastori <58153955+gabrielpastori1@users.noreply.github.com> Date: Mon, 30 Oct 2023 18:05:18 -0300 Subject: [PATCH 5/5] try catch entire sendTypebot --- src/whatsapp/services/typebot.service.ts | 291 +++++++++++------------ 1 file changed, 145 insertions(+), 146 deletions(-) diff --git a/src/whatsapp/services/typebot.service.ts b/src/whatsapp/services/typebot.service.ts index c9894f75..9579cffd 100644 --- a/src/whatsapp/services/typebot.service.ts +++ b/src/whatsapp/services/typebot.service.ts @@ -482,16 +482,102 @@ export class TypebotService { const session = sessions.find((session) => session.remoteJid === remoteJid); - if (session && expire && expire > 0) { - const now = Date.now(); + try { + 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) { - const newSessions = await this.clearSessions(instance, remoteJid); + if (diffInMinutes > expire) { + const newSessions = await this.clearSessions(instance, remoteJid); + const data = await this.createNewSession(instance, { + enabled: findTypebot.enabled, + 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: newSessions, + 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()) { + const newSessions = await this.clearSessions(instance, remoteJid); + + const typebotData = { + enabled: findTypebot.enabled, + 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: newSessions, + }; + + this.create(instance, typebotData); + + return; + } + + const reqData = { + message: content, + sessionId: data.sessionId, + }; + + try { + 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 (error) { + this.logger.error(error); + return; + } + } + + return; + } + } + + if (session && session.status !== 'opened') { + return; + } + + if (!session) { const data = await this.createNewSession(instance, { enabled: findTypebot.enabled, url: url, @@ -501,7 +587,7 @@ export class TypebotService { delay_message: delay_message, unknown_message: unknown_message, listening_from_me: listening_from_me, - sessions: newSessions, + sessions: sessions, remoteJid: remoteJid, pushName: msg.pushName, }); @@ -528,7 +614,7 @@ export class TypebotService { } if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { - const newSessions = await this.clearSessions(instance, remoteJid); + sessions.splice(sessions.indexOf(session), 1); const typebotData = { enabled: findTypebot.enabled, @@ -539,7 +625,7 @@ export class TypebotService { delay_message: delay_message, unknown_message: unknown_message, listening_from_me: listening_from_me, - sessions: newSessions, + sessions, }; this.create(instance, typebotData); @@ -552,9 +638,9 @@ export class TypebotService { sessionId: data.sessionId, }; + let request: any; try { - const request = await axios.post(url + '/api/v1/sendMessage', reqData); - + request = await axios.post(url + '/api/v1/sendMessage', reqData); await this.sendWAMessage( instance, remoteJid, @@ -567,135 +653,15 @@ export class TypebotService { return; } } - return; } - } - if (session && session.status !== 'opened') { - return; - } - - if (!session) { - const data = await this.createNewSession(instance, { - enabled: findTypebot.enabled, - 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: findTypebot.enabled, - 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, - }; - - let request: any; - try { - request = await axios.post(url + '/api/v1/sendMessage', reqData); - await this.sendWAMessage( - instance, - remoteJid, - request.data.messages, - request.data.input, - request.data.clientSideActions, - ); - } catch (error) { - this.logger.error(error); - return; - } - } - return; - } - - sessions.map((session) => { - if (session.remoteJid === remoteJid) { - session.updateAt = Date.now(); - } - }); - - const typebotData = { - enabled: findTypebot.enabled, - 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: findTypebot.enabled, url: url, @@ -710,17 +676,50 @@ export class TypebotService { this.create(instance, typebotData); - return; - } + const content = this.getConversationMessage(msg.message); - const reqData = { - message: content, - sessionId: session.sessionId.split('-')[1], - }; + 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; + } - let request: any; - try { - request = await axios.post(url + '/api/v1/sendMessage', reqData); + if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { + sessions.splice(sessions.indexOf(session), 1); + + const typebotData = { + enabled: findTypebot.enabled, + 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, @@ -729,11 +728,11 @@ export class TypebotService { request.data.input, request.data.clientSideActions, ); + + return; } catch (error) { this.logger.error(error); return; } - - return; } }