201 lines
4.5 KiB
JavaScript
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 });
|
|
});
|