use std::fmt;
use serde::Serialize;
use crate::models::{ServerStatus, ServerData};
use crate::core::fmt::strip_formatting;
use super::ext::StatusExt;
#[derive(Serialize)]
#[serde(transparent)]
pub struct JavaServerStatus(pub(crate) ServerStatus);
impl JavaServerStatus {
pub fn motd(&self) -> &str {
match &self.0.data {
ServerData::Java(j) => &j.description,
_ => "",
}
}
pub fn motd_clean(&self) -> String {
strip_formatting(self.motd())
}
pub fn version(&self) -> &str {
match &self.0.data {
ServerData::Java(j) => &j.version.name,
_ => "",
}
}
pub fn players_online(&self) -> i64 {
match &self.0.data {
ServerData::Java(j) => j.players.online,
_ => 0,
}
}
pub fn players_max(&self) -> i64 {
match &self.0.data {
ServerData::Java(j) => j.players.max,
_ => 0,
}
}
pub fn favicon(&self) -> Option<&str> {
match &self.0.data {
ServerData::Java(j) => j.favicon.as_deref(),
_ => None,
}
}
pub fn save_favicon(&self, filename: &str) -> Result<(), crate::McError> {
match &self.0.data {
ServerData::Java(j) => j.save_favicon(filename),
_ => Err(crate::McError::invalid_response("not a java server")),
}
}
#[inline]
pub fn is_cached(&self) -> bool {
self.0.cached
}
pub fn raw(&self) -> &ServerStatus {
&self.0
}
}
impl StatusExt for JavaServerStatus {
fn latency_ms(&self) -> f64 { self.0.latency }
fn ip(&self) -> &str { &self.0.ip }
fn hostname(&self) -> &str { &self.0.hostname }
fn port(&self) -> u16 { self.0.port }
fn is_online(&self) -> bool { self.0.online }
fn display_players(&self) -> String {
format!("{}/{}", self.players_online(), self.players_max())
}
}
impl fmt::Display for JavaServerStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f, "{} [{} ms] {}/{} — {}",
self.hostname(),
self.latency_ms() as u32,
self.players_online(),
self.players_max(),
self.motd_clean(),
)
}
}
impl fmt::Debug for JavaServerStatus {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("JavaServerStatus")
.field("hostname", &self.hostname())
.field("ip", &self.ip())
.field("port", &self.port())
.field("latency_ms", &self.latency_ms())
.field("cached", &self.is_cached())
.field("version", &self.version())
.field("players", &self.display_players())
.field("motd", &self.motd_clean())
.finish()
}
}