Implemented a function to synchronize message deletions on WhatsApp, automatically reflecting in Chatwoot

A new variable has been created, and a function has been implemented to manage the deletion of messages on WhatsApp. Now, when deleting a message for everyone on WhatsApp, the same action will be automatically performed on Chatwoot, ensuring consistency across platforms
This commit is contained in:
Amilton Morais 2024-01-24 13:38:29 -03:00
parent 7f74de07ed
commit 0e50da324b
4 changed files with 40 additions and 27 deletions

View File

@ -147,6 +147,7 @@ export type Webhook = { GLOBAL?: GlobalWebhook; EVENTS: EventsWebhook };
export type ConfigSessionPhone = { CLIENT: string; NAME: string }; export type ConfigSessionPhone = { CLIENT: string; NAME: string };
export type QrCode = { LIMIT: number; COLOR: string }; export type QrCode = { LIMIT: number; COLOR: string };
export type Typebot = { API_VERSION: string; KEEP_OPEN: boolean }; export type Typebot = { API_VERSION: string; KEEP_OPEN: boolean };
export type ChatWoot = { MESSAGE_DELETE: boolean };
export type CacheConf = { REDIS: CacheConfRedis; LOCAL: CacheConfLocal }; export type CacheConf = { REDIS: CacheConfRedis; LOCAL: CacheConfLocal };
export type Production = boolean; export type Production = boolean;
@ -167,6 +168,7 @@ export interface Env {
CONFIG_SESSION_PHONE: ConfigSessionPhone; CONFIG_SESSION_PHONE: ConfigSessionPhone;
QRCODE: QrCode; QRCODE: QrCode;
TYPEBOT: Typebot; TYPEBOT: Typebot;
CHATWOOT: ChatWoot;
CACHE: CacheConf; CACHE: CacheConf;
AUTHENTICATION: Auth; AUTHENTICATION: Auth;
PRODUCTION?: Production; PRODUCTION?: Production;
@ -330,6 +332,9 @@ export class ConfigService {
API_VERSION: process.env?.TYPEBOT_API_VERSION || 'old', API_VERSION: process.env?.TYPEBOT_API_VERSION || 'old',
KEEP_OPEN: process.env.TYPEBOT_KEEP_OPEN === 'true', KEEP_OPEN: process.env.TYPEBOT_KEEP_OPEN === 'true',
}, },
CHATWOOT: {
MESSAGE_DELETE: process.env.CHATWOOT_MESSAGE_DELETE === 'false',
},
CACHE: { CACHE: {
REDIS: { REDIS: {
ENABLED: process.env?.CACHE_REDIS_ENABLED === 'true', ENABLED: process.env?.CACHE_REDIS_ENABLED === 'true',

View File

@ -153,6 +153,10 @@ TYPEBOT:
API_VERSION: 'old' # old | latest API_VERSION: 'old' # old | latest
KEEP_OPEN: false KEEP_OPEN: false
# If you leave this option as false, when deleting the message for everyone on WhatsApp, it will not be deleted on Chatwoot.
CHATWOOT:
MESSAGE_DELETE: true # false | true
# Cache to optimize application performance # Cache to optimize application performance
CACHE: CACHE:
REDIS: REDIS:

View File

@ -26,7 +26,7 @@ export class MessageRaw {
messageType?: string; messageType?: string;
messageTimestamp?: number | Long.Long; messageTimestamp?: number | Long.Long;
owner: string; owner: string;
source?: 'android' | 'web' | 'ios'; source?: 'android' | 'web' | 'ios' | 'ios' | 'unknown' | 'desktop';
source_id?: string; source_id?: string;
source_reply_id?: string; source_reply_id?: string;
chatwoot?: ChatwootMessage; chatwoot?: ChatwootMessage;
@ -45,7 +45,7 @@ const messageSchema = new Schema<MessageRaw>({
participant: { type: String }, participant: { type: String },
messageType: { type: String }, messageType: { type: String },
message: { type: Object }, message: { type: Object },
source: { type: String, minlength: 3, enum: ['android', 'web', 'ios'] }, source: { type: String, minlength: 3, enum: ['android', 'web', 'ios','unknown','desktop' ] },
messageTimestamp: { type: Number, required: true }, messageTimestamp: { type: Number, required: true },
owner: { type: String, required: true, minlength: 1 }, owner: { type: String, required: true, minlength: 1 },
chatwoot: { chatwoot: {

View File

@ -7,7 +7,7 @@ import Jimp from 'jimp';
import mimeTypes from 'mime-types'; import mimeTypes from 'mime-types';
import path from 'path'; import path from 'path';
import { ConfigService, HttpServer } from '../../config/env.config'; import { ConfigService, HttpServer, ChatWoot} from '../../config/env.config';
import { Logger } from '../../config/logger.config'; import { Logger } from '../../config/logger.config';
import { ICache } from '../abstract/abstract.cache'; import { ICache } from '../abstract/abstract.cache';
import { ChatwootDto } from '../dto/chatwoot.dto'; import { ChatwootDto } from '../dto/chatwoot.dto';
@ -1894,33 +1894,37 @@ export class ChatwootService {
} }
if (event === Events.MESSAGES_DELETE) { if (event === Events.MESSAGES_DELETE) {
this.logger.verbose('deleting message from instance: ' + instance.instanceName);
if (!body?.key?.id) { const chatwootDelete = this.configService.get<ChatWoot>('CHATWOOT').MESSAGE_DELETE
this.logger.warn('message id not found'); if (chatwootDelete === true) {
return; this.logger.verbose('deleting message from instance: ' + instance.instanceName);
}
const message = await this.getMessageByKeyId(instance, body.key.id); if (!body?.key?.id) {
if (message?.chatwoot?.messageId && message?.chatwoot?.conversationId) { this.logger.warn('message id not found');
this.logger.verbose('deleting message in repository. Message id: ' + body.key.id); return;
this.repository.message.delete({ }
where: {
key: {
id: body.key.id,
},
owner: instance.instanceName,
},
});
this.logger.verbose('deleting message in chatwoot. Message id: ' + body.key.id); const message = await this.getMessageByKeyId(instance, body.key.id);
return await client.messages.delete({ if (message?.chatwoot?.messageId && message?.chatwoot?.conversationId) {
accountId: this.provider.account_id, this.logger.verbose('deleting message in repository. Message id: ' + body.key.id);
conversationId: message.chatwoot.conversationId, this.repository.message.delete({
messageId: message.chatwoot.messageId, where: {
}); key: {
} id: body.key.id,
} },
owner: instance.instanceName,
},
});
this.logger.verbose('deleting message in chatwoot. Message id: ' + body.key.id);
return await client.messages.delete({
accountId: this.provider.account_id,
conversationId: message.chatwoot.conversationId,
messageId: message.chatwoot.messageId,
});
}
}
}
if (event === 'messages.read') { if (event === 'messages.read') {
this.logger.verbose('read message from instance: ' + instance.instanceName); this.logger.verbose('read message from instance: ' + instance.instanceName);