Skip to content

Commit 0d8e8bc

Browse files
committed
fix(chatwoot): corrige reabertura de conversas e loop de conexão
Este commit aborda duas questões críticas na integração com o Chatwoot para melhorar a estabilidade e a experiência do agente. Primeiro, as conversas que já estavam marcadas como "resolvidas" no Chatwoot não eram reabertas automaticamente quando o cliente enviava uma nova mensagem. Isso foi corrigido para que o sistema verifique o status da conversa e a reabra, garantindo que nenhuma nova interação seja perdida. Segundo, um bug no tratamento do evento de conexão fazia com que a mensagem de status "Conexão estabelecida com sucesso" fosse enviada repetidamente, poluindo o histórico da conversa. A lógica foi ajustada para garantir que esta notificação seja enviada apenas uma vez por evento de conexão.
1 parent b62917e commit 0d8e8bc

File tree

1 file changed

+53
-25
lines changed

1 file changed

+53
-25
lines changed

src/api/integrations/chatbot/chatwoot/services/chatwoot.service.ts

Lines changed: 53 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -747,34 +747,49 @@ export class ChatwootService {
747747
return null;
748748
}
749749

750-
let inboxConversation = contactConversations.payload.find(
751-
(conversation) => conversation.inbox_id == filterInbox.id,
752-
);
753-
if (inboxConversation) {
754-
if (this.provider.reopenConversation) {
755-
this.logger.verbose(`Found conversation in reopenConversation mode: ${JSON.stringify(inboxConversation)}`);
756-
if (inboxConversation && this.provider.conversationPending && inboxConversation.status !== 'open') {
757-
await client.conversations.toggleStatus({
758-
accountId: this.provider.accountId,
759-
conversationId: inboxConversation.id,
760-
data: {
761-
status: 'pending',
762-
},
763-
});
764-
}
750+
let inboxConversation = null;
751+
752+
if (this.provider.reopenConversation) {
753+
inboxConversation = contactConversations.payload.find(
754+
(conversation) =>
755+
conversation && conversation.status !== 'resolved' && conversation.inbox_id == filterInbox.id,
756+
);
757+
758+
if (inboxConversation) {
759+
this.logger.verbose(
760+
`Found open conversation in reopenConversation mode: ${JSON.stringify(inboxConversation)}`,
761+
);
765762
} else {
766763
inboxConversation = contactConversations.payload.find(
767-
(conversation) =>
768-
conversation && conversation.status !== 'resolved' && conversation.inbox_id == filterInbox.id,
764+
(conversation) => conversation.inbox_id == filterInbox.id,
769765
);
770-
this.logger.verbose(`Found conversation: ${JSON.stringify(inboxConversation)}`);
771-
}
772766

773-
if (inboxConversation) {
774-
this.logger.verbose(`Returning existing conversation ID: ${inboxConversation.id}`);
775-
this.cache.set(cacheKey, inboxConversation.id);
776-
return inboxConversation.id;
767+
if (inboxConversation) {
768+
this.logger.verbose(`Found resolved conversation to reopen: ${JSON.stringify(inboxConversation)}`);
769+
if (this.provider.conversationPending && inboxConversation.status !== 'open') {
770+
await client.conversations.toggleStatus({
771+
accountId: this.provider.accountId,
772+
conversationId: inboxConversation.id,
773+
data: {
774+
status: 'pending',
775+
},
776+
});
777+
this.logger.verbose(`Reopened resolved conversation ID: ${inboxConversation.id}`);
778+
}
779+
}
777780
}
781+
} else {
782+
inboxConversation = contactConversations.payload.find(
783+
(conversation) =>
784+
conversation && conversation.status !== 'resolved' && conversation.inbox_id == filterInbox.id,
785+
);
786+
this.logger.verbose(`Found conversation: ${JSON.stringify(inboxConversation)}`);
787+
}
788+
789+
if (inboxConversation) {
790+
this.logger.verbose(`Returning existing conversation ID: ${inboxConversation.id}`);
791+
this.cache.set(cacheKey, inboxConversation.id);
792+
return inboxConversation.id;
778793
}
779794

780795
const data = {
@@ -2407,12 +2422,25 @@ export class ChatwootService {
24072422

24082423
if (event === 'connection.update') {
24092424
if (body.status === 'open') {
2425+
const waInstance = this.waMonitor.waInstances[instance.instanceName];
24102426
// if we have qrcode count then we understand that a new connection was established
2411-
if (this.waMonitor.waInstances[instance.instanceName].qrCode.count > 0) {
2427+
if (waInstance && waInstance.qrCode.count > 0) {
24122428
const msgConnection = i18next.t('cw.inbox.connected');
24132429
await this.createBotMessage(instance, msgConnection, 'incoming');
2414-
this.waMonitor.waInstances[instance.instanceName].qrCode.count = 0;
2430+
waInstance.qrCode.count = 0;
2431+
2432+
waInstance.lastConnectionNotification = Date.now();
2433+
24152434
chatwootImport.clearAll(instance);
2435+
} else if (waInstance) {
2436+
const timeSinceLastNotification = Date.now() - (waInstance.lastConnectionNotification || 0);
2437+
const minIntervalMs = 30000; // 30 seconds
2438+
2439+
if (timeSinceLastNotification < minIntervalMs) {
2440+
this.logger.warn(
2441+
`Connection notification skipped for ${instance.instanceName} - too frequent (${timeSinceLastNotification}ms since last)`,
2442+
);
2443+
}
24162444
}
24172445
}
24182446
}

0 commit comments

Comments
 (0)