up
This commit is contained in:
@@ -305,6 +305,16 @@ class WhatsAppWebhook {
|
||||
error_log('Failed to create notification: ' . $e->getMessage());
|
||||
}
|
||||
|
||||
// Empujar evento SSE en tiempo real
|
||||
$this->pushSSEEvent('new_message', [
|
||||
'user_id' => $user['id'],
|
||||
'phone_number' => $user['phone_number'],
|
||||
'name' => $user['name'] ?? $from,
|
||||
'message' => substr($messageText, 0, 250),
|
||||
'message_type' => $messageType,
|
||||
'timestamp' => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
// Procesar con bot (protección contra excepciones externas)
|
||||
try {
|
||||
$this->botService->processMessage($user, $messageText, $messageType);
|
||||
@@ -398,6 +408,44 @@ class WhatsAppWebhook {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Empujar evento a través de SSE (Server-Sent Events)
|
||||
* Notifica a todos los operadores conectados sobre nuevos eventos
|
||||
*/
|
||||
private function pushSSEEvent($eventType, $data) {
|
||||
try {
|
||||
// Llamar al endpoint push_event interno
|
||||
$pushUrl = 'http://127.0.0.1' . dirname($_SERVER['SCRIPT_NAME']) . '/push_event.php';
|
||||
|
||||
$payload = json_encode([
|
||||
'event_type' => $eventType,
|
||||
'data' => $data,
|
||||
'target_user_id' => 'all' // Notificar a todos los operadores
|
||||
]);
|
||||
|
||||
// Hacer llamada asíncrona (fire and forget)
|
||||
$ch = curl_init($pushUrl);
|
||||
curl_setopt_array($ch, [
|
||||
CURLOPT_POST => true,
|
||||
CURLOPT_POSTFIELDS => $payload,
|
||||
CURLOPT_RETURNTRANSFER => true,
|
||||
CURLOPT_TIMEOUT_MS => 500, // Timeout corto
|
||||
CURLOPT_HTTPHEADER => [
|
||||
'Content-Type: application/json',
|
||||
'X-Push-Token: internal_push_secret_2026'
|
||||
]
|
||||
]);
|
||||
|
||||
// Ejecutar sin bloquear
|
||||
curl_exec($ch);
|
||||
curl_close($ch);
|
||||
|
||||
} catch (Exception $e) {
|
||||
// No fallar si el push falla
|
||||
error_log('pushSSEEvent failed: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Procesar un payload (array) recibido manualmente (replay)
|
||||
* Útil para reproducir entradas desde la UI o scripts.
|
||||
|
||||
Reference in New Issue
Block a user