From: Ian Jackson Date: Sat, 1 Aug 2020 00:56:17 +0000 (+0100) Subject: track lastseen and terminate update after player gone X-Git-Tag: otter-0.2.0~1204 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=f20454ad7925b2c8477bd0fdc02f4a734b378bf9;p=otter.git track lastseen and terminate update after player gone --- diff --git a/src/api.rs b/src/api.rs index a0c294e9..df5d5b72 100644 --- a/src/api.rs +++ b/src/api.rs @@ -62,8 +62,9 @@ fn api_piece_op(form : Json>) let client = iad.ident; let mut g = iad.gref.lock()?; let g = &mut *g; - let cl = &g.clients.byid(client)?; + let cl = &mut g.clients.byid_mut(client)?; // ^ can only fail if we raced + cl.lastseen = Instant::now(); let player = cl.player; let gs = &mut g.gs; let _ = gs.players.byid(player)?; diff --git a/src/global.rs b/src/global.rs index 45c2a3d7..607e2a56 100644 --- a/src/global.rs +++ b/src/global.rs @@ -47,6 +47,7 @@ pub enum ManagementScope { #[derive(Debug)] pub struct Client { pub player : PlayerId, + pub lastseen : Instant, } pub type PlayerMap = DenseSlotMap; diff --git a/src/imports.rs b/src/imports.rs index 4d6f239f..fdeb2d53 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -25,6 +25,7 @@ pub use std::fs; pub use std::fs::File; pub use std::mem; pub use std::os::unix; +pub use std::time::Instant; pub use thiserror::Error; pub use anyhow::{Context,anyhow}; diff --git a/src/session.rs b/src/session.rs index 82ab3a5f..c326d725 100644 --- a/src/session.rs +++ b/src/session.rs @@ -48,7 +48,7 @@ fn session(form : Json) -> Result { let player = iad.ident; let c = { let mut ig = iad.gref.lock()?; - let cl = Client { player }; + let cl = Client { player, lastseen: Instant::now() }; let client = ig.clients.insert(cl); let ciad = InstanceAccessDetails { diff --git a/src/sse.rs b/src/sse.rs index d10d40b8..e2e4ea73 100644 --- a/src/sse.rs +++ b/src/sse.rs @@ -35,6 +35,13 @@ impl Read for UpdateReader { |s| io::Error::new(io::ErrorKind::Other, anyhow!(s)); let mut ig = self.gref.lock().map_err(|_| em("poison"))?; + if (||{ + (*ig).gs.players.get(self.player)?; + let client = ig.clients.get_mut(self.client)?; + client.lastseen = Instant::now(); + Some(()) + })() == None { return Ok(0) } + let orig_wanted = orig_buf.len(); let mut buf = orig_buf.as_mut();