Implement sending a simple Hello-package

This commit is contained in:
Sofia 2026-07-16 04:52:31 +03:00
parent 0e3fac5a12
commit a849904535
4 changed files with 50 additions and 6 deletions

1
Cargo.lock generated
View File

@ -179,6 +179,7 @@ name = "quakeball"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"godot", "godot",
"serde",
"teanet", "teanet",
] ]

View File

@ -8,4 +8,5 @@ crate-type = ["cdylib"] # Compile this crate to a dynamic C library.
[dependencies] [dependencies]
godot = "0.5.4" godot = "0.5.4"
serde = "1.0.228"
teanet = { path = "../teanet-rust" } teanet = { path = "../teanet-rust" }

View File

@ -1,6 +1,10 @@
use std::net::SocketAddr; use std::{
net::SocketAddr,
time::{Duration, Instant},
};
use godot::{prelude::*, tools::get_autoload_by_name}; use godot::{prelude::*, tools::get_autoload_by_name};
use serde::{Deserialize, Serialize};
use teanet::{Peer, PeerConfig}; use teanet::{Peer, PeerConfig};
use crate::ui::cli::{CLI_GLOBAL_NAME, CliColor, CommandLinePanel}; 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 { pub struct NetworkManager {
peer: Option<PeerKind>, peer: Option<PeerKind>,
last_hello: Instant,
base: Base<Node>, base: Base<Node>,
} }
@ -18,7 +24,11 @@ pub const NETWORK_SINGLETON_NAME: &str = "NetworkManagerGlob";
#[godot_api] #[godot_api]
impl INode for NetworkManager { impl INode for NetworkManager {
fn init(base: Base<Node>) -> Self { fn init(base: Base<Node>) -> Self {
NetworkManager { peer: None, base } NetworkManager {
last_hello: Instant::now(),
peer: None,
base,
}
} }
fn ready(&mut self) { fn ready(&mut self) {
@ -42,6 +52,17 @@ impl INode for NetworkManager {
if let Some(peer) = &mut self.peer { if let Some(peer) = &mut self.peer {
let mut cli = get_autoload_by_name::<CommandLinePanel>(CLI_GLOBAL_NAME); let mut cli = get_autoload_by_name::<CommandLinePanel>(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 { match peer {
PeerKind::Client(peer, _) => match peer.poll() { PeerKind::Client(peer, _) => match peer.poll() {
Ok(message) => { Ok(message) => {
@ -69,6 +90,14 @@ impl INode for NetworkManager {
teanet::PeerMessage::Closed => { teanet::PeerMessage::Closed => {
self.peer = None; 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); .publish_message(format!("Server closed"), CliColor::Info);
self.peer = None; 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 { #[derive(Debug, Clone, Serialize, Deserialize)]
Client(Peer, SocketAddr), pub enum Package {
Server(Peer, u16), Hello,
}
pub enum PeerKind {
Client(Peer<Package>, SocketAddr),
Server(Peer<Package>, u16),
} }

@ -1 +1 @@
Subproject commit 97230a23be7758450551f4baa8077208d06f4ba3 Subproject commit 44122d77d6382043be85ff0a72398748b9ab3493