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 })
}
AddPlayer(PlayerState),
RemovePlayer(PlayerId),
ResetPlayerAccesses { players: Vec<PlayerId> },
+ ReportPlayerAccesses { players: Vec<PlayerId> },
}
#[derive(Debug,Serialize,Deserialize)]
pub enum MgmtGameResult {
Fine { },
AddPlayer { player: PlayerId },
- PlayerAccessTokens { tokens: Vec<RawToken> },
+ PlayerAccessTokens { tokens: Vec<Vec<RawToken>> },
}
#[derive(Debug,Serialize,Deserialize)]
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)]
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,