chiark / gitweb /
Provide account in PlayerRecord
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 14 Jan 2021 01:13:28 +0000 (01:13 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 14 Jan 2021 01:13:28 +0000 (01:13 +0000)
This is an Arc<>.  It saves us a good deal of lock hierarchy trouble.

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
daemon/cmdlistener.rs
src/global.rs

index c9f22d893a23cf979816623242fe3e2d30e44fc2..8af23885f7e29d26ecc4f8a095edb8e0c5e0809e 100644 (file)
@@ -362,7 +362,8 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>(
         tz,
         tokens_revealed: default(),
       };
-      let (player, update, logentry) = ig.player_new(gpl, ipl, logentry)?;
+      let (player, update, logentry) =
+        ig.player_new(gpl, ipl, arecord.account.clone(), logentry)?;
 
       let atr = ig.player_access_reset(ag, player, auth.therefore_ok())?;
 
index a50d2b8ae2c858b03355edbd7a1d438281eba427..4c6a0c6e9b9c322feba97bf63ac38509442c69b7 100644 (file)
@@ -57,6 +57,7 @@ pub struct Instance {
 pub struct PlayerRecord {
   pub u: PlayerUpdates,
   pub ipl: IPlayerState,
+  pub account: Arc<AccountName>,
 }
 
 #[derive(Debug,Clone,Serialize,Deserialize)]
@@ -534,7 +535,7 @@ impl<'ig> InstanceGuard<'ig> {
   /// proves the caller has a log entry.
   #[throws(MgmtError)]
   pub fn player_new(&mut self, gnew: GPlayerState, inew: IPlayerState,
-                    logentry: LogEntry)
+                    account: Arc<AccountName>, logentry: LogEntry)
                     -> (PlayerId, PreparedUpdateEntry, LogEntry) {
     // saving is fallible, but we can't attempt to save unless
     // we have a thing to serialise with the player in it
@@ -544,7 +545,7 @@ impl<'ig> InstanceGuard<'ig> {
     }
     let player = self.c.g.gs.players.insert(gnew);
     let u = PlayerUpdates::new_begin(&self.c.g.gs).new();
-    let record = PlayerRecord { u, ipl: inew };
+    let record = PlayerRecord { u, account, ipl: inew, };
 
     self.c.g.iplayers.insert(player, record);
 
@@ -1057,9 +1058,10 @@ impl InstanceGuard<'_> {
     let iplayers : SecondarySlotMap<PlayerId, PlayerRecord> = {
       let a = aplayers;
       a.into_iter()
-    }.map(|(player, ipl)| {
+    }.filter_map(|(player, ipl)| {
       let u = pu_bc.new();
-      (player, PlayerRecord { u, ipl })
+      let account = accounts.lookup(ipl.acctid).ok()?.0.account.clone();
+      Some((player, PlayerRecord { u, ipl, account }))
     }).collect();
 
     for mut p in gs.pieces.values_mut() {