From a0838d81b3333cdea20d376e808e0d69e0a2fa99 Mon Sep 17 00:00:00 2001 From: Peter Atashian Date: Sat, 23 Sep 2023 05:04:05 -0400 Subject: [PATCH] Routine update --- Cargo.toml | 4 ++-- src/bin/export.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/bin/fixgt5ore.rs | 2 +- src/bin/purgesheet.rs | 27 +++++++++++++++++++++++++++ src/bin/rc.rs | 4 ++-- src/bin/upload.rs | 10 +++++----- src/bin/verifyoretile.rs | 7 +------ src/lib.rs | 29 +++++++++++++++++------------ src/tilesheet.rs | 7 +++++++ 9 files changed, 100 insertions(+), 28 deletions(-) create mode 100644 src/bin/export.rs create mode 100644 src/bin/purgesheet.rs diff --git a/Cargo.toml b/Cargo.toml index 350b759..1225663 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,10 +3,10 @@ name = "mediawiki" version = "0.0.1" authors = ["Peter Atashian "] license = "MIT/Apache-2.0" -edition = "2018" +edition = "2021" [dependencies] -cookie = "0.15" +cookie = "0.17" regex = "1.0" reqwest = { version = "0.11", features = ["blocking", "multipart"] } serde = { version = "1.0", features = ["derive"] } diff --git a/src/bin/export.rs b/src/bin/export.rs new file mode 100644 index 0000000..b3a0462 --- /dev/null +++ b/src/bin/export.rs @@ -0,0 +1,38 @@ +use mediawiki::{oredict::Oredict, tilesheet::Tilesheet, Mediawiki}; +use serde_json::Value; +use std::fs; + +fn export() { + let mw = Mediawiki::login_path("ftb.json").unwrap(); + let tiles = mw + .query_tiles(None) + .into_iter() + .map(|tile| tile.unwrap()) + .collect::>(); + fs::write("tiles.json", Value::Array(tiles.clone()).to_string()).unwrap(); + let sheets = mw + .query_sheets() + .into_iter() + .map(|sheet| sheet.unwrap()) + .collect::>(); + fs::write("sheets.json", Value::Array(sheets).to_string()).unwrap(); + let ores = mw + .query_ores(None) + .into_iter() + .map(|ore| ore.unwrap()) + .collect::>(); + fs::write("ores.json", Value::Array(ores).to_string()).unwrap(); + let translations = tiles + .into_iter() + .flat_map(|tile| { + let id = tile["id"].as_i64().unwrap(); + mw.query_tile_translations(id) + .into_iter() + .map(|trans| trans.unwrap()) + }) + .collect::>(); + fs::write("translations.json", Value::Array(translations).to_string()).unwrap(); +} +fn main() { + export(); +} diff --git a/src/bin/fixgt5ore.rs b/src/bin/fixgt5ore.rs index b52929a..17d58d0 100644 --- a/src/bin/fixgt5ore.rs +++ b/src/bin/fixgt5ore.rs @@ -26,7 +26,7 @@ fn fix_gt5() { assert!(mod_name == "GT"); let pair = (tag_name.into(), item_name.into()); if !gt5_ores.contains(&pair) { - println!("{:?}", pair); + println!("{pair:?}"); mw.edit_ore(&token, id, Some("GT5"), None, None, None) .unwrap(); } diff --git a/src/bin/purgesheet.rs b/src/bin/purgesheet.rs new file mode 100644 index 0000000..f996b97 --- /dev/null +++ b/src/bin/purgesheet.rs @@ -0,0 +1,27 @@ +use mediawiki::{tilesheet::Tilesheet, Mediawiki}; +use std::env::args; + +fn purge(mod_name: &str) { + let mw = Mediawiki::login_path("ftb.json").unwrap(); + let todelete: Vec = mw + .query_tiles(Some(mod_name)) + .into_iter() + .map(|tile| { + let tile = tile.unwrap(); + let tile = tile.as_object().unwrap(); + tile["id"].as_i64().unwrap().to_string() + }) + .collect(); + let token = mw.get_token().unwrap(); + for chunk in todelete.chunks(100) { + let blob = chunk.join("|"); + mw.delete_tiles(&token, &blob, Some("Purging tiles")) + .unwrap(); + } + mw.delete_sheet(&token, mod_name, Some("Purging tilesheet")) + .unwrap(); +} +fn main() { + let name = args().nth(1).unwrap(); + purge(&name); +} diff --git a/src/bin/rc.rs b/src/bin/rc.rs index 9b3337b..709333f 100644 --- a/src/bin/rc.rs +++ b/src/bin/rc.rs @@ -30,10 +30,10 @@ fn main() { let mut file = files .entry(name.clone()) .or_insert_with(|| BufWriter::new(File::create(name).unwrap())); - writeln!(&mut file, "{}", change)?; + writeln!(&mut file, "{change}")?; Ok(()) })() { - println!("Error: {:?}", e); + println!("Error: {e:?}"); } } } diff --git a/src/bin/upload.rs b/src/bin/upload.rs index 4fea25b..ba875cc 100644 --- a/src/bin/upload.rs +++ b/src/bin/upload.rs @@ -5,18 +5,18 @@ fn upload_test(filename: &str, file: Upload, comment: Option<&str>) { let result = mw .upload(filename, &token, file, None, comment, false) .unwrap(); - println!("{:?}", result); + println!("{result:?}"); match result["upload"]["result"].as_str().unwrap() { "Warning" => (), "Success" => return, - other => panic!("Unknown result: {}", other), + other => panic!("Unknown result: {other}"), } for (warning, _value) in result["upload"]["warnings"].as_object().unwrap() { match &**warning { "was-deleted" => (), "duplicate" => (), "exists" => (), - other => panic!("Unknown warning: {}", other), + other => panic!("Unknown warning: {other}"), } } let filekey = result["upload"]["filekey"].as_str().unwrap(); @@ -30,11 +30,11 @@ fn upload_test(filename: &str, file: Upload, comment: Option<&str>) { true, ) .unwrap(); - println!("{:?}", result); + println!("{result:?}"); match result["upload"]["result"].as_str().unwrap() { "Warning" => (), "Success" => (), - other => panic!("Unknown result: {}", other), + other => panic!("Unknown result: {other}"), } } fn main() { diff --git a/src/bin/verifyoretile.rs b/src/bin/verifyoretile.rs index d2fa7fd..71e1cc8 100644 --- a/src/bin/verifyoretile.rs +++ b/src/bin/verifyoretile.rs @@ -37,12 +37,7 @@ fn import() { // if mod_name == "GT6-I" { // todelete.push(id.to_string()); // } - writeln!( - &mut file, - "{} {} = {} ({})", - id, tag_name, item_name, mod_name - ) - .unwrap(); + writeln!(&mut file, "{id} {tag_name} = {item_name} ({mod_name})",).unwrap(); } } /* diff --git a/src/lib.rs b/src/lib.rs index 01636e5..4de4525 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,7 +79,9 @@ impl Mediawiki { config, client: Client::new(), }; - mw.login()?; + if !mw.config.username.is_empty() { + mw.login()?; + } Ok(mw) } pub fn login_path>(path: P) -> Result { @@ -148,7 +150,7 @@ impl Mediawiki { let mut request = self.request(); request.arg("action", "query"); request.arg("prop", "imageinfo"); - request.arg("titles", format!("File:{}", name)); + request.arg("titles", format!("File:{name}")); request.arg("iiprop", "url"); let json = request.get()?; let images = json["query"]["pages"] @@ -171,7 +173,7 @@ impl Mediawiki { if response.status() == StatusCode::OK { break response; } - println!("{:?}", response); + println!("{response:?}"); sleep(Duration::from_secs(5)) }; let mut buf = Vec::new(); @@ -222,6 +224,7 @@ impl<'a> RequestBuilder<'a> { args: HashMap::new(), }; request.arg("format", "json"); + request.arg("formatversion", "2"); request } pub fn arg(&mut self, key: T, val: U) -> &mut Self @@ -277,9 +280,13 @@ impl<'a> RequestBuilder<'a> { let text = response.text()?; if status.is_success() { let json: Json = serde_json::from_str(&text)?; - Ok(json) + if json["error"].is_object() { + Err(Error::Json(json)) + } else { + Ok(json) + } } else { - println!("{:?}", text); + println!("{text:?}"); Err(status.to_string().into()) } } @@ -287,7 +294,7 @@ impl<'a> RequestBuilder<'a> { loop { match self.request(Method::POST, None) { Ok(json) => return Ok(json), - Err(status) => println!("{:?}", status), + Err(status) => println!("{status:?}"), } } } @@ -295,7 +302,7 @@ impl<'a> RequestBuilder<'a> { loop { match self.request(Method::GET, None) { Ok(json) => return Ok(json), - Err(status) => println!("{:?}", status), + Err(status) => println!("{status:?}"), } } } @@ -359,10 +366,8 @@ impl<'a> Query<'a> { self.buf.reverse(); if let Json::Object(cont) = &json["continue"] { for (key, val) in cont { - self.req.arg( - &*key, - val.as_str().ok_or_else(|| Error::Json(json.clone()))?, - ); + self.req + .arg(key, val.as_str().ok_or_else(|| Error::Json(json.clone()))?); } Ok(true) } else { @@ -397,7 +402,7 @@ impl Token { Token(token.to_owned(), PhantomData) } fn value(&self) -> &str { - &*self.0 + &self.0 } } #[derive(Debug)] diff --git a/src/tilesheet.rs b/src/tilesheet.rs index c3cfc0c..5e252c2 100644 --- a/src/tilesheet.rs +++ b/src/tilesheet.rs @@ -1,6 +1,7 @@ use crate::{Csrf, Error, Json, Mediawiki, QueryBuilder, Token}; pub trait Tilesheet { fn query_tiles(&self, tsmod: Option<&str>) -> QueryBuilder; + fn query_tile_translations(&self, tsid: i64) -> QueryBuilder; fn add_tiles( &self, token: &Token, @@ -49,6 +50,12 @@ impl Tilesheet for Mediawiki { query.arg("tslimit", "5000"); query } + fn query_tile_translations(&self, tsid: i64) -> QueryBuilder { + let mut query = self.query("tiles"); + query.arg("list", "tiletranslations"); + query.arg("tsid", tsid.to_string()); + query + } fn delete_sheet( &self, token: &Token,