query("SELECT language_code, flag_emoji FROM supported_languages WHERE is_active = 1 AND telegram_enabled = 1");
$telegramLanguages = $stmtTelegram->fetchAll();
$stmtDiscord = $pdo->query("SELECT language_code, flag_emoji FROM supported_languages WHERE is_active = 1 AND discord_enabled = 1");
$discordLanguages = $stmtDiscord->fetchAll();
if (count($telegramLanguages) <= 1 && count($discordLanguages) <= 1) {
return [];
}
return [
'telegram' => count($telegramLanguages) > 1 ? buildTelegramTranslationButtons($pdo, $telegramLanguages, $text) : [],
'discord' => count($discordLanguages) > 1 ? buildDiscordTranslationButtons($discordLanguages, $text) : []
];
}
function buildTelegramTranslationButtons(PDO $pdo, array $languages, string $text): array
{
if (count($languages) <= 1) {
return [];
}
// Guardar texto en la base de datos con hash consistente
$textHash = md5($text);
$stmt = $pdo->prepare("INSERT INTO translation_cache (text_hash, original_text) VALUES (?, ?) ON DUPLICATE KEY UPDATE original_text = VALUES(original_text)");
$stmt->execute([$textHash, $text]);
$buttons = [];
foreach ($languages as $lang) {
$buttons[] = [
'text' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']),
'callback_data' => 'translate:' . $lang['language_code'] . ':' . $textHash
];
}
return [
'inline_keyboard' => array_chunk($buttons, 3)
];
}
function buildDiscordTranslationButtons(array $languages, string $text): array
{
$buttons = [];
$textHash = md5($text);
foreach ($languages as $lang) {
$buttons[] = [
'label' => $lang['flag_emoji'] . ' ' . strtoupper($lang['language_code']),
'custom_id' => 'translate_' . $lang['language_code'] . ':' . $textHash,
'style' => 1
];
}
return [
[
'type' => 1,
'components' => array_slice($buttons, 0, 5)
]
];
}
$pageTitle = t('Enviar Mensaje Directo');
$recipients = [];
$galleryImages = [];
try {
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT * FROM recipients ORDER BY platform, name");
$recipients = $stmt->fetchAll();
// Cargar imágenes de la galería
$galleryPath = __DIR__ . '/galeria';
if (is_dir($galleryPath)) {
$files = scandir($galleryPath);
foreach ($files as $file) {
if (in_array(strtolower(pathinfo($file, PATHINFO_EXTENSION)), ['jpg', 'jpeg', 'png', 'gif', 'webp'])) {
$galleryImages[] = $file;
}
}
}
} catch (Exception $e) {
$error = $e->getMessage();
}
$success = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$content = $_POST['content'];
$recipientId = $_POST['recipient_id'];
if ($content && $recipientId) {
$messageId = createMessage([
'user_id' => getCurrentUserId(),
'content' => $content
]);
// Obtener hora actual de MySQL para sincronización
$pdo = getDbConnection();
$stmt = $pdo->query("SELECT NOW() as now");
$now = $stmt->fetch()['now'];
$scheduleId = createSchedule([
'message_id' => $messageId,
'recipient_id' => $recipientId,
'send_time' => $now,
'status' => 'pending'
]);
// Procesar el mensaje inmediatamente
// Obtener datos del schedule recién creado
$stmt = $pdo->prepare("
SELECT s.*, m.content, r.platform_id, r.platform, r.name as recipient_name
FROM schedules s
JOIN messages m ON s.message_id = m.id
JOIN recipients r ON s.recipient_id = r.id
WHERE s.id = ?
");
$stmt->execute([$scheduleId]);
$schedule = $stmt->fetch();
$results = ['processed' => 0, 'sent' => 0, 'failed' => 0];
if ($schedule) {
$stmt = $pdo->prepare("UPDATE schedules SET status = 'processing' WHERE id = ?");
$stmt->execute([$schedule['id']]);
try {
$sender = \Common\Helpers\SenderFactory::create($schedule['platform']);
// Obtener botones de traducción (convertir HTML a texto plano)
$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))) {
$buttons = null;
if ($isLastSegment && $schedule['platform'] !== 'telegram') {
$buttons = $translationButtons['discord'];
}
if ($schedule['platform'] === 'telegram') {
$sender->sendMessage($schedule['platform_id'], $textContent);
} else {
$sender->sendMessage($schedule['platform_id'], $textContent, null, $buttons);
}
$messageCount++;
}
} elseif ($segment['type'] === 'image') {
$imagePath = $segment['src'];
$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())
");
$stmt->execute([$schedule['id'], $schedule['recipient_id'], $messageCount]);
$stmt = $pdo->prepare("UPDATE schedules SET status = 'sent', sent_at = NOW() WHERE id = ?");
$stmt->execute([$schedule['id']]);
$results['sent']++;
} catch (Exception $e) {
$stmt = $pdo->prepare("UPDATE schedules SET status = 'failed', error_message = ? WHERE id = ?");
$stmt->execute([$e->getMessage(), $schedule['id']]);
$results['failed']++;
}
$results['processed']++;
}
$success = "Mensaje enviado. Procesados: {$results['processed']}, Enviados: {$results['sent']}, Fallidos: {$results['failed']}";
}
}
require_once __DIR__ . '/templates/header.php';
?>