chiark / gitweb /
wip adjust players etc.
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Nov 2020 19:18:32 +0000 (19:18 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 1 Nov 2020 19:18:32 +0000 (19:18 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/cmdlistener.rs
src/commands.rs

index ca5d23f46724ce7f83b32397e11e6c7c9f8a3e7a..2dedc82d247e0b830657c8911f1bd31cc89427dc 100644 (file)
@@ -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 {
+        "<i>partial data?!</i>".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<PermSet<TablePermission>>>(
+    &mut self,
+    ag: &AccountsGuard,
+    ig: &'ig mut Unauthorised<InstanceGuard<'ig>, InstanceName>,
+    player: PlayerId,
+    p: P,
+  ) -> (&'ig mut InstanceGuard<'ig>,
+        Authorisation<InstanceName>)
+  {
+    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<PermSet<TablePermission>>>(
     &mut self,
index 029b7a2d11a717b9f4dfc5394ceaab8ce3803bd3..a7cdaf8b036c0b8eed811948c106715551c0655f 100644 (file)
@@ -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<String>,
   pub nick: Option<String>,
 }