Preparando terreno

This commit is contained in:
Ruben Garcalia
2026-05-18 20:24:22 +02:00
parent 9ce7217d6b
commit 6e7937b049
21 changed files with 482 additions and 13 deletions

287
Cargo.lock generated
View File

@@ -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"

View File

@@ -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"

View File

@@ -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
}

View File

@@ -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<Player>,
#[serde(rename = "Ball")]
pub ball: Ball,
}

View File

@@ -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,
}

View File

@@ -0,0 +1,6 @@
pub mod ball;
pub mod player;
pub mod ball_hit;
pub mod location;
pub use ball_hit::BallHit;

View File

@@ -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
}

6
src/events/mod.rs Normal file
View File

@@ -0,0 +1,6 @@
pub mod update_state;
pub mod ball_hit;
pub mod event;
pub use event::Event;

View File

@@ -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;

15
src/gui/game_state.rs Normal file
View File

@@ -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,
}
}
}

17
src/gui/gui.rs Normal file
View File

@@ -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) {
}
}

5
src/gui/mod.rs Normal file
View File

@@ -0,0 +1,5 @@
pub mod gui;
pub mod game_state;
pub use gui::Gui;
pub use game_state::GameState;

View File

@@ -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<Event>, Receiver<Event>) = mpsc::channel();
thread::spawn(move || {
let mut intentos = 0;
loop {
if let Err(e) = read_stream(&tx) {
let io_kind = e.downcast_ref::<std::io::Error>().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<dyn std::error::Error>> {
fn read_stream(tx: &Sender<Event>) -> Result<(), Box<dyn std::error::Error>> {
let mut stream = TcpStream::connect("localhost:49123")?;
let request = "GET /\r\n";
@@ -36,8 +104,14 @@ fn read_stream() -> Result<(), Box<dyn std::error::Error>> {
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);
}
}
}