From: Ian Jackson Date: Sun, 1 Nov 2020 19:18:32 +0000 (+0000) Subject: wip adjust players etc. X-Git-Tag: otter-0.2.0~575 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=34c2fb9e2963559ba503a12f6012d46b72cd902c;p=otter.git wip adjust players etc. Signed-off-by: Ian Jackson --- diff --git a/src/cmdlistener.rs b/src/cmdlistener.rs index ca5d23f4..2dedc82d 100644 --- a/src/cmdlistener.rs +++ b/src/cmdlistener.rs @@ -338,23 +338,18 @@ fn execute_game_insn<'ig>( Ok(Resp::Pieces(pieces)) })?, - RemovePlayer(account) => { - let acctid = ag.check(&account)?; - let ig = cs.check_acl(ag, ig, - PCH::InstanceOrOnlyAffectedAccount(acctid), - &[TP::RemovePlayer])?.0; - let player = ig.iplayers.iter() - .filter(|(_,v)| v.ipl.acctid == acctid) - .map(|(k,_)| k) - .next() - .ok_or(ME::PlayerNotFound)?; - let record = ig.player_remove(player).unwrap(); - let gpl = ig.gs.players.remove(player) - .ok_or(InternalError::PartialPlayerData)?; + RemovePlayer { player } => { + let ig = cs.check_acl_modify_player(ag, ig, player, + &[TP::RemovePlayer])?.0; + let (gpl, ipl) = ig.player_remove(player)?; + let show = if let Some(gpl) = gpl { + htmlescape::encode_minimal(&gpl.nick) + } else { + "partial data?!".to_string() + }; (U{ pcs: vec![], log: vec![ LogEntry { - html: Html(format!("{} removed a player: {}", &who, - htmlescape::encode_minimal(&gpl.nick))), + html: Html(format!("{} removed a player: {}", &who, &show)), }], raw: None}, Fine, ig) @@ -724,6 +719,25 @@ impl CommandStream<'_> { self.superuser.map(Into::into) } + #[throws(MgmtError)] + pub fn check_acl_modify_player<'ig, P: Into>>( + &mut self, + ag: &AccountsGuard, + ig: &'ig mut Unauthorised, InstanceName>, + player: PlayerId, + p: P, + ) -> (&'ig mut InstanceGuard<'ig>, + Authorisation) + { + let (ipl_unauth, gpl_unauth) = { + let ig = ig.by(Authorisation::authorise_any()); + (ig.iplayers.get(player)?, ig.gs.gplayers.get(player)?) + }; + let how = PCH::InstanceOrOnlyAffectedAccount(ipl_unauth.acctid); + let (ig, auth) = self.check_acl(ag, ig, how, p)?; + (ig, auth) + } + #[throws(MgmtError)] pub fn check_acl_modify_pieces<'ig>( &mut self, @@ -738,7 +752,7 @@ impl CommandStream<'_> { let modperm = ig.modify_pieces(); (ig, modperm, auth) } - + #[throws(MgmtError)] pub fn check_acl<'ig, P: Into>>( &mut self, diff --git a/src/commands.rs b/src/commands.rs index 029b7a2d..a7cdaf8b 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -78,17 +78,15 @@ pub enum MgmtGameInstruction { // xxx ^ prevent use of Fixed when not wanted RedeliverPlayerAccess(PlayerId), - AddPlayer(MgmtPlayerDetails), - UpdatePlayer(MgmtPlayerDetails), - RemovePlayer(AccountName), - BlockPlayer(String), + AddPlayer { account: AccountName, details: MgmtPlayerDetails }, + UpdatePlayer { player: PlayerId, details: MgmtPlayerDetails }, + RemovePlayer { player: PlayerId }, } // xxx facilitator name? #[derive(Debug,Serialize,Deserialize)] pub struct MgmtPlayerDetails { - pub account: AccountName, pub timezone: Option, pub nick: Option, }