diff --git a/SERVICES.md b/SERVICES.md index 76df99e..5c00adb 100644 --- a/SERVICES.md +++ b/SERVICES.md @@ -1,8 +1,9 @@ # Supported services: -| Name | Documentation reference | -|---------------------|-------------------------------------------------------------------------------------------------------| -| Valve Master Server | [Master Server Query Protocol](https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol) | +| Name | Documentation reference | +|------------------------|-------------------------------------------------------------------------------------------------------| +| Valve Master Server | [Master Server Query Protocol](https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol) | +| MineTest Master Server | [Node-GameDig](https://github.com/gamedig/node-gamedig/blob/master/protocols/minetest.js) | ## Planned to add support: diff --git a/crates/lib/CHANGELOG.md b/crates/lib/CHANGELOG.md index 405049f..f049095 100644 --- a/crates/lib/CHANGELOG.md +++ b/crates/lib/CHANGELOG.md @@ -6,6 +6,10 @@ Games: - [Soulmask](https://store.steampowered.com/app/2646460/Soulmask/) support. +Services: + +- MineTest Master Server support (available only on the `tls` and `serde` feature). + # 0.5.1 - 12/05/2024 Games: diff --git a/crates/lib/src/services/minetest_master_server/mod.rs b/crates/lib/src/services/minetest_master_server/mod.rs new file mode 100644 index 0000000..908f8f6 --- /dev/null +++ b/crates/lib/src/services/minetest_master_server/mod.rs @@ -0,0 +1,7 @@ +/// The implementation. +pub mod service; +/// All types used by the implementation. +pub mod types; + +pub use service::*; +pub use types::*; diff --git a/crates/lib/src/services/minetest_master_server/service.rs b/crates/lib/src/services/minetest_master_server/service.rs new file mode 100644 index 0000000..1829866 --- /dev/null +++ b/crates/lib/src/services/minetest_master_server/service.rs @@ -0,0 +1,13 @@ +use crate::http::HttpClient; +use crate::minetest_master_server::types::Response; +use crate::{GDResult, TimeoutSettings}; + +pub fn query(timeout_settings: TimeoutSettings) -> GDResult { + let mut client = HttpClient::from_url( + "https://servers.minetest.net", + &Some(timeout_settings), + None, + )?; + + client.get_json("/list", None) +} diff --git a/crates/lib/src/services/minetest_master_server/types.rs b/crates/lib/src/services/minetest_master_server/types.rs new file mode 100644 index 0000000..c9842ff --- /dev/null +++ b/crates/lib/src/services/minetest_master_server/types.rs @@ -0,0 +1,46 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct Server { + pub address: String, + pub clients: u32, + pub clients_list: Vec, + pub clients_max: u32, + pub creative: bool, + pub damage: bool, + pub description: String, + pub game_time: u32, + pub gameid: String, + pub lag: Option, + pub name: String, + pub password: bool, + pub port: u16, + pub proto_max: u16, + pub proto_min: u16, + pub pvp: bool, + pub uptime: u32, + pub url: Option, + pub version: String, + pub ip: String, + pub update_time: u32, + pub start: u32, + pub clients_top: u32, + pub updates: u32, + pub total_clients: u32, + pub pop_v: f32, + pub geo_continent: Option, + pub ping: f32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ServersClients { + pub servers: u32, + pub clients: u32, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Response { + pub total: ServersClients, + pub total_max: ServersClients, + pub list: Vec, +} diff --git a/crates/lib/src/services/mod.rs b/crates/lib/src/services/mod.rs index ba33024..0fc5453 100644 --- a/crates/lib/src/services/mod.rs +++ b/crates/lib/src/services/mod.rs @@ -2,3 +2,7 @@ /// Reference: [Master Server Query Protocol](https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol) pub mod valve_master_server; + +/// Reference: [Node-GameDig](https://github.com/gamedig/node-gamedig/blob/master/protocols/minetest.js) +#[cfg(all(feature = "serde", feature = "tls"))] +pub mod minetest_master_server;