Files
contenedor_ibiza/bot/TelegramBot.php
2026-01-19 15:20:36 -06:00

207 lines
7.0 KiB
PHP
Executable File

<?php
require_once __DIR__ . '/../config/config.php';
require_once __DIR__ . '/../src/Asignacion.php';
require_once __DIR__ . '/../src/User.php';
class TelegramBot {
private $token;
private $apiUrl;
public function __construct() {
$config = require __DIR__ . '/../config/config.php';
$this->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 = "<b>TABLA DE TURNOS</b>\n\n";
$tabla .= "<code>";
$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 .= "</code>";
$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 "<b>SEMANA ACTUAL</b>\n\n" .
"Asignado: <b>{$asignacionActual['nombre']}</b>\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 = "<b>TURNOS DE {$user['nombre']}</b>\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);
}
}