reminder-bot/postman/src/lib.rs

51 lines
1.3 KiB
Rust
Raw Normal View History

2022-02-06 15:47:59 +00:00
mod sender;
2022-02-19 22:11:21 +00:00
use std::env;
2022-03-21 23:11:52 +00:00
use log::{info, warn};
2022-02-06 15:47:59 +00:00
use serenity::client::Context;
use sqlx::{Executor, MySql};
2022-03-21 23:11:52 +00:00
use tokio::{
sync::broadcast::Receiver,
time::{sleep_until, Duration, Instant},
};
2022-02-06 15:47:59 +00:00
type Database = MySql;
2022-03-21 23:11:52 +00:00
pub async fn initialize(
mut kill: Receiver<()>,
ctx: Context,
pool: impl Executor<'_, Database = Database> + Copy,
) -> Result<(), &'static str> {
tokio::select! {
output = _initialize(ctx, pool) => Ok(output),
_ = kill.recv() => {
warn!("Received terminate signal. Goodbye");
Err("Received terminate signal. Goodbye")
}
}
}
async fn _initialize(ctx: Context, pool: impl Executor<'_, Database = Database> + Copy) {
2022-02-19 22:11:21 +00:00
let remind_interval = env::var("REMIND_INTERVAL")
2022-02-06 15:47:59 +00:00
.map(|inner| inner.parse::<u64>().ok())
.ok()
.flatten()
.unwrap_or(10);
loop {
2022-02-19 22:11:21 +00:00
let sleep_to = Instant::now() + Duration::from_secs(remind_interval);
2022-02-06 15:47:59 +00:00
let reminders = sender::Reminder::fetch_reminders(pool).await;
if reminders.len() > 0 {
println!("Preparing to send {} reminders.", reminders.len());
2022-02-06 15:47:59 +00:00
for reminder in reminders {
reminder.send(pool, ctx.clone()).await;
}
}
sleep_until(sleep_to).await;
}
}