Files
scoreodonto.com/backend/dist/modules/whatsapp/warmer/WhatsAppWarmer.js
T

108 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.WhatsAppWarmer = void 0;
/**
* WhatsApp Warmer — aquecimento gradual de número novo.
*
* Envia mensagens em intervalos aleatórios crescentes para simular
* uso humano e reduzir risco de ban em números recém-criados.
*/
const logger_1 = require("../../../config/logger");
const MESSAGES = [
'Olá! Tudo bem?',
'Oi, como vai?',
'Boa tarde!',
'Só passando para dizer oi 😊',
'Tudo certo por aí?',
'Bom dia! 🌤',
'E aí, tudo bem?',
'Boa noite!',
];
function randomBetween(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function randomMessage() {
return MESSAGES[Math.floor(Math.random() * MESSAGES.length)];
}
class WhatsAppWarmer {
manager;
sessions = new Map();
constructor(manager) {
this.manager = manager;
}
start(config) {
if (this.sessions.has(config.instanceId)) {
logger_1.logger.warn({ instanceId: config.instanceId }, 'Warmer já em execução para esta instância');
return;
}
const session = {
config,
dayCount: 0,
sentToday: 0,
timer: null,
};
this.sessions.set(config.instanceId, session);
logger_1.logger.info({ instanceId: config.instanceId, totalDays: config.totalDays }, '🔥 Warmer iniciado');
this.scheduleNext(config.instanceId);
}
stop(instanceId) {
const session = this.sessions.get(instanceId);
if (!session)
return;
if (session.timer)
clearTimeout(session.timer);
this.sessions.delete(instanceId);
logger_1.logger.info({ instanceId }, 'Warmer encerrado');
}
scheduleNext(instanceId) {
const session = this.sessions.get(instanceId);
if (!session)
return;
const { config, dayCount, sentToday } = session;
// Limite diário cresce linearmente: day 1 = 10%, day N = 100%
const progressRatio = Math.min(1, (dayCount + 1) / config.totalDays);
const limitHoje = Math.ceil(config.dailyMessageLimit * progressRatio);
if (sentToday >= limitHoje) {
// Dia completo — aguarda até o próximo dia (24h + jitter)
const nextDayMs = 24 * 60 * 60 * 1000 + randomBetween(0, 30 * 60 * 1000);
logger_1.logger.debug({ instanceId, dayCount, sentToday }, 'Limite diário atingido — aguardando próximo dia');
if (dayCount + 1 >= config.totalDays) {
logger_1.logger.info({ instanceId }, '✅ Aquecimento concluído!');
this.sessions.delete(instanceId);
return;
}
session.dayCount += 1;
session.sentToday = 0;
session.timer = setTimeout(() => this.scheduleNext(instanceId), nextDayMs);
return;
}
// Intervalo aleatório entre mensagens (15 minutos com jitter)
const delayMs = randomBetween(60_000, 5 * 60_000);
session.timer = setTimeout(() => this.sendWarmerMessage(instanceId), delayMs);
}
async sendWarmerMessage(instanceId) {
const session = this.sessions.get(instanceId);
if (!session)
return;
const sock = this.manager.getSocket(instanceId);
if (!sock) {
logger_1.logger.warn({ instanceId }, 'Warmer: socket não encontrado — pausando');
session.timer = setTimeout(() => this.sendWarmerMessage(instanceId), 60_000);
return;
}
const targets = session.config.targets;
const target = targets[Math.floor(Math.random() * targets.length)];
const text = randomMessage();
try {
await sock.sendMessage(target, { text });
session.sentToday += 1;
logger_1.logger.debug({ instanceId, target, sentToday: session.sentToday }, 'Warmer: mensagem enviada');
}
catch (err) {
logger_1.logger.error({ err, instanceId, target }, 'Warmer: falha ao enviar mensagem');
}
this.scheduleNext(instanceId);
}
}
exports.WhatsAppWarmer = WhatsAppWarmer;