use crate::app::{App, MenuItem};
use crate::state::messages::{NetworkRequest, RefreshableRequest};
use std::time::Duration;
use tokio::sync::mpsc;
use tokio::time::interval;
pub struct PeriodicRefresher {
network_requests: mpsc::Sender<RefreshableRequest>,
}
impl PeriodicRefresher {
pub fn new(network_requests: mpsc::Sender<RefreshableRequest>) -> Self {
Self { network_requests }
}
pub async fn run(self, app: std::sync::Arc<tokio::sync::Mutex<App>>) {
let mut live_interval = interval(Duration::from_secs(10)); let mut schedule_interval = interval(Duration::from_secs(30)); let mut standings_interval = interval(Duration::from_secs(1800)); let mut stats_interval = interval(Duration::from_secs(1800));
loop {
tokio::select! {
_ = live_interval.tick() => {
let (active_tab, game_id, is_final) = {
let app = app.lock().await;
(
app.state.active_tab,
app.state.gameday.current_game_id(),
app.state.gameday.is_final(),
)
};
if active_tab == MenuItem::Gameday && game_id > 0 && !is_final {
let _ = self.network_requests.send(RefreshableRequest::force(NetworkRequest::GameData { game_id })).await;
}
}
_ = schedule_interval.tick() => {
let (active_tab, date, game_id) = {
let app = app.lock().await;
(app.state.active_tab, app.state.schedule.date_selector.date, app.state.schedule.get_selected_game_opt().unwrap_or(0))
};
if active_tab == MenuItem::Scoreboard {
let _ = self.network_requests.send(RefreshableRequest::force(NetworkRequest::Schedule { date })).await;
if game_id > 0 {
let _ = self.network_requests.send(RefreshableRequest::force(NetworkRequest::GameData { game_id })).await;
}
}
}
_ = standings_interval.tick() => {
let (active_tab, date) = {
let app = app.lock().await;
(app.state.active_tab, app.state.standings.date_selector.date)
};
if active_tab == MenuItem::Standings {
let _ = self.network_requests.send(RefreshableRequest::force(NetworkRequest::Standings { date })).await;
}
}
_ = stats_interval.tick() => {
let (active_tab, date, stat_type) = {
let app = app.lock().await;
(app.state.active_tab, app.state.stats.date_selector.date, app.state.stats.stat_type)
};
if active_tab == MenuItem::Stats {
let _ = self.network_requests.send(RefreshableRequest::force(NetworkRequest::Stats { date, stat_type })).await;
}
}
}
}
}
}