Commit inicial con archivos existentes
This commit is contained in:
361
includes/message_handler.php
Executable file
361
includes/message_handler.php
Executable file
@@ -0,0 +1,361 @@
|
||||
<?php
|
||||
// Configurar zona horaria
|
||||
date_default_timezone_set('America/Mexico_City');
|
||||
|
||||
// Incluir el helper de programación
|
||||
require_once __DIR__ . '/schedule_helpers.php';
|
||||
|
||||
// Configuración de logs
|
||||
$logFile = dirname(__DIR__) . '/logs/discord_api.log';
|
||||
|
||||
// Crear el directorio de logs si no existe
|
||||
if (!file_exists(dirname($logFile))) {
|
||||
mkdir(dirname($logFile), 0755, true);
|
||||
}
|
||||
|
||||
// Incluir archivos necesarios
|
||||
require_once __DIR__ . '/session_check.php';
|
||||
require_once __DIR__ . '/db.php';
|
||||
require_once __DIR__ . '/activity_logger.php';
|
||||
|
||||
$submitAction = $_POST['submit'] ?? '';
|
||||
|
||||
// --- Special handler for sending from a template ---
|
||||
if ($submitAction === 'send_from_template') {
|
||||
$template_id = $_POST['recurrent_message_id'] ?? 0;
|
||||
$user_ids = $_POST['recipientId_user'] ?? [];
|
||||
$scheduleType = $_POST['scheduleType'] ?? 'now';
|
||||
$scheduleDateTime = $_POST['scheduleDateTime'] ?? null;
|
||||
$userId = $_SESSION['user_id'];
|
||||
|
||||
if (empty($template_id) || empty($user_ids)) {
|
||||
header("Location: ../enviar_plantilla.php?error=missing_fields");
|
||||
exit();
|
||||
}
|
||||
|
||||
$pdo->beginTransaction();
|
||||
try {
|
||||
// Fetch the message content from the template
|
||||
$stmt = $pdo->prepare("SELECT message_content FROM recurrent_messages WHERE id = ?");
|
||||
$stmt->execute([$template_id]);
|
||||
$template = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
if (!$template) {
|
||||
throw new Exception("La plantilla seleccionada no existe.");
|
||||
}
|
||||
$messageContent = $template['message_content'];
|
||||
|
||||
// 1. Insert the main message content into the messages table
|
||||
$stmt = $pdo->prepare("INSERT INTO messages (user_id, content) VALUES (?, ?)");
|
||||
$stmt->execute([$userId, $messageContent]);
|
||||
$messageId = $pdo->lastInsertId();
|
||||
|
||||
// 2. Determine the send time
|
||||
$sendTime = ($scheduleType === 'later')
|
||||
? (new DateTime($scheduleDateTime, new DateTimeZone('America/Mexico_City')))->format('Y-m-d H:i:s')
|
||||
: date('Y-m-d H:i:s');
|
||||
|
||||
// 3. Create a schedule for each selected user
|
||||
$stmt = $pdo->prepare(
|
||||
"INSERT INTO schedules (message_id, recipient_id, send_time, status, is_recurring, recurring_days, recurring_time)
|
||||
VALUES (?, ?, ?, 'pending', 0, NULL, NULL)"
|
||||
);
|
||||
|
||||
foreach ($user_ids as $user_id) {
|
||||
$stmt->execute([$messageId, $user_id, $sendTime]);
|
||||
log_activity($userId, 'Message Scheduled from Template', 'Schedule for user ID: ' . $user_id);
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
// If sending now, trigger the queue processor
|
||||
if ($scheduleType === 'now') {
|
||||
$phpPath = PHP_BINARY ?: 'php';
|
||||
$scriptPath = dirname(__DIR__) . '/process_queue.php';
|
||||
$logPath = dirname(__DIR__) . '/logs/process_queue_manual.log';
|
||||
$command = sprintf('%s %s >> %s 2>&1 &', escapeshellarg($phpPath), escapeshellarg($scriptPath), escapeshellarg($logPath));
|
||||
shell_exec($command);
|
||||
}
|
||||
|
||||
header("Location: ../scheduled_messages.php?success=template_sent");
|
||||
exit();
|
||||
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollBack();
|
||||
error_log("TemplateHandler Error: " . $e->getMessage() . "\n", 3, dirname(__DIR__) . '/logs/discord_api.log');
|
||||
header("Location: ../enviar_plantilla.php?error=dberror");
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
// Regular message handling starts here
|
||||
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
||||
header('Location: ../index.php');
|
||||
exit();
|
||||
}
|
||||
|
||||
$userId = $_SESSION['user_id'];
|
||||
$content = $_POST['messageContent'] ?? '';
|
||||
error_log("[DEBUG] Message content in message_handler.php: " . substr($content, 0, 500)); // Log first 500 chars
|
||||
$platform = $_POST['platform'] ?? ''; // 'discord' or 'telegram'
|
||||
|
||||
// Obtener canales y usuarios seleccionados (pueden ser arrays JSON)
|
||||
$channelIds = json_decode($_POST['channelIds'] ?? '[]', true);
|
||||
$userIds = json_decode($_POST['userIds'] ?? '[]', true);
|
||||
|
||||
// Si no hay canales ni usuarios seleccionados, verificar el campo legacy recipientId
|
||||
if (empty($channelIds) && empty($userIds) && !empty($_POST['recipientId'])) {
|
||||
// Para compatibilidad con el código existente
|
||||
$channelIds = [$_POST['recipientId']];
|
||||
}
|
||||
|
||||
// Combinar todos los IDs de destinatarios y eliminar valores vacíos
|
||||
$allRecipientIds = array_filter(array_merge($channelIds, $userIds));
|
||||
|
||||
// Debug: Registrar los destinatarios recibidos
|
||||
error_log("Channel IDs: " . print_r($channelIds, true));
|
||||
error_log("User IDs: " . print_r($userIds, true));
|
||||
error_log("All Recipient IDs: " . print_r($allRecipientIds, true));
|
||||
|
||||
// Validar que haya al menos un destinatario
|
||||
if (empty($allRecipientIds)) {
|
||||
header('Location: ../create_message.php?error=no_recipients');
|
||||
exit();
|
||||
}
|
||||
$scheduleId = $_POST['schedule_id'] ?? null;
|
||||
$submitAction = $_POST['submit'] ?? 'send';
|
||||
$isEditing = ($submitAction === 'update' && !empty($scheduleId));
|
||||
|
||||
// Basic validation
|
||||
if (empty($content) || empty($platform) || empty(array_filter($allRecipientIds))) {
|
||||
$error_param = 'missing_fields';
|
||||
if (empty($platform)) $error_param = 'missing_platform';
|
||||
if (empty(array_filter($allRecipientIds))) $error_param = 'missing_recipient';
|
||||
|
||||
$error_url = $isEditing
|
||||
? "../create_message.php?action=edit&schedule_id={$scheduleId}&error={$error_param}"
|
||||
: "../create_message.php?error={$error_param}";
|
||||
header("Location: {$error_url}");
|
||||
exit();
|
||||
}
|
||||
|
||||
$scheduleType = $_POST['scheduleType'] ?? 'now';
|
||||
|
||||
$pdo->beginTransaction();
|
||||
|
||||
try {
|
||||
// --- DEBUG LOGGING ---
|
||||
$debugLogFile = dirname(__DIR__) . '/logs/schedule_debug.log';
|
||||
$logEntry = "[" . date('Y-m-d H:i:s') . "] --- INICIO DE PETICIÓN ---\n";
|
||||
$logEntry .= "ACTION: {$submitAction}, SCHEDULE_ID: " . ($scheduleId ?? 'null') . "\n";
|
||||
$logEntry .= "PLATFORM: {$platform}\n";
|
||||
$logEntry .= "CHANNEL_IDS: " . (is_array($channelIds) ? implode(', ', $channelIds) : $channelIds) . "\n";
|
||||
$logEntry .= "USER_IDS: " . (is_array($userIds) ? implode(', ', $userIds) : $userIds) . "\n";
|
||||
$logEntry .= "CONTENT LENGTH: " . strlen($content) . "\n";
|
||||
$logEntry .= "POST DATA: " . json_encode($_POST, JSON_PRETTY_PRINT) . "\n";
|
||||
file_put_contents($debugLogFile, $logEntry, FILE_APPEND);
|
||||
// --- FIN DEBUG LOGGING ---
|
||||
|
||||
// Validar que haya contenido y destinatarios
|
||||
if (empty(trim($content))) {
|
||||
throw new Exception("El contenido del mensaje no puede estar vacío.");
|
||||
}
|
||||
|
||||
if (empty($channelIds) && empty($userIds)) {
|
||||
throw new Exception("Debes seleccionar al menos un canal o usuario como destinatario.");
|
||||
}
|
||||
|
||||
// Combinar todos los IDs de destinatarios
|
||||
$allRecipientIds = array_merge(
|
||||
is_array($channelIds) ? $channelIds : [],
|
||||
is_array($userIds) ? $userIds : []
|
||||
);
|
||||
|
||||
// Validar que todos los destinatarios existan
|
||||
if (!empty($allRecipientIds)) {
|
||||
$placeholders = rtrim(str_repeat('?,', count($allRecipientIds)), ',');
|
||||
$stmt = $pdo->prepare("SELECT COUNT(*) FROM recipients WHERE id IN ($placeholders)");
|
||||
$stmt->execute($allRecipientIds);
|
||||
$validRecipients = (int)$stmt->fetchColumn();
|
||||
|
||||
if ($validRecipients !== count($allRecipientIds)) {
|
||||
throw new Exception("Uno o más destinatarios no son válidos.");
|
||||
}
|
||||
}
|
||||
|
||||
if ($submitAction === 'update' && !empty($scheduleId)) {
|
||||
// UPDATE LOGIC
|
||||
$stmt = $pdo->prepare("SELECT message_id FROM schedules WHERE id = ?");
|
||||
$stmt->execute([$scheduleId]);
|
||||
$originalMessage = $stmt->fetch();
|
||||
|
||||
if (!$originalMessage) {
|
||||
throw new Exception("No se encontró la programación original.");
|
||||
}
|
||||
$messageId = $originalMessage['message_id'];
|
||||
|
||||
$stmt = $pdo->prepare("UPDATE messages SET content = ? WHERE id = ?");
|
||||
$stmt->execute([$content, $messageId]);
|
||||
|
||||
$sendTime = null;
|
||||
$isRecurring = 0;
|
||||
$recurringDaysStr = null;
|
||||
$recurringTime = null;
|
||||
$status = 'pending';
|
||||
$stmt = $pdo->prepare("DELETE FROM schedules WHERE message_id = ?");
|
||||
$stmt->execute([$originalMessage['message_id']]);
|
||||
|
||||
// Obtener la configuración de programación
|
||||
$sendTime = null;
|
||||
$status = 'pending';
|
||||
$isRecurring = 0;
|
||||
$recurringDaysStr = null;
|
||||
$recurringTime = null;
|
||||
|
||||
if ($scheduleType === 'later') {
|
||||
$user_timezone = new DateTimeZone('America/Mexico_City');
|
||||
$schedule_dt = DateTime::createFromFormat('Y-m-d\TH:i', $_POST['scheduleDateTime'], $user_timezone);
|
||||
if (!$schedule_dt) {
|
||||
throw new Exception("Formato de fecha/hora de programación no válido.");
|
||||
}
|
||||
$sendTime = $schedule_dt->format('Y-m-d H:i:s');
|
||||
} elseif ($scheduleType === 'recurring') {
|
||||
$isRecurring = 1;
|
||||
$recurringDays = $_POST['recurringDays'] ?? [];
|
||||
sort($recurringDays);
|
||||
$recurringDaysStr = !empty($recurringDays) ? implode(',', $recurringDays) : null;
|
||||
$recurringTime = $_POST['recurringTime'] ?? '00:00';
|
||||
$sendTime = calculateNextSendTime($recurringDays, $recurringTime);
|
||||
} else { // 'now'
|
||||
$sendTime = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
// Create new schedules for each recipient
|
||||
$stmt = $pdo->prepare(
|
||||
"INSERT INTO schedules (message_id, recipient_id, send_time, status, is_recurring, recurring_days, recurring_time) VALUES (?, ?, ?, ?, ?, ?, ?)"
|
||||
);
|
||||
|
||||
foreach ($allRecipientIds as $recipientId) {
|
||||
$stmt->execute([
|
||||
$originalMessage['message_id'],
|
||||
$recipientId,
|
||||
$sendTime,
|
||||
$status,
|
||||
$isRecurring,
|
||||
$recurringDaysStr,
|
||||
$recurringTime
|
||||
]);
|
||||
log_activity($userId, 'Schedule Recipient Updated', 'Schedule for Message ID: ' . $originalMessage['message_id'] . ' to Recipient ID: ' . $recipientId);
|
||||
}
|
||||
|
||||
// --- DEBUG LOGGING ---
|
||||
$logEntry = "Calculated sendTime for UPDATE: {$sendTime} (Timezone: " . date_default_timezone_get() . ")\n";
|
||||
file_put_contents($debugLogFile, $logEntry, FILE_APPEND);
|
||||
// --- FIN DEBUG LOGGING ---
|
||||
|
||||
$success_param = 'updated';
|
||||
log_activity($userId, 'Message Updated', 'Schedule ID: ' . $scheduleId);
|
||||
|
||||
} else {
|
||||
// CREATE LOGIC
|
||||
$sendTime = null;
|
||||
$status = 'pending';
|
||||
$isRecurring = 0;
|
||||
$recurringDaysStr = null;
|
||||
$recurringTime = null;
|
||||
|
||||
// Determinar la configuración de programación
|
||||
if ($scheduleType === 'later') {
|
||||
$user_timezone = new DateTimeZone('America/Mexico_City');
|
||||
$schedule_dt = DateTime::createFromFormat('Y-m-d\TH:i', $_POST['scheduleDateTime'], $user_timezone);
|
||||
if (!$schedule_dt) {
|
||||
throw new Exception("Formato de fecha/hora de programación no válido.");
|
||||
}
|
||||
$sendTime = $schedule_dt->format('Y-m-d H:i:s');
|
||||
} elseif ($scheduleType === 'recurring') {
|
||||
$isRecurring = 1;
|
||||
$recurringDays = $_POST['recurringDays'] ?? [];
|
||||
sort($recurringDays);
|
||||
$recurringDaysStr = !empty($recurringDays) ? implode(',', $recurringDays) : null;
|
||||
$recurringTime = $_POST['recurringTime'] ?? '00:00';
|
||||
$sendTime = calculateNextSendTime($recurringDays, $recurringTime);
|
||||
} else { // 'now'
|
||||
$sendTime = date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
// Insertar un solo mensaje
|
||||
$stmt = $pdo->prepare("INSERT INTO messages (user_id, content) VALUES (?, ?)");
|
||||
$stmt->execute([$userId, $content]);
|
||||
$messageId = $pdo->lastInsertId();
|
||||
|
||||
// Crear programaciones para cada destinatario
|
||||
$stmt = $pdo->prepare(
|
||||
"INSERT INTO schedules (message_id, recipient_id, send_time, status, is_recurring, recurring_days, recurring_time) " .
|
||||
"VALUES (?, ?, ?, ?, ?, ?, ?)"
|
||||
);
|
||||
|
||||
// Combinar canales y usuarios en un solo array
|
||||
$allRecipients = array_merge(
|
||||
is_array($channelIds) ? $channelIds : [],
|
||||
is_array($userIds) ? $userIds : []
|
||||
);
|
||||
|
||||
// Crear una programación para cada destinatario
|
||||
foreach ($allRecipients as $recipientId) {
|
||||
$stmt->execute([
|
||||
$messageId,
|
||||
$recipientId,
|
||||
$sendTime,
|
||||
$status,
|
||||
$isRecurring,
|
||||
$recurringDaysStr,
|
||||
$recurringTime
|
||||
]);
|
||||
$scheduleId = $pdo->lastInsertId();
|
||||
log_activity($userId, 'Message Created', 'Schedule ID: ' . $scheduleId . ' for Recipient ID: ' . $recipientId);
|
||||
}
|
||||
|
||||
$success_param = 'message_created';
|
||||
|
||||
// --- DEBUG LOGGING ---
|
||||
$logEntry = "Calculated sendTime for CREATE: {$sendTime} (Timezone: " . date_default_timezone_get() . ")\n-- FIN DE PETICIÓN --\n\n";
|
||||
file_put_contents($debugLogFile, $logEntry, FILE_APPEND);
|
||||
// --- FIN DEBUG LOGGING ---
|
||||
}
|
||||
|
||||
$pdo->commit();
|
||||
|
||||
if ($scheduleType === 'now') {
|
||||
$phpPath = PHP_BINARY ?: 'php';
|
||||
$scriptPath = dirname(__DIR__) . '/process_queue.php';
|
||||
$logPath = dirname(__DIR__) . '/logs/process_queue_manual.log';
|
||||
|
||||
// Asegurarse de que se use el entorno correcto
|
||||
$command = sprintf(
|
||||
'APP_ENVIRONMENT=pruebas %s %s >> %s 2>&1 &',
|
||||
escapeshellarg($phpPath),
|
||||
escapeshellarg($scriptPath),
|
||||
escapeshellarg($logPath)
|
||||
);
|
||||
|
||||
// Registrar el comando que se va a ejecutar para depuración
|
||||
error_log("Ejecutando comando: " . $command . "\n", 3, $logFile);
|
||||
|
||||
// Ejecutar el comando
|
||||
shell_exec($command);
|
||||
|
||||
// Registrar que se inició el procesamiento
|
||||
error_log("Procesamiento en segundo plano iniciado para schedule_id: " . ($scheduleId ?? 'nuevo') . "\n", 3, $logFile);
|
||||
}
|
||||
|
||||
header("Location: ../scheduled_messages.php?success={$success_param}");
|
||||
exit();
|
||||
|
||||
} catch (Exception $e) {
|
||||
$pdo->rollBack();
|
||||
error_log("MessageHandler Error: " . $e->getMessage() . "\n", 3, $logFile);
|
||||
$error_url = ($submitAction === 'update') ? "../create_message.php?action=edit&schedule_id={$scheduleId}&error=dberror" : '../create_message.php?error=dberror';
|
||||
header("Location: {$error_url}");
|
||||
exit();
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user