From 06284448837afae74116bf5daf6bafd95271b17c Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sat, 1 Aug 2020 00:54:16 +0100 Subject: [PATCH] players access command --- src/cmdlistener.rs | 8 +++++++- src/commands.rs | 3 ++- src/error.rs | 2 ++ src/global.rs | 31 +++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index 736c9bb8..a257c482 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -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 }) } diff --git a/src/commands.rs b/src/commands.rs index 7ee9b17e..3d673a44 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -21,6 +21,7 @@ pub enum MgmtGameInstruction { AddPlayer(PlayerState), RemovePlayer(PlayerId), ResetPlayerAccesses { players: Vec }, + ReportPlayerAccesses { players: Vec }, } #[derive(Debug,Serialize,Deserialize)] @@ -35,7 +36,7 @@ pub enum MgmtResponse { pub enum MgmtGameResult { Fine { }, AddPlayer { player: PlayerId }, - PlayerAccessTokens { tokens: Vec }, + PlayerAccessTokens { tokens: Vec> }, } #[derive(Debug,Serialize,Deserialize)] diff --git a/src/error.rs b/src/error.rs index 5371f56f..327a2798 100644 --- a/src/error.rs +++ b/src/error.rs @@ -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)] diff --git a/src/global.rs b/src/global.rs index bd4eb50f..45c2a3d7 100644 --- a/src/global.rs +++ b/src/global.rs @@ -455,6 +455,37 @@ impl InstanceGuard<'_> { tokens } + #[throws(MgmtError)] + pub fn players_access_report(&mut self, players: &[PlayerId]) + -> Vec> { + // 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( &mut self, token: RawToken, -- 2.30.2