diff --git a/admin_send_message.php b/admin_send_message.php index e4c3570..621432f 100755 --- a/admin_send_message.php +++ b/admin_send_message.php @@ -140,32 +140,45 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { $sender = \Common\Helpers\SenderFactory::create($schedule['platform']); // Obtener botones de traducción (convertir HTML a texto plano) - $plainText = html_entity_decode(strip_tags($schedule['content']), ENT_QUOTES | ENT_HTML5, 'UTF-8'); - $plainText = preg_replace('/\s+/', ' ', $plainText); // Normalizar espacios + $plainText = $schedule['content']; + // Marcar donde hay imágenes + $plainText = preg_replace('/]+src=["\']([^"\']+)["\'][^>]*>/i', "\n[IMAGEN]\n", $plainText); + // Convertir saltos de párrafo y br a saltos de línea dobles + $plainText = preg_replace('/<\/p>/i', "\n\n", $plainText); + $plainText = preg_replace('/]*>/i', '', $plainText); + $plainText = preg_replace('//i', "\n", $plainText); + // Eliminar HTML restante + $plainText = html_entity_decode(strip_tags($plainText), ENT_QUOTES | ENT_HTML5, 'UTF-8'); + // Limpiar espacios múltiples pero preservar saltos de línea (máximo 2) + $plainText = preg_replace('/[ \t]+/', ' ', $plainText); + $plainText = preg_replace('/\n{3,}/', "\n\n", $plainText); + $plainText = trim($plainText); $translationButtons = getTranslationButtons($pdo, $plainText); // Parsear el contenido HTML en segmentos manteniendo el orden $segments = $sender->parseContent($schedule['content']); $messageCount = 0; + $totalSegments = count($segments); + $currentSegment = 0; // Enviar cada segmento en el orden correcto foreach ($segments as $segment) { + $currentSegment++; + $isLastSegment = ($currentSegment === $totalSegments); + if ($segment['type'] === 'text') { // Convertir el texto al formato de la plataforma $textContent = \Common\Helpers\ConverterFactory::convert($schedule['platform'], $segment['content']); if (!empty(trim($textContent))) { - // Agregar botones de traducción al último segmento de texto $buttons = null; - if ($segment === end($segments)) { - $buttons = $schedule['platform'] === 'telegram' - ? $translationButtons['telegram'] - : $translationButtons['discord']; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; } if ($schedule['platform'] === 'telegram') { - $sender->sendMessage($schedule['platform_id'], $textContent, $buttons); + $sender->sendMessage($schedule['platform_id'], $textContent); } else { $sender->sendMessage($schedule['platform_id'], $textContent, null, $buttons); } @@ -174,22 +187,43 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } elseif ($segment['type'] === 'image') { $imagePath = $segment['src']; - // Quitar parámetros de URL si los hay - $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; + $appUrl = $_ENV['APP_URL'] ?? getenv('APP_URL') ?? ''; + $baseUrl = rtrim($appUrl, '/'); - if (file_exists($imgPath)) { - // Es un archivo local - $sender->sendMessageWithAttachments($schedule['platform_id'], '', [$imgPath]); - $messageCount++; - } elseif (strpos($imagePath, 'http') === 0) { - // Es una URL remota - $embed = ['image' => ['url' => $imagePath]]; - $sender->sendMessage($schedule['platform_id'], '', $embed); + $buttons = null; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; + } + + if ($schedule['platform'] === 'telegram') { + if (strpos($imagePath, 'http') !== 0) { + $imageUrl = $baseUrl . '/' . ltrim($imagePath, '/'); + } else { + $imageUrl = $imagePath; + } + $sender->sendPhoto($schedule['platform_id'], $imageUrl); $messageCount++; + } else { + $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; + if (file_exists($imgPath)) { + $sender->sendMessageWithImages($schedule['platform_id'], '', [$imgPath], $buttons); + $messageCount++; + } elseif (strpos($imagePath, 'http') === 0) { + $embed = ['image' => ['url' => $imagePath]]; + $sender->sendMessage($schedule['platform_id'], '', $embed, $buttons); + $messageCount++; + } } } } + // Enviar botones de traducción en mensaje separado para Telegram + if ($schedule['platform'] === 'telegram' && !empty($translationButtons['telegram'])) { + $translationMessage = "🌐 Traducciones disponibles:\nHaz clic en una bandera para ver la traducción"; + $sender->sendMessage($schedule['platform_id'], $translationMessage, $translationButtons['telegram']); + $messageCount++; + } + $stmt = $pdo->prepare(" INSERT INTO sent_messages (schedule_id, recipient_id, platform_message_id, message_count, sent_at) VALUES (?, ?, '', ?, NOW()) diff --git a/create_message.php b/create_message.php index 94c2a8a..dc14a13 100755 --- a/create_message.php +++ b/create_message.php @@ -127,35 +127,39 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' // Obtener botones de traducción (convertir HTML a texto plano) $plainText = $schedule['content']; - // Convertir saltos de párrafo a saltos de línea - $plainText = preg_replace('/<\/p>/i', "\n", $plainText); + // Marcar donde hay imágenes + $plainText = preg_replace('/]+src=["\']([^"\']+)["\'][^>]*>/i', "\n[IMAGEN]\n", $plainText); + // Convertir saltos de párrafo y br a saltos de línea dobles + $plainText = preg_replace('/<\/p>/i', "\n\n", $plainText); $plainText = preg_replace('/]*>/i', '', $plainText); $plainText = preg_replace('//i', "\n", $plainText); - // Eliminar HTML + // Eliminar HTML restante $plainText = html_entity_decode(strip_tags($plainText), ENT_QUOTES | ENT_HTML5, 'UTF-8'); - // Limpiar espacios múltiples pero preservar saltos de línea + // Limpiar espacios múltiples pero preservar saltos de línea (máximo 2) $plainText = preg_replace('/[ \t]+/', ' ', $plainText); - $plainText = preg_replace('/\n\s*\n/', "\n", $plainText); + $plainText = preg_replace('/\n{3,}/', "\n\n", $plainText); $plainText = trim($plainText); $translationButtons = getTranslationButtons($pdo, $plainText); $segments = $sender->parseContent($schedule['content']); $messageCount = 0; + $totalSegments = count($segments); + $currentSegment = 0; foreach ($segments as $segment) { + $currentSegment++; + $isLastSegment = ($currentSegment === $totalSegments); + if ($segment['type'] === 'text') { $textContent = \Common\Helpers\ConverterFactory::convert($schedule['platform'], $segment['content']); if (!empty(trim($textContent))) { - // Agregar botones de traducción al último segmento de texto $buttons = null; - if ($segment === end($segments)) { - $buttons = $schedule['platform'] === 'telegram' - ? $translationButtons['telegram'] - : $translationButtons['discord']; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; } if ($schedule['platform'] === 'telegram') { - $sender->sendMessage($schedule['platform_id'], $textContent, $buttons); + $sender->sendMessage($schedule['platform_id'], $textContent); } else { $sender->sendMessage($schedule['platform_id'], $textContent, null, $buttons); } @@ -163,19 +167,44 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST[' } } elseif ($segment['type'] === 'image') { $imagePath = $segment['src']; - $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; - if (file_exists($imgPath)) { - $sender->sendMessageWithAttachments($schedule['platform_id'], '', [$imgPath]); - $messageCount++; - } elseif (strpos($imagePath, 'http') === 0) { - $embed = ['image' => ['url' => $imagePath]]; - $sender->sendMessage($schedule['platform_id'], '', $embed); + $appUrl = $_ENV['APP_URL'] ?? getenv('APP_URL') ?? ''; + $baseUrl = rtrim($appUrl, '/'); + + $buttons = null; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; + } + + if ($schedule['platform'] === 'telegram') { + if (strpos($imagePath, 'http') !== 0) { + $imageUrl = $baseUrl . '/' . ltrim($imagePath, '/'); + } else { + $imageUrl = $imagePath; + } + $sender->sendPhoto($schedule['platform_id'], $imageUrl); $messageCount++; + } else { + $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; + if (file_exists($imgPath)) { + $sender->sendMessageWithImages($schedule['platform_id'], '', [$imgPath], $buttons); + $messageCount++; + } elseif (strpos($imagePath, 'http') === 0) { + $embed = ['image' => ['url' => $imagePath]]; + $sender->sendMessage($schedule['platform_id'], '', $embed, $buttons); + $messageCount++; + } } } } + // Enviar botones de traducción en mensaje separado para Telegram + if ($schedule['platform'] === 'telegram' && !empty($translationButtons['telegram'])) { + $translationMessage = "🌐 Traducciones disponibles:\nHaz clic en una bandera para ver la traducción"; + $sender->sendMessage($schedule['platform_id'], $translationMessage, $translationButtons['telegram']); + $messageCount++; + } + $stmt = $pdo->prepare(" INSERT INTO sent_messages (schedule_id, recipient_id, platform_message_id, message_count, sent_at) VALUES (?, ?, '', ?, NOW()) diff --git a/discord_bot.php b/discord_bot.php index bb77363..60dfca7 100755 --- a/discord_bot.php +++ b/discord_bot.php @@ -356,13 +356,11 @@ function handleAutoTranslationWithButtons(PDO $pdo, Message $message, string $te // Preparar botones $buttons = []; foreach ($activeLanguages as $lang) { - if ($lang['language_code'] !== $detectedLang) { - $buttons[] = [ - 'label' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']), - 'custom_id' => 'translate_' . $lang['language_code'] . ':' . $textHash, - 'style' => 1 - ]; - } + $buttons[] = [ + 'label' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']), + 'custom_id' => 'translate_' . $lang['language_code'] . ':' . $textHash, + 'style' => 1 + ]; } // Enviar mensaje con botones usando MessageBuilder correctamente @@ -508,13 +506,11 @@ function handleTranslateInteraction($interaction, string $customId): void $targetLang = str_replace('translate_', '', $parts[0]); $textHash = $parts[1] ?? ''; - // Obtener texto de la base de datos primero $stmt = $pdo->prepare("SELECT original_text FROM translation_cache WHERE text_hash = ?"); $stmt->execute([$textHash]); $row = $stmt->fetch(); if (!$row || empty($row['original_text'])) { - // Enviar error efímero $builder = \Discord\Builders\MessageBuilder::new() ->setContent('❌ Error: Texto no encontrado'); $interaction->respondWithMessage($builder, true); @@ -523,34 +519,25 @@ function handleTranslateInteraction($interaction, string $customId): void $originalText = $row['original_text']; - // Responder inmediatamente con "Traduciendo..." - $loadingBuilder = \Discord\Builders\MessageBuilder::new() - ->setContent("⏳ Traduciendo a " . strtoupper($targetLang) . "..."); - $interaction->respondWithMessage($loadingBuilder, true); + try { + $interaction->acknowledge(); + } catch (\Exception $e) { + error_log("Acknowledge error: " . $e->getMessage()); + } - // Ahora traducir (esto puede tardar) - // Usar texto sin emojis para detectar idioma y traducir con mayor precisión $textForDetection = stripEmojisForDetection($originalText); $sourceLang = $translator->detectLanguage($textForDetection) ?? 'es'; $translated = $translator->translate($textForDetection, $sourceLang, $targetLang); if ($translated) { - // Limpiar todo el HTML $translated = strip_tags($translated); - // Limpiar asteriscos duplicados $translated = preg_replace('/\*+/', '', $translated); - // Limpiar comandos con espacios $translated = preg_replace('/\/(\s+)(\w+)/', '/$2', $translated); $translated = preg_replace('/#(\s+)(\w+)/', '#$2', $translated); - // Limpiar saltos de línea extras $translated = preg_replace('/\n\s*\n/', "\n", $translated); - // Actualizar la respuesta con la traducción real - // Preservar emojis del original si los hay $displayText = trim($translated); if (strpos($originalText, '👍') !== false || preg_match('/[\x{1F300}-\x{1F9FF}]/u', $originalText)) { - // Si el original tenía emojis, intentar identificarlos - // Para mensajes simples, los emojis generalmente están al inicio o final $emojiPrefix = ''; $emojiSuffix = ''; if (preg_match('/^([\x{1F300}-\x{1F9FF}]+)\s*/u', $originalText, $match)) { @@ -562,25 +549,32 @@ function handleTranslateInteraction($interaction, string $customId): void $displayText = $emojiPrefix . $displayText . $emojiSuffix; } - $finalBuilder = \Discord\Builders\MessageBuilder::new() - ->setContent("🌐 **Traducción (" . strtoupper($targetLang) . "):**\n\n" . $displayText); - $interaction->updateOriginalResponse($finalBuilder); + $messageText = "🌐 **Traducción (" . strtoupper($targetLang) . "):**\n\n" . $displayText; + + $buttons = getDiscordTranslationButtons($pdo, $originalText); + + $builder = \Discord\Builders\MessageBuilder::new() + ->setContent($messageText); + + if (!empty($buttons)) { + $actionRow = new \Discord\Builders\Components\ActionRow(); + foreach ($buttons[0]['components'] as $btn) { + $button = \Discord\Builders\Components\Button::new(\Discord\Builders\Components\Button::STYLE_PRIMARY) + ->setLabel($btn['label']) + ->setCustomId($btn['custom_id']); + $actionRow->addComponent($button); + } + $builder->addComponent($actionRow); + } + + $interaction->message->edit($builder); + } else { - // Actualizar con error - $errorBuilder = \Discord\Builders\MessageBuilder::new() - ->setContent("❌ Error al traducir"); - $interaction->updateOriginalResponse($errorBuilder); + $interaction->message->edit(\Discord\Builders\MessageBuilder::new()->setContent("❌ Error al traducir")); } } catch (Exception $e) { error_log("Discord translate error: " . $e->getMessage()); - try { - $builder = \Discord\Builders\MessageBuilder::new() - ->setContent('❌ Error en el proceso de traducción'); - $interaction->respondWithMessage($builder, true); - } catch (Exception $inner) { - error_log("Error responding to interaction: " . $inner->getMessage()); - } } } diff --git a/docker/supervisord.conf b/docker/supervisord.conf index f30d0c5..88c8ef0 100755 --- a/docker/supervisord.conf +++ b/docker/supervisord.conf @@ -1,3 +1,7 @@ +[unix_http_server] +file=/var/run/supervisor.sock +chmod=0700 + [supervisord] nodaemon=true logfile=/var/www/html/logs/supervisor.log @@ -5,6 +9,12 @@ logfile_maxbytes=50MB pidfile=/var/run/supervisord.pid childlogdir=/var/www/html/logs +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl=unix:///var/run/supervisor.sock + [program:apache] process_name=%(program_name)s command=/usr/sbin/apache2ctl -D FOREGROUND diff --git a/gallery.php b/gallery.php index 532b996..d2072c0 100755 --- a/gallery.php +++ b/gallery.php @@ -2,6 +2,7 @@ require_once __DIR__ . '/includes/db.php'; require_once __DIR__ . '/includes/session_check.php'; require_once __DIR__ . '/includes/i18n.php'; +require_once __DIR__ . '/includes/activity_logger.php'; checkSession(); $pageTitle = t('Galería de Imágenes'); diff --git a/login.php b/login.php index e1839b3..f4c8625 100755 --- a/login.php +++ b/login.php @@ -2,12 +2,9 @@ require_once __DIR__ . '/includes/db.php'; require_once __DIR__ . '/includes/env_loader.php'; require_once __DIR__ . '/includes/auth.php'; -require_once __DIR__ . '/includes/i18n.php'; - -handleLanguageChange(); $domain = $_ENV['APP_URL'] ?? getenv('APP_URL') ?? ''; -if ($domain) { +if ($domain && session_status() === PHP_SESSION_NONE) { $parsed = parse_url($domain); $host = $parsed['host'] ?? ''; if ($host) { @@ -22,7 +19,9 @@ if ($domain) { } } -session_start(); +require_once __DIR__ . '/includes/i18n.php'; + +handleLanguageChange(); if (isset($_SESSION['user_id'])) { header('Location: index.php'); diff --git a/process_queue.php b/process_queue.php index 2822d58..41d7cc7 100755 --- a/process_queue.php +++ b/process_queue.php @@ -104,15 +104,17 @@ function processScheduledMessages(): array // Obtener botones de traducción (convertir HTML a texto plano) $plainText = $schedule['content']; - // Convertir saltos de párrafo a saltos de línea - $plainText = preg_replace('/<\/p>/i', "\n", $plainText); + // Marcar donde hay imágenes + $plainText = preg_replace('/]+src=["\']([^"\']+)["\'][^>]*>/i', "\n[IMAGEN]\n", $plainText); + // Convertir saltos de párrafo y br a saltos de línea dobles + $plainText = preg_replace('/<\/p>/i', "\n\n", $plainText); $plainText = preg_replace('/]*>/i', '', $plainText); $plainText = preg_replace('//i', "\n", $plainText); - // Eliminar HTML + // Eliminar HTML restante $plainText = html_entity_decode(strip_tags($plainText), ENT_QUOTES | ENT_HTML5, 'UTF-8'); - // Limpiar espacios múltiples pero preservar saltos de línea + // Limpiar espacios múltiples pero preservar saltos de línea (máximo 2) $plainText = preg_replace('/[ \t]+/', ' ', $plainText); - $plainText = preg_replace('/\n\s*\n/', "\n", $plainText); + $plainText = preg_replace('/\n{3,}/', "\n\n", $plainText); $plainText = trim($plainText); $translationButtons = getTranslationButtons($pdo, $plainText); @@ -120,24 +122,26 @@ function processScheduledMessages(): array $segments = $sender->parseContent($schedule['content']); $messageCount = 0; + $totalSegments = count($segments); + $currentSegment = 0; // Enviar cada segmento en el orden correcto foreach ($segments as $segment) { + $currentSegment++; + $isLastSegment = ($currentSegment === $totalSegments); + if ($segment['type'] === 'text') { // Convertir el texto al formato de la plataforma $textContent = ConverterFactory::convert($schedule['platform'], $segment['content']); if (!empty(trim($textContent))) { - // Agregar botones de traducción al último segmento de texto $buttons = null; - if ($segment === end($segments)) { - $buttons = $schedule['platform'] === 'telegram' - ? $translationButtons['telegram'] - : $translationButtons['discord']; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; } if ($schedule['platform'] === 'telegram') { - $sender->sendMessage($schedule['platform_id'], $textContent, $buttons); + $sender->sendMessage($schedule['platform_id'], $textContent); } else { $sender->sendMessage($schedule['platform_id'], $textContent, null, $buttons); } @@ -146,22 +150,43 @@ function processScheduledMessages(): array } elseif ($segment['type'] === 'image') { $imagePath = $segment['src']; - // Quitar parámetros de URL si los hay - $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; + $appUrl = $_ENV['APP_URL'] ?? getenv('APP_URL') ?? ''; + $baseUrl = rtrim($appUrl, '/'); - if (file_exists($imgPath)) { - // Es un archivo local - $sender->sendMessageWithAttachments($schedule['platform_id'], '', [$imgPath]); - $messageCount++; - } elseif (strpos($imagePath, 'http') === 0) { - // Es una URL remota - $embed = ['image' => ['url' => $imagePath]]; - $sender->sendMessage($schedule['platform_id'], '', $embed); + $buttons = null; + if ($isLastSegment && $schedule['platform'] !== 'telegram') { + $buttons = $translationButtons['discord']; + } + + if ($schedule['platform'] === 'telegram') { + if (strpos($imagePath, 'http') !== 0) { + $imageUrl = $baseUrl . '/' . ltrim($imagePath, '/'); + } else { + $imageUrl = $imagePath; + } + $sender->sendPhoto($schedule['platform_id'], $imageUrl); $messageCount++; + } else { + $imgPath = parse_url($imagePath, PHP_URL_PATH) ?: $imagePath; + if (file_exists($imgPath)) { + $sender->sendMessageWithImages($schedule['platform_id'], '', [$imgPath], $buttons); + $messageCount++; + } elseif (strpos($imagePath, 'http') === 0) { + $embed = ['image' => ['url' => $imagePath]]; + $sender->sendMessage($schedule['platform_id'], '', $embed, $buttons); + $messageCount++; + } } } } + // Enviar botones de traducción en mensaje separado para Telegram + if ($schedule['platform'] === 'telegram' && !empty($translationButtons['telegram'])) { + $translationMessage = "🌐 Traducciones disponibles:\nHaz clic en una bandera para ver la traducción"; + $sender->sendMessage($schedule['platform_id'], $translationMessage, $translationButtons['telegram']); + $messageCount++; + } + $stmt = $pdo->prepare(" INSERT INTO sent_messages (schedule_id, recipient_id, platform_message_id, message_count, sent_at) VALUES (?, ?, ?, ?, NOW()) diff --git a/src/Translate.php b/src/Translate.php index d5b2cc9..cfd2282 100755 --- a/src/Translate.php +++ b/src/Translate.php @@ -34,7 +34,6 @@ class Translate } try { - // Primero intentar obtener del caché $cacheKey = $this->generateCacheKey($text, $sourceLang, $targetLang); $cached = $this->getFromCache($cacheKey); @@ -46,25 +45,32 @@ class Translate $lines = explode("\n", $text); $translatedLines = []; - foreach ($lines as $line) { - if (trim($line) === '') { + error_log("Translate: " . count($lines) . " lines from $sourceLang to $targetLang"); + + foreach ($lines as $index => $line) { + $trimmed = trim($line); + if ($trimmed === '') { $translatedLines[] = ''; + error_log("Line $index: empty -> empty"); continue; } $response = $this->request('/translate', [ - 'q' => trim($line), + 'q' => $trimmed, 'source' => $sourceLang, 'target' => $targetLang, 'format' => 'text' ]); - $translatedLines[] = $response['translatedText'] ?? trim($line); + $translated = $response['translatedText'] ?? $trimmed; + $translatedLines[] = $translated; + error_log("Line $index: '$trimmed' -> '$translated'"); } $result = implode("\n", $translatedLines); - // Guardar en caché + error_log("Final result (length: " . strlen($result) . "): " . str_replace("\n", "\\n", substr($result, 0, 100))); + $this->saveToCache($cacheKey, $result); return $result; diff --git a/telegram/TelegramSender.php b/telegram/TelegramSender.php index 1d30d3c..cff8dbf 100755 --- a/telegram/TelegramSender.php +++ b/telegram/TelegramSender.php @@ -27,7 +27,7 @@ class TelegramSender return $this->request('sendMessage', $data); } - public function editMessageText(int $chatId, int $messageId, string $text, ?array $keyboard = null, ?string $parseMode = 'HTML'): array + public function editMessageText(int $chatId, int $messageId, string $text, ?array $keyboard = null, ?string $parseMode = 'HTML', ?string $inlineMessageId = null): array { $data = [ 'chat_id' => $chatId, @@ -35,6 +35,12 @@ class TelegramSender 'text' => $text, ]; + if ($inlineMessageId) { + unset($data['chat_id']); + unset($data['message_id']); + $data['inline_message_id'] = $inlineMessageId; + } + if ($parseMode) { $data['parse_mode'] = $parseMode; } diff --git a/telegram/webhook/telegram_bot_webhook.php b/telegram/webhook/telegram_bot_webhook.php index aaa8d5d..7ccdffc 100755 --- a/telegram/webhook/telegram_bot_webhook.php +++ b/telegram/webhook/telegram_bot_webhook.php @@ -23,11 +23,11 @@ if (!$update) { exit('No update'); } -file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " -收到更新\n", FILE_APPEND); +file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - Received update\n", FILE_APPEND); if (isset($update['callback_query'])) { $callbackData = $update['callback_query']['data'] ?? 'no data'; - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - Callback: $callbackData\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - Callback: $callbackData\n", FILE_APPEND); } try { @@ -82,11 +82,12 @@ try { $callbackData = $callbackQuery['data']; $chatId = $callbackQuery['message']['chat']['id']; $messageId = $callbackQuery['message']['message_id']; + $inlineMessageId = $callbackQuery['inline_message_id'] ?? null; $userId = $callbackQuery['from']['id'] ?? ''; error_log("Telegram callback - chatId: $chatId, messageId: $messageId, userId: $userId, callbackData: $callbackData"); - handleTelegramCallback($pdo, $sender, $translator, $chatId, $messageId, $callbackQuery['id'], $callbackData); + handleTelegramCallback($pdo, $sender, $translator, $chatId, $messageId, $inlineMessageId, $callbackQuery['id'], $callbackData); } } catch (Exception $e) { @@ -119,7 +120,7 @@ function handleAutoTranslation(PDO $pdo, Telegram\TelegramSender $sender, src\Tr } } -function getTelegramTranslationButtons(PDO $pdo, string $text, ?string $excludeLang = null): ?array +function getTelegramTranslationButtons(PDO $pdo, string $text): ?array { try { $stmt = $pdo->query("SELECT language_code, flag_emoji FROM supported_languages WHERE is_active = 1"); @@ -135,10 +136,6 @@ function getTelegramTranslationButtons(PDO $pdo, string $text, ?string $excludeL $buttons = []; foreach ($activeLanguages as $lang) { - if ($excludeLang && $lang['language_code'] === $excludeLang) { - continue; - } - $callbackData = "translate:" . $lang['language_code'] . ":" . $textHash; $buttons[] = [ @@ -360,7 +357,7 @@ function sendTemplateByCommand(PDO $pdo, Telegram\TelegramSender $sender, int $c } } -function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\Translate $translator, int $chatId, int $messageId, string $callbackQueryId, string $callbackData): void +function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\Translate $translator, int $chatId, int $messageId, ?string $inlineMessageId, string $callbackQueryId, string $callbackData): void { $parts = explode(':', $callbackData, 3); $action = $parts[0] ?? ''; @@ -369,7 +366,7 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T $targetLang = $parts[1] ?? 'es'; $textHash = $parts[2] ?? ''; - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - targetLang: $targetLang, textHash: $textHash\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - targetLang: $targetLang, textHash: $textHash\n", FILE_APPEND); // Recuperar texto de la base de datos $stmt = $pdo->prepare("SELECT original_text FROM translation_cache WHERE text_hash = ?"); @@ -377,7 +374,7 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T $row = $stmt->fetch(); if (!$row) { - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: No text found\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: No text found\n", FILE_APPEND); $sender->answerCallbackQuery($callbackQueryId, "❌ Error: Texto no encontrado"); return; } @@ -385,7 +382,7 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T $originalText = $row['original_text']; if (empty($originalText)) { - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: Empty text\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: Empty text\n", FILE_APPEND); $sender->answerCallbackQuery($callbackQueryId, "❌ Error: No se pudo recuperar el texto"); return; } @@ -394,11 +391,11 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T // Obtener el idioma original (usar texto sin emojis para mayor precisión) $textForDetection = stripEmojisForDetection($originalText); $sourceLang = $translator->detectLanguage($textForDetection) ?? 'es'; - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - sourceLang: $sourceLang, targetLang: $targetLang, originalText: " . substr($originalText, 0, 50) . "\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - sourceLang: $sourceLang, targetLang: $targetLang, originalText: " . substr($originalText, 0, 50) . "\n", FILE_APPEND); // Traducir (usar texto sin emojis para evitar interferencias) $translated = $translator->translate($textForDetection ?: $originalText, $sourceLang, $targetLang); - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - translated: $translated\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - translated: $translated\n", FILE_APPEND); if ($translated) { // Limpiar TODAS las etiquetas HTML problemáticas (con espacios como < b > o ) @@ -422,16 +419,16 @@ function handleTelegramCallback(PDO $pdo, Telegram\TelegramSender $sender, src\T $sender->answerCallbackQuery($callbackQueryId, "", false); - $keyboard = getTelegramTranslationButtons($pdo, $originalText, $targetLang); + $keyboard = getTelegramTranslationButtons($pdo, $originalText); - $result = $sender->editMessageText($chatId, $messageId, "🌐 Traducción (" . strtoupper($targetLang) . "):\n\n" . $translated, $keyboard); - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - editMessageText result: " . json_encode($result) . "\n", FILE_APPEND); + $result = $sender->editMessageText($chatId, $messageId, "🌐 Traducción (" . strtoupper($targetLang) . "):\n\n" . $translated, $keyboard, 'HTML', $inlineMessageId); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - editMessageText result: " . json_encode($result) . "\n", FILE_APPEND); } else { - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: Translation failed\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - ERROR: Translation failed\n", FILE_APPEND); $sender->answerCallbackQuery($callbackQueryId, "❌ Error al traducir el mensaje", false); } } catch (Exception $e) { - file_put_contents('/var/www/html/lastwar/logs/telegram_debug.log', date('Y-m-d H:i:s') . " - EXCEPTION: " . $e->getMessage() . "\n", FILE_APPEND); + file_put_contents(__DIR__ . '/../../logs/telegram_debug.log', date('Y-m-d H:i:s') . " - EXCEPTION: " . $e->getMessage() . "\n", FILE_APPEND); $sender->answerCallbackQuery($callbackQueryId, "❌ Error en la traducción", false); } } elseif ($action === 'chat_mode') { diff --git a/templates/header.php b/templates/header.php index a2c4e21..bac7a0a 100755 --- a/templates/header.php +++ b/templates/header.php @@ -1,5 +1,7 @@