#![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<en::RawStamp>>(
File::open(&stamps_en_path)
.expect("Couldn't open stamps.json"))
.expect("stamps.json invalid")
.into_iter()
.map(|a| a.to_stamp())
.collect::<Vec<_>>();
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::<Vec<_>>();
let text_stamps =
stamps_en.clone().into_iter()
.filter(|a|
match a.character {
en::StampCharacter::Nobody => true,
_ => false
})
.collect::<Vec<_>>();
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::<Vec<_>>();
let pair_stamps =
stamps_en.clone().into_iter()
.filter(|a|
match a.character {
en::StampCharacter::Duo { .. } => true,
_ => false
})
.collect::<Vec<_>>();
slug::SlugPrompter::run("en".into(), &repo_dir, character_stamps);
}