commit 0943842d015ab16b5af7ede66d3d7d3ab5d2d3c5 Author: Martin Bley Date: Mon Nov 16 09:50:57 2020 +0100 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..58dfd8c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "i3status-custom-pim" +version = "0.1.0" +authors = ["Martin Bley "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +chrono = "0.4" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..fedd7db --- /dev/null +++ b/src/main.rs @@ -0,0 +1,67 @@ +use chrono::{Local, NaiveTime}; +use std::process::Command; + +fn main() { + const THRESHOLD_WARNING: i64 = 60; + const THRESHOLD_CRITICAL: i64 = 15; + let icon = String::from("calendar"); + + let mut events: Vec = Vec::new(); + let now = Local::now().time(); + let from = now.format("%H:%M").to_string(); + + let khal_cmd = Command::new("khal") + .arg("list") + .arg("-df") + .arg("{name}") + .arg("-f") + .arg("{start-time}") + .arg("--notstarted") + .arg(&from) + .arg("23:59") + .output(); + + let khal_output = khal_cmd.expect("failed to run command"); + let khal_stdout = String::from_utf8(khal_output.stdout) + .expect("can't read output"); + + let mut lines = khal_stdout.lines(); + let dayline = lines.nth(0).expect("output seems empty"); + + if dayline.trim() == "Today" { + for e in lines { + events.push(e.to_string()); + } + } + + // get duration up to next event and set state + let mut state = String::from("Idle"); + + let mut event_remaining: i64 = 24 * 60; + let event_count = events.len(); + for e in events.iter() { + let e_start = match NaiveTime::parse_from_str(e, "%H:%M") { + Ok(s) => s, + Err(_f) => NaiveTime::from_hms(0, 0, 0), + }; + let diff = e_start - now; + if (diff.num_minutes() < event_remaining) && + (diff.num_minutes() >= 0) { + event_remaining = diff.num_minutes() + } + + if event_remaining >= 0 { + if event_remaining <= THRESHOLD_WARNING { + state = String::from("Warning"); + } + if event_remaining <= THRESHOLD_CRITICAL { + state = String::from("Critical"); + } + } + } + + println!( + "{{ \"icon\": \"{}\", \"state\": \"{}\", \"text\": \"{}\" }}", + icon, state, event_count + ); +}