query("SELECT language_code FROM supported_languages WHERE is_active = 1"); $activeLanguages = $stmt->fetchAll(\PDO::FETCH_COLUMN); $stmt = $pdo->prepare(" SELECT * FROM translation_queue WHERE status = 'pending' ORDER BY created_at ASC LIMIT 10 FOR UPDATE SKIP LOCKED "); $stmt->execute(); $queueItems = $stmt->fetchAll(); $results = ['processed' => 0, 'completed' => 0, 'failed' => 0]; foreach ($queueItems as $item) { $pdo->prepare("UPDATE translation_queue SET status = 'processing', attempts = attempts + 1 WHERE id = ?") ->execute([$item['id']]); try { $sourceLang = $item['source_lang']; $targetLangs = array_filter($activeLanguages, fn($l) => $l !== $sourceLang); $translatedTexts = []; foreach ($targetLangs as $lang) { $translatedTexts[$lang] = $translate->translate( $item['text_to_translate'], $sourceLang, $lang ); } sendTranslationToUser($item, $translatedTexts); $pdo->prepare(" UPDATE translation_queue SET status = 'completed', processed_at = NOW() WHERE id = ? ")->execute([$item['id']]); $results['completed']++; } catch (\Exception $e) { $attempts = $item['attempts'] + 1; if ($attempts >= 5) { $pdo->prepare(" UPDATE translation_queue SET status = 'failed', error_message = ?, attempts = ? WHERE id = ? ")->execute([$e->getMessage(), $attempts, $item['id']]); $results['failed']++; } else { $pdo->prepare("UPDATE translation_queue SET status = 'pending', attempts = ? WHERE id = ?") ->execute([$attempts, $item['id']]); } } $results['processed']++; } return $results; } function sendTranslationToUser(array $item, array $translatedTexts): void { $platform = $item['platform']; $chatId = $item['chat_id']; $originalText = $item['text_to_translate']; $sourceLang = strtoupper($item['source_lang']); if ($platform === 'telegram') { $sender = new \Telegram\TelegramSender(); $message = "🌐 Traducción\n\n"; $message .= "Original ({$sourceLang}):\n"; $message .= $originalText . "\n\n"; foreach ($translatedTexts as $lang => $text) { if ($text) { $message .= "" . strtoupper($lang) . ":\n"; $message .= $text . "\n\n"; } } $sender->sendMessage($chatId, $message); } elseif ($platform === 'discord') { $sender = new \Discord\DiscordSender(); $embed = [ 'title' => '🌐 Traducción', 'description' => $originalText, 'color' => 3066993, 'fields' => [] ]; foreach ($translatedTexts as $lang => $text) { if ($text) { $embed['fields'][] = [ 'name' => strtoupper($lang), 'value' => mb_substr($text, 0, 1024), 'inline' => false ]; } } $sender->sendMessage($chatId, '', $embed); } } function logMessage(string $message): void { echo "[" . date('Y-m-d H:i:s') . "] " . $message . PHP_EOL; } if (DAEMON_MODE) { logMessage("Translation Queue Worker started"); while (true) { try { $results = processTranslationQueue(); if ($results['processed'] > 0) { logMessage("Processed: {$results['processed']}, Completed: {$results['completed']}, Failed: {$results['failed']}"); } } catch (Exception $e) { logMessage("Error: " . $e->getMessage()); } sleep(SLEEP_INTERVAL); } } else { $results = processTranslationQueue(); echo "Translation Queue - Processed: {$results['processed']}, Completed: {$results['completed']}, Failed: {$results['failed']}\n"; }