diff --git a/melib/src/backends/nntp.rs b/melib/src/backends/nntp.rs index 842b6547..364d0a07 100644 --- a/melib/src/backends/nntp.rs +++ b/melib/src/backends/nntp.rs @@ -251,7 +251,7 @@ impl MailBackend for NntpType { /* To get updates, either issue NEWNEWS if it's supported by the server, and fallback * to OVER otherwise */ let mbox: NntpMailbox = uid_store.mailboxes.lock().await.get(&mailbox_hash).map(std::clone::Clone::clone).ok_or_else(|| MeliError::new(format!("Mailbox with hash {} not found in NNTP connection, this could possibly be a bug or it was deleted.", mailbox_hash)))?; - let mut latest_article: Option = + let latest_article: Option = mbox.latest_article.lock().unwrap().clone(); let (over_msgid_support, newnews_support): (bool, bool) = { let caps = uid_store.capabilities.lock().unwrap(); @@ -263,8 +263,8 @@ impl MailBackend for NntpType { }; let mut res = String::with_capacity(8 * 1024); let mut conn = timeout(Some(Duration::from_secs(60 * 16)), connection.lock()).await?; - if let Some(ref mut latest_article) = latest_article { - let timestamp = *latest_article - 10 * 60; + if let Some(mut latest_article) = latest_article { + let timestamp = latest_article - 10 * 60; let datetime_str = crate::datetime::timestamp_to_string(timestamp, Some("%Y%m%d %H%M%S"), true); @@ -286,6 +286,7 @@ impl MailBackend for NntpType { if message_ids.is_empty() || !over_msgid_support { return Ok(()); } + let mut env_hash_set: BTreeSet = Default::default(); for msg_id in message_ids { conn.send_command(format!("OVER {}", msg_id).as_bytes()) .await?; @@ -295,10 +296,11 @@ impl MailBackend for NntpType { let mut uid_index_lck = uid_store.uid_index.lock().unwrap(); for l in res.split_rn().skip(1) { let (_, (num, env)) = protocol_parser::over_article(&l)?; + env_hash_set.insert(env.hash()); message_id_lck.insert(env.message_id_display().to_string(), env.hash()); hash_index_lck.insert(env.hash(), (num, mailbox_hash)); uid_index_lck.insert((mailbox_hash, num), env.hash()); - *latest_article = std::cmp::max(*latest_article, env.timestamp); + latest_article = std::cmp::max(latest_article, env.timestamp); (uid_store.event_consumer)( uid_store.account_hash, crate::backends::BackendEvent::Refresh(RefreshEvent { @@ -309,6 +311,15 @@ impl MailBackend for NntpType { ); } } + { + let f = &uid_store.mailboxes.lock().await[&mailbox_hash]; + *f.latest_article.lock().unwrap() = Some(latest_article); + f.exists + .lock() + .unwrap() + .insert_existing_set(env_hash_set.clone()); + f.unseen.lock().unwrap().insert_existing_set(env_hash_set); + } return Ok(()); } }