From 6f332b314d40db87101da6a8789bd088b9ba3961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20W=C3=B6lfer?= Date: Sat, 17 Jan 2026 23:34:24 +0100 Subject: [PATCH] Added subcommands --- src/main.rs | 60 +++++++++++++++++++++++++++++++++++++++++-------- src/wikiinfo.rs | 16 ++----------- 2 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/main.rs b/src/main.rs index f3f5bae..2847c43 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,8 +26,8 @@ use std::path::Path; use tracing::level_filters::LevelFilter; use tracing_subscriber::{Layer, layer::SubscriberExt, util::SubscriberInitExt}; +use crate::fetching::{DynWsdcFetcher, ScoringDanceFetcher, WorldsdcFetcher}; use crate::watchdog::{update_wanted_ids, watch_wanted}; -use crate::fetching::{DynWsdcFetcher, WorldsdcFetcher, ScoringDanceFetcher}; mod dance_info; mod fetching; @@ -128,8 +128,19 @@ enum WsdcPointsBackend { #[derive(Subcommand)] enum Commands { + /// Continuously watch for missing or outdated teachers and update them + Watch, /// Build pages for all missing teachers - Missing, + FixMissing, + /// List all missing teachers + ListMissing, + /// Update info for all teachers + FetchInfo(FetchInfoArgs), +} + +#[derive(Parser)] +struct FetchInfoArgs { + id: u32, } fn main() -> Result<(), AppError> { @@ -149,9 +160,10 @@ fn main() -> Result<(), AppError> { WsdcPointsBackend::ScoringDance => std::sync::Arc::new(ScoringDanceFetcher {}), WsdcPointsBackend::WorldSDC => std::sync::Arc::new(WorldsdcFetcher {}), }; + let command = cli.command.as_ref().map_or(&Commands::Watch, |cmd| cmd); - match &cli.command { - Some(Commands::Missing) => { + match command { + Commands::ListMissing => { rt.block_on(async { let wanted = wikiinfo::wanted_ids(bot.clone(), fetcher.clone()).await; tracing::info!( @@ -165,18 +177,48 @@ fn main() -> Result<(), AppError> { ); update_wanted_ids(&wanted, &[], fetcher.clone()).await; }); - - return Ok(()); } - None => { + Commands::FetchInfo(args) => { + rt.block_on(async { + let info = fetcher.fetch(args.id).await; + #[allow( + clippy::print_stdout, + clippy::print_stderr, + reason = "We want to print here" + )] + match info { + Ok(info) => println!("Fetched info: {info:?}"), + Err(err) => eprintln!("Error fetching info: {err}"), + } + }); + } + Commands::FixMissing => { + rt.block_on(async { + let wanted = wikiinfo::wanted_ids(bot.clone(), fetcher.clone()).await; + tracing::info!( + "Missing ids: {}", + wanted + .iter() + .map(|(v, _)| v) + .map(u32::to_string) + .collect::>() + .join("\n") + ); + update_wanted_ids(&wanted, &[], fetcher.clone()).await; + }); + } + Commands::Watch => { #[allow( unreachable_code, reason = "This is a false positive I think, I just want to loop infinitely on two futures" )] rt.block_on(async { - futures::join!(watch_wanted(bot.clone(), fetcher.clone()), updater::update_wsdc(bot, fetcher.clone())) + futures::join!( + watch_wanted(bot.clone(), fetcher.clone()), + updater::update_wsdc(bot, fetcher.clone()) + ) }); } } - unreachable!(); + Ok(()) } diff --git a/src/wikiinfo.rs b/src/wikiinfo.rs index 22ae03d..8d8f6dc 100644 --- a/src/wikiinfo.rs +++ b/src/wikiinfo.rs @@ -4,8 +4,8 @@ use mwbot::{ }; use crate::fetching::DynWsdcFetcher; -pub async fn wanted_ids(_bot: Bot, _fetcher: DynWsdcFetcher) -> Vec<(u32, Page)> { - let mut gene = QueryPage::new("Wantedpages").generate(&_bot); +pub async fn wanted_ids(bot: Bot, _fetcher: DynWsdcFetcher) -> Vec<(u32, Page)> { + let mut gene = QueryPage::new("Wantedpages").generate(&bot); let mut result = vec![]; while let Some(x) = gene.recv().await { let p = match x { @@ -51,18 +51,6 @@ fn parse_wsdc_page_name(name: &str) -> Result { } } -// fn get_wsdc_page_date(bot: &Bot, page: &Page) -> Option { -// todo!(); -// let prefix = "Updated-On: "; -// page.filter_comments() -// .iter() -// .filter_map(|x| { -// let c = x.text_contents(); -// if c.starts_with(prefix) { Some(c) } else { None } -// }) -// .map(|x| x.trim_start_matches(prefix).parse::()); -// } - #[allow(dead_code)] pub async fn index_wsdc_ids(bot: &Bot, _fetcher: DynWsdcFetcher) -> Vec<(u32, Page)> { let mut gene = Search::new("WSDC/").generate(bot);