From 592864de182dfeef8c639cfab6902e385a7c4595 Mon Sep 17 00:00:00 2001 From: metamuffin Date: Thu, 18 Aug 2022 11:40:06 +0200 Subject: refactor networking --- karld/src/main.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) (limited to 'karld/src/main.rs') diff --git a/karld/src/main.rs b/karld/src/main.rs index d5dfd5f..6f92fe5 100644 --- a/karld/src/main.rs +++ b/karld/src/main.rs @@ -47,27 +47,39 @@ fn main() { lazy_static::lazy_static! { static ref TASKS: RwLock> = RwLock::new(HashMap::new()); + static ref CLIENTS: RwLock>> = RwLock::new(HashMap::new()); static ref CLIENT_ID_COUNTER: AtomicU32 = AtomicU32::new(0); } +fn broadcast_invalidation() { + CLIENTS + .write() + .unwrap() + .values() + .for_each(|r| drop(r.send(ClientboundPacket::InvalidateState))); +} + pub fn handle_packet(client: u32, packet: ServerboundPacket, responder: Sender) { // std::thread::sleep(std::time::Duration::from_millis(75)); // for testing clients with latency match packet { ServerboundPacket::Sync => { - let _ = responder.send(ClientboundPacket::Sync); + drop(responder.send(ClientboundPacket::Sync)); } ServerboundPacket::ListTasks => { - let _ = responder.send(ClientboundPacket::TaskList( + drop(responder.send(ClientboundPacket::TaskList( TASKS.read().unwrap().values().map(|e| e.clone()).collect(), - )); + ))); } ServerboundPacket::UpdateTask(t) => { TASKS.write().unwrap().insert(t.id, t); + broadcast_invalidation(); savestate::save(); } ServerboundPacket::RemoveTask(i) => { - if TASKS.write().unwrap().remove(&i).is_none() { - let _ = responder.send(ClientboundPacket::Error(ProtoError::UnknownTask)); + if TASKS.write().unwrap().remove(&i).is_some() { + broadcast_invalidation(); + } else { + drop(responder.send(ClientboundPacket::Error(ProtoError::UnknownTask))); } savestate::save(); } @@ -78,8 +90,7 @@ pub fn handle_packet(client: u32, packet: ServerboundPacket, responder: Sender t, None => { - let _ = responder.send(ClientboundPacket::Error(ProtoError::UnknownTask)); - return; + return drop(responder.send(ClientboundPacket::Error(ProtoError::UnknownTask))) } }; @@ -113,7 +124,7 @@ pub fn handle_packet(client: u32, packet: ServerboundPacket, responder: Sender