From 3efebedb5ea5a0af0c95ccdad0a5bc07d5d95e22 Mon Sep 17 00:00:00 2001 From: Kevin Munoz Date: Mon, 4 Nov 2024 15:34:38 -0500 Subject: [PATCH] initial commit --- Cargo.toml | 16 +++++++++ README.md | 3 ++ src/main.rs | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..d6f2d2f --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "bot-reservas-rust" +version = "0.1.0" +edition = "2021" +rust-version = "1.77.2" +authors = ["Kevin Muñoz ", "Kevin Muñoz "] +description = "Reserva tus espacion de uniminuto con este bot de telegram reescrito en rust" +repository = "https://condorcs.net/mrhacker/bot-reservas-rust" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +teloxide = "*" +mysql = "*" +dotenv = "*" +chrono = "*" diff --git a/README.md b/README.md new file mode 100644 index 0000000..f83bf2d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# bot-reservas-rust + +Repositorio fuente del código en Rust para el bot de Telegram para realizar reservas en Uniminuto \ No newline at end of file diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..61c8b44 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,99 @@ +use teloxide::{prelude::*, types::{InlineKeyboardButton, InlineKeyboardMarkup, BotCommand, ParseMode}, utils::command::BotCommands}; +use mysql::*; +use mysql::prelude::*; +use dotenv::dotenv; +use std::env; +use chrono::NaiveDate; +use std::collections::HashMap; + +#[derive(BotCommands, Clone)] +#[command(rename = "lowercase", description = "Comandos disponibles:")] +enum Command { + #[command(description = "Iniciar el bot.")] + Start, + #[command(description = "Mostrar ayuda.")] + Help, + #[command(description = "Reservar un espacio.")] + Reservar, + #[command(description = "Cancelar una reserva.")] + Cancelar, + #[command(description = "Consultar detalles de una reserva.")] + Consultar, +} + +// Estructura de categorías y espacios +fn espacios() -> HashMap<&'static str, Vec<&'static str>> { + let mut espacios: HashMap<&'static str, Vec<&'static str>> = HashMap::new(); + + espacios.insert("Auditorio", vec![ + "Auditorio B205-C202", + "Auditorio Escalonado Grande", + "Auditorio Escalonado Pequeño" + ]); + + espacios.insert("Plazoleta", vec![ + "Plazoleta Jesus y Maria", + "Plazoleta RGH", + "Plazoleta de la Cruz", + "Plazoleta Verde", + "Plazoleta R Piso 9", + "Hall Torre B-C" + ]); + + espacios.insert("Sala de Juntas", vec![ + "Sala de Juntas", "Sala de Juntas RGH", "Sala de Juntas FCC", "Sala de Juntas FCE", + "Sala de Juntas FING", "Sala de Juntas FEDU", "Sala de Juntas I+D", "Sala de Juntas FCHS", + "Coworking 1", "Coworking 2" + ]); + + espacios +} + +// Conexión a la base de datos +fn connect_db() -> PooledConn { + dotenv().ok(); + let db_host = env::var("DB_HOST").unwrap(); + let db_user = env::var("DB_USER").unwrap(); + let db_passwd = env::var("DB_PASSWD").unwrap(); + let db_db = env::var("DB_DB").unwrap(); + + let url = format!("mysql://{}:{}@{}/{}", db_user, db_passwd, db_host, db_db); + let pool = Pool::new(url).unwrap(); + pool.get_conn().unwrap() +} + +#[tokio::main] +async fn main() { + dotenv().ok(); + let bot_token = env::var("BOT_TOKEN").expect("Token de bot no encontrado."); + let bot = Bot::new(bot_token).auto_send(); + + teloxide::commands_repl(bot.clone(), Command::ty(), move |cx, command| async move { + match command { + Command::Start => { + cx.answer("¡Hola! Soy Recon, tu asistente de reservas en UNIMINUTO. Usa /reservar para comenzar.") + .await?; + } + Command::Help => { + cx.answer("Comandos disponibles:\n/reservar - Para hacer una reserva\n/cancelar - Para cancelar una reserva\n/consultar - Para consultar una reserva.") + .await?; + } + Command::Reservar => { + // Lógica para comenzar una reserva + cx.answer("Por favor, proporciona tu nombre:").await?; + // Aquí continúa la interacción paso a paso con el usuario + } + Command::Cancelar => { + // Lógica para cancelar una reserva + cx.answer("Funcionalidad de cancelación en desarrollo...").await?; + } + Command::Consultar => { + // Lógica para consultar reservas + cx.answer("Funcionalidad de consulta en desarrollo...").await?; + } + } + Ok::<(), Box>(()) + }) + .await; +} +