summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-01-09 23:34:40 -0800
committerFuwn <[email protected]>2024-01-09 23:34:40 -0800
commitfa9f5f70a5221bb940354f3e4d978d4312af77e4 (patch)
tree06a8fd1e6c254fae373459a606bf3b256ccb8efe /src/main.rs
downloadrin-fa9f5f70a5221bb940354f3e4d978d4312af77e4.tar.xz
rin-fa9f5f70a5221bb940354f3e4d978d4312af77e4.zip
feat: initial release
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..38c9103
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,76 @@
+#![deny(
+ warnings,
+ nonstandard_style,
+ unused,
+ future_incompatible,
+ rust_2018_idioms,
+ unsafe_code
+)]
+#![deny(clippy::all, clippy::nursery, clippy::pedantic)]
+#![recursion_limit = "128"]
+#![allow(clippy::cast_precision_loss)]
+
+use thirtyfour::error::WebDriverResult;
+
+mod schedule;
+mod web;
+mod week;
+
+#[derive(serde::Serialize, serde::Deserialize)]
+struct Cache {
+ schedule: schedule::MarkdownMap,
+ last_updated: std::time::SystemTime,
+}
+
+#[tokio::main]
+async fn main() -> WebDriverResult<()> {
+ let cache = format!("{}/rin_cache", std::env::temp_dir().display());
+
+ if std::path::Path::new(&cache).exists()
+ && std::env::var("RIN_CACHE_BUST").unwrap_or_else(|_| "0".to_string())
+ != "1"
+ {
+ let schedule: Cache = serde_json::from_str(
+ &std::fs::read_to_string(&cache).expect("failed to read cache"),
+ )
+ .expect("failed to parse cache");
+
+ if schedule
+ .last_updated
+ .elapsed()
+ .unwrap()
+ .as_secs()
+ .checked_div(60)
+ .unwrap()
+ .checked_div(60)
+ .unwrap()
+ < 24
+ {
+ schedule::render_markdown(&schedule.schedule).await;
+
+ return Ok(());
+ }
+ }
+
+ let mut geckodriver =
+ web::geckodriver().expect("failed to start geckodriver");
+ let driver = web::webdriver().await.expect("failed to start webdriver");
+ let markdown =
+ schedule::to_markdown(&driver).await.expect("failed to get schedule");
+ let schedule = schedule::markdown_to_map(&markdown);
+
+ std::fs::write(
+ cache,
+ serde_json::to_string(&Cache {
+ schedule: schedule.clone(),
+ last_updated: std::time::SystemTime::now(),
+ })
+ .unwrap(),
+ )
+ .unwrap();
+ schedule::render_markdown(&schedule).await;
+ driver.quit().await.expect("failed to quit webdriver");
+ geckodriver.kill().await.expect("failed to kill geckodriver");
+
+ Ok(())
+}