From: Ian Jackson Date: Wed, 13 Jan 2021 23:50:05 +0000 (+0000) Subject: infopane: Plumbing for player list X-Git-Tag: otter-0.3.0~17 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=cb542b261fb3b66b13e38913d096f9d95024afc8;p=otter.git infopane: Plumbing for player list Signed-off-by: Ian Jackson --- diff --git a/src/global.rs b/src/global.rs index 84ce6af7..0383c300 100644 --- a/src/global.rs +++ b/src/global.rs @@ -406,6 +406,12 @@ impl Instance { .collect(); out } + + #[throws(InternalError)] + fn player_info_pane(&self) -> Arc { + 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!( diff --git a/src/updates.rs b/src/updates.rs index 88210de4..3a57be27 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -49,8 +49,15 @@ pub enum PreparedUpdateEntry { SetTableSize(Pos), SetTableColour(Colour), SetLinks(Arc), - AddPlayer { player: PlayerId, data: DataLoadPlayer }, - RemovePlayer { player: PlayerId }, + AddPlayer { + player: PlayerId, + data: DataLoadPlayer, + new_info_pane: Arc, + }, + RemovePlayer { + player: PlayerId, + new_info_pane: Arc, + }, Log (Arc), Error (Option /* 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, + }, + RemovePlayer { + player: PlayerId, + new_info_pane: &'u Arc, + }, 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::() + 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) {