From 6e7937b049a3b620357733fc582ad121abfdb517 Mon Sep 17 00:00:00 2001 From: Ruben Garcalia <92950852+rubeneitor21@users.noreply.github.com> Date: Mon, 18 May 2026 20:24:22 +0200 Subject: [PATCH] Preparando terreno --- Cargo.lock | 287 ++++++++++++++++++ Cargo.toml | 1 + src/events/ball_hit/ball.rs | 16 + src/events/ball_hit/ball_hit.rs | 17 ++ src/events/ball_hit/location.rs | 13 + src/events/ball_hit/mod.rs | 6 + src/events/ball_hit/player.rs | 14 + src/{models => events}/event.rs | 0 src/events/mod.rs | 6 + .../update_state}/attacker.rs | 0 src/{models => events/update_state}/ball.rs | 0 src/{models => events/update_state}/game.rs | 0 src/{models => events/update_state}/mod.rs | 2 - src/{models => events/update_state}/player.rs | 0 src/{models => events/update_state}/target.rs | 0 src/{models => events/update_state}/team.rs | 0 .../update_state}/update_state.rs | 0 src/gui/game_state.rs | 15 + src/gui/gui.rs | 17 ++ src/gui/mod.rs | 5 + src/main.rs | 96 +++++- 21 files changed, 482 insertions(+), 13 deletions(-) create mode 100644 src/events/ball_hit/ball.rs create mode 100644 src/events/ball_hit/ball_hit.rs create mode 100644 src/events/ball_hit/location.rs create mode 100644 src/events/ball_hit/mod.rs create mode 100644 src/events/ball_hit/player.rs rename src/{models => events}/event.rs (100%) create mode 100644 src/events/mod.rs rename src/{models => events/update_state}/attacker.rs (100%) rename src/{models => events/update_state}/ball.rs (100%) rename src/{models => events/update_state}/game.rs (100%) rename src/{models => events/update_state}/mod.rs (85%) rename src/{models => events/update_state}/player.rs (100%) rename src/{models => events/update_state}/target.rs (100%) rename src/{models => events/update_state}/team.rs (100%) rename src/{models => events/update_state}/update_state.rs (100%) create mode 100644 src/gui/game_state.rs create mode 100644 src/gui/gui.rs create mode 100644 src/gui/mod.rs diff --git a/Cargo.lock b/Cargo.lock index c836a82..c7f5efe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,18 +2,175 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "bitflags" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "convert_case" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "crossterm" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b9f2e4c67f833b660cdb0a3523065869fb35570177239812ed4c905aeff87b" +dependencies = [ + "bitflags", + "crossterm_winapi", + "derive_more", + "document-features", + "mio", + "parking_lot", + "rustix", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "derive_more" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + [[package]] name = "itoa" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + [[package]] name = "memchr" version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "mio" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -32,14 +189,58 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + [[package]] name = "rocket-api-rust" version = "0.1.0" dependencies = [ + "crossterm", "serde", "serde_json", ] +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + [[package]] name = "serde" version = "1.0.228" @@ -83,6 +284,43 @@ dependencies = [ "zmij", ] +[[package]] +name = "signal-hook" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d881a16cf4426aa584979d30bd82cb33429027e42122b169753d6ef1085ed6e2" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b75a19a7a740b25bc7944bdee6172368f988763b744e3d4dfe753f6b4ece40cc" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + [[package]] name = "syn" version = "2.0.117" @@ -100,6 +338,55 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + [[package]] name = "zmij" version = "1.0.21" diff --git a/Cargo.toml b/Cargo.toml index 8007d25..3d6fa6a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,5 +4,6 @@ version = "0.1.0" edition = "2024" [dependencies] +crossterm = "0.29.0" serde = {version = "1.0.228", features = ["derive"]} serde_json = "1.0.149" diff --git a/src/events/ball_hit/ball.rs b/src/events/ball_hit/ball.rs new file mode 100644 index 0000000..e2ba8a6 --- /dev/null +++ b/src/events/ball_hit/ball.rs @@ -0,0 +1,16 @@ +use serde::{Deserialize, Serialize}; + +use super::location::Location; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Ball { + #[serde(rename = "PreHitSpeed")] + pub pre_hit_speed: f64, + + #[serde(rename = "PostHitSpeed")] + pub post_hit_speed: f64, + + #[serde(rename = "Location")] + pub location: Location +} + diff --git a/src/events/ball_hit/ball_hit.rs b/src/events/ball_hit/ball_hit.rs new file mode 100644 index 0000000..2ceb042 --- /dev/null +++ b/src/events/ball_hit/ball_hit.rs @@ -0,0 +1,17 @@ +use serde::{Deserialize, Serialize}; + +use super::ball::Ball; +use super::player::Player; + +#[derive(Debug, Serialize, Deserialize, Clone)] +// #[serde(rename_all = "camelCase")] // Opcional, pero ayuda si hay variaciones de nombres +pub struct BallHit { + #[serde(rename = "MatchGuid")] + pub match_guid: String, + + #[serde(rename = "Players")] + pub players: Vec, + + #[serde(rename = "Ball")] + pub ball: Ball, +} diff --git a/src/events/ball_hit/location.rs b/src/events/ball_hit/location.rs new file mode 100644 index 0000000..be135df --- /dev/null +++ b/src/events/ball_hit/location.rs @@ -0,0 +1,13 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Location { + #[serde(rename = "X")] + pub x: f64, + + #[serde(rename = "Y")] + pub y: f64, + + #[serde(rename = "Z")] + pub z: f64, +} diff --git a/src/events/ball_hit/mod.rs b/src/events/ball_hit/mod.rs new file mode 100644 index 0000000..58cf03f --- /dev/null +++ b/src/events/ball_hit/mod.rs @@ -0,0 +1,6 @@ +pub mod ball; +pub mod player; +pub mod ball_hit; +pub mod location; + +pub use ball_hit::BallHit; diff --git a/src/events/ball_hit/player.rs b/src/events/ball_hit/player.rs new file mode 100644 index 0000000..1dec2b3 --- /dev/null +++ b/src/events/ball_hit/player.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Player { + #[serde(rename = "Name")] + pub name: String, + + #[serde(rename = "Shortcut")] + pub shortcut: i32, + + #[serde(rename = "TeamNum")] + pub team_num: i32 + +} diff --git a/src/models/event.rs b/src/events/event.rs similarity index 100% rename from src/models/event.rs rename to src/events/event.rs diff --git a/src/events/mod.rs b/src/events/mod.rs new file mode 100644 index 0000000..9692048 --- /dev/null +++ b/src/events/mod.rs @@ -0,0 +1,6 @@ +pub mod update_state; +pub mod ball_hit; + +pub mod event; + +pub use event::Event; diff --git a/src/models/attacker.rs b/src/events/update_state/attacker.rs similarity index 100% rename from src/models/attacker.rs rename to src/events/update_state/attacker.rs diff --git a/src/models/ball.rs b/src/events/update_state/ball.rs similarity index 100% rename from src/models/ball.rs rename to src/events/update_state/ball.rs diff --git a/src/models/game.rs b/src/events/update_state/game.rs similarity index 100% rename from src/models/game.rs rename to src/events/update_state/game.rs diff --git a/src/models/mod.rs b/src/events/update_state/mod.rs similarity index 85% rename from src/models/mod.rs rename to src/events/update_state/mod.rs index eb6cd65..f75d392 100644 --- a/src/models/mod.rs +++ b/src/events/update_state/mod.rs @@ -3,7 +3,6 @@ pub mod team; pub mod ball; pub mod target; pub mod game; -pub mod event; pub mod update_state; pub mod attacker; @@ -11,4 +10,3 @@ pub use player::Player; pub use attacker::Attacker; pub use game::Game; pub use update_state::UpdateState; -pub use event::Event; diff --git a/src/models/player.rs b/src/events/update_state/player.rs similarity index 100% rename from src/models/player.rs rename to src/events/update_state/player.rs diff --git a/src/models/target.rs b/src/events/update_state/target.rs similarity index 100% rename from src/models/target.rs rename to src/events/update_state/target.rs diff --git a/src/models/team.rs b/src/events/update_state/team.rs similarity index 100% rename from src/models/team.rs rename to src/events/update_state/team.rs diff --git a/src/models/update_state.rs b/src/events/update_state/update_state.rs similarity index 100% rename from src/models/update_state.rs rename to src/events/update_state/update_state.rs diff --git a/src/gui/game_state.rs b/src/gui/game_state.rs new file mode 100644 index 0000000..0c5943e --- /dev/null +++ b/src/gui/game_state.rs @@ -0,0 +1,15 @@ +use std::time::SystemTime; + +pub struct GameState { + pub saque: bool, + pub time: SystemTime, +} + +impl GameState { + pub fn new() -> Self { + Self { + saque: false, + time: SystemTime::UNIX_EPOCH, + } + } +} diff --git a/src/gui/gui.rs b/src/gui/gui.rs new file mode 100644 index 0000000..3a31f26 --- /dev/null +++ b/src/gui/gui.rs @@ -0,0 +1,17 @@ +use super::GameState; + +pub struct Gui{ + ball_speed: f64 +} + +impl Gui { + pub fn new() -> Self { + Self { + ball_speed: 0.0 + } + } + + pub fn render(state: &GameState) { + + } +} diff --git a/src/gui/mod.rs b/src/gui/mod.rs new file mode 100644 index 0000000..cdd979b --- /dev/null +++ b/src/gui/mod.rs @@ -0,0 +1,5 @@ +pub mod gui; +pub mod game_state; + +pub use gui::Gui; +pub use game_state::GameState; diff --git a/src/main.rs b/src/main.rs index e0f038c..3f3bd70 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,31 +1,99 @@ -mod models; +mod events; +mod gui; -use models::{UpdateState, Event}; +use events::Event; + +use events::ball_hit::BallHit; +use events::update_state::UpdateState; +use gui::{Gui, GameState}; use std::io::{BufReader, Write}; use std::net::TcpStream; +use std::sync::mpsc::{self, Receiver, Sender}; +use std::time::SystemTime; +use std::{thread, time}; -use serde_json::{Deserializer, Value}; +use serde_json::{Deserializer}; fn main() { - let _ = read_stream(); + let (tx, rx): (Sender, Receiver) = mpsc::channel(); + + thread::spawn(move || { + let mut intentos = 0; + + loop { + if let Err(e) = read_stream(&tx) { + let io_kind = e.downcast_ref::().map(|io| io.kind()); + + match io_kind { + Some(std::io::ErrorKind::ConnectionRefused) => { + intentos += 1; + print!("{}[2J", 27 as char); + println!( + "No se ha podido conectar con la API. Comprueba que la api este activa y use el puerto 49123\nReintentado en 3 segundos... [{}]", + intentos + ); + thread::sleep(time::Duration::from_secs(3)); + } + _ => { + println!("Error desconocido: {}", e) + } + } + } else { + println!("API desconectada, saliendo"); + std::process::exit(0); + } + } + }); + + let mut state = GameState::new(); + let _gui_handler = Gui::new(); + + 'main_loop: loop { + while let Ok(event) = rx.try_recv() { + handle_data(event, &mut state); + } + + // let running = _gui_handler.render(&state); + // if !running { + // break 'main_loop; + // } + } + // std::process::exit(0); } -fn handle_data(event: &str, data: Value) { - let inner = data +fn handle_data(event: Event, state: &mut GameState) { + let inner = event + .data .as_str() - .unwrap_or_else(|| panic!("Expected Data to be a JSON string, got: {}", data)); - match event { + .unwrap_or_else(|| panic!("Expected Data to be a JSON string, got: {}", event.data)); + match event.event.as_str() { "UpdateState" => { let update_data: UpdateState = serde_json::from_str(inner).expect("Failed to parse UpdateState"); println!("Ball speed: {:?}", update_data.game.ball.speed); } + "BallHit" => { + let ball_hit_data: BallHit = + serde_json::from_str(inner).expect("Failed to parse BallHit"); + + if state.saque { + println!( + "Tiempo de saque: {:.2}s", + state.time.elapsed().unwrap().as_secs_f64() + ) + } + println!("Hit pos: {:?}", ball_hit_data.ball.location); + } + "RoundStarted" => { + state.time = SystemTime::now(); + state.saque = true; + } other => println!("Evento desconocido: {}", other), } } -fn read_stream() -> Result<(), Box> { +fn read_stream(tx: &Sender) -> Result<(), Box> { let mut stream = TcpStream::connect("localhost:49123")?; let request = "GET /\r\n"; @@ -36,8 +104,14 @@ fn read_stream() -> Result<(), Box> { while let Some(result) = stream_iter.next() { match result { - Ok(event) => handle_data(&event.event, event.data), - Err(e) => eprintln!("Error de parseo: {}", e), + Ok(event) => { + if tx.send(event).is_err() { + break; + } + } //handle_data(&event.event, event.data), + Err(e) => { + eprintln!("Error de parseo: {}", e); + } } }