Skip to main content

minecraft_pinger/java/
model.rs

1use serde::{Serialize, Deserialize};
2
3#[derive(Serialize, Deserialize)]
4pub struct JavaPing {
5    pub version: Version,
6    pub players: Players,
7    pub description: Description,
8    pub favicon: Option<String>,
9    #[serde(rename = "modinfo")]
10    pub mod_info: Option<ModInfo>,
11
12    #[serde(default)]
13    pub latency: u32,
14}
15
16// Components
17#[derive(Serialize, Deserialize)]
18#[serde(untagged)]
19pub enum Description {
20    Component(TextComponent),
21    Plain(String),
22}
23
24#[derive(Serialize, Deserialize)]
25#[serde(untagged)]
26pub enum TextComponent {
27    Object {
28        #[serde(default)]
29        text: String,
30
31        #[serde(skip_serializing_if = "Option::is_none")]
32        hat: Option<bool>,
33        #[serde(skip_serializing_if = "Option::is_none")]
34        player: Option<PlayerField>,
35        #[serde(skip_serializing_if = "Option::is_none", alias = "shadowColor")]
36        shadow_color: Option<i32>,
37        #[serde(skip_serializing_if = "Option::is_none")]
38        atlas: Option<String>,
39        #[serde(skip_serializing_if = "Option::is_none")]
40        sprite: Option<String>,
41        #[serde(skip_serializing_if = "Option::is_none")]
42        bold: Option<bool>,
43        #[serde(skip_serializing_if = "Option::is_none")]
44        strikethrough: Option<bool>,
45        #[serde(skip_serializing_if = "Option::is_none")]
46        obfuscated: Option<bool>,
47        #[serde(skip_serializing_if = "Option::is_none")]
48        italic: Option<bool>,
49        #[serde(skip_serializing_if = "Option::is_none")]
50        underlined: Option<bool>,
51        #[serde(skip_serializing_if = "Option::is_none")]
52        font: Option<String>,
53
54        #[serde(skip_serializing_if = "Option::is_none")]
55        color: Option<String>,
56        #[serde(skip_serializing_if = "Option::is_none")]
57        extra: Option<Vec<TextComponent>>,
58    },
59    String(String),
60    Array(Vec<TextComponent>),
61}
62// Components end
63
64#[derive(Serialize, Deserialize)]
65#[serde(untagged)]
66pub enum PlayerField {
67    Name(String),
68    Full(Player),
69}
70
71#[derive(Serialize, Deserialize)]
72pub struct Player {
73    #[serde(skip_serializing_if = "Option::is_none")]
74    pub name: Option<String>,
75    #[serde(skip_serializing_if = "Option::is_none")]
76    pub properties: Option<Vec<Property>>
77}
78
79#[derive(Serialize, Deserialize)]
80pub struct Property {
81    pub name: String,
82    pub value: String
83}
84
85#[derive(Serialize, Deserialize)]
86pub struct Version {
87    pub name: String,
88    pub protocol: Option<i32>,
89}
90
91#[derive(Serialize, Deserialize)]
92pub struct Players {
93    pub online: u32,
94    pub max: i32,
95    pub sample: Option<Vec<PlayerInfo>>,
96}
97
98#[derive(Serialize, Deserialize)]
99pub struct PlayerInfo {
100    pub name: String,
101    pub id: String,
102}
103
104#[derive(Serialize, Deserialize, Default)]
105pub struct ModInfo {
106    #[serde(rename = "type", default)]
107    pub name: String,
108    #[serde(rename = "modList", default)]
109    pub mod_list: Vec<Mod>,
110}
111
112#[derive(Serialize, Deserialize)]
113pub struct Mod {
114    #[serde(rename = "modid")]
115    pub mod_id: String,
116    pub version: String,
117}