2000) exit; $d = json_decode($raw, true); if (!is_array($d)) exit; $evento = $d['e'] ?? ''; $PERMITIDOS = ['start', 'end', 'error', 'sin_start', 'mudo', 'lag']; if (!in_array($evento, $PERMITIDOS, true)) exit; unset($d['e'], $d['t']); // el timestamp lo pone la base, no el cliente try { $pdo = Database::getInstance()->getConnection(); $stmt = $pdo->prepare( "INSERT INTO turnero_tv_log (evento, detalle, ip, user_agent) VALUES (?, ?, ?, ?)" ); $stmt->execute([ $evento, mb_substr(json_encode($d, JSON_UNESCAPED_UNICODE), 0, 500), substr(trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]), 0, 45), substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 255), ]); } catch (\Throwable $e) { // La bitácora jamás debe afectar a la pantalla error_log('[log_tv] ' . $e->getMessage()); }