Skip to main content

hypixel/models/skyblock/
member.rs

1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6use crate::models::common::JsonObject;
7
8/// The `leveling` section of a member: SkyBlock level experience.
9///
10/// Each SkyBlock level costs a flat 100 XP, so level = `experience / 100`.
11#[derive(Debug, Clone, Default, Deserialize, Serialize)]
12pub struct MemberLeveling {
13    #[serde(default)]
14    pub experience: f64,
15    #[serde(flatten)]
16    pub extra: JsonObject,
17}
18
19/// The `player_data` section of a member: skills and unlocks.
20#[derive(Debug, Clone, Default, Deserialize, Serialize)]
21pub struct PlayerData {
22    /// Skill experience keyed by `SKILL_MINING`-style names.
23    #[serde(default)]
24    pub experience: HashMap<String, f64>,
25    #[serde(default)]
26    pub unlocked_coll_tiers: Vec<String>,
27    #[serde(default)]
28    pub crafted_generators: Vec<String>,
29    #[serde(flatten)]
30    pub extra: JsonObject,
31}
32
33/// The `currencies` section of a member: purse and essence balances.
34#[derive(Debug, Clone, Default, Deserialize, Serialize)]
35pub struct MemberCurrencies {
36    #[serde(default)]
37    pub coin_purse: f64,
38    #[serde(default)]
39    pub motes_purse: f64,
40    /// Essence balances keyed by essence type (`WITHER`, `DRAGON`, ...).
41    #[serde(default)]
42    pub essence: HashMap<String, Essence>,
43    #[serde(flatten)]
44    pub extra: JsonObject,
45}
46
47/// One essence balance within [`MemberCurrencies`].
48#[derive(Debug, Clone, Default, Deserialize, Serialize)]
49pub struct Essence {
50    #[serde(default)]
51    pub current: f64,
52    #[serde(flatten)]
53    pub extra: JsonObject,
54}
55
56/// The `slayer` section of a member.
57#[derive(Debug, Clone, Default, Deserialize, Serialize)]
58pub struct SlayerData {
59    /// Per-boss progress keyed by boss name (`zombie`, `spider`, `wolf`,
60    /// `enderman`, `blaze`, `vampire`).
61    #[serde(default)]
62    pub slayer_bosses: HashMap<String, SlayerBossProgress>,
63    #[serde(flatten)]
64    pub extra: JsonObject,
65}
66
67/// Progress against a single slayer boss.
68#[derive(Debug, Clone, Default, Deserialize, Serialize)]
69pub struct SlayerBossProgress {
70    #[serde(default)]
71    pub xp: f64,
72    /// Claimed level flags such as `level_7` / `level_7_special`.
73    #[serde(default)]
74    pub claimed_levels: HashMap<String, bool>,
75    #[serde(flatten)]
76    pub extra: JsonObject,
77}
78
79/// The `dungeons` section of a member.
80#[derive(Debug, Clone, Default, Deserialize, Serialize)]
81pub struct Dungeons {
82    /// Per-dungeon progress keyed by dungeon type (`catacombs`,
83    /// `master_catacombs`).
84    #[serde(default)]
85    pub dungeon_types: HashMap<String, DungeonProgress>,
86    /// Per-class progress keyed by class name (`healer`, `mage`, `berserk`,
87    /// `archer`, `tank`).
88    #[serde(default)]
89    pub player_classes: HashMap<String, DungeonClassProgress>,
90    #[serde(default)]
91    pub selected_dungeon_class: Option<String>,
92    #[serde(default)]
93    pub secrets: Option<f64>,
94    #[serde(flatten)]
95    pub extra: JsonObject,
96}
97
98/// Progress within one dungeon type.
99#[derive(Debug, Clone, Default, Deserialize, Serialize)]
100pub struct DungeonProgress {
101    #[serde(default)]
102    pub experience: f64,
103    /// Completions keyed by floor number (`"0"` is the entrance).
104    #[serde(default)]
105    pub tier_completions: HashMap<String, f64>,
106    #[serde(default)]
107    pub highest_tier_completed: Option<i64>,
108    #[serde(flatten)]
109    pub extra: JsonObject,
110}
111
112/// Progress for one dungeon class.
113#[derive(Debug, Clone, Default, Deserialize, Serialize)]
114pub struct DungeonClassProgress {
115    #[serde(default)]
116    pub experience: f64,
117    #[serde(flatten)]
118    pub extra: JsonObject,
119}
120
121/// The `pets_data` section of a member.
122#[derive(Debug, Clone, Default, Deserialize, Serialize)]
123pub struct PetsData {
124    #[serde(default)]
125    pub pets: Vec<Pet>,
126    #[serde(flatten)]
127    pub extra: JsonObject,
128}
129
130/// A single pet owned by a member.
131#[derive(Debug, Clone, Default, Deserialize, Serialize)]
132pub struct Pet {
133    #[serde(default)]
134    pub uuid: Option<String>,
135    /// Pet type id, e.g. `ENDER_DRAGON`.
136    #[serde(rename = "type", default)]
137    pub pet_type: String,
138    #[serde(default)]
139    pub exp: f64,
140    /// Rarity tier: `COMMON`, `UNCOMMON`, `RARE`, `EPIC`, `LEGENDARY`, `MYTHIC`.
141    #[serde(default)]
142    pub tier: String,
143    #[serde(default)]
144    pub active: bool,
145    #[serde(default)]
146    pub held_item: Option<String>,
147    #[serde(default)]
148    pub skin: Option<String>,
149    #[serde(default)]
150    pub candy_used: i64,
151    #[serde(flatten)]
152    pub extra: JsonObject,
153}
154
155/// The `mining_core` section of a member: Heart of the Mountain progress.
156#[derive(Debug, Clone, Default, Deserialize, Serialize)]
157pub struct MiningCore {
158    /// Heart of the Mountain experience.
159    #[serde(default)]
160    pub experience: f64,
161    #[serde(default)]
162    pub powder_mithril: f64,
163    #[serde(default)]
164    pub powder_gemstone: f64,
165    #[serde(default)]
166    pub powder_glacite: f64,
167    /// Unlocked HOTM tree nodes and their levels.
168    #[serde(default)]
169    pub nodes: HashMap<String, Value>,
170    #[serde(flatten)]
171    pub extra: JsonObject,
172}