add support for CommonNinja calendars

This commit is contained in:
_ 2025-08-26 06:34:53 +00:00
parent 4140010bf2
commit 097745aeed
5 changed files with 166 additions and 18 deletions

View file

@ -1,23 +1,23 @@
use anyhow::{Context as _, Result, bail};
use camino::Utf8PathBuf;
use chrono::{DateTime, Utc};
use chrono::DateTime;
use clap::Parser as _;
use serde::Deserialize;
use std::{collections::BTreeSet, io::Write as _, time::Duration};
use url::Url;
use prelude::*;
#[cfg(test)]
mod tests;
mod prelude;
mod wac_campfire;
mod wac_common_ninja;
mod wac_ical;
#[derive(Clone, Default, Deserialize)]
struct Downloadable {
/// URL to scrape to download the JSON
struct SimpleDownload {
/// URL to scrape to download the file from
download_url: Option<Url>,
/// Disk location to cache the JSON file for debugging
/// Disk location to cache the file for debugging
file_path: Utf8PathBuf,
}
@ -52,10 +52,21 @@ struct ConfigOutput {
#[derive(Deserialize)]
struct Config {
campfires: Vec<wac_campfire::Config>,
common_ninjas: Vec<wac_common_ninja::Config>,
icals: Vec<wac_ical::Config>,
output: ConfigOutput,
}
impl Config {
fn downloads(&self) -> impl Iterator<Item = SimpleDownload> {
self.campfires
.iter()
.map(|cf| cf.dl.clone())
.chain(self.common_ninjas.iter().map(|cn| cn.simple_download()))
.chain(self.icals.iter().map(|ical| ical.dl.clone()))
}
}
#[derive(clap::Parser)]
struct CliAuto {
#[arg(long)]
@ -175,6 +186,7 @@ impl EventInstance {
#[derive(Default)]
struct Data {
campfires: Vec<wac_campfire::Calendar>,
common_ninjas: Vec<wac_common_ninja::Calendar>,
icals: Vec<wac_ical::Calendar>,
}
@ -185,6 +197,11 @@ fn read_data_from_disk(config: &Config) -> Result<Data> {
.iter()
.map(|cfg| wac_campfire::Calendar::read_from_config(cfg.clone()))
.collect::<Result<Vec<_>, _>>()?,
common_ninjas: config
.common_ninjas
.iter()
.map(|cfg| wac_common_ninja::Calendar::read_from_config(cfg.clone()))
.collect::<Result<Vec<_>, _>>()?,
icals: config
.icals
.iter()
@ -212,6 +229,16 @@ fn process_data<'a>(
}
}
for common_ninja in &data.common_ninjas {
for ev in common_ninja
.event_instances(&params)?
.into_iter()
.filter(|x| x.filter(config_output))
{
instances.push(ev);
}
}
for ical in &data.icals {
for ev in ical
.event_instances(&params)?
@ -412,12 +439,7 @@ async fn do_everything(cli: &CliAuto) -> Result<()> {
let client = reqwest::Client::builder()
.user_agent(APP_USER_AGENT)
.build()?;
for dl in config
.campfires
.iter()
.map(|cf| &cf.dl)
.chain(config.icals.iter().map(|ical| &ical.dl))
{
for dl in config.downloads() {
let Some(download_url) = &dl.download_url else {
continue;
};