false, 'error' => 'Acceso denegado']); exit; } $chatId = $_POST['chat_id'] ?? null; $message = trim($_POST['message'] ?? ''); if (!$chatId || !$message) { echo json_encode(['success' => false, 'error' => 'Faltan parámetros']); exit; } $botToken = $_ENV['TELEGRAM_BOT_TOKEN'] ?? ''; if (empty($botToken)) { echo json_encode(['success' => false, 'error' => 'Token de Telegram no configurado']); exit; } try { $telegram = new TelegramSender($botToken, $pdo); $converter = new HtmlToTelegramHtmlConverter(); // Verificar si el mensaje es un comando (comienza con #) if (strpos($message, '#') === 0) { // Extraer el comando (eliminando el # inicial y cualquier espacio en blanco) $command = trim(substr($message, 1)); // Depuración: Mostrar el comando que se está buscando error_log("Buscando comando: " . $command); // Buscar el comando en la base de datos (insensible a mayúsculas/minúsculas) $sql = "SELECT id, telegram_command, message_content FROM recurrent_messages WHERE LOWER(telegram_command) = LOWER(?)"; error_log("SQL: " . $sql . " - Parámetro: " . $command); $stmt = $pdo->prepare($sql); $stmt->execute([$command]); $template = $stmt->fetch(PDO::FETCH_ASSOC); // Depuración: Mostrar si se encontró el comando if ($template) { error_log("Comando encontrado - ID: " . $template['id'] . ", Comando: " . $template['telegram_command']); // Usar el convertidor HTML para manejar correctamente el formato $convertedContent = $converter->convert($template['message_content']); // Usar el método sendMessage de TelegramSender que ya maneja la división de mensajes e imágenes error_log("Enviando mensaje con comando: " . $template['telegram_command']); $messageIds = $telegram->sendMessage($chatId, $convertedContent, ['parse_mode' => 'HTML']); if ($messageIds === false) { $error = "Error al enviar el mensaje a través de la API de Telegram"; error_log($error); throw new Exception($error); } // Verificar si hubo errores en el envío de las partes $failedParts = array_filter($messageIds, function($part) { return isset($part['success']) && $part['success'] === false; }); if (!empty($failedParts)) { $error = "Algunas partes del mensaje no se pudieron enviar. Detalles: " . json_encode($failedParts); error_log($error); throw new Exception($error); } // Guardar tanto el comando como la respuesta en la base de datos $stmt = $pdo->prepare( "INSERT INTO telegram_interactions (chat_id, message_text, direction) VALUES (?, ?, 'out')" ); // Guardar el comando original $stmt->execute([$chatId, $message]); // Guardar la respuesta automática (solo la primera parte para evitar llenar la base de datos) $firstPart = mb_substr($template['message_content'], 0, 1000) . (mb_strlen($template['message_content']) > 1000 ? '...' : ''); $stmt->execute([$chatId, $firstPart]); echo json_encode(['success' => true, 'is_command' => true]); exit; } else { error_log("Comando NO encontrado en la base de datos: " . $command); // Depuración adicional: Mostrar todos los comandos disponibles $allCommands = $pdo->query("SELECT id, telegram_command FROM recurrent_messages WHERE telegram_command IS NOT NULL")->fetchAll(PDO::FETCH_ASSOC); error_log("Comandos disponibles: " . print_r($allCommands, true)); } } // Si no es un comando o no se encontró el comando, enviar el mensaje normalmente error_log("Enviando mensaje normal"); $messageIds = $telegram->sendMessage($chatId, $message, [], true); if ($messageIds === false) { $error = "Error al enviar el mensaje a través de la API de Telegram"; error_log($error); throw new Exception($error); } // Verificar si hubo errores en el envío de las partes $failedParts = array_filter($messageIds, function($part) { return isset($part['success']) && $part['success'] === false; }); if (!empty($failedParts)) { $error = "Algunas partes del mensaje no se pudieron enviar. Detalles: " . json_encode($failedParts); error_log($error); throw new Exception($error); } // Guardar el mensaje saliente en la base de datos $stmt = $pdo->prepare( "INSERT INTO telegram_interactions (chat_id, message_text, direction) VALUES (?, ?, 'out')" ); $stmt->execute([$chatId, $message]); echo json_encode(['success' => true, 'is_command' => false]); } catch (Exception $e) { $errorMsg = 'Error en send_telegram_reply: ' . $e->getMessage(); error_log($errorMsg); // Intentar enviar un mensaje de error al chat si es posible try { if (isset($telegram) && $chatId) { $errorDetails = "⚠️ Error al procesar tu solicitud. Por favor, inténtalo de nuevo más tarde."; $telegram->sendMessage($chatId, $errorDetails); // También registrar el error en la base de datos if (isset($pdo)) { $stmt = $pdo->prepare( "INSERT INTO telegram_interactions (chat_id, message_text, direction, error) VALUES (?, ?, 'out', 1)" ); $stmt->execute([$chatId, "[ERROR] " . $e->getMessage()]); } } } catch (Exception $innerE) { error_log("Error al notificar al usuario: " . $innerE->getMessage()); } // Devolver el error al cliente echo json_encode([ 'success' => false, 'error' => $e->getMessage(), 'debug' => [ 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString() ] ]); }