From: Ian Jackson Date: Mon, 5 Apr 2021 15:42:22 +0000 (+0100) Subject: SyncLog: new facility, will help us find messages X-Git-Tag: otter-0.5.0~171 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=76eec97d5003df3989a6cabd3ad517ac1e86a33f;p=otter.git SyncLog: new facility, will help us find messages Signed-off-by: Ian Jackson --- diff --git a/apitest/apitest.rs b/apitest/apitest.rs index 31f1db18..442d1156 100644 --- a/apitest/apitest.rs +++ b/apitest/apitest.rs @@ -813,7 +813,7 @@ impl MgmtChannel { fn game_synch(&mut self, game: InstanceName) -> Generation { let cmd = MgmtCommand::AlterGame { how: MgmtGameUpdateMode::Online, - insns: vec![ MgmtGameInstruction::Synch ], + insns: vec![ MgmtGameInstruction::SynchLog ], game }; let gen = if_chain!{ diff --git a/apitest/at-otter.rs b/apitest/at-otter.rs index 85483db4..b677c3e5 100644 --- a/apitest/at-otter.rs +++ b/apitest/at-otter.rs @@ -608,6 +608,21 @@ impl Ctx { alice.api_piece(GH::Raw, &mut a_p, alice_move_to)?; bob.synchx(Some(&mut b_pieces), None, |_sess, gen, k, v| { dbg!(gen, k, v); + + if_chain! { + if k == "Log"; + if let Some(html) = (|| Some({ + v + .as_object()? + .get("logent")? + .as_object()? + .get("html")? + .as_str()? + }))(); + if html.starts_with(SYNCH_LOGENTRY_PREFIX.as_html_str()); + then { return; } + } + panic!("bob saw something when alice moved displaced occulted"); })?; diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index b5d3142b..1b91fa25 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -453,6 +453,14 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( no_updates(ig, mgr) } + MGI::SynchLog => { + let superuser = cs.superuser.ok_or(ME::SuperuserAuthorisationRequired)?; + let ig = ig.by_mut(superuser.into()); + let (gen, mgr) = some_synch_core(ig)?; + let log = LogEntry { html: synch_logentry(gen) }; + (U{ pcs: vec![], log: vec![log], raw: None }, mgr, None, ig) + }, + MGI::PieceIdLookupFwd { player, piece } => { pieceid_lookup( cs, ig, player, diff --git a/src/commands.rs b/src/commands.rs index 36acc155..455b1be4 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -82,7 +82,7 @@ pub enum MgmtGameInstruction { SetTableColour(ColourSpec), /// For testing, mostly. - Synch, + Synch, SynchLog, /// For testing only PieceIdLookupFwd { piece: PieceId, player: PlayerId, }, /// For testing only diff --git a/src/updates.rs b/src/updates.rs index 3b42fc90..76a2950a 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -1011,3 +1011,9 @@ fn serialize_logentry(&(tz,logent): &TransmitUpdateLogEntry, let f: FormattedLogEntry = (tz, logent).into(); f.serialize(s) } + +pub const SYNCH_LOGENTRY_PREFIX: HtmlLit = Html::lit("### SynchLog "); + +pub fn synch_logentry(gen: Generation) -> Html { + hformat!("{} gen={} ###", SYNCH_LOGENTRY_PREFIX, gen.0) +} diff --git a/wdriver/wdriver.rs b/wdriver/wdriver.rs index 1533823e..b008eb82 100644 --- a/wdriver/wdriver.rs +++ b/wdriver/wdriver.rs @@ -604,7 +604,7 @@ impl<'g> WindowGuard<'g> { } #[throws(AE)] - fn synch_raw(&mut self) { + fn synch_raw(&mut self) -> String { let gen = self.su.mgmt_conn().game_synch(self.w.instance.clone())?; (|| { loop { @@ -630,6 +630,7 @@ impl<'g> WindowGuard<'g> { Ok::<(),AE>(()) })() .context("await gen update via async js script")?; + synch_logentry(gen).into_html_string() } #[throws(AE)]