Bot Discord - Commit completo con todos los cambios

This commit is contained in:
Admin
2026-01-16 20:24:38 -06:00
commit cf8ecfcf64
151 changed files with 28808 additions and 0 deletions

View 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()
]
]);
}

View File

@@ -0,0 +1,75 @@
<?php
require_once __DIR__ . '/../../includes/session_check.php';
require_once __DIR__ . '/../../includes/db.php';
require_once __DIR__ . '/../TelegramSender.php';
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['action'])) {
header('Location: ../sent_messages.php');
exit();
}
$action = $_POST['action'];
if ($action === 'delete_message') {
if (!isset($_POST['sent_message_id'], $_POST['platform_message_id'], $_POST['chat_id'])) {
header('Location: ../sent_messages.php?error=missing_data');
exit();
}
$sentMessageId = $_POST['sent_message_id'];
$telegramMessageIdsJson = $_POST['platform_message_id'];
$chatId = $_POST['chat_id'];
$telegramMessageIds = json_decode($telegramMessageIdsJson, true);
// If decoding fails or the result is not an array, treat it as a single ID
if (json_last_error() !== JSON_ERROR_NONE || !is_array($telegramMessageIds)) {
$telegramMessageIds = [$telegramMessageIdsJson];
}
$telegramSender = new TelegramSender(TELEGRAM_BOT_TOKEN);
$allDeleted = true;
$error_messages = [];
try {
foreach ($telegramMessageIds as $messageId) {
// Skip if the ID is empty or invalid
if (empty($messageId) || !is_numeric($messageId)) {
error_log("Skipping invalid Telegram message ID: " . var_export($messageId, true));
continue;
}
try {
$telegramSender->deleteMessage($chatId, $messageId);
usleep(300000); // 300ms pause to avoid rate limits
} catch (Exception $e) {
$allDeleted = false;
$error_messages[] = "Failed to delete message ID {$messageId}: " . $e->getMessage();
error_log(end($error_messages)); // Log the last error
}
}
if ($allDeleted) {
// If all messages were deleted successfully, remove the record from DB
$stmt = $pdo->prepare("DELETE FROM sent_messages WHERE id = ?");
$stmt->execute([$sentMessageId]);
header('Location: ../sent_messages.php?success=deleted&platform=Telegram');
} else {
// If some deletions failed, redirect with an error message
$errorMessage = implode('; ', $error_messages);
header('Location: ../sent_messages.php?error=delete_failed&platform=Telegram&message=' . urlencode($errorMessage));
}
exit();
} catch (Exception $e) {
// Catch any other unexpected errors during the process
$errorMessage = "An unexpected error occurred: " . $e->getMessage();
error_log($errorMessage);
header('Location: ../sent_messages.php?error=unexpected_error&platform=Telegram&message=' . urlencode($errorMessage));
exit();
}
} // Closing brace for "if ($action === 'delete_message')"
// Fallback redirect if action is not 'delete_message'
header('Location: ../sent_messages.php');
exit();