cabytcini/src/main.rs

155 lines
3.7 KiB
Rust
Raw Normal View History

2020-04-07 12:56:56 +00:00
mod config;
2020-04-07 14:41:17 +00:00
mod front;
2020-04-08 22:19:44 +00:00
mod weather;
2020-04-07 01:09:09 +00:00
mod xsetroot;
2020-04-10 11:12:09 +00:00
use anyhow::{Result};
2020-04-07 01:09:09 +00:00
use chrono::prelude::*;
2020-04-07 12:56:56 +00:00
use log::*;
2020-04-07 12:03:07 +00:00
use std::{
fmt,
io::{prelude::*, BufReader},
net::Shutdown,
os::unix::net::{UnixListener, UnixStream},
sync::{Arc, Mutex},
thread, time,
};
2020-04-07 01:09:09 +00:00
use xsetroot::XSetRoot;
2020-04-08 22:19:44 +00:00
// Name your user agent after your app?
pub static APP_USER_AGENT: &str = concat!(
env!("CARGO_PKG_NAME"),
"/",
env!("CARGO_PKG_VERSION"),
" +https://tulpa.dev/cadey/cabytcini",
);
2020-04-07 14:41:17 +00:00
pub(crate) type MTState = Arc<Mutex<State>>;
2020-04-07 01:09:09 +00:00
fn handle_client(stream: UnixStream, st: MTState) {
let mut rdr = BufReader::new(&stream);
let mut msg = String::new();
let _ = rdr.read_line(&mut msg);
let _ = write!(&stream, "OK");
let mut data = st.lock().unwrap();
2020-04-07 12:03:07 +00:00
data.msg = msg.trim().to_string();
2020-04-07 12:56:56 +00:00
info!("new message: {}", data.msg);
2020-04-07 12:03:07 +00:00
stream.shutdown(Shutdown::Both).expect("socket to close");
2020-04-07 01:09:09 +00:00
}
2020-08-25 20:04:46 +00:00
const UPDATE_FREQUENCY: u64 = 1000;
2020-04-07 12:03:07 +00:00
fn update_every_so_often(st: MTState) {
loop {
let so_often = time::Duration::from_millis(UPDATE_FREQUENCY);
thread::sleep(so_often);
{
let data = st.lock().unwrap();
data.show();
}
}
}
2020-04-10 11:12:09 +00:00
fn main() -> Result<()> {
2020-04-07 12:03:07 +00:00
let st: State = State::init();
2020-04-07 01:09:09 +00:00
st.show();
let mtst = Arc::new(Mutex::new(st));
2020-04-07 12:56:56 +00:00
env_logger::init();
let cfg = config::load()?;
2020-04-07 01:09:09 +00:00
2020-04-07 12:03:07 +00:00
// start update thread
{
let mtst = mtst.clone();
thread::spawn(move || update_every_so_often(mtst));
}
2020-04-07 12:56:56 +00:00
// start front thread
{
let mtst = mtst.clone();
let cfg = cfg.clone();
2020-04-07 14:41:17 +00:00
thread::spawn(move || front::update(mtst, cfg));
2020-04-07 12:56:56 +00:00
}
2020-04-08 22:19:44 +00:00
// start weather thread
{
let mtst = mtst.clone();
let cfg = cfg.clone();
thread::spawn(move || weather::update(mtst, cfg));
}
2020-04-07 12:03:07 +00:00
let _ = std::fs::remove_file("/home/cadey/tmp/cabytcini.sock")?;
2020-04-07 01:09:09 +00:00
let listener = UnixListener::bind("/home/cadey/tmp/cabytcini.sock")?;
for stream in listener.incoming() {
match stream {
Ok(stream) => {
2020-04-07 12:03:07 +00:00
let mtst = mtst.clone();
thread::spawn(move || handle_client(stream, mtst));
}
2020-04-07 01:09:09 +00:00
Err(err) => {
2020-04-10 11:12:09 +00:00
return Err(err.into());
2020-04-07 12:03:07 +00:00
}
2020-04-07 01:09:09 +00:00
}
}
Ok(())
}
2020-04-07 14:41:17 +00:00
pub(crate) struct State {
2020-04-07 01:09:09 +00:00
msg: String,
2020-04-07 12:56:56 +00:00
front: String,
2020-04-08 22:19:44 +00:00
weather: Option<weather::Root>,
2020-04-07 01:09:09 +00:00
}
impl fmt::Display for State {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.msg)
}
}
impl State {
fn init() -> State {
State {
msg: "".to_string(),
2020-04-07 12:56:56 +00:00
front: "".to_string(),
2020-04-08 22:19:44 +00:00
weather: None,
2020-04-07 01:09:09 +00:00
}
}
2020-04-07 14:41:17 +00:00
pub(crate) fn show(&self) {
2020-04-07 12:03:07 +00:00
let now = Local::now().format("%H:%M M%m %-d %a");
2020-04-10 11:18:51 +00:00
let xsr = XSetRoot::init().expect("xsetroot to initialize");
2020-04-07 12:56:56 +00:00
let mut msg = String::new();
if self.msg != "" {
2020-04-08 13:11:04 +00:00
msg.push_str(format!("{} | ", self.msg).as_str());
2020-04-07 12:56:56 +00:00
}
if self.front != "" {
msg.push_str(format!("{} | ", self.front).as_str());
2020-04-07 12:03:07 +00:00
}
2020-04-07 12:56:56 +00:00
2020-04-08 22:19:44 +00:00
match &self.weather {
2020-04-10 11:12:09 +00:00
Some(datni) => msg.push_str(
format!(
"{} {} / {} {} | ",
datni.currently.temperature,
datni.currently.summary,
datni.daily.data[0].temperature_high,
datni.daily.data[0].temperature_low
)
.as_str(),
),
2020-04-08 22:19:44 +00:00
None => {}
};
2020-04-07 12:56:56 +00:00
msg.push_str(format!("{}", now).as_str());
2020-04-10 11:18:51 +00:00
if let Err(why) = xsr.render(msg) {
error!("error setting root window title: {:?}", why);
}
2020-04-07 01:09:09 +00:00
}
}