rs_pixel/response/
player_response.rs

1use crate::util::{
2    generic_json::{Property, Raw},
3    utils,
4};
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8#[derive(Serialize, Deserialize, Debug)]
9pub struct PlayerResponse {
10    pub success: bool,
11    pub player: Value,
12}
13
14impl Raw for PlayerResponse {
15    fn raw(&self) -> &Value {
16        &self.player
17    }
18}
19
20impl PlayerResponse {
21    pub fn get_uuid(&self) -> Option<&str> {
22        self.get_str_property("uuid")
23    }
24
25    pub fn get_name(&self) -> Option<&str> {
26        match self.get_str_property("displayname") {
27            Some(name) => Some(name),
28            None => {
29                match self
30                    .get_array_property("knownAliases")
31                    .and_then(|aliases| aliases.last())
32                    .and_then(serde_json::Value::as_str)
33                {
34                    Some(alias) => Some(alias),
35                    None => {
36                        return self
37                            .get_str_property("playername")
38                            .or_else(|| self.get_str_property("username"))
39                    }
40                }
41            }
42        }
43    }
44
45    pub fn get_network_exp(&self) -> i64 {
46        self.get_int_property("networkExp").unwrap_or(0)
47            + (utils::get_total_exp_to_full_level(
48                (self.get_int_property("networkLevel").unwrap_or(0) + 1) as f64,
49            ) as i64)
50    }
51
52    pub fn get_network_level(&self) -> f64 {
53        utils::get_exact_level(self.get_network_exp() as f64)
54    }
55
56    pub fn get_karma(&self) -> i64 {
57        self.get_int_property("karma").unwrap_or(0)
58    }
59
60    pub fn get_rank(&self) -> &str {
61        if self.has_rank_in_field("rank") {
62            return self.get_str_property("rank").unwrap_or("NONE");
63        } else if self.has_rank_in_field("monthlyPackageRank") {
64            return self
65                .get_str_property("monthlyPackageRank")
66                .unwrap_or("NONE");
67        } else if self.has_rank_in_field("newPackageRank") {
68            return self.get_str_property("newPackageRank").unwrap_or("NONE");
69        } else if self.has_rank_in_field("packageRank") {
70            return self.get_str_property("packageRank").unwrap_or("NONE");
71        }
72
73        "NONE"
74    }
75
76    pub fn has_rank(&self) -> bool {
77        self.get_rank() != "NONE"
78    }
79
80    fn has_rank_in_field(&self, name: &str) -> bool {
81        let value = self.get_str_property(name).unwrap_or("NONE");
82        !value.is_empty() && value != "NONE" && value != "NORMAL"
83    }
84}