chiark / gitweb /
infopane: Plumbing for player list
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 13 Jan 2021 23:50:05 +0000 (23:50 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 13 Jan 2021 23:50:05 +0000 (23:50 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/global.rs
src/updates.rs

index 84ce6af70f3490dee61e4776c4e13a911ec3687c..0383c300e11f47355f41488680e28766048dc6d0 100644 (file)
@@ -406,6 +406,12 @@ impl Instance {
       .collect();
     out
   }
+
+  #[throws(InternalError)]
+  fn player_info_pane(&self) -> Arc<Html> {
+    let html = Html::from_txt("Players list from server, but NYI");// xxx
+    Arc::new(html)
+  }
 }
 
 pub fn games_lock() -> RwLockWriteGuard<'static, GamesTable> {
@@ -518,16 +524,20 @@ 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 update = PreparedUpdateEntry::AddPlayer {
-      player,
-      data: DataLoadPlayer::from_player(self, player),
-    };
+
     self.c.g.iplayers.insert(player, record);
 
-    (||{
+    let update = (||{
+      let new_info_pane = self.player_info_pane()?;
+
+      let update = PreparedUpdateEntry::AddPlayer {
+        player, new_info_pane,
+        data: DataLoadPlayer::from_player(self, player),
+      };
+
       self.save_game_now()?;
       self.save_access_now()?;
-      Ok::<_,InternalError>(())
+      Ok::<_,InternalError>(update)
     })().map_err(|e|{
       self.c.g.iplayers.remove(player);
       self.c.g.gs.players.remove(player);
@@ -642,6 +652,8 @@ impl<'ig> InstanceGuard<'ig> {
     swap_things(self);
     undo.push(Box::new(swap_things));
 
+    let new_info_pane = self.player_info_pane()?;
+
     self.save_game_now().map_err(|e|{
       // oof
       for u in undo.drain(..).rev() {
@@ -685,7 +697,10 @@ impl<'ig> InstanceGuard<'ig> {
     })(); // <- No ?, ensures that IEFE is infallible (barring panics)
 
     let updates = old_players.iter().cloned().map(
-      |player| PreparedUpdateEntry::RemovePlayer { player }
+      |player| PreparedUpdateEntry::RemovePlayer {
+        player,
+        new_info_pane: new_info_pane.clone(),
+      }
     );
 
     let old = izip!(
index 88210de405956abe1829f6536b9af64d42d9e56c..3a57be279fba1dc5ca7c4545c328309dc2c971c4 100644 (file)
@@ -49,8 +49,15 @@ pub enum PreparedUpdateEntry {
   SetTableSize(Pos),
   SetTableColour(Colour),
   SetLinks(Arc<LinksTable>),
-  AddPlayer { player: PlayerId, data: DataLoadPlayer },
-  RemovePlayer { player: PlayerId },
+  AddPlayer {
+    player: PlayerId,
+    data: DataLoadPlayer,
+    new_info_pane: Arc<Html>,
+  },
+  RemovePlayer {
+    player: PlayerId,
+    new_info_pane: Arc<Html>,
+  },
   Log (Arc<CommittedLogEntry>),
   Error (Option<ClientId> /* none: all */, ErrorSignaledViaUpdate),
 }
@@ -114,8 +121,15 @@ enum TransmitUpdateEntry<'u> {
   },
   SetTableSize(Pos),
   SetTableColour(&'u Colour),
-  AddPlayer { player: PlayerId, data: &'u DataLoadPlayer },
-  RemovePlayer { player: PlayerId },
+  AddPlayer {
+    player: PlayerId,
+    data: &'u DataLoadPlayer,
+    new_info_pane: &'u Arc<Html>,
+  },
+  RemovePlayer {
+    player: PlayerId,
+    new_info_pane: &'u Arc<Html>,
+  },
   SetLinks(Html),
   #[serde(serialize_with="serialize_logentry")]
   Log(TransmitUpdateLogEntry<'u>),
@@ -199,8 +213,16 @@ impl PreparedUpdateEntry {
       Log(logent) => {
         logent.logent.html.0.as_bytes().len() * 28
       }
-      AddPlayer { player:_, data: DataLoadPlayer { dasharray } } => {
+      AddPlayer {
+        player:_,
+        data: DataLoadPlayer { dasharray },
+        new_info_pane,
+      } => {
         dasharray.as_bytes().len() + 100
+          + new_info_pane.0.len()
+      }
+      RemovePlayer { player:_, new_info_pane } => {
+        new_info_pane.0.len() + 100
       }
       SetTableColour(colour) => {
         colour.0.as_bytes().len() + 50
@@ -211,7 +233,6 @@ impl PreparedUpdateEntry {
         ).sum::<usize>() + 50
       }
       SetTableSize(_) |
-      RemovePlayer { player:_ } |
       Error(_,_) => {
         100
       }
@@ -535,11 +556,11 @@ impl PreparedUpdate {
         PUE::SetTableColour(colour) => {
           TUE::SetTableColour(colour)
         }
-        &PUE::AddPlayer { player, ref data } => {
-          TUE::AddPlayer { player, data }
+        &PUE::AddPlayer { player, ref new_info_pane, ref data } => {
+          TUE::AddPlayer { player, new_info_pane, data }
         }
-        &PUE::RemovePlayer { player } => {
-          TUE::RemovePlayer { player }
+        &PUE::RemovePlayer { player, ref new_info_pane } => {
+          TUE::RemovePlayer { player, new_info_pane }
         }
         PUE::Error(c, e) => {
           if *c == None || *c == Some(dest) {