use crate::db;
use crate::nntp_client::NntpClient;
use rusqlite::Connection;
use std::sync::Arc;
use tokio::sync::Mutex;
pub async fn update_new_counts(
client: &Arc<Mutex<NntpClient>>,
db: &Arc<Mutex<Connection>>,
subscriptions: &[String],
new_counts: &mut [u32],
) {
for (i, group) in subscriptions.iter().enumerate() {
let last_seen: u32 = {
let db = db.clone();
let group = group.clone();
tokio::task::spawn_blocking(move || {
db::get_last_seen(&db.blocking_lock(), &group).unwrap_or(0)
})
.await
.unwrap_or(0)
};
let new_count = if let Ok((_, high)) = {
let mut cl = client.lock().await;
cl.group_bounds(group).await
} {
high.saturating_sub(last_seen)
} else {
0
};
new_counts[i] = new_count;
}
}
pub async fn fetch_new_count_for_group(
client: &Arc<Mutex<NntpClient>>,
db: &Arc<Mutex<Connection>>,
group: &str,
) -> u32 {
let last_seen: u32 = {
let db = db.clone();
let group = group.to_string();
tokio::task::spawn_blocking(move || {
db::get_last_seen(&db.blocking_lock(), &group).unwrap_or(0)
})
.await
.unwrap_or(0)
};
let new_count = if let Ok((_, high)) = {
let mut cl = client.lock().await;
cl.group_bounds(group).await
} {
high.saturating_sub(last_seen)
} else {
0
};
new_count
}