chiark / gitweb /
track lastseen and terminate update after player gone
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 Aug 2020 00:56:17 +0000 (01:56 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 Aug 2020 00:56:17 +0000 (01:56 +0100)
src/api.rs
src/global.rs
src/imports.rs
src/session.rs
src/sse.rs

index a0c294e96e60dcfcb3b42b90213bb98a73d664b7..df5d5b722f1a3b1cc0cd9824fab3df2cfc167f5f 100644 (file)
@@ -62,8 +62,9 @@ fn api_piece_op<O: ApiPieceOp>(form : Json<ApiPiece<O>>)
   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)?;
index 45c2a3d7bbc629c426ef5598c328d4b4a9af57b1..607e2a56dd13d92240a4fd80dcf71e22a60b97e9 100644 (file)
@@ -47,6 +47,7 @@ pub enum ManagementScope {
 #[derive(Debug)] 
 pub struct Client {
   pub player : PlayerId,
+  pub lastseen : Instant,
 }
 
 pub type PlayerMap = DenseSlotMap<PlayerId,PlayerState>;
index 4d6f239f344d7ade1d9583af846bf534fd253a29..fdeb2d535caa4cfe45fa6e2a80ba21aa605c8f21 100644 (file)
@@ -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};
index 82ab3a5f1d3193aaca94d9fe6e6ca52a4abfdb92..c326d725d853a4e47b172bc8f6c0b604fdebbc6f 100644 (file)
@@ -48,7 +48,7 @@ fn session(form : Json<SessionForm>) -> Result<Template,OE> {
   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 {
index d10d40b8eb6a1ae9a617d909d841d612b4c99421..e2e4ea73aed2eb65e3b051befc75a98d4c674bf9 100644 (file)
@@ -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();