1
Fork 0
mirror of https://github.com/redstrate/Auracite.git synced 2025-04-21 20:27:46 +00:00

Skip writing unavailable data

If you aren't using the Dalamud plugin, some data is unavailable.
Instead of writing empty values to the JSON, don't include it at all.
This commit is contained in:
Joshua Goins 2025-03-31 16:21:55 -04:00
parent fbb6cd26d0
commit 236731374a
4 changed files with 76 additions and 53 deletions

View file

@ -43,18 +43,33 @@ pub struct CharacterData {
pub city_state: String, pub city_state: String,
pub nameday: String, pub nameday: String,
pub guardian: String, pub guardian: String,
pub currencies: Currencies, pub race: String,
pub playtime: String, pub gender: String,
pub appearance: Appearance, pub tribe: String,
pub is_battle_mentor: bool, #[serde(skip_serializing_if = "Option::is_none")]
pub is_trade_mentor: bool, pub currencies: Option<Currencies>,
pub is_novice: bool, #[serde(skip_serializing_if = "Option::is_none")]
pub is_returner: bool, pub playtime: Option<String>,
pub player_commendations: i32, #[serde(skip_serializing_if = "Option::is_none")]
pub plate_title: String, pub appearance: Option<Appearance>,
pub plate_classjob: String, #[serde(skip_serializing_if = "Option::is_none")]
pub plate_classjob_level: i32, pub is_battle_mentor: Option<bool>,
pub search_comment: String, #[serde(skip_serializing_if = "Option::is_none")]
pub is_trade_mentor: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_novice: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_returner: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub player_commendations: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plate_title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plate_classjob: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub plate_classjob_level: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub search_comment: Option<String>,
#[serde(skip)] #[serde(skip)]
pub face_url: String, pub face_url: String,

View file

@ -16,9 +16,9 @@ pub fn create_character_html(char_data: &CharacterData) -> String {
name => char_data.name, name => char_data.name,
world => char_data.world, world => char_data.world,
data_center => char_data.data_center, data_center => char_data.data_center,
race => char_data.appearance.race, race => char_data.race,
subrace => char_data.appearance.tribe, subrace => char_data.tribe,
gender => char_data.appearance.gender, gender => char_data.gender,
nameday => char_data.nameday, nameday => char_data.nameday,
city_state => char_data.city_state city_state => char_data.city_state
}) })

View file

@ -9,6 +9,7 @@ use crate::downloader::download;
use crate::html::{create_character_html, create_plate_html}; use crate::html::{create_character_html, create_plate_html};
use crate::parser::parse_search; use crate::parser::parse_search;
use base64::prelude::*; use base64::prelude::*;
use data::{Appearance, Currencies};
use package::Package; use package::Package;
use physis::race::{Gender, Race, Tribe}; use physis::race::{Gender, Race, Tribe};
use reqwest::Url; use reqwest::Url;
@ -166,41 +167,48 @@ pub async fn archive_character(
let package: Package = serde_json::from_str(&package.trim_start()).unwrap(); let package: Package = serde_json::from_str(&package.trim_start()).unwrap();
// appearance data // appearance data
char_data.appearance.model_type = package.model_type; char_data.appearance = Some(Appearance {
char_data.appearance.height = package.height; race: char_data.race.clone(),
char_data.appearance.face_type = package.face_type; tribe: char_data.tribe.clone(),
char_data.appearance.hair_style = package.hair_style; gender: char_data.gender.clone(),
char_data.appearance.has_highlights = package.has_highlights; model_type: package.model_type,
char_data.appearance.skin_color = package.skin_color; height: package.height,
char_data.appearance.eye_color = package.eye_color; face_type: package.face_type,
char_data.appearance.hair_color = package.hair_color; hair_style: package.hair_style,
char_data.appearance.hair_color2 = package.hair_color2; has_highlights: package.has_highlights,
char_data.appearance.face_features = package.face_features; skin_color: package.skin_color,
char_data.appearance.face_features_color = package.face_features_color; eye_color: package.eye_color,
char_data.appearance.eyebrows = package.eyebrows; hair_color: package.hair_color,
char_data.appearance.eye_color2 = package.eye_color2; hair_color2: package.hair_color2,
char_data.appearance.eye_shape = package.eye_color2; face_features: package.face_features,
char_data.appearance.nose_shape = package.nose_shape; face_features_color: package.face_features_color,
char_data.appearance.jaw_shape = package.jaw_shape; eyebrows: package.eyebrows,
char_data.appearance.lip_style = package.lip_style; eye_color2: package.eye_color2,
char_data.appearance.lip_color = package.lip_color; eye_shape: package.eye_color2,
char_data.appearance.race_feature_size = package.race_feature_size; nose_shape: package.nose_shape,
char_data.appearance.race_feature_type = package.race_feature_type; jaw_shape: package.jaw_shape,
char_data.appearance.bust_size = package.bust_size; lip_style: package.lip_style,
char_data.appearance.facepaint = package.facepaint; lip_color: package.lip_color,
char_data.appearance.facepaint_color = package.facepaint_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.playtime = Some(package.playtime.parse().unwrap());
char_data.currencies.gil = package.gil; // TODO: also fetch from the lodestone char_data.currencies = Some(Currencies {
char_data.is_battle_mentor = package.is_battle_mentor; gil: package.gil, // TODO: also fetch from the lodestone
char_data.is_trade_mentor = package.is_trade_mentor; });
char_data.is_novice = package.is_novice; char_data.is_battle_mentor = Some(package.is_battle_mentor);
char_data.is_returner = package.is_returner; char_data.is_trade_mentor = Some(package.is_trade_mentor);
char_data.player_commendations = package.player_commendations; // TODO: fetch from the lodestone? char_data.is_novice = Some(package.is_novice);
char_data.plate_title = package.plate_title; char_data.is_returner = Some(package.is_returner);
char_data.plate_classjob = package.plate_class_job; char_data.player_commendations = Some(package.player_commendations); // TODO: fetch from the lodestone?
char_data.plate_classjob_level = package.plate_class_job_level; char_data.plate_title = Some(package.plate_title);
char_data.search_comment = package.search_comment; 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.start_file("plate-portrait.png", options)?;
zip.write_all( zip.write_all(

View file

@ -69,12 +69,12 @@ pub fn parse_lodestone(data: &str) -> CharacterData {
let inner_html = block_name.inner_html(); let inner_html = block_name.inner_html();
let captures = re.captures(&inner_html).unwrap(); let captures = re.captures(&inner_html).unwrap();
char_data.appearance.race = captures.get(1).unwrap().as_str().to_owned(); char_data.race = captures.get(1).unwrap().as_str().to_owned();
char_data.appearance.tribe = captures.get(2).unwrap().as_str().to_owned(); char_data.tribe = captures.get(2).unwrap().as_str().to_owned();
if captures.get(3).unwrap().as_str() == "" { if captures.get(3).unwrap().as_str() == "" {
char_data.appearance.gender = "Female".parse().unwrap(); char_data.gender = "Female".parse().unwrap();
} else { } else {
char_data.appearance.gender = "Male".parse().unwrap(); char_data.gender = "Male".parse().unwrap();
} }
} }
} else if name == "City-state" { } else if name == "City-state" {