Merge pull request #198 from gabrielpastori1/fix-typebot-error-handle

Handle erros in Typebot
This commit is contained in:
Davidson Gomes 2023-11-09 14:32:30 -03:00 committed by GitHub
commit c619e253a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 228 additions and 198 deletions

View File

@ -7,5 +7,7 @@
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": true, "source.fixAll.eslint": true,
"source.fixAll": true "source.fixAll": true
} },
"prisma-smart-formatter.typescript.defaultFormatter": "esbenp.prettier-vscode",
"prisma-smart-formatter.prisma.defaultFormatter": "Prisma.prisma"
} }

View File

@ -96,6 +96,8 @@ export class TypebotService {
} }
public async startTypebot(instance: InstanceDto, data: any) { public async startTypebot(instance: InstanceDto, data: any) {
if (data.remoteJid === 'status@broadcast') return;
const remoteJid = data.remoteJid; const remoteJid = data.remoteJid;
const url = data.url; const url = data.url;
const typebot = data.typebot; const typebot = data.typebot;
@ -159,23 +161,28 @@ 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);
await this.sendWAMessage( await this.sendWAMessage(
instance, instance,
remoteJid, remoteJid,
request.data.messages, request.data.messages,
request.data.input, request.data.input,
request.data.clientSideActions, request.data.clientSideActions,
); );
this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, {
remoteJid: remoteJid, remoteJid: remoteJid,
url: url, url: url,
typebot: typebot, typebot: typebot,
variables: variables, variables: variables,
sessionId: id, sessionId: id,
}); });
} catch (error) {
this.logger.error(error);
return;
}
} }
return { return {
@ -228,7 +235,9 @@ export class TypebotService {
} }
public async createNewSession(instance: InstanceDto, data: any) { public async createNewSession(instance: InstanceDto, data: any) {
if (data.remoteJid === 'status@broadcast') return;
const id = Math.floor(Math.random() * 10000000000).toString(); const id = Math.floor(Math.random() * 10000000000).toString();
const reqData = { const reqData = {
startParams: { startParams: {
typebot: data.typebot, typebot: data.typebot,
@ -241,39 +250,43 @@ 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) { if (request?.data?.sessionId) {
data.sessions.push({ 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, remoteJid: data.remoteJid,
pushName: data.pushName || '', sessionId: `${id}-${request.data.sessionId}`,
instanceName: instance.instanceName, status: 'opened',
}, createdAt: Date.now(),
}); updateAt: Date.now(),
prefilledVariables: {
...data.prefilledVariables,
remoteJid: data.remoteJid,
pushName: data.pushName || '',
instanceName: instance.instanceName,
},
});
const typebotData = { const typebotData = {
enabled: data.enabled, enabled: data.enabled,
url: data.url, url: data.url,
typebot: data.typebot, typebot: data.typebot,
expire: data.expire, expire: data.expire,
keyword_finish: data.keyword_finish, keyword_finish: data.keyword_finish,
delay_message: data.delay_message, delay_message: data.delay_message,
unknown_message: data.unknown_message, unknown_message: data.unknown_message,
listening_from_me: data.listening_from_me, listening_from_me: data.listening_from_me,
sessions: data.sessions, sessions: data.sessions,
}; };
this.create(instance, typebotData); this.create(instance, typebotData);
}
return request.data;
} catch (error) {
this.logger.error(error);
return;
} }
return request.data;
} }
public async clearSessions(instance: InstanceDto, remoteJid: string) { public async clearSessions(instance: InstanceDto, remoteJid: string) {
@ -469,16 +482,102 @@ export class TypebotService {
const session = sessions.find((session) => session.remoteJid === remoteJid); const session = sessions.find((session) => session.remoteJid === remoteJid);
if (session && expire && expire > 0) { try {
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) { if (diffInMinutes > expire) {
const newSessions = await this.clearSessions(instance, remoteJid); 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, { const data = await this.createNewSession(instance, {
enabled: findTypebot.enabled, enabled: findTypebot.enabled,
url: url, url: url,
@ -488,7 +587,7 @@ export class TypebotService {
delay_message: delay_message, delay_message: delay_message,
unknown_message: unknown_message, unknown_message: unknown_message,
listening_from_me: listening_from_me, listening_from_me: listening_from_me,
sessions: newSessions, sessions: sessions,
remoteJid: remoteJid, remoteJid: remoteJid,
pushName: msg.pushName, pushName: msg.pushName,
}); });
@ -515,7 +614,7 @@ export class TypebotService {
} }
if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) { if (keyword_finish && content.toLowerCase() === keyword_finish.toLowerCase()) {
const newSessions = await this.clearSessions(instance, remoteJid); sessions.splice(sessions.indexOf(session), 1);
const typebotData = { const typebotData = {
enabled: findTypebot.enabled, enabled: findTypebot.enabled,
@ -526,7 +625,7 @@ export class TypebotService {
delay_message: delay_message, delay_message: delay_message,
unknown_message: unknown_message, unknown_message: unknown_message,
listening_from_me: listening_from_me, listening_from_me: listening_from_me,
sessions: newSessions, sessions,
}; };
this.create(instance, typebotData); this.create(instance, typebotData);
@ -539,140 +638,30 @@ export class TypebotService {
sessionId: data.sessionId, sessionId: data.sessionId,
}; };
const request = await axios.post(url + '/api/v1/sendMessage', reqData); let request: any;
try {
await this.sendWAMessage( request = await axios.post(url + '/api/v1/sendMessage', reqData);
instance, await this.sendWAMessage(
remoteJid, instance,
request.data.messages, remoteJid,
request.data.input, request.data.messages,
request.data.clientSideActions, request.data.input,
); request.data.clientSideActions,
);
} catch (error) {
this.logger.error(error);
return;
}
} }
return; return;
} }
}
if (session && session.status !== 'opened') { sessions.map((session) => {
return; if (session.remoteJid === remoteJid) {
} session.updateAt = Date.now();
}
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,
}); });
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,
};
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;
}
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 = { const typebotData = {
enabled: findTypebot.enabled, enabled: findTypebot.enabled,
url: url, url: url,
@ -687,24 +676,63 @@ export class TypebotService {
this.create(instance, typebotData); 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,
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,
);
return;
} catch (error) {
this.logger.error(error);
return; 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,
);
return;
} }
} }