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 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<Currencies>,
#[serde(skip_serializing_if = "Option::is_none")]
pub playtime: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub appearance: Option<Appearance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_battle_mentor: Option<bool>,
#[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)]
pub face_url: String,

View file

@ -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
})

View file

@ -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(

View file

@ -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" {