token = $config['telegram_bot_token']; $this->apiUrl = "https://api.telegram.org/bot{$this->token}"; } private function request($method, $data = []) { $url = "{$this->apiUrl}/{$method}"; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } public function sendMessage($chatId, $text, $parseMode = 'HTML', $replyMarkup = null) { $data = [ 'chat_id' => $chatId, 'text' => $text, 'parse_mode' => $parseMode ]; if ($replyMarkup) { $data['reply_markup'] = $replyMarkup; } return $this->request('sendMessage', $data); } public function getMe() { return $this->request('getMe'); } public function getUpdates($offset = 0) { return $this->request('getUpdates', ['offset' => $offset, 'timeout' => 60]); } public function sendKeyboard($chatId, $text) { $keyboard = [ 'inline_keyboard' => [ [ ['text' => 'Ver Turnos', 'callback_data' => 'ver_turnos'], ['text' => 'Semana Actual', 'callback_data' => 'semana_actual'] ], [ ['text' => '🔍 Buscar por Nombre', 'callback_data' => 'buscar_nombre'] ] ] ]; return $this->sendMessage($chatId, $text, 'HTML', json_encode($keyboard)); } public function answerCallback($callbackId, $text, $showAlert = false) { return $this->request('answerCallbackQuery', [ 'callback_query_id' => $callbackId, 'text' => $text, 'show_alert' => $showAlert ]); } public function deleteMessage($chatId, $messageId) { return $this->request('deleteMessage', [ 'chat_id' => $chatId, 'message_id' => $messageId ]); } public function editMessage($chatId, $messageId, $text, $keyboard = null) { $data = [ 'chat_id' => $chatId, 'message_id' => $messageId, 'text' => $text, 'parse_mode' => 'HTML' ]; if ($keyboard) { $data['reply_markup'] = $keyboard; } return $this->request('editMessageText', $data); } public function getTablaTurnos($semanas = 4) { $asignacion = new Asignacion(); $ayudantes = $asignacion->getAyudantesPorOrden(); if (empty($ayudantes)) { return "No hay ayudantes configurados."; } $hoy = new DateTime(); $diaSemana = (int)$hoy->format('w'); $domingo = clone $hoy; $domingo->modify('-' . $diaSemana . ' days'); $tabla = "TABLA DE TURNOS\n\n"; $tabla .= ""; $tabla .= str_pad("Semana", 10) . " | " . str_pad("Ayudante", 12) . " | Periodo\n"; $tabla .= str_repeat("-", 45) . "\n"; for ($i = 0; $i < $semanas; $i++) { $domingoSemana = clone $domingo; $domingoSemana->modify("+{$i} weeks"); $viernesSemana = clone $domingoSemana; $viernesSemana->modify('+5 days'); $posicion = ($i % count($ayudantes)); $ayudante = $ayudantes[$posicion]; $semanaNum = $i + 1; $periodo = $domingoSemana->format('d/m') . '-' . $viernesSemana->format('d/m'); $tabla .= str_pad("Sem $semanaNum", 10) . " | " . str_pad(substr($ayudante['nombre'], 0, 10), 12) . " | $periodo\n"; } $tabla .= ""; $tabla .= "\n\nCiclo: " . implode(' -> ', array_column($ayudantes, 'nombre')); return $tabla; } public function getSemanaActual() { $asignacion = new Asignacion(); $hoy = new DateTime(); $diaSemana = (int)$hoy->format('w'); $domingo = clone $hoy; $domingo->modify('-' . $diaSemana . ' days'); $asignacionActual = $asignacion->getAsignacionPorSemana($domingo->format('Y-m-d')); if ($asignacionActual) { return "SEMANA ACTUAL\n\n" . "Asignado: {$asignacionActual['nombre']}\n" . "Periodo: " . date('d/m/Y', strtotime($asignacionActual['semana_inicio'])) . " - " . date('d/m/Y', strtotime($asignacionActual['semana_fin'])) . "\n" . "Dias: Domingo a Viernes"; } else { return "No hay asignacion para esta semana."; } } public function getTurnosAyudante($nombre) { $config = require __DIR__ . '/../config/config.php'; try { $pdo = new PDO( "mysql:host={$config['db']['host']};port={$config['db']['port']};dbname={$config['db']['database']};charset=utf8mb4", $config['db']['username'], $config['db']['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); } catch (Exception $e) { return "Error de conexion."; } $stmt = $pdo->prepare("SELECT * FROM users WHERE nombre LIKE ? AND rol = 'ayudante' AND activo = 1 LIMIT 1"); $stmt->execute(["%$nombre%"]); $user = $stmt->fetch(); if (!$user) { $ayudantes = (new Asignacion())->getAyudantesPorOrden(); $nombres = implode(', ', array_map(fn($a) => $a['nombre'], $ayudantes)); return "No encontre '$nombre'.\n\nAyudantes: $nombres"; } $stmt = $pdo->prepare(" SELECT semana_inicio, semana_fin FROM asignaciones_turnos WHERE user_id = ? AND semana_inicio >= CURDATE() ORDER BY semana_inicio LIMIT 4 "); $stmt->execute([$user['id']]); $turnos = $stmt->fetchAll(); if (empty($turnos)) { return "{$user['nombre']} no tiene turnos proximos."; } $result = "TURNOS DE {$user['nombre']}\n\n"; foreach ($turnos as $turno) { $result .= date('d/m/Y', strtotime($turno['semana_inicio'])) . " - " . date('d/m/Y', strtotime($turno['semana_fin'])) . "\n"; } return $result; } public function getListaAyudantesParaBusqueda() { $ayudantes = (new Asignacion())->getAyudantesPorOrden(); return array_map(fn($a) => $a['nombre'], $ayudantes); } }