From: Ian Jackson Date: Fri, 31 Jul 2020 23:54:16 +0000 (+0100) Subject: players access command X-Git-Tag: otter-0.2.0~1205 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=06284448837afae74116bf5daf6bafd95271b17c;p=otter.git players access command --- 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,