From 3ae13f6ffeb4c208d81cb57baae60fc3d3a4208e Mon Sep 17 00:00:00 2001 From: marsalva Date: Thu, 26 Mar 2026 08:41:51 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/server.js b/server.js index 2ba16ad..b0511f5 100644 --- a/server.js +++ b/server.js @@ -3977,7 +3977,8 @@ app.post("/webhook/evolution", async (req, res) => { if (msgCmd.includes('🔴')) { try { await pool.query(`UPDATE scraped_services SET raw_data = COALESCE(raw_data, '{}'::jsonb) || '{"ia_paused": true}'::jsonb WHERE id = $1`, [service.id]); - await pool.query(`INSERT INTO service_communications (scraped_id, owner_id, sender_name, sender_role, message, is_internal) VALUES ($1, $2, $3, $4, $5, true)`, [service.id, ownerId, "Sistema", "admin", "🔴 IA Pausada manualmente con Emoji."]); + // 🛑 Guardamos como 'system' para que NO active el escudo humano de 2 horas + await pool.query(`INSERT INTO service_communications (scraped_id, owner_id, sender_name, sender_role, message, is_internal) VALUES ($1, $2, $3, $4, $5, true)`, [service.id, ownerId, "Sistema", "system", "🔴 IA Pausada manualmente con Emoji."]); console.log(`🔴 [IA PAUSADA] Semáforo rojo activado para exp ${service.service_ref}`); } catch(err) { console.error("Error pausando IA:", err); } return; @@ -3987,7 +3988,8 @@ app.post("/webhook/evolution", async (req, res) => { if (msgCmd.includes('🟢')) { try { await pool.query(`UPDATE scraped_services SET raw_data = raw_data - 'ia_paused' WHERE id = $1`, [service.id]); - await pool.query(`INSERT INTO service_communications (scraped_id, owner_id, sender_name, sender_role, message, is_internal) VALUES ($1, $2, $3, $4, $5, true)`, [service.id, ownerId, "Sistema", "admin", "🟢 IA Reactivada manualmente con Emoji."]); + // 🟢 Guardamos como 'system' para EVITAR que la IA se autobloquee al despertarla + await pool.query(`INSERT INTO service_communications (scraped_id, owner_id, sender_name, sender_role, message, is_internal) VALUES ($1, $2, $3, $4, $5, true)`, [service.id, ownerId, "Sistema", "system", "🟢 IA Reactivada manualmente con Emoji."]); console.log(`🟢 [IA ACTIVADA] Semáforo verde activado para exp ${service.service_ref}`); } catch(err) { console.error("Error activando IA:", err); } return; @@ -4004,6 +4006,39 @@ app.post("/webhook/evolution", async (req, res) => { if (candadosIA.has(service.id)) return; candadosIA.add(service.id); + try { + // 🛑 COMPROBAR SI LA HEMOS PAUSADO CON EL SEMÁFORO ROJO + if (service.ia_paused === 'true' || service.ia_paused === true) { + console.log(`🤫 [IA MUTEADA] El cliente ha hablado, pero la IA está en semáforo rojo para ${service.service_ref}`); + return; + } + + // 🛡️ VERIFICAR INTERVENCIÓN HUMANA (ESCUDO INTELIGENTE) + // Buscamos el último mensaje, PERO ignoramos al 'system' y al 'user' + const checkHumanQ = await pool.query(` + SELECT sender_role, created_at FROM service_communications + WHERE scraped_id = $1 AND sender_role NOT IN ('user', 'system') + ORDER BY created_at DESC LIMIT 1 + `, [service.id]); + + if (checkHumanQ.rowCount > 0) { + const lastMsg = checkHumanQ.rows[0]; + const diffMinutos = (new Date() - new Date(lastMsg.created_at)) / (1000 * 60); + + // 🛑 ESCUDO ACTIVADO: 120 minutos de silencio desde tu último mensaje real + if (['admin', 'superadmin', 'operario'].includes(lastMsg.sender_role) && diffMinutos < 120) { + console.log(`🛡️ [ESCUDO IA] Silenciando a la IA porque un humano habló hace ${Math.round(diffMinutos)} minutos.`); + return; + } + } + [service.id, ownerId, "Técnico (WhatsApp)", "operario", mensajeTexto]); + } catch(err) { console.error("Error guardando mensaje de admin:", err); } + return; + } + + if (candadosIA.has(service.id)) return; + candadosIA.add(service.id); + try { // 🛑 COMPROBAR SI LA HEMOS PAUSADO CON EL SEMÁFORO ROJO if (service.ia_paused === 'true' || service.ia_paused === true) {