Files
whatsapp_bot/nucleo-bot/routes.js
2025-05-02 13:09:42 -06:00

201 lines
4.5 KiB
JavaScript

// routes.js
import express from 'express';
import axios from 'axios';
import dayjs from 'dayjs';
import { config } from './config.js';
import { log } from './logger.js';
import { sendText } from './whatsapp.js';
import { processIncoming } from './handlers.js';
import { processMessage } from './utils/processMessage.js';
// chats a tomar en cuenta para el bot
const relevantChats = [
'50496210031@c.us',
'120363203056794284@g.us',
'120363398335375917@g.us',
'50498554225@c.us',
'50496934012@c.us',
'50497588328@c.us',
'50489701450@c.us'
]
export const router = express.Router();
// --- Manejo de eventos del webhook ------------------------------------------------
router.post('/webhook', async (req, res) => {
const { event, data: raw } = req.body;
const data = processMessage(raw);
// Si el evento no es relevante, ignorar
if(data.chatId && !relevantChats.includes(data.chatId)) {
log('info', `Mensaje de ${data.chatId} ignorado`);
return res.sendStatus(200);
}
// console.log('----------------------------------------------------------------');
// log('debug', '↪︎ Mensaje IN →', raw);
// console.log('----------------------------------------------------------------');
// log('debug', `📩 Webhook event "${event}"`);
switch (event) {
case 'onAck':
log('info', 'Ack:', data);
break;
case 'onAddedToGroup':
log('info', 'Added to group:', data);
break;
case 'onAnyMessage':
// log('info', 'onAnyMessage', data);
log('info', 'onAnyMessage', raw.chatId);
await processIncoming(raw);
break;
case 'onBattery':
log('info', 'Battery status:', data);
break;
case 'onBroadcast':
log('info', 'Broadcast:', data);
break;
case 'onButton':
log('info', 'Button pressed:', data);
break;
case 'onCallState':
log('info', 'Call state:', data);
break;
case 'onChatDeleted':
log('info', 'Chat deleted:', data);
break;
case 'onChatOpened':
log('info', 'Chat opened:', data);
break;
case 'onChatState':
log('info', 'Chat state:', data);
break;
case 'onContactAdded':
log('info', 'Contact added:', data);
break;
case 'onGlobalParticipantsChanged':
log('info', 'Global participants changed:', data);
break;
case 'onGroupApprovalRequest':
log('info', 'Group approval request:', data);
break;
case 'onGroupChange':
log('info', 'Group change:', data);
break;
case 'onIncomingCall':
log('info', 'Incoming call:', data);
break;
case 'onLabel':
log('info', 'Label event:', data);
break;
case 'onLogout':
log('info', 'Logout:', data);
break;
case 'onMessage':
log('info', 'Message:', data);
break;
case 'onMessageDeleted':
log('info', 'Message deleted:', data);
break;
case 'onNewProduct':
log('info', 'New product:', data);
break;
case 'onOrder':
log('info', 'Order:', data);
break;
case 'onPlugged':
log('info', 'Plugged:', data);
break;
case 'onPollVote':
log('info', 'Poll vote:', data);
break;
case 'onReaction':
log('info', 'Reaction:', data);
break;
case 'onRemovedFromGroup':
log('info', 'Removed from group:', data);
break;
case 'onStateChanged':
log('info', 'State changed:', data);
break;
case 'onStory':
log('info', 'Story:', data);
break;
default:
log('warn', `Unhandled event type: "${event}"`, data);
break;
}
res.sendStatus(200);
});
// comentado el 4/26/2025
/* Debug: escanear últimos mensajes */
// router.get('/debug/scan', async (_req, res) => {
// const { data } = await axios.post(`${config.API_URL}/loadAndGetAllMessagesInChat`, {
// args: { chatId: config.GROUP_ID, includeMe: 'true', includeNotifications: 'false' }
// });
// const msgs = (data?.response ?? []).slice(-20);
// log('info', `Escaneando ${msgs.length} mensajes recientes…`);
// for (const m of msgs) await processIncoming(m);
// res.json({ ok: true, scanned: msgs.length });
// });
/* Debug: enviar mensaje */
// router.get('/debug/send', async (req, res) => {
// const text = req.query.msg ?? config.REPLY_MSG;
// const resp = await sendText(config.GROUP_ID, text);
// res.json({ ok: true, resp });
// });
/* Debug: versión */
router.get('/debug/version', (_req, res) => {
res.json({ version: config.VERSION });
});