2022-12-23 23:31:49 +11:00
|
|
|
use tokio::{task, time, sync::oneshot};
|
2022-12-23 18:30:38 +11:00
|
|
|
use crate::DResult;
|
|
|
|
use crate::db;
|
2022-12-23 23:31:49 +11:00
|
|
|
use crate::listener::{ListenerMap, ListenerSend};
|
|
|
|
use blastmud_interfaces::MessageToListener;
|
2022-12-23 18:30:38 +11:00
|
|
|
use log::warn;
|
|
|
|
|
|
|
|
async fn cleanup_session_once(pool: db::DBPool) -> DResult<()> {
|
2022-12-23 21:37:28 +11:00
|
|
|
for listener in pool.clone().get_dead_listeners().await? {
|
|
|
|
pool.clone().cleanup_listener(listener).await?;
|
2022-12-23 18:30:38 +11:00
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2022-12-23 23:31:49 +11:00
|
|
|
fn start_session_cleanup_task(pool: db::DBPool) {
|
2022-12-23 18:30:38 +11:00
|
|
|
task::spawn(async move {
|
|
|
|
loop {
|
2022-12-23 23:31:49 +11:00
|
|
|
time::sleep(time::Duration::from_secs(60)).await;
|
2022-12-23 18:30:38 +11:00
|
|
|
match cleanup_session_once(pool.clone()).await {
|
|
|
|
Ok(()) => {}
|
|
|
|
Err(e) => {
|
|
|
|
warn!("Error cleaning up sessions: {}", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2022-12-23 23:31:49 +11:00
|
|
|
}
|
|
|
|
|
|
|
|
async fn process_sendqueue_once(pool: db::DBPool, listener_map: ListenerMap) -> DResult<()> {
|
|
|
|
for item in pool.clone().get_from_sendqueue().await? {
|
|
|
|
match listener_map.lock().await.get(&item.session.listener).map(|l| l.clone()) {
|
|
|
|
None => {}
|
|
|
|
Some(listener_sender) => {
|
|
|
|
let (tx, rx) = oneshot::channel();
|
|
|
|
listener_sender.send(
|
|
|
|
ListenerSend {
|
|
|
|
message: MessageToListener::SendToSession {
|
|
|
|
session: item.session.session.clone(),
|
|
|
|
msg: item.message.clone()
|
|
|
|
},
|
|
|
|
ack_notify: tx
|
|
|
|
}
|
|
|
|
).await.unwrap_or(());
|
|
|
|
rx.await.unwrap_or(());
|
|
|
|
pool.clone().delete_from_sendqueue(&item).await?;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-12-23 18:30:38 +11:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2022-12-23 23:31:49 +11:00
|
|
|
fn start_send_queue_task(pool: db::DBPool, listener_map: ListenerMap) {
|
|
|
|
task::spawn(async move {
|
|
|
|
loop {
|
|
|
|
time::sleep(time::Duration::from_secs(1)).await;
|
|
|
|
match process_sendqueue_once(pool.clone(), listener_map.clone()).await {
|
|
|
|
Ok(()) => {}
|
|
|
|
Err(e) => {
|
|
|
|
warn!("Error processing sendqueue: {}", e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn start_regular_tasks(pool: db::DBPool, listener_map: ListenerMap) -> DResult<()> {
|
|
|
|
start_session_cleanup_task(pool.clone());
|
|
|
|
start_send_queue_task(pool, listener_map);
|
|
|
|
Ok(())
|
2022-12-23 18:30:38 +11:00
|
|
|
}
|