From f9c09d61b14d0ed096df0ae6a4a28f9a4d7617ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Tue, 25 Oct 2022 21:11:08 +0200 Subject: [PATCH] Send a reminder when the event starts --- src/main.rs | 67 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/src/main.rs b/src/main.rs index 794021a..628bc5d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -9,7 +9,7 @@ use std::{env, fs::File, io::BufReader, sync::Arc, time::Duration}; use anyhow::Result; use async_mutex::Mutex; use bot::fetch_and_announce_appointment; -use chrono::{NaiveTime, Utc}; +use chrono::{DateTime, NaiveTime, TimeZone, Utc}; use chrono_tz::Europe; use db::ChatInfo; use diesel::{Connection, RunQueryDsl, SqliteConnection}; @@ -93,6 +93,11 @@ async fn main() { bot::spawn(bot, db).await; } +struct Reminder { + time: DateTime, + text: String, +} + async fn check_task(bot: &Throttle, reminder_time: NaiveTime, db: &Database) -> Result<()> { let chats = db.lock().await.transaction(|db| { use schema::chat::dsl::*; @@ -112,40 +117,46 @@ async fn check_task(bot: &Throttle, reminder_time: NaiveTime, db: &Database }; let appointment = appointment.with_timezone(&Europe::Berlin); - if appointment.start < now { - continue; - } if appointment.start.date_naive() != today { continue; } - let reminder_date_time = now.date().and_time(reminder_time).unwrap(); - - if now < reminder_date_time { - continue; + let mut reminder = None; + if now >= appointment.start { + reminder = Some(Reminder { + time: appointment.start, + text: "Jetzt geht's weiter".into(), + }); + } else { + let reminder_date_time = now.date().and_time(reminder_time).unwrap(); + if now >= reminder_date_time { + reminder = Some(Reminder { + time: reminder_date_time, + text: format!( + "Heute um {} Uhr geht's weiter", + appointment.start.format("%H:%M") + ), + }) + } } - if chat_info.last_reminder.is_some() - && chat_info.last_reminder.unwrap() >= reminder_date_time - { - continue; + if let Some(reminder) = reminder { + if chat_info.last_reminder.is_some() + && chat_info.last_reminder.unwrap() >= reminder.time + { + continue; + } + + bot.send_message(ChatId(chat_info.id), reminder.text) + .await?; + + db.lock().await.transaction(|db| { + use schema::chat::dsl::*; + diesel::update(chat.filter(telegram_id.eq(chat_info.id))) + .set((last_reminder.eq(now.timestamp()),)) + .execute(db) + })?; } - - bot.send_message( - ChatId(chat_info.id), - format!( - "Heute um {} Uhr geht's weiter", - appointment.start.format("%H:%M") - ), - ) - .await?; - - db.lock().await.transaction(|db| { - use schema::chat::dsl::*; - diesel::update(chat.filter(telegram_id.eq(chat_info.id))) - .set((last_reminder.eq(now.timestamp()),)) - .execute(db) - })?; } Ok(())