Refatory send message to typebox

This commit is contained in:
Leandro Gonçalves 2023-12-07 18:45:05 -03:00
parent 8fe75cd210
commit 457fcde572
5 changed files with 288 additions and 212 deletions

View File

@ -106,7 +106,7 @@ QRCODE_COLOR=#198754
AUTHENTICATION_TYPE=apikey AUTHENTICATION_TYPE=apikey
## Define a global apikey to access all instances. ## Define a global apikey to access all instances.
### OBS: This key must be inserted in the request header to create an instance. ### 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 AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true
## Set the secret key to encrypt and decrypt your token and its expiration time ## Set the secret key to encrypt and decrypt your token and its expiration time
# seconds - 3600s ===1h | zero (0) - never expires # seconds - 3600s ===1h | zero (0) - never expires

View File

@ -24,12 +24,12 @@ ENV LOG_LEVEL=ERROR,WARN,DEBUG,INFO,LOG,VERBOSE,DARK,WEBHOOKS
ENV LOG_COLOR=true ENV LOG_COLOR=true
ENV LOG_BAILEYS=error ENV LOG_BAILEYS=error
ENV DEL_INSTANCE=false ENV DEL_INSTANCE=true
ENV STORE_MESSAGES=true ENV STORE_MESSAGES=true
ENV STORE_MESSAGE_UP=true ENV STORE_MESSAGE_UP=true
ENV STORE_CONTACTS=true ENV STORE_CONTACTS=false
ENV STORE_CHATS=true ENV STORE_CHATS=false
ENV CLEAN_STORE_CLEANING_INTERVAL=7200 ENV CLEAN_STORE_CLEANING_INTERVAL=7200
ENV CLEAN_STORE_MESSAGES=true ENV CLEAN_STORE_MESSAGES=true
@ -37,22 +37,22 @@ ENV CLEAN_STORE_MESSAGE_UP=true
ENV CLEAN_STORE_CONTACTS=true ENV CLEAN_STORE_CONTACTS=true
ENV CLEAN_STORE_CHATS=true ENV CLEAN_STORE_CHATS=true
ENV DATABASE_ENABLED=false ENV DATABASE_ENABLED=true
ENV DATABASE_CONNECTION_URI=mongodb://root:root@mongodb:27017/?authSource=admin&readPreference=primary&ssl=false&directConnection=true ENV DATABASE_CONNECTION_URI=
ENV DATABASE_CONNECTION_DB_PREFIX_NAME=evolution ENV DATABASE_CONNECTION_DB_PREFIX_NAME=evolution
ENV DATABASE_SAVE_DATA_INSTANCE=false ENV DATABASE_SAVE_DATA_INSTANCE=true
ENV DATABASE_SAVE_DATA_NEW_MESSAGE=false ENV DATABASE_SAVE_DATA_NEW_MESSAGE=true
ENV DATABASE_SAVE_MESSAGE_UPDATE=false ENV DATABASE_SAVE_MESSAGE_UPDATE=true
ENV DATABASE_SAVE_DATA_CONTACTS=false ENV DATABASE_SAVE_DATA_CONTACTS=true
ENV DATABASE_SAVE_DATA_CHATS=false ENV DATABASE_SAVE_DATA_CHATS=true
ENV REDIS_ENABLED=false ENV REDIS_ENABLED=false
ENV REDIS_URI=redis://redis:6379 ENV REDIS_URI=
ENV REDIS_PREFIX_KEY=evolution ENV REDIS_PREFIX_KEY=evolution
ENV RABBITMQ_ENABLED=false ENV RABBITMQ_ENABLED=false
ENV RABBITMQ_URI=amqp://guest:guest@rabbitmq:5672 ENV RABBITMQ_URI=
ENV WEBSOCKET_ENABLED=false ENV WEBSOCKET_ENABLED=false
@ -100,7 +100,7 @@ ENV QRCODE_COLOR=#198754
ENV AUTHENTICATION_TYPE=apikey ENV AUTHENTICATION_TYPE=apikey
ENV AUTHENTICATION_API_KEY=B6D711FCDE4D4FD5936544120E713976 ENV AUTHENTICATION_API_KEY=
ENV AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true ENV AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true
ENV AUTHENTICATION_JWT_EXPIRIN_IN=0 ENV AUTHENTICATION_JWT_EXPIRIN_IN=0

4
captain-definition Normal file
View File

@ -0,0 +1,4 @@
{
"schemaVersion": 2,
"dockerfilePath": "./Dockerfile"
}

View File

@ -44,6 +44,7 @@ export class TypebotService {
if (session) { if (session) {
if (status === 'closed') { if (status === 'closed') {
this.logger.verbose(`============== Closing Typebot session to Jid ${remoteJid}! =================`);
findData.sessions.splice(findData.sessions.indexOf(session), 1); findData.sessions.splice(findData.sessions.indexOf(session), 1);
const typebotData = { const typebotData = {
@ -65,6 +66,7 @@ export class TypebotService {
findData.sessions.map((session) => { findData.sessions.map((session) => {
if (session.remoteJid === remoteJid) { if (session.remoteJid === remoteJid) {
this.logger.verbose(`============== Updating Typebot session to Jid ${remoteJid}! =================`);
session.status = status; 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) { if (startSession) {
const response = await this.createNewSession(instance, { const response = await this.createNewSession(instance, 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 (response.sessionId) { if (response.sessionId) {
await this.sendWAMessage(instance, remoteJid, response.messages, response.input, response.clientSideActions); 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( const request = await axios.post(data.url + '/api/v1/sendMessage', reqData);
instance,
remoteJid,
request.data.messages,
request.data.input,
request.data.clientSideActions,
);
this.waMonitor.waInstances[instance.instanceName].sendDataWebhook(Events.TYPEBOT_START, { await this.sendWAMessage(
remoteJid: remoteJid, instance,
url: url, remoteJid,
typebot: typebot, request.data.messages,
variables: variables, request.data.input,
sessionId: id, 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 { 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) { 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: true, enabled: true,
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 (e) {
this.logger.verbose('============== Erro Trying create new Typebot session! =================');
this.logger.verbose(e);
} }
return request.data;
} }
public async sendWAMessage( public async sendWAMessage(
@ -434,18 +454,118 @@ export class TypebotService {
const unknown_message = findTypebot.unknown_message; const unknown_message = findTypebot.unknown_message;
const listening_from_me = findTypebot.listening_from_me; 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); const session = sessions.find((session) => session.remoteJid === remoteJid);
try {
if (session && expire && expire > 0) {
const now = Date.now();
if (session && expire && expire > 0) { const diff = now - session.updateAt;
const now = Date.now();
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) { const data = await this.createNewSession(instance, {
sessions.splice(sessions.indexOf(session), 1); 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, { const data = await this.createNewSession(instance, {
url: url, url: url,
typebot: typebot, typebot: typebot,
@ -516,130 +636,15 @@ export class TypebotService {
request.data.clientSideActions, request.data.clientSideActions,
); );
} }
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, {
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;
}
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 = { const typebotData = {
enabled: true, enabled: true,
url: url, url: url,
@ -654,24 +659,91 @@ export class TypebotService {
this.create(instance, typebotData); 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; 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);
}
}
} }

View File

@ -11,7 +11,7 @@
<body> <body>
<iframe src="https://manager.evolution-api.com" frameborder="0" style="width: 100%; height: 100vh;"></iframe> <iframe src="https://app.appsmith.com/app/manager/home-6563bdd6451fcc25a150d2bc" frameborder="0" style="width: 100%; height: 100vh;"></iframe>
</body> </body>