chiark / gitweb /
players access command
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 23:54:16 +0000 (00:54 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 31 Jul 2020 23:54:16 +0000 (00:54 +0100)
src/cmdlistener.rs
src/commands.rs
src/error.rs
src/global.rs

index 736c9bb8bc7819af7e3d4d3c47dafa3e1f457e96..a257c482c37be09dd12aeaed643f0b7fe46b05e3 100644 (file)
@@ -395,7 +395,13 @@ fn execute_game_insn(ig: &mut InstanceGuard, update: MgmtGameInstruction)
 
 
     ResetPlayerAccesses { players } => {
-      let tokens = ig.players_access_reset(&players)?;
+      let tokens = ig.players_access_reset(&players)?
+        .drain(0..).map(|token| vec![token]).collect();
+      (vec![], vec![], PlayerAccessTokens { tokens })
+    }
+
+    ReportPlayerAccesses { players } => {
+      let tokens = ig.players_access_report(&players)?;
       (vec![], vec![], PlayerAccessTokens { tokens })
     }
 
index 7ee9b17e5cbc401524252827b36aea7686bfb25c..3d673a44830b388d2f2e025a20e1d8384a49ca7e 100644 (file)
@@ -21,6 +21,7 @@ pub enum MgmtGameInstruction {
   AddPlayer(PlayerState),
   RemovePlayer(PlayerId),
   ResetPlayerAccesses { players: Vec<PlayerId> },
+  ReportPlayerAccesses { players: Vec<PlayerId> },
 }
 
 #[derive(Debug,Serialize,Deserialize)]
@@ -35,7 +36,7 @@ pub enum MgmtResponse {
 pub enum MgmtGameResult {
   Fine { },
   AddPlayer { player: PlayerId },
-  PlayerAccessTokens { tokens: Vec<RawToken> },
+  PlayerAccessTokens { tokens: Vec<Vec<RawToken>> },
 }
 
 #[derive(Debug,Serialize,Deserialize)]
index 5371f56f73a8463ef7f9746fce50cef9de453a9f..327a279821802b27ac707adbcc35d571580fc488 100644 (file)
@@ -40,6 +40,8 @@ pub enum ServerFailure {
   MessagePackEncodeFail(#[from] rmp_serde::encode::Error),
   #[error("Server MessagePack decoding error (game load failed) {0:?}")]
   MessagePackDecodeFail(#[from] rmp_serde::decode::Error),
+  #[error("Server internal logic error {0:}")]
+  InternalLogicError(String),
 }
 
 #[derive(Error,Debug,Serialize,Copy,Clone)]
index bd4eb50f555eae96f895cfcb7b380d5ed0b7f614..45c2a3d7bbc629c426ef5598c328d4b4a9af57b1 100644 (file)
@@ -455,6 +455,37 @@ impl InstanceGuard<'_> {
     tokens
   }
 
+  #[throws(MgmtError)]
+  pub fn players_access_report(&mut self, players: &[PlayerId])
+                               -> Vec<Vec<RawToken>> {
+    // tokens can't persist unless game is never destroyed ?
+    // so a game is like a tables, and persistent
+    // xxx boxes feature maybe
+    let mut wanted = {
+      let mut wanted = SecondarySlotMap::new();
+      for &player in players {
+        wanted.insert(player, vec![]);
+      }
+      let global = GLOBAL.players.read().unwrap();
+      for token in &self.tokens_players.tr {
+        (||{
+          let iad = global.get(token)?;
+          let e = wanted.get_mut(iad.ident)?;
+          e.push(token.clone());
+          Some(())
+        })();
+      }
+      wanted
+    };
+    let out = players.iter().map(|&player| {
+      let mut tokens = wanted.remove(player)
+        .unwrap_or(vec![] /* dupe, somehow */);
+      tokens.sort_unstable();
+      tokens
+    }).collect();
+    out
+  }
+
   fn token_register<Id:AccessId>(
     &mut self,
     token: RawToken,