diff --git a/src/main.rs b/src/main.rs index 3ebf544..4ef02c1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,6 +64,10 @@ async fn main() -> Result<(), Error> { start_polling().await; }); + task::spawn(async move { + event_alerts().await; + }); + let mut reminder_msg = MessageId::new(1); let mut reminder_text = String::new(); let mut reminder_start = Local::now(); @@ -237,6 +241,49 @@ async fn create_text_note(client: &Client, trilium_token: &str, title: &str, con // image note: // curl 'http://localhost:9001/api/clipper/clippings' -H 'Accept: */*' -H 'Accept-Language: en' --compressed -H 'Content-Type: application/json' -H 'Authorization: icB3xohFDpkVt7YFpbTflUYC8pucmryVGpb1DFpd6ns=' -H 'Origin: moz-extension://13bc3fd7-5cb0-4d48-b368-76e389fd7c5f' --data $'{"title":"trilium/clipper.js at master \xb7 zadam/trilium","content":"","images":[{"imageId":"BoCpsLz9je8a01MdGbj4","src":"inline.png","dataUrl":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASkAAAESCAYAAAChJCPsAAAgAElEQV"}]}' +async fn event_alerts() { + loop { + let last_min = Local::now().minute(); + if let Err(e) = event_alerts_soon().await { + println!("error: {}", e); + } + while Local::now().minute() == last_min { + tokio::time::delay_for(Duration::from_secs(1)).await; + } + tokio::time::delay_for(Duration::from_secs(16)).await; + } +} + +async fn event_alerts_soon() -> Result<(), Error> { + let now = Local::now(); + + let events: Vec = CLIENT.get("http://localhost:9001/custom/event_alerts").send().await?.json().await?; + for event in events { + let todo_time: DateTime = TimeZone::from_local_datetime(&Local, &NaiveDateTime::parse_from_str(&event.start_time, "%Y-%m-%dT%H:%M:%S")?).unwrap(); + if todo_time <= now { + continue; + } + let diff = todo_time - now; + let minutes = diff.num_minutes(); + if minutes == 7 * 24 * 60 || minutes == 48 * 60 || minutes == 24 * 60 || minutes == 60 || minutes == 10 { + event_alert_notify(&format_time(diff), event).await?; + } + } + Ok(()) +} + +async fn event_alert_notify(time_left: &str, event: Event) -> Result<(), Error> { + API.send(SendMessage::new(*OWNER, format!("{}: {}", time_left, event.name))).await?; + Ok(()) +} + +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct Event { + name: String, + start_time: String, +} + async fn start_polling() { loop { let last_min = Local::now().minute(); @@ -371,6 +418,8 @@ pub enum Error { Telegram(#[from] telegram_bot::Error), #[error("mime parsing error: {0}")] Mime(#[from] mime::FromStrError), + #[error("chrono parsing error: {0}")] + Chrono(#[from] chrono::format::ParseError), #[error("ical parsing error: {0}")] Ical(#[from] ical_parsing::Error), #[error("internal error: {0}")]