azalea_protocol/packets/status/
c_status_response.rs1use std::io::{Cursor, Write};
2
3use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
4use azalea_chat::FormattedText;
5use azalea_protocol_macros::ClientboundStatusPacket;
6use serde::{Deserialize, Serialize};
7use serde_json::value::Serializer;
8
9#[derive(Clone, Debug, Serialize, Deserialize)]
10pub struct Version {
11 pub name: String,
12 pub protocol: i32,
13}
14
15#[derive(Clone, Debug, Serialize, Deserialize)]
16pub struct SamplePlayer {
17 pub id: String,
18 pub name: String,
19}
20
21#[derive(Clone, Debug, Serialize, Deserialize)]
22pub struct Players {
23 pub max: i32,
24 pub online: i32,
25 #[serde(default)]
26 pub sample: Vec<SamplePlayer>,
27}
28
29#[derive(Clone, Debug, Serialize, Deserialize, ClientboundStatusPacket)]
31pub struct ClientboundStatusResponse {
32 pub description: FormattedText,
33 #[serde(default)]
34 #[serde(skip_serializing_if = "Option::is_none")]
35 pub favicon: Option<String>,
36 pub players: Players,
37 pub version: Version,
38 #[serde(default)]
39 #[serde(skip_serializing_if = "Option::is_none")]
40 #[serde(rename = "enforcesSecureChat")]
41 pub enforces_secure_chat: Option<bool>,
42}
43
44impl AzaleaRead for ClientboundStatusResponse {
45 fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<ClientboundStatusResponse, BufReadError> {
46 let status_string = String::azalea_read(buf)?;
47 let status_json: serde_json::Value = serde_json::from_str(status_string.as_str())?;
48
49 Ok(ClientboundStatusResponse::deserialize(status_json)?)
50 }
51}
52
53impl AzaleaWrite for ClientboundStatusResponse {
54 fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
55 let status_string = ClientboundStatusResponse::serialize(self, Serializer)
56 .unwrap()
57 .to_string();
58 status_string.azalea_write(buf)?;
59 Ok(())
60 }
61}