use crate::ServerSeekerClient;
use derive_builder::Builder;
use reqwest::Method;
use serde::{Deserialize, Serialize, Serializer};
#[derive(Clone)]
pub enum MaxOnlinePlayers {
Num(u16),
Inf,
}
impl Serialize for MaxOnlinePlayers {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match self {
MaxOnlinePlayers::Num(value) => serializer.serialize_u16(*value),
MaxOnlinePlayers::Inf => serializer.serialize_str("inf"),
}
}
}
#[derive(Serialize, Clone)]
pub enum ServerSoftware {
Any,
Vanilla,
Paper,
Spigot,
Bukkit,
}
#[derive(Serialize, Builder, Clone, Default)]
#[builder(name = "ServersBuilder", public, setter(strip_option), default)]
pub struct ServersParams {
#[serde(rename = "online_players")]
#[serde(skip_serializing_if = "Option::is_none")]
pub num_online_players: Option<u16>,
#[serde(rename = "online_players")]
#[serde(skip_serializing_if = "Option::is_none")]
pub range_online_players: Option<(u16, MaxOnlinePlayers)>,
pub max_players: Option<u16>,
pub cracked: Option<bool>,
#[builder(setter(into))]
pub description: Option<String>,
pub protocol: Option<i32>,
pub online_after: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub software: Option<ServerSoftware>,
#[builder(setter(into))]
pub country_code: Option<String>,
pub asn: Option<i16>,
pub ignore_modded: Option<bool>
}
#[derive(Deserialize, Debug)]
pub struct ServersServer {
pub cracked: Option<bool>,
pub description: String,
pub last_seen: i64,
pub max_players: i64,
pub online_players: i64,
pub protocol: i64,
pub server: String,
pub version: String,
}
#[derive(Deserialize, Debug)]
pub(crate) struct ServersData {
pub data: Vec<ServersServer>,
}
impl ServerSeekerClient {
pub async fn servers(
&self,
builder: &ServersBuilder,
) -> anyhow::Result<Vec<ServersServer>> {
let mut params = builder.build()?;
Ok(self
.request::<ServersData, _, _>("/servers", params, Method::POST)
.await?
.data)
}
}