Adds initial_connection setting and filter old messages

This commit is contained in:
Pedro Howat 2024-10-04 12:48:32 -03:00
parent 2c76098d59
commit ef7c6678cf
10 changed files with 61 additions and 2 deletions

View File

@ -402,6 +402,7 @@ export class InstanceController {
read_status: read_status || false, read_status: read_status || false,
sync_full_history: sync_full_history ?? false, sync_full_history: sync_full_history ?? false,
ignore_list: [], ignore_list: [],
initial_connection: null,
}; };
this.logger.verbose('settings: ' + JSON.stringify(settings)); this.logger.verbose('settings: ' + JSON.stringify(settings));

View File

@ -7,4 +7,5 @@ export class SettingsDto {
read_status?: boolean; read_status?: boolean;
sync_full_history?: boolean; sync_full_history?: boolean;
ignore_list?: string[]; ignore_list?: string[];
initial_connection?: number;
} }

View File

@ -5,11 +5,12 @@ import { Logger } from '../../../../config/logger.config';
import { dbserver } from '../../../../libs/db.connect'; import { dbserver } from '../../../../libs/db.connect';
import { InstanceDto } from '../../../dto/instance.dto'; import { InstanceDto } from '../../../dto/instance.dto';
import { WAMonitoringService } from '../../../services/monitor.service'; import { WAMonitoringService } from '../../../services/monitor.service';
import { SettingsService } from '../../../services/settings.service';
const logger = new Logger('KwikController'); const logger = new Logger('KwikController');
export class KwikController { export class KwikController {
constructor(private readonly waMonitor: WAMonitoringService) {} constructor(private readonly waMonitor: WAMonitoringService, private readonly settingsService: SettingsService) {}
private isTextMessage(messageType: any) { private isTextMessage(messageType: any) {
return [ return [
@ -184,4 +185,17 @@ export class KwikController {
}; };
} }
} }
public async cleanChats(instance: InstanceDto) {
const db = configService.get<Database>('DATABASE');
const connection = dbserver.getClient().db(db.CONNECTION.DB_PREFIX_NAME + '-whatsapp-api');
const settings = this.settingsService.find(instance);
const initialConnection = (await settings).initial_connection;
if (initialConnection) {
connection
.collection('messages')
.deleteMany({ owner: instance.instanceName, messageTimestamp: { $lt: initialConnection } });
}
return { status: 'ok' };
}
} }

View File

@ -70,6 +70,30 @@ export class KwikRouter extends RouterBroker {
return res.status(HttpStatus.OK).json(response); return res.status(HttpStatus.OK).json(response);
}); });
this.router.post(this.routerPath('cleanChats'), ...guards, async (req, res) => {
logger.verbose('request received in cleanChats');
logger.verbose('request body: ');
logger.verbose(req.body);
logger.verbose('request query: ');
logger.verbose(req.query);
logger.error('request received in cleanChats');
logger.error('request body: ');
logger.error(req.body);
logger.error('request query: ');
logger.error(req.query);
const response = await this.dataValidate<InstanceDto>({
request: req,
schema: null,
ClassRef: InstanceDto,
execute: (instance) => kwikController.cleanChats(instance),
});
return res.status(HttpStatus.OK).json(response);
});
} }
public readonly router = Router(); public readonly router = Router();

View File

@ -12,6 +12,7 @@ export class SettingsRaw {
read_status?: boolean; read_status?: boolean;
sync_full_history?: boolean; sync_full_history?: boolean;
ignore_list?: string[]; ignore_list?: string[];
initial_connection?: number;
} }
const settingsSchema = new Schema<SettingsRaw>({ const settingsSchema = new Schema<SettingsRaw>({
@ -24,6 +25,7 @@ const settingsSchema = new Schema<SettingsRaw>({
read_status: { type: Boolean, required: true }, read_status: { type: Boolean, required: true },
sync_full_history: { type: Boolean, required: true }, sync_full_history: { type: Boolean, required: true },
ignore_list: { type: [String], required: false }, ignore_list: { type: [String], required: false },
initial_connection: { type: Number, required: false },
}); });
export const SettingsModel = dbserver?.model(SettingsRaw.name, settingsSchema, 'settings'); export const SettingsModel = dbserver?.model(SettingsRaw.name, settingsSchema, 'settings');

View File

@ -183,6 +183,6 @@ export const sendMessageController = new SendMessageController(waMonitor);
export const chatController = new ChatController(waMonitor); export const chatController = new ChatController(waMonitor);
export const groupController = new GroupController(waMonitor); export const groupController = new GroupController(waMonitor);
export const labelController = new LabelController(waMonitor); export const labelController = new LabelController(waMonitor);
export const kwikController = new KwikController(waMonitor); export const kwikController = new KwikController(waMonitor, settingsService);
logger.info('Module - ON'); logger.info('Module - ON');

View File

@ -223,6 +223,7 @@ export class ChannelStartupService {
read_status: data.read_status, read_status: data.read_status,
sync_full_history: data.sync_full_history, sync_full_history: data.sync_full_history,
ignore_list: data.ignore_list, ignore_list: data.ignore_list,
initial_connection: data.initial_connection,
}; };
} }

View File

@ -979,6 +979,13 @@ export class BaileysStartupService extends ChannelStartupService {
continue; continue;
} }
if (settings.initial_connection && (m.messageTimestamp as number) <= settings.initial_connection) {
this.logger.verbose(
`[messaging-history.set] Ignore -> ${m.messageTimestamp} <= ${settings.initial_connection}`,
);
continue;
}
if (messagesRepository.has(m.key.id)) { if (messagesRepository.has(m.key.id)) {
continue; continue;
} }
@ -1098,6 +1105,13 @@ export class BaileysStartupService extends ChannelStartupService {
return; return;
} }
if (settings?.initial_connection && (received.messageTimestamp as number) <= settings.initial_connection) {
this.logger.verbose(
`[messages.upsert] Ignore -> ${received.messageTimestamp} <= ${settings.initial_connection}`,
);
continue;
}
if (settings?.ignore_list && settings.ignore_list.includes(received.key.remoteJid)) { if (settings?.ignore_list && settings.ignore_list.includes(received.key.remoteJid)) {
this.logger.verbose('contact in ignore list.'); this.logger.verbose('contact in ignore list.');
return; return;

View File

@ -84,6 +84,7 @@ export declare namespace wa {
read_status?: boolean; read_status?: boolean;
sync_full_history?: boolean; sync_full_history?: boolean;
ignore_list?: string[]; ignore_list?: string[];
initial_connection?: number;
}; };
export type LocalWebsocket = { export type LocalWebsocket = {

View File

@ -1003,6 +1003,7 @@ export const settingsSchema: JSONSchema7 = {
read_status: { type: 'boolean', enum: [true, false] }, read_status: { type: 'boolean', enum: [true, false] },
sync_full_history: { type: 'boolean', enum: [true, false] }, sync_full_history: { type: 'boolean', enum: [true, false] },
ignore_list: { type: 'array', items: { type: 'string' } }, ignore_list: { type: 'array', items: { type: 'string' } },
initial_connection: { type: 'integer', minLength: 1 },
}, },
required: ['reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'], required: ['reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'],
...isNotEmpty('reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'), ...isNotEmpty('reject_call', 'groups_ignore', 'always_online', 'read_messages', 'read_status', 'sync_full_history'),