use serde::{Serialize, Deserialize}; use chrono::{DateTime, Utc}; 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, PartialEq, Eq, PartialOrd, Ord)] pub enum SkillType { Apraise, Blades, Bombs, Chemistry, Climb, Clubs, Craft, Fish, Fists, Flails, Fuck, Hack, Locksmith, Medic, Persuade, Pilot, Pistols, Quickdraw, Repair, Ride, Rifles, Scavenge, Science, Sneak, Spears, Swim, Teach, Throw, Track, Wrestle, Whips } #[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub enum StatType { Brains, Senses, Brawn, Reflexes, Endurance, Cool } #[derive(Serialize, Deserialize, Clone, Debug)] pub struct User { pub username: String, pub password_hash: String, // bcrypted. 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(), 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(), } } }