use serde::{Serialize, Deserialize}; use chrono::{DateTime, Utc}; use super::item::{SkillType, StatType}; use std::collections::BTreeMap; #[derive(Serialize, Deserialize, Clone, Debug)] pub struct UserTermData { pub accepted_terms: BTreeMap>, pub terms_complete: bool, // Recalculated on accept and login. pub last_presented_term: Option, } #[derive(Serialize, Deserialize, Clone, Debug)] pub struct UserExperienceData { pub spent_xp: u64, // Since last chargen complete. pub completed_journals: BTreeMap>, pub xp_change_for_this_reroll: i64, pub crafted_items: BTreeMap } #[derive(Serialize, Deserialize, Clone, Debug)] pub struct User { pub username: String, pub password_hash: String, // bcrypted. pub email: String, pub player_item_id: i64, pub registered_at: Option>, pub banned_until: Option>, pub abandoned_at: Option>, pub chargen_last_completed_at: Option>, pub terms: UserTermData, pub experience: UserExperienceData, pub raw_skills: BTreeMap, pub raw_stats: BTreeMap, // Reminder: Consider backwards compatibility when updating this. New fields should generally // be an Option, or things will crash out for existing sessions. } impl Default for UserTermData { fn default() -> Self { UserTermData { accepted_terms: BTreeMap::new(), terms_complete: false, last_presented_term: None } } } impl Default for UserExperienceData { fn default() -> Self { UserExperienceData { spent_xp: 0, completed_journals: BTreeMap::new(), xp_change_for_this_reroll: 0, crafted_items: BTreeMap::new(), } } } impl Default for User { fn default() -> Self { User { username: "unknown".to_owned(), password_hash: "unknown".to_owned(), email: "unknown".to_owned(), player_item_id: 0, registered_at: None, banned_until: None, abandoned_at: None, chargen_last_completed_at: None, terms: UserTermData::default(), experience: UserExperienceData::default(), raw_skills: BTreeMap::new(), raw_stats: BTreeMap::new(), } } }