.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> {
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);
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() {
})(); // <- 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!(
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),
}
},
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>),
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
).sum::<usize>() + 50
}
SetTableSize(_) |
- RemovePlayer { player:_ } |
Error(_,_) => {
100
}
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) {