diff --git a/src/database.rs b/src/database.rs index fe4e811..cf171d1 100644 --- a/src/database.rs +++ b/src/database.rs @@ -6,8 +6,6 @@ use std::env; pub fn establish_connection() -> PgConnection { dotenv().ok(); - let database_url = env::var("DATABASE_URL") - .expect("DATABASE_URL must be set"); - PgConnection::establish(&database_url) - .expect(&format!("Error connecting to {}", database_url)) + let database_url = env::var("DATABASE_URL").expect("DATABASE_URL must be set"); + PgConnection::establish(&database_url).expect(&format!("Error connecting to {}", database_url)) } diff --git a/src/main.rs b/src/main.rs index 094afee..a9eabbc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,19 @@ +use std::{env, io}; use tokio::io::AsyncWriteExt; use tokio::net::{TcpListener, TcpStream}; -use std::{env, io}; +pub mod database; +pub mod models; +pub mod npc; +pub mod objects; +pub mod player; pub mod rlib; pub mod rlocation; -pub mod player; -pub mod objects; pub mod schema; -pub mod models; -pub mod database; -pub mod npc; // use crate::player::Player; -use crate::rlib::set_player; use crate::player::update_player; +use crate::rlib::set_player; #[tokio::main] async fn main() -> io::Result<()> { @@ -26,14 +26,14 @@ async fn main() -> io::Result<()> { loop { let (socket, _) = listener.accept().await?; - tokio::spawn(procesar_socket(socket)); // tokio::spawn """"abre un novo fío"""" + tokio::spawn(procesar_socket(socket)); // tokio::spawn """"abre un novo fío"""" } } async fn procesar_socket(mut socket: TcpStream) -> io::Result<()> { // intro - socket.write_all(b"\x1B[2J").await?; // clear screen - socket.write_all(b"\x1B[1;1H").await?; // position on 1,1 + socket.write_all(b"\x1B[2J").await?; // clear screen + socket.write_all(b"\x1B[1;1H").await?; // position on 1,1 let banner = "\n\n\ ██████╗░███████╗███████╗███╗░░██╗████████╗██████╗░░█████╗░██████╗░░█████╗░\n\ @@ -50,10 +50,13 @@ async fn procesar_socket(mut socket: TcpStream) -> io::Result<()> { let mut output: String; let mut player = set_player(&mut socket).await; - let intro = format!("Bienvenido {}. Vamos a empezar a jugar... \n\n\ + let intro = format!( + "Bienvenido {}. Vamos a empezar a jugar... \n\n\ Despiertas en la oscuridad con un fuerte dolor de cabeza. \n\ Un fuerte sonido de alarma machaca tus oídos. No ayuda nada a tu dolor de cabeza. \n\ - Qué vas a hacer?", player.nombre); + Qué vas a hacer?", + player.nombre + ); socket.write_all(intro.as_bytes()).await?; // main loop diff --git a/src/models.rs b/src/models.rs index ac8bf4b..83bb569 100644 --- a/src/models.rs +++ b/src/models.rs @@ -1,5 +1,5 @@ -use diesel::prelude::*; use crate::schema::*; +use diesel::prelude::*; #[derive(Queryable)] #[diesel(table_name = location)] diff --git a/src/npc.rs b/src/npc.rs index d53e06a..c567cfc 100644 --- a/src/npc.rs +++ b/src/npc.rs @@ -1,22 +1,19 @@ +use crate::database::establish_connection; use crate::models::*; use diesel::prelude::*; -use crate::database::establish_connection; //get_npc_here trae da base de datos o npc polo nome e a pegatina da sala actual pub fn get_npc_here(pegatina: String, nome: String) -> Result { - use crate::schema::npc::dsl::*; + use crate::schema::npc::dsl::*; let conn = &mut establish_connection(); - npc - .filter(location.eq(pegatina)) + npc.filter(location.eq(pegatina)) .filter(nombre.eq(nome)) .first(conn) } -// get_npcs trae da base de datos todos os npcs de unha localización +// get_npcs trae da base de datos todos os npcs de unha localización pub fn get_npcs(pegatina: String) -> Result, diesel::result::Error> { - use crate::schema::npc::dsl::*; + use crate::schema::npc::dsl::*; let conn = &mut establish_connection(); - npc - .filter(location.eq(pegatina)) - .get_results(conn) + npc.filter(location.eq(pegatina)).get_results(conn) } diff --git a/src/objects.rs b/src/objects.rs index 93ecdd9..98a3391 100644 --- a/src/objects.rs +++ b/src/objects.rs @@ -1,10 +1,10 @@ +use crate::database::establish_connection; use crate::models::RObject; use diesel::prelude::*; -use crate::database::establish_connection; -//get_object trae da base de datos un obxeto pola sua pegatina +//get_object trae da base de datos un obxeto pola sua pegatina pub fn get_object(pegatina: String) -> Result { - use crate::schema::object::dsl::*; + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); object .filter(tipo.eq("item")) @@ -12,9 +12,9 @@ pub fn get_object(pegatina: String) -> Result { .first(conn) } -// get_objects trae da base de datos todos os obxetos de unha localización +// get_objects trae da base de datos todos os obxetos de unha localización pub fn get_objects(pegatina: String) -> Result, diesel::result::Error> { - use crate::schema::object::dsl::*; + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); object .filter(tipo.eq("item")) @@ -24,7 +24,7 @@ pub fn get_objects(pegatina: String) -> Result, diesel::result::Err //get_object_here trae da base de datos o obxeto polo nome e a pegatina da sala actual pub fn get_object_here(pegatina: String, nome: String) -> Result { - use crate::schema::object::dsl::*; + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); object .filter(location.eq(pegatina)) @@ -33,8 +33,11 @@ pub fn get_object_here(pegatina: String, nome: String) -> Result Result { - use crate::schema::object::dsl::*; +pub fn update_object_location( + pegatina: String, + new_location: String, +) -> Result { + use crate::schema::object::dsl::*; // println!("{} {}", pegatina, new_location); let conn = &mut establish_connection(); diesel::update(object.filter(tag.eq(pegatina))) @@ -43,17 +46,20 @@ pub fn update_object_location(pegatina: String, new_location: String) -> Result< } // actualiza as condiciós de un obxeto, devolve o número de rows afectados -pub fn update_object_conditions(pegatina: String, cond: Vec>) -> Result { - use crate::schema::object::dsl::*; +pub fn update_object_conditions( + pegatina: String, + cond: Vec>, +) -> Result { + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); diesel::update(object.filter(tag.eq(pegatina))) .set(condiciones.eq(cond)) .execute(conn) } -// get_salidas trae da base de datos todos os obxetos salida de unha localización +// get_salidas trae da base de datos todos os obxetos salida de unha localización pub fn get_salidas(pegatina: String) -> Result, diesel::result::Error> { - use crate::schema::object::dsl::*; + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); object .filter(tipo.eq("salida")) @@ -63,7 +69,7 @@ pub fn get_salidas(pegatina: String) -> Result, diesel::result::Err //get_salidas_here trae da base de datos a salida polo nome e a pegatina da sala actual pub fn get_salidas_here(pegatina: String, nome: String) -> Result { - use crate::schema::object::dsl::*; + use crate::schema::object::dsl::*; let conn = &mut establish_connection(); object .filter(tipo.eq("salida")) @@ -71,4 +77,3 @@ pub fn get_salidas_here(pegatina: String, nome: String) -> Result Result { - use crate::schema::player::dsl::*; + use crate::schema::player::dsl::*; let conn = &mut establish_connection(); - player - .filter(nombre.eq(nome)) - .first(conn) + player.filter(nombre.eq(nome)).first(conn) } // create_player garda o xogador -pub fn create_player(newplayer: &Player) -> Result { - use crate::schema::player; +pub fn create_player(newplayer: &Player) -> Result { + use crate::schema::player; let conn = &mut establish_connection(); diesel::insert_into(player::table) @@ -26,17 +26,17 @@ pub fn create_player(newplayer: &Player) -> Result // update_player actualiza o xogador pub fn update_player(newplayer: &Player) -> Result { - use crate::schema::player::dsl::*; // para ter o find no update + use crate::schema::player::dsl::*; // para ter o find no update let conn = &mut establish_connection(); // FIXME: actualiza todos os rows... diesel::update(player::find(player, &newplayer.tag)) - .set(newplayer) // co trait AsChangeSet podese actualizar a struct enteira + .set(newplayer) // co trait AsChangeSet podese actualizar a struct enteira .execute(conn) } // execute_search mostra os obxetos na ubicación do xogador -pub fn execute_search(player: &mut Player) -> String { +pub fn execute_search(player: &mut Player) -> String { let mut output: String; let current = &player.location; let objetos = get_objects(current.to_string()); @@ -44,9 +44,9 @@ pub fn execute_search(player: &mut Player) -> String { if objetos.is_ok() && objetos.as_ref().unwrap().len() > 0 { output = String::from("En esta sala encuentras:\n"); for objeto in objetos.unwrap() { - let mut nombre = objeto.nombre; - nombre.push_str("\n"); - output.push_str(&nombre); + let mut nombre = objeto.nombre; + nombre.push_str("\n"); + output.push_str(&nombre); } } else { output = String::from("No encuentras ningún objeto en esta sala.") @@ -64,9 +64,9 @@ pub fn execute_inventory(player: &mut Player) -> String { if objetos.is_ok() && objetos.as_ref().unwrap().len() > 0 { output = String::from("Portas los siguientes objetos:\n"); for objeto in objetos.unwrap() { - let mut nombre = objeto.nombre; - nombre.push_str("\n"); - output.push_str(&nombre); + let mut nombre = objeto.nombre; + nombre.push_str("\n"); + output.push_str(&nombre); } } else { output = String::from("No portas ningún objeto.") @@ -76,15 +76,14 @@ pub fn execute_inventory(player: &mut Player) -> String { } // execute_pick recolle un obxeto -pub fn execute_pick(player: &mut Player, nombre: &str) -> String { +pub fn execute_pick(player: &mut Player, nombre: &str) -> String { let output: String; let location = &player.location; let obxeto = get_object_here(location.to_string(), nombre.to_string()); if obxeto.is_ok() { - let res = update_object_location( - obxeto.as_ref().unwrap().tag.clone(), - player.tag.to_string()); + let res = + update_object_location(obxeto.as_ref().unwrap().tag.clone(), player.tag.to_string()); if res.is_ok() && res.unwrap() > 0 { output = format!("{} ahora está en tu inventario.", obxeto.unwrap().nombre); @@ -107,7 +106,8 @@ pub fn execute_drop(player: &mut Player, nombre: &str) -> String { if obxeto.is_ok() { let res = update_object_location( obxeto.as_ref().unwrap().tag.clone(), - player.location.to_string()); //tirao aquí + player.location.to_string(), + ); //tirao aquí if res.is_ok() && res.unwrap() > 0 { output = format!("Tiras {}.", obxeto.unwrap().nombre); @@ -123,7 +123,7 @@ pub fn execute_drop(player: &mut Player, nombre: &str) -> String { // execute_kill intenta matar un npc pub fn execute_kill(player: &mut Player, nombre: &str) -> String { - let mut output= String::from(""); + let mut output = String::from(""); let location = &player.location; let npc = get_npc_here(location.to_string(), nombre.to_string()); @@ -136,7 +136,10 @@ pub fn execute_kill(player: &mut Player, nombre: &str) -> String { if tohit >= malo.ca { let damage = rand::thread_rng().gen_range(1..6); malo.hp = malo.hp - damage; - let tmp = format!("Golpeas a {} por {} de daño, le quedan {} pg.", malo.nombre, damage, malo.hp); + let tmp = format!( + "Golpeas a {} por {} de daño, le quedan {} pg.", + malo.nombre, damage, malo.hp + ); output = format!("{}\n{}", output, tmp); } else { let tmp = format!("No consigues golpear a {}.", malo.nombre); @@ -148,13 +151,16 @@ pub fn execute_kill(player: &mut Player, nombre: &str) -> String { if tohit >= player.ca { let damage = rand::thread_rng().gen_range(1..6); player.hp = player.hp - damage; - let tmp = format!("{} te golpea por {} de daño, te quedan {} pg.", malo.nombre, damage, player.hp); + let tmp = format!( + "{} te golpea por {} de daño, te quedan {} pg.", + malo.nombre, damage, player.hp + ); output = format!("{}\n{}", output, tmp); } else { let tmp = format!("{} no consigue herirte.", malo.nombre); output = format!("{}\n{}", output, tmp); } - print!("{}",output); //FIXME si saco esto, non o concatena coa salida + print!("{}", output); //FIXME si saco esto, non o concatena coa salida } let resolucion: String; @@ -166,7 +172,6 @@ pub fn execute_kill(player: &mut Player, nombre: &str) -> String { resolucion = String::from("No se que ha pasado. Alguien debería estar muerto."); } output = format!("{}\n{}", output, resolucion); - } else { output = String::from("No encuentro lo que quieres matar."); } diff --git a/src/rlib.rs b/src/rlib.rs index 6807c47..6fd7f77 100644 --- a/src/rlib.rs +++ b/src/rlib.rs @@ -1,8 +1,8 @@ -use tokio::net::TcpStream; -use tokio::io::{AsyncReadExt,AsyncWriteExt}; -use crate::rlocation::{execute_go, execute_look}; -use crate::player::*; use crate::models::Player; +use crate::player::*; +use crate::rlocation::{execute_go, execute_look}; +use tokio::io::{AsyncReadExt, AsyncWriteExt}; +use tokio::net::TcpStream; use uuid::Uuid; pub struct Command { @@ -28,15 +28,15 @@ impl Command { pub async fn set_player(socket: &mut TcpStream) -> Player { // prompt - socket.write_all(b"\n").await.unwrap(); - socket.write_all("Cuál es tu nombre?\n".as_bytes()).await.unwrap(); + socket.write_all(b"\n").await.unwrap(); + socket + .write_all("Cuál es tu nombre?\n".as_bytes()) + .await + .unwrap(); socket.write_all(b"> ").await.unwrap(); let mut buf = vec![0; 1024]; - let n = socket - .read(&mut buf) - .await - .unwrap(); + let n = socket.read(&mut buf).await.unwrap(); let input_str = String::from_utf8(buf[0..n].to_vec()).unwrap(); @@ -52,7 +52,7 @@ pub async fn set_player(socket: &mut TcpStream) -> Player { if check_player.is_ok() { player = check_player.unwrap(); } else { - player = Player{ + player = Player { tag: Uuid::new_v4().to_string(), nombre: nick.to_string(), descripcion: "humano, equipo básico".to_string(), @@ -71,14 +71,11 @@ pub async fn set_player(socket: &mut TcpStream) -> Player { pub async fn get_input(socket: &mut TcpStream) -> Command { // prompt - socket.write_all(b"\n").await.unwrap(); + socket.write_all(b"\n").await.unwrap(); socket.write_all(b"> ").await.unwrap(); let mut buf = vec![0; 1024]; - let n = socket - .read(&mut buf) - .await - .unwrap(); + let n = socket.read(&mut buf).await.unwrap(); let input_str = String::from_utf8(buf[0..n].to_vec()).unwrap(); diff --git a/src/rlocation.rs b/src/rlocation.rs index 62ac1fd..7ee9ab5 100644 --- a/src/rlocation.rs +++ b/src/rlocation.rs @@ -1,10 +1,9 @@ -use crate::objects::{get_salidas, get_object_here, get_salidas_here}; use crate::npc::{get_npc_here, get_npcs}; +use crate::objects::{get_object_here, get_salidas, get_salidas_here}; +use crate::database::establish_connection; use crate::models::*; use diesel::prelude::*; -use crate::database::establish_connection; - pub fn execute_look(player: &mut Player, nombre: &str) -> String { let mut output: String; @@ -21,10 +20,10 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String { if salidas.is_ok() && salidas.as_ref().unwrap().len() > 0 { output.push_str("\nSalidas:\n"); for salidas in salidas.unwrap() { - let mut nombre = "- ".to_string(); - nombre.push_str(&salidas.nombre); - nombre.push_str("\n"); - output.push_str(&nombre); + let mut nombre = "- ".to_string(); + nombre.push_str(&salidas.nombre); + nombre.push_str("\n"); + output.push_str(&nombre); } } @@ -34,13 +33,12 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String { if npcs.is_ok() && npcs.as_ref().unwrap().len() > 0 { output.push_str("\nTambién ves:\n"); for npc in npcs.as_ref().unwrap() { - let mut nombre = "- ".to_string(); - nombre.push_str(&npc.nombre); - nombre.push_str("\n"); - output.push_str(&nombre); + let mut nombre = "- ".to_string(); + nombre.push_str(&npc.nombre); + nombre.push_str("\n"); + output.push_str(&nombre); } } - } else { output = String::from("Navengado el ether!"); } @@ -62,7 +60,7 @@ pub fn execute_look(player: &mut Player, nombre: &str) -> String { output = String::from("Qué quieres mirar?"); } - return output + return output; } pub fn execute_go(player: &mut Player, coord: &str) -> String { @@ -82,7 +80,7 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String { "oeste" => nombre = "oeste".to_string(), "arriba" => nombre = "arriba".to_string(), "abajo" => nombre = "abajo".to_string(), - _ => nombre = "".to_string(), + _ => nombre = "".to_string(), } let tag: String; @@ -106,7 +104,6 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String { } else { output = String::from("No existe esa salida."); } - } else { output = String::from("No entiendo a donde quieres ir. Debes elegir una coordenada correspondiente a las salidas de esta sala."); } @@ -116,9 +113,7 @@ pub fn execute_go(player: &mut Player, coord: &str) -> String { // get_location busca na base de datos a localización polo seu tag pub fn get_location(pegatina: String) -> Result { - use crate::schema::location::dsl::*; + use crate::schema::location::dsl::*; let conn = &mut establish_connection(); - location - .filter(tag.eq(pegatina)) - .first(conn) + location.filter(tag.eq(pegatina)).first(conn) } diff --git a/src/schema.rs b/src/schema.rs index c344a2a..60e947a 100644 --- a/src/schema.rs +++ b/src/schema.rs @@ -45,9 +45,4 @@ diesel::table! { } } -diesel::allow_tables_to_appear_in_same_query!( - location, - npc, - object, - player, -); +diesel::allow_tables_to_appear_in_same_query!(location, npc, object, player,);