From e538be2c3a19efb122ba9da030160c1dae36e44b Mon Sep 17 00:00:00 2001 From: Damocles Date: Fri, 1 May 2026 03:17:07 +0200 Subject: [PATCH] process unread messages on restart by registering handlers before initial sync --- src/main.rs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main.rs b/src/main.rs index 90dfa8c..5f80a1a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -114,7 +114,12 @@ async fn sync( session_file: &std::path::Path, state: Arc>, ) -> anyhow::Result<()> { - tracing::info!("initial sync (ignoring past messages)"); + let has_token = initial_sync_token.is_some(); + if has_token { + tracing::info!("restoring with persisted token, will process unread messages"); + } else { + tracing::info!("first start, ignoring historical messages"); + } let filter = FilterDefinition::with_lazy_loading(); let mut sync_settings = SyncSettings::default().filter(filter.into()); @@ -123,6 +128,13 @@ async fn sync( sync_settings = sync_settings.token(token); } + // Register handlers BEFORE sync_once iff we have a token, so messages + // received while we were down trigger the queue. On first start we skip + // this to avoid backlogging every historical message. + if has_token { + register_event_handlers(&client, state.clone()); + } + loop { match client.sync_once(sync_settings.clone()).await { Ok(response) => { @@ -136,8 +148,18 @@ async fn sync( } } + if !has_token { + register_event_handlers(&client, state.clone()); + } + tracing::info!("synced, listening for messages"); + client.sync(sync_settings).await?; + + bail!("sync loop exited unexpectedly") +} + +fn register_event_handlers(client: &Client, state: Arc>) { let msg_state = state.clone(); client.add_event_handler( move |event: matrix_sdk::ruma::events::room::message::OriginalSyncRoomMessageEvent, @@ -160,10 +182,6 @@ async fn sync( ); client.add_event_handler(handlers::on_stripped_state_member); - - client.sync(sync_settings).await?; - - bail!("sync loop exited unexpectedly") } async fn process_loop(state: Arc>, client: Client, socket_path: &PathBuf) {