use std::{
sync::{
atomic::{AtomicBool, Ordering},
Arc,
},
time::{Duration, Instant},
};
use serde::{Deserialize, Serialize};
use warqueen::{ClientDisconnectionDetails, ClientEvent, ClientNetworking, NetReceive, NetSend};
#[derive(Serialize, NetSend)]
enum MessageClientToServer {
String(String),
}
#[derive(Deserialize, NetReceive)]
enum MessageServerToClient {
String(String),
}
fn main() {
let server_address = "127.0.0.1:21001".parse().unwrap();
let mut client = ClientNetworking::new(server_address, None);
let mut last_sent_time = Instant::now();
let halt = Arc::new(AtomicBool::new(false));
let halt_cloned = Arc::clone(&halt);
ctrlc::set_handler(move || {
println!();
halt_cloned.store(true, Ordering::Relaxed);
})
.unwrap();
loop {
while let Some(event) = client.poll_event_from_server() {
match event {
ClientEvent::Connected => {
println!("Connected");
}
ClientEvent::Message(message) => match message {
MessageServerToClient::String(content) => {
println!("The server says \"{content}\"")
}
},
ClientEvent::Disconnected(details) => {
match details {
ClientDisconnectionDetails::None => {
println!("Server disconnected, let's terminate");
}
ClientDisconnectionDetails::Timeout => {
println!("Server timed out, let's terminate");
}
}
return;
}
ClientEvent::FailedToConnect => {
println!("Failed to connect, let's terminate");
return;
}
}
}
if last_sent_time.elapsed() > Duration::from_millis(1500) {
last_sent_time = Instant::now();
println!("We say \"jaaj\" to the server");
let message = MessageClientToServer::String("jaaj".to_string());
client.send_message_to_server(message);
}
if halt.load(Ordering::Relaxed) {
println!("Let's disconnect");
client.disconnect().wait_for_proper_disconnection();
break;
}
std::thread::sleep(Duration::from_millis(10));
}
}