#![feature(iter_intersperse)] mod en; mod slug; use std::collections::HashSet; use std::fs::{File, self}; use std::path::PathBuf; use bytes::Bytes; use reqwest::blocking::Client; fn get_stamp_asset_png(client: &Client, id: &str) -> Bytes { client .get(format!("https://storage.sekai.best/sekai-en-assets/stamp/{id}_rip/{id}.png")) .send() .expect("Couldn't download stamp asset") .error_for_status() .expect("Couldn't download stamp asset") .bytes() .expect("Couldn't download stamp asset") } fn main() { let repo_dir: PathBuf = std::env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| ".".to_owned()).into(); let client = Client::new(); // English region (global) let sekai_en_dir = repo_dir.join("sekai_world/db_en_diff"); let stamps_en_path = sekai_en_dir.join("stamps.json"); let stamps_en = serde_json::from_reader::<_, Vec>( File::open(&stamps_en_path) .expect("Couldn't open stamps.json")) .expect("stamps.json invalid") .into_iter() .map(|a| a.to_stamp()) .collect::>(); let cache_dir = repo_dir.join("stamps_cache/en"); fs::create_dir_all(&cache_dir); for stamp in &stamps_en { let download_path = cache_dir.join(&stamp.assetbundle_name).with_extension("png"); if !fs::exists(&download_path).unwrap() { println!("Downlading asset {}...", &stamp.assetbundle_name); fs::write(&download_path, get_stamp_asset_png(&client, &stamp.assetbundle_name)) .expect("Couldn't write out stamp cache file"); } } let character_stamps = stamps_en.clone().into_iter() .filter(|a| match a.character { en::StampCharacter::Solo { .. } | en::StampCharacter::SoloExtra { .. } => true, _ => false }) .collect::>(); let text_stamps = stamps_en.clone().into_iter() .filter(|a| match a.character { en::StampCharacter::Nobody => true, _ => false }) .collect::>(); for stamp in text_stamps { println!("{} => {}", stamp.name, stamp.name.to_ascii_lowercase().replace(" ", "_")); } let name_stamps = stamps_en.clone().into_iter() .filter(|a| match a.character { en::StampCharacter::GCUID { .. } => true, _ => false }) .collect::>(); let pair_stamps = stamps_en.clone().into_iter() .filter(|a| match a.character { en::StampCharacter::Duo { .. } => true, _ => false }) .collect::>(); slug::SlugPrompter::run("en".into(), &repo_dir, character_stamps); }