README/weather
This commit is contained in:
parent
83c5a8ccbd
commit
ac0ea18145
|
@ -0,0 +1,27 @@
|
||||||
|
# lo mi cabytcini
|
||||||
|
|
||||||
|
ni'o ni'o ti cu me lo mi cabytcini be lo mi cankyralju me'e la zo DWM.
|
||||||
|
|
||||||
|
## gaftercu'a
|
||||||
|
|
||||||
|
.i sfaile fa zoi .py. $HOME/.config/cabytcini/gaftercu'a.toml .py. lo gaftercu'a
|
||||||
|
be ko'a .i le formato cu:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
front_url = "https://whatever.omg/path"
|
||||||
|
weather_url = "https://omg.weather/darksky"
|
||||||
|
```
|
||||||
|
|
||||||
|
.i lo zo `front_url` cu eilga terbe'i lo jadycau uensni fi'o benji zo HTTP
|
||||||
|
|
||||||
|
.i lo zo `weather_url` cu eilga terbe'i lo zo JSON fi'o benji zo HTTP
|
||||||
|
|
||||||
|
## pilno
|
||||||
|
|
||||||
|
.i ko ci'erse'a fi'o zoi .ko.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ nix-env -if ./cabytcini.nix
|
||||||
|
```
|
||||||
|
|
||||||
|
.ko.
|
29
src/main.rs
29
src/main.rs
|
@ -1,5 +1,6 @@
|
||||||
mod config;
|
mod config;
|
||||||
mod front;
|
mod front;
|
||||||
|
mod weather;
|
||||||
mod xsetroot;
|
mod xsetroot;
|
||||||
|
|
||||||
use chrono::prelude::*;
|
use chrono::prelude::*;
|
||||||
|
@ -14,6 +15,14 @@ use std::{
|
||||||
};
|
};
|
||||||
use xsetroot::XSetRoot;
|
use xsetroot::XSetRoot;
|
||||||
|
|
||||||
|
// 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",
|
||||||
|
);
|
||||||
|
|
||||||
pub(crate) type MTState = Arc<Mutex<State>>;
|
pub(crate) type MTState = Arc<Mutex<State>>;
|
||||||
|
|
||||||
fn handle_client(stream: UnixStream, st: MTState) {
|
fn handle_client(stream: UnixStream, st: MTState) {
|
||||||
|
@ -62,6 +71,13 @@ fn main() -> std::io::Result<()> {
|
||||||
thread::spawn(move || front::update(mtst, cfg));
|
thread::spawn(move || front::update(mtst, cfg));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// start weather thread
|
||||||
|
{
|
||||||
|
let mtst = mtst.clone();
|
||||||
|
let cfg = cfg.clone();
|
||||||
|
thread::spawn(move || weather::update(mtst, cfg));
|
||||||
|
}
|
||||||
|
|
||||||
let _ = std::fs::remove_file("/home/cadey/tmp/cabytcini.sock")?;
|
let _ = std::fs::remove_file("/home/cadey/tmp/cabytcini.sock")?;
|
||||||
let listener = UnixListener::bind("/home/cadey/tmp/cabytcini.sock")?;
|
let listener = UnixListener::bind("/home/cadey/tmp/cabytcini.sock")?;
|
||||||
for stream in listener.incoming() {
|
for stream in listener.incoming() {
|
||||||
|
@ -83,6 +99,7 @@ fn main() -> std::io::Result<()> {
|
||||||
pub(crate) struct State {
|
pub(crate) struct State {
|
||||||
msg: String,
|
msg: String,
|
||||||
front: String,
|
front: String,
|
||||||
|
weather: Option<weather::Root>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for State {
|
impl fmt::Display for State {
|
||||||
|
@ -96,6 +113,7 @@ impl State {
|
||||||
State {
|
State {
|
||||||
msg: "".to_string(),
|
msg: "".to_string(),
|
||||||
front: "".to_string(),
|
front: "".to_string(),
|
||||||
|
weather: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +131,17 @@ impl State {
|
||||||
msg.push_str(format!("{} | ", self.front).as_str());
|
msg.push_str(format!("{} | ", self.front).as_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
match &self.weather {
|
||||||
|
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()),
|
||||||
|
None => {}
|
||||||
|
};
|
||||||
|
|
||||||
msg.push_str(format!("{}", now).as_str());
|
msg.push_str(format!("{}", now).as_str());
|
||||||
|
|
||||||
xsr.render(msg);
|
xsr.render(msg);
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
use crate::{config::Config, MTState};
|
||||||
|
use reqwest::blocking::*;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::{thread, time};
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Root {
|
||||||
|
pub currently: Currently,
|
||||||
|
pub daily: Daily,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Currently {
|
||||||
|
pub time: i64,
|
||||||
|
pub summary: String,
|
||||||
|
pub temperature: f64,
|
||||||
|
pub apparent_temperature: f64,
|
||||||
|
pub humidity: f64,
|
||||||
|
pub icon: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Daily {
|
||||||
|
pub summary: String,
|
||||||
|
pub icon: String,
|
||||||
|
pub data: Vec<Daum>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Daum {
|
||||||
|
pub time: i64,
|
||||||
|
pub icon: String,
|
||||||
|
pub temperature_high: f64,
|
||||||
|
pub temperature_low: f64,
|
||||||
|
}
|
||||||
|
|
||||||
|
const UPDATE_FREQUENCY: u64 = 15 * 60; // 15 minutes
|
||||||
|
|
||||||
|
fn get(cfg: &Config) -> reqwest::Result<Root> {
|
||||||
|
let client = Client::builder().user_agent(crate::APP_USER_AGENT).build()?;
|
||||||
|
let now: Root = client.get(&cfg.weather_url).send()?.json()?;
|
||||||
|
|
||||||
|
Ok(now)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn update(st: MTState, cfg: Config) {
|
||||||
|
loop {
|
||||||
|
match get(&cfg) {
|
||||||
|
Ok(datni) => {
|
||||||
|
let mut data = st.lock().unwrap();
|
||||||
|
data.weather = Some(datni);
|
||||||
|
}
|
||||||
|
Err(why) => {
|
||||||
|
log::error!("error getting weather from {}: {:?}", &cfg.weather_url, why);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let amt = time::Duration::new(UPDATE_FREQUENCY, 0);
|
||||||
|
thread::sleep(amt);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue