diff --git a/src/data.rs b/src/data.rs index 8291b6c..ed18b08 100644 --- a/src/data.rs +++ b/src/data.rs @@ -43,18 +43,33 @@ pub struct CharacterData { pub city_state: String, pub nameday: String, pub guardian: String, - pub currencies: Currencies, - pub playtime: String, - pub appearance: Appearance, - pub is_battle_mentor: bool, - pub is_trade_mentor: bool, - pub is_novice: bool, - pub is_returner: bool, - pub player_commendations: i32, - pub plate_title: String, - pub plate_classjob: String, - pub plate_classjob_level: i32, - pub search_comment: String, + pub race: String, + pub gender: String, + pub tribe: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub currencies: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub playtime: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub appearance: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_battle_mentor: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_trade_mentor: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_novice: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub is_returner: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub player_commendations: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub plate_title: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub plate_classjob: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub plate_classjob_level: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub search_comment: Option, #[serde(skip)] pub face_url: String, diff --git a/src/html.rs b/src/html.rs index b35bf43..fc3bd41 100644 --- a/src/html.rs +++ b/src/html.rs @@ -16,9 +16,9 @@ pub fn create_character_html(char_data: &CharacterData) -> String { name => char_data.name, world => char_data.world, data_center => char_data.data_center, - race => char_data.appearance.race, - subrace => char_data.appearance.tribe, - gender => char_data.appearance.gender, + race => char_data.race, + subrace => char_data.tribe, + gender => char_data.gender, nameday => char_data.nameday, city_state => char_data.city_state }) diff --git a/src/lib.rs b/src/lib.rs index dbfce85..904b856 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,6 +9,7 @@ use crate::downloader::download; use crate::html::{create_character_html, create_plate_html}; use crate::parser::parse_search; use base64::prelude::*; +use data::{Appearance, Currencies}; use package::Package; use physis::race::{Gender, Race, Tribe}; use reqwest::Url; @@ -166,41 +167,48 @@ pub async fn archive_character( let package: Package = serde_json::from_str(&package.trim_start()).unwrap(); // appearance data - char_data.appearance.model_type = package.model_type; - char_data.appearance.height = package.height; - char_data.appearance.face_type = package.face_type; - char_data.appearance.hair_style = package.hair_style; - char_data.appearance.has_highlights = package.has_highlights; - char_data.appearance.skin_color = package.skin_color; - char_data.appearance.eye_color = package.eye_color; - char_data.appearance.hair_color = package.hair_color; - char_data.appearance.hair_color2 = package.hair_color2; - char_data.appearance.face_features = package.face_features; - char_data.appearance.face_features_color = package.face_features_color; - char_data.appearance.eyebrows = package.eyebrows; - char_data.appearance.eye_color2 = package.eye_color2; - char_data.appearance.eye_shape = package.eye_color2; - char_data.appearance.nose_shape = package.nose_shape; - char_data.appearance.jaw_shape = package.jaw_shape; - char_data.appearance.lip_style = package.lip_style; - char_data.appearance.lip_color = package.lip_color; - char_data.appearance.race_feature_size = package.race_feature_size; - char_data.appearance.race_feature_type = package.race_feature_type; - char_data.appearance.bust_size = package.bust_size; - char_data.appearance.facepaint = package.facepaint; - char_data.appearance.facepaint_color = package.facepaint_color; + char_data.appearance = Some(Appearance { + race: char_data.race.clone(), + tribe: char_data.tribe.clone(), + gender: char_data.gender.clone(), + model_type: package.model_type, + height: package.height, + face_type: package.face_type, + hair_style: package.hair_style, + has_highlights: package.has_highlights, + skin_color: package.skin_color, + eye_color: package.eye_color, + hair_color: package.hair_color, + hair_color2: package.hair_color2, + face_features: package.face_features, + face_features_color: package.face_features_color, + eyebrows: package.eyebrows, + eye_color2: package.eye_color2, + eye_shape: package.eye_color2, + nose_shape: package.nose_shape, + jaw_shape: package.jaw_shape, + lip_style: package.lip_style, + lip_color: package.lip_color, + race_feature_size: package.race_feature_size, + race_feature_type: package.race_feature_type, + bust_size: package.bust_size, + facepaint: package.facepaint, + facepaint_color: package.facepaint_color, + }); - char_data.playtime = package.playtime.parse().unwrap(); - char_data.currencies.gil = package.gil; // TODO: also fetch from the lodestone - char_data.is_battle_mentor = package.is_battle_mentor; - char_data.is_trade_mentor = package.is_trade_mentor; - char_data.is_novice = package.is_novice; - char_data.is_returner = package.is_returner; - char_data.player_commendations = package.player_commendations; // TODO: fetch from the lodestone? - char_data.plate_title = package.plate_title; - char_data.plate_classjob = package.plate_class_job; - char_data.plate_classjob_level = package.plate_class_job_level; - char_data.search_comment = package.search_comment; + char_data.playtime = Some(package.playtime.parse().unwrap()); + char_data.currencies = Some(Currencies { + gil: package.gil, // TODO: also fetch from the lodestone + }); + char_data.is_battle_mentor = Some(package.is_battle_mentor); + char_data.is_trade_mentor = Some(package.is_trade_mentor); + char_data.is_novice = Some(package.is_novice); + char_data.is_returner = Some(package.is_returner); + char_data.player_commendations = Some(package.player_commendations); // TODO: fetch from the lodestone? + char_data.plate_title = Some(package.plate_title); + char_data.plate_classjob = Some(package.plate_class_job); + char_data.plate_classjob_level = Some(package.plate_class_job_level); + char_data.search_comment = Some(package.search_comment); zip.start_file("plate-portrait.png", options)?; zip.write_all( diff --git a/src/parser.rs b/src/parser.rs index 4ba65ee..9d3e4c1 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -69,12 +69,12 @@ pub fn parse_lodestone(data: &str) -> CharacterData { let inner_html = block_name.inner_html(); let captures = re.captures(&inner_html).unwrap(); - char_data.appearance.race = captures.get(1).unwrap().as_str().to_owned(); - char_data.appearance.tribe = captures.get(2).unwrap().as_str().to_owned(); + char_data.race = captures.get(1).unwrap().as_str().to_owned(); + char_data.tribe = captures.get(2).unwrap().as_str().to_owned(); if captures.get(3).unwrap().as_str() == "♀" { - char_data.appearance.gender = "Female".parse().unwrap(); + char_data.gender = "Female".parse().unwrap(); } else { - char_data.appearance.gender = "Male".parse().unwrap(); + char_data.gender = "Male".parse().unwrap(); } } } else if name == "City-state" {