diff --git a/Cargo.lock b/Cargo.lock index 86652ae..3763ca7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,6 +179,7 @@ name = "quakeball" version = "0.1.0" dependencies = [ "godot", + "serde", "teanet", ] diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 995e8f9..c906dfd 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -8,4 +8,5 @@ crate-type = ["cdylib"] # Compile this crate to a dynamic C library. [dependencies] godot = "0.5.4" +serde = "1.0.228" teanet = { path = "../teanet-rust" } diff --git a/rust/src/network_manager.rs b/rust/src/network_manager.rs index 7673d8f..94813b5 100644 --- a/rust/src/network_manager.rs +++ b/rust/src/network_manager.rs @@ -1,6 +1,10 @@ -use std::net::SocketAddr; +use std::{ + net::SocketAddr, + time::{Duration, Instant}, +}; use godot::{prelude::*, tools::get_autoload_by_name}; +use serde::{Deserialize, Serialize}; use teanet::{Peer, PeerConfig}; use crate::ui::cli::{CLI_GLOBAL_NAME, CliColor, CommandLinePanel}; @@ -10,6 +14,8 @@ use crate::ui::cli::{CLI_GLOBAL_NAME, CliColor, CommandLinePanel}; pub struct NetworkManager { peer: Option, + last_hello: Instant, + base: Base, } @@ -18,7 +24,11 @@ pub const NETWORK_SINGLETON_NAME: &str = "NetworkManagerGlob"; #[godot_api] impl INode for NetworkManager { fn init(base: Base) -> Self { - NetworkManager { peer: None, base } + NetworkManager { + last_hello: Instant::now(), + peer: None, + base, + } } fn ready(&mut self) { @@ -42,6 +52,17 @@ impl INode for NetworkManager { if let Some(peer) = &mut self.peer { let mut cli = get_autoload_by_name::(CLI_GLOBAL_NAME); + match peer { + PeerKind::Client(..) => {} + PeerKind::Server(peer, _) => { + let now = Instant::now(); + if now - self.last_hello > Duration::from_millis(2000) { + self.last_hello = now; + peer.broadcast_reliable(Package::Hello); + } + } + } + match peer { PeerKind::Client(peer, _) => match peer.poll() { Ok(message) => { @@ -69,6 +90,14 @@ impl INode for NetworkManager { teanet::PeerMessage::Closed => { self.peer = None; } + teanet::PeerMessage::Message(msg) => match msg { + Package::Hello => { + cli.bind_mut().publish_message( + format!("Got \"Hello\"!"), + CliColor::Info, + ); + } + }, } } } @@ -104,6 +133,14 @@ impl INode for NetworkManager { .publish_message(format!("Server closed"), CliColor::Info); self.peer = None; } + teanet::PeerMessage::Message(msg) => match msg { + Package::Hello => { + cli.bind_mut().publish_message( + format!("Got \"Hello\"!"), + CliColor::Info, + ); + } + }, } } } @@ -168,7 +205,12 @@ impl NetworkManager { } } -pub enum PeerKind { - Client(Peer, SocketAddr), - Server(Peer, u16), +#[derive(Debug, Clone, Serialize, Deserialize)] +pub enum Package { + Hello, +} + +pub enum PeerKind { + Client(Peer, SocketAddr), + Server(Peer, u16), } diff --git a/teanet-rust b/teanet-rust index 97230a2..44122d7 160000 --- a/teanet-rust +++ b/teanet-rust @@ -1 +1 @@ -Subproject commit 97230a23be7758450551f4baa8077208d06f4ba3 +Subproject commit 44122d77d6382043be85ff0a72398748b9ab3493