Commit inicial con archivos existentes
This commit is contained in:
161
telegram/actions/send_telegram_reply.php
Executable file
161
telegram/actions/send_telegram_reply.php
Executable file
@@ -0,0 +1,161 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/includes/session_check.php';
|
||||
require_once __DIR__ . '/includes/db.php';
|
||||
require_once __DIR__ . '/src/TelegramSender.php';
|
||||
require_once __DIR__ . '/src/HtmlToTelegramHtmlConverter.php';
|
||||
require_once __DIR__ . '/config/config.php';
|
||||
|
||||
header('Content-Type: application/json');
|
||||
|
||||
// Solo para administradores
|
||||
if ($_SESSION['role'] !== 'admin') {
|
||||
echo json_encode(['success' => 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()
|
||||
]
|
||||
]);
|
||||
}
|
||||
Reference in New Issue
Block a user