72 lines
2.6 KiB
Rust
72 lines
2.6 KiB
Rust
|
use chrono::{Duration, Utc};
|
||
|
use serenity::prelude::Context;
|
||
|
|
||
|
use crate::discord::{get_db, utility};
|
||
|
use crate::reminder::Reminders;
|
||
|
use crate::INTERESTED_EMOJI;
|
||
|
|
||
|
/// Send reminders
|
||
|
pub async fn send_reminders_task(ctx: &Context) {
|
||
|
let duration = tokio::time::Duration::from_secs(1);
|
||
|
loop {
|
||
|
tokio::time::sleep(duration).await;
|
||
|
let config = utility::get_config(&ctx.data.read().await)
|
||
|
.await
|
||
|
.expect("Unable to get config");
|
||
|
let event_channel_id = config.event_channel;
|
||
|
|
||
|
let reminder_msg: Vec<&String> = match &config.reminders {
|
||
|
None => return,
|
||
|
Some(reminder_msg) => reminder_msg.iter().map(|r| &r.msg).collect(),
|
||
|
};
|
||
|
|
||
|
let db = get_db(&ctx.data.read().await)
|
||
|
.await
|
||
|
.expect("Unable to get DB");
|
||
|
|
||
|
let mut data = ctx.data.write().await;
|
||
|
let reminders = data
|
||
|
.get_mut::<Reminders>()
|
||
|
.expect("Unable to get reminders");
|
||
|
|
||
|
let current_reminders = reminders.get_reminders();
|
||
|
|
||
|
for reminder in current_reminders {
|
||
|
if let Some(event) = db.get_event_by_msg_id(&reminder.event_id) {
|
||
|
let message_id = event.message_id.parse::<u64>().unwrap_or_default();
|
||
|
// Get message id
|
||
|
if let Ok(message) = ctx.http.get_message(event_channel_id, message_id).await {
|
||
|
if let Ok(reaction_users) = message
|
||
|
.reaction_users(ctx, INTERESTED_EMOJI, None, None)
|
||
|
.await
|
||
|
{
|
||
|
// Build reminder message
|
||
|
let msg: String = reminder_msg[reminder.reminder_id]
|
||
|
.replace("{EVENT_NAME}", event.event_name.as_str());
|
||
|
|
||
|
// Send reminder to each reacted user
|
||
|
for user in reaction_users {
|
||
|
utility::send_dm_message(ctx, user, &msg).await;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// Delete old events
|
||
|
pub async fn cleanup_task(ctx: &Context) {
|
||
|
let duration = tokio::time::Duration::from_secs(60 * 60);
|
||
|
loop {
|
||
|
tokio::time::sleep(duration).await;
|
||
|
let db = get_db(&ctx.data.read().await).await.unwrap();
|
||
|
let one_week_ago = Utc::now()
|
||
|
- Duration::from_std(std::time::Duration::from_secs(60 * 60 * 24 * 7)).unwrap();
|
||
|
|
||
|
for event in db.filter_events(|_, event| event.event_time < one_week_ago.naive_utc()) {
|
||
|
utility::delete_event(ctx, &event).await.ok();
|
||
|
}
|
||
|
}
|
||
|
}
|