extern crate dotenv;
extern crate error_chain;
#[macro_use]
extern crate log;
extern crate pretty_env_logger;
extern crate schedule;
extern crate tri;
extern crate void;
use std::process::exit;
use std::sync::Arc;
use std::thread::{sleep, spawn};
use std::time::Duration;
use error_chain::ChainedError;
use schedule::{Agenda, Job};
use tri::{Result, ResultExt, Tri};
use void::{unreachable, Void};
fn main() {
match run() {
Ok(void) => unreachable(void),
Err(err) => {
error!("{}", err.display_chain());
exit(1)
}
}
}
fn run() -> Result<Void> {
dotenv::dotenv().ok();
pretty_env_logger::init().chain_err(
|| "Couldn't start logger",
)?;
let tri = Arc::new(Tri::new_env()?);
tri.add_missing_users()?;
let sched_tri = tri.clone();
spawn(move || run_scheduler(sched_tri));
tri.listen()
}
fn run_scheduler(tri: Arc<Tri>) {
let mut a = Agenda::new();
a.add(Job::new(
|| {
let r = tri.add_missing_users();
if let Err(err) = r {
error!("{}", err.display_chain());
}
},
"0 0 * * * *".parse().unwrap(),
));
a.add(Job::new(
|| {
info!("asdfasdf");
let r = tri.remind_all_users();
if let Err(err) = r {
error!("{}", err.display_chain());
}
},
"0 35 5 * * 1".parse().unwrap(),
));
loop {
a.run_pending();
sleep(Duration::from_millis(500));
}
}