rs_pixel/response/
player_response.rs1use 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}