diff --git a/CHANGELOG.md b/CHANGELOG.md index a6c1f7a..e8cb3cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,12 @@ Protocols: - Minecraft Java: Add derives to `RequestSettings` and add `new_just_hostname` that creates new settings just by specifying the hostname, `protocol_version` defaults to -1. +Games: +- Organised game modules into protocols (when protocol used by other games), + you can now access a game by its name or by its protocol name: + - `use gamedig::games::teamfortress2;` + - `use gamedig::games::valve::teamfortress2;` + Generics: - Added standard derives to `ProprietaryProtocol`, `CommonResponseJson`, `CommonPlayerJson`, `TimeoutSettings` and `ExtraRequestSettings`. diff --git a/src/games/a2oa.rs b/src/games/a2oa.rs deleted file mode 100644 index ba83f54..0000000 --- a/src/games/a2oa.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(2304)), - SteamApp::A2OA.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/alienswarm.rs b/src/games/alienswarm.rs deleted file mode 100644 index dde7e87..0000000 --- a/src/games/alienswarm.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::ALIENSWARM.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/aoc.rs b/src/games/aoc.rs deleted file mode 100644 index acf88ae..0000000 --- a/src/games/aoc.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::AOC.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/ase.rs b/src/games/ase.rs deleted file mode 100644 index 07467dc..0000000 --- a/src/games/ase.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::ASE.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/asrd.rs b/src/games/asrd.rs deleted file mode 100644 index fcf5cdc..0000000 --- a/src/games/asrd.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(2304)), - SteamApp::ASRD.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/avorion.rs b/src/games/avorion.rs deleted file mode 100644 index 8c91507..0000000 --- a/src/games/avorion.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27020)), - SteamApp::AVORION.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/ballisticoverkill.rs b/src/games/ballisticoverkill.rs deleted file mode 100644 index 1cac0ea..0000000 --- a/src/games/ballisticoverkill.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::BALLISTICOVERKILL.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/battlefield1942.rs b/src/games/battlefield1942.rs deleted file mode 100644 index 83e6437..0000000 --- a/src/games/battlefield1942.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::protocols::gamespy; -use crate::protocols::gamespy::one::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - gamespy::one::query(&SocketAddr::new(*address, port.unwrap_or(23000)), None) -} diff --git a/src/games/blackmesa.rs b/src/games/blackmesa.rs deleted file mode 100644 index 1fabb4f..0000000 --- a/src/games/blackmesa.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::BLACKMESA.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/brainbread2.rs b/src/games/brainbread2.rs deleted file mode 100644 index 25588b8..0000000 --- a/src/games/brainbread2.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::BRAINBREAD2.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/codenamecure.rs b/src/games/codenamecure.rs deleted file mode 100644 index 3253d87..0000000 --- a/src/games/codenamecure.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::CODENAMECURE.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/colonysurvival.rs b/src/games/colonysurvival.rs deleted file mode 100644 index 664fd17..0000000 --- a/src/games/colonysurvival.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27004)), - SteamApp::COLONYSURVIVAL.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/counterstrike.rs b/src/games/counterstrike.rs deleted file mode 100644 index 83fa4e7..0000000 --- a/src/games/counterstrike.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::COUNTERSTRIKE.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/creativerse.rs b/src/games/creativerse.rs deleted file mode 100644 index 9df2abb..0000000 --- a/src/games/creativerse.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(26901)), - SteamApp::CREATIVERSE.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/crysiswars.rs b/src/games/crysiswars.rs deleted file mode 100644 index cc3cb30..0000000 --- a/src/games/crysiswars.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::protocols::gamespy; -use crate::protocols::gamespy::three::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - gamespy::three::query(&SocketAddr::new(*address, port.unwrap_or(64100)), None) -} diff --git a/src/games/cscz.rs b/src/games/cscz.rs deleted file mode 100644 index 84cb168..0000000 --- a/src/games/cscz.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::CSCZ.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/csgo.rs b/src/games/csgo.rs deleted file mode 100644 index 66ccd40..0000000 --- a/src/games/csgo.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::CSGO.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/css.rs b/src/games/css.rs deleted file mode 100644 index 9bdb9e0..0000000 --- a/src/games/css.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::CSS.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/definitions.rs b/src/games/definitions.rs index 5396c47..0d0e0c4 100644 --- a/src/games/definitions.rs +++ b/src/games/definitions.rs @@ -89,31 +89,3 @@ pub static GAMES: Map<&'static str, Game> = phf_map! { "jc2m" => game!("Just Cause 2: Multiplayer", 7777, Protocol::PROPRIETARY(ProprietaryProtocol::JC2M)), "warsow" => game!("Warsow", 44400, Protocol::Quake(QuakeVersion::Three)), }; - -#[cfg(test)] -mod test { - use super::GAMES; - use std::fs; - - #[test] - fn check_game_files_match_defs() { - let ignore = [ - "mod", // Module file - "definitions", // This file - "minecraft", // Has various defs - "sd2d", // Module names cannot start with numbers - ]; - - for file in fs::read_dir("./src/games/").unwrap() { - let file = file.unwrap(); - let metadata = file.metadata().unwrap(); - if metadata.is_file() { - if let Some(file_name) = file.file_name().into_string().unwrap().strip_suffix(".rs") { - if !ignore.contains(&file_name) && !GAMES.contains_key(file_name) { - panic!("Expected GAMES to contain a definition to match {file_name}"); - } - } - } - } - } -} diff --git a/src/games/dod.rs b/src/games/dod.rs deleted file mode 100644 index 588f765..0000000 --- a/src/games/dod.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::DOD.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/dods.rs b/src/games/dods.rs deleted file mode 100644 index 813718a..0000000 --- a/src/games/dods.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::DODS.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/doi.rs b/src/games/doi.rs deleted file mode 100644 index b8b5222..0000000 --- a/src/games/doi.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::DOI.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/dst.rs b/src/games/dst.rs deleted file mode 100644 index 49f7252..0000000 --- a/src/games/dst.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::DST.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/gamespy.rs b/src/games/gamespy.rs new file mode 100644 index 0000000..31f6a16 --- /dev/null +++ b/src/games/gamespy.rs @@ -0,0 +1,9 @@ +//! Gamespy game query modules + +use crate::protocols::gamespy::game_query_mod; + +game_query_mod!(battlefield1942, "Battlefield 1942", one, 23000); +game_query_mod!(crysiswars, "Crysis Wars", three, 64100); +game_query_mod!(hce, "Halo: Combat Evolved", two, 2302); +game_query_mod!(serioussam, "Serious Sam", one, 25601); +game_query_mod!(unrealtournament, "Unreal Tournament", one, 7778); diff --git a/src/games/garrysmod.rs b/src/games/garrysmod.rs deleted file mode 100644 index e0f033d..0000000 --- a/src/games/garrysmod.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::GARRYSMOD.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/hce.rs b/src/games/hce.rs deleted file mode 100644 index 6ab7af8..0000000 --- a/src/games/hce.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::protocols::gamespy; -use crate::protocols::gamespy::two::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - gamespy::two::query(&SocketAddr::new(*address, port.unwrap_or(2302)), None) -} diff --git a/src/games/hl2d.rs b/src/games/hl2d.rs deleted file mode 100644 index 0553f73..0000000 --- a/src/games/hl2d.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::HL2D.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/hlds.rs b/src/games/hlds.rs deleted file mode 100644 index 1b9fc42..0000000 --- a/src/games/hlds.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::HLDS.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/hll.rs b/src/games/hll.rs deleted file mode 100644 index 078aaeb..0000000 --- a/src/games/hll.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(26420)), - SteamApp::HLL.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/imic.rs b/src/games/imic.rs deleted file mode 100644 index 0d5aaa8..0000000 --- a/src/games/imic.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::IMIC.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/insurgency.rs b/src/games/insurgency.rs deleted file mode 100644 index c4874b9..0000000 --- a/src/games/insurgency.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::INSURGENCY.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/insurgencysandstorm.rs b/src/games/insurgencysandstorm.rs deleted file mode 100644 index bc55899..0000000 --- a/src/games/insurgencysandstorm.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27131)), - SteamApp::INSURGENCYSANDSTORM.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/left4dead.rs b/src/games/left4dead.rs deleted file mode 100644 index cb8a09e..0000000 --- a/src/games/left4dead.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::LEFT4DEAD.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/left4dead2.rs b/src/games/left4dead2.rs deleted file mode 100644 index e06a548..0000000 --- a/src/games/left4dead2.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::LEFT4DEAD2.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/mod.rs b/src/games/mod.rs index 46ed2c2..10129f7 100644 --- a/src/games/mod.rs +++ b/src/games/mod.rs @@ -3,118 +3,24 @@ #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; -/// ARMA 2: Operation Arrowhead -pub mod a2oa; -/// Alien Swarm -pub mod alienswarm; -/// Age of Chivalry -pub mod aoc; -/// ARK: Survival Evolved -pub mod ase; -/// Alien Swarm: Reactive Drop -pub mod asrd; -/// Avorion -pub mod avorion; -/// Ballistic Overkill -pub mod ballisticoverkill; +pub mod gamespy; +pub mod quake; +pub mod valve; + +pub use gamespy::*; +pub use quake::*; +pub use valve::*; + /// Battalion 1944 pub mod battalion1944; -/// Battlefield 1942 -pub mod battlefield1942; -/// Black Mesa -pub mod blackmesa; -/// BrainBread 2 -pub mod brainbread2; -/// Codename CURE -pub mod codenamecure; -/// Colony Survival -pub mod colonysurvival; -/// Counter-Strike -pub mod counterstrike; -/// Creativerse -pub mod creativerse; -/// Crysis Wars -pub mod crysiswars; -/// Counter Strike: Condition Zero -pub mod cscz; -/// Counter-Strike: Global Offensive -pub mod csgo; -/// Counter-Strike: Source -pub mod css; -/// Day of Defeat -pub mod dod; -/// Day of Defeat: Source -pub mod dods; -/// Day of Infamy -pub mod doi; -/// Don't Starve Together -pub mod dst; /// Frontlines: Fuel of War pub mod ffow; -/// Garry's Mod -pub mod garrysmod; -/// Halo: Combat Evolved -pub mod hce; -/// Half-Life 2 Deathmatch -pub mod hl2d; -/// Half-Life Deathmatch: Source -pub mod hlds; -/// Hell Let Loose -pub mod hll; -/// Insurgency: Modern Infantry Combat -pub mod imic; -/// Insurgency -pub mod insurgency; -/// Insurgency: Sandstorm -pub mod insurgencysandstorm; /// Just Cause 2: Multiplayer pub mod jc2m; -/// Left 4 Dead -pub mod left4dead; -/// Left 4 Dead 2 -pub mod left4dead2; /// Minecraft pub mod minecraft; -/// Operation: Harsh Doorstop -pub mod ohd; -/// Onset -pub mod onset; -/// Project Zomboid -pub mod projectzomboid; -/// Quake 1 -pub mod quake1; -/// Quake 2 -pub mod quake2; -/// Quake 3: Arena -pub mod quake3; -/// Risk of Rain 2 -pub mod ror2; -/// Rust -pub mod rust; -/// Sven Co-op -pub mod sco; -/// 7 Days To Die -pub mod sd2d; -/// Serious Sam -pub mod serioussam; -/// Soldier of Fortune 2 -pub mod sof2; -/// Team Fortress 2 -pub mod teamfortress2; -/// Team Fortress Classic -pub mod tfc; -/// The Forest -pub mod theforest; /// The Ship pub mod theship; -/// Unreal Tournament -pub mod unrealtournament; -/// Unturned -pub mod unturned; -/// V Rising -pub mod vrising; -/// Warsow -pub mod warsow; use crate::protocols::gamespy::GameSpyVersion; use crate::protocols::quake::QuakeVersion; diff --git a/src/games/ohd.rs b/src/games/ohd.rs deleted file mode 100644 index 16d3502..0000000 --- a/src/games/ohd.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27005)), - SteamApp::OHD.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/onset.rs b/src/games/onset.rs deleted file mode 100644 index e83c33b..0000000 --- a/src/games/onset.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(7776)), - SteamApp::ONSET.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/projectzomboid.rs b/src/games/projectzomboid.rs deleted file mode 100644 index 24e2a24..0000000 --- a/src/games/projectzomboid.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(16261)), - SteamApp::PROJECTZOMBOID.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/quake.rs b/src/games/quake.rs new file mode 100644 index 0000000..948e18c --- /dev/null +++ b/src/games/quake.rs @@ -0,0 +1,9 @@ +//! Quake game query modules + +use crate::protocols::quake::game_query_mod; + +game_query_mod!(quake1, "Quake 1", one, 27500); +game_query_mod!(quake2, "Quake 2", two, 27910); +game_query_mod!(quake3, "Quake 3: Arena", three, 27960); +game_query_mod!(sof2, "Soldier of Fortune 2", three, 20100); +game_query_mod!(warsow, "Warsow", three, 44400); diff --git a/src/games/quake1.rs b/src/games/quake1.rs deleted file mode 100644 index 32359a4..0000000 --- a/src/games/quake1.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::protocols::quake; -use crate::protocols::quake::one::Player; -use crate::protocols::quake::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult> { - quake::one::query(&SocketAddr::new(*address, port.unwrap_or(27500)), None) -} diff --git a/src/games/quake2.rs b/src/games/quake2.rs deleted file mode 100644 index 32481d0..0000000 --- a/src/games/quake2.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::protocols::quake; -use crate::protocols::quake::two::Player; -use crate::protocols::quake::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult> { - quake::two::query(&SocketAddr::new(*address, port.unwrap_or(27910)), None) -} diff --git a/src/games/quake3.rs b/src/games/quake3.rs deleted file mode 100644 index eb38e4b..0000000 --- a/src/games/quake3.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::protocols::quake; -use crate::protocols::quake::two::Player; -use crate::protocols::quake::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult> { - quake::three::query(&SocketAddr::new(*address, port.unwrap_or(27960)), None) -} diff --git a/src/games/ror2.rs b/src/games/ror2.rs deleted file mode 100644 index ca0bfe8..0000000 --- a/src/games/ror2.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::ROR2.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/rust.rs b/src/games/rust.rs deleted file mode 100644 index 39bae1a..0000000 --- a/src/games/rust.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::RUST.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/sco.rs b/src/games/sco.rs deleted file mode 100644 index f7b08cc..0000000 --- a/src/games/sco.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::SCO.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/sd2d.rs b/src/games/sd2d.rs deleted file mode 100644 index 9477a52..0000000 --- a/src/games/sd2d.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(26900)), - SteamApp::SD2D.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/serioussam.rs b/src/games/serioussam.rs deleted file mode 100644 index 001d4e4..0000000 --- a/src/games/serioussam.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::protocols::gamespy; -use crate::protocols::gamespy::one::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - gamespy::one::query(&SocketAddr::new(*address, port.unwrap_or(25601)), None) -} diff --git a/src/games/sof2.rs b/src/games/sof2.rs deleted file mode 100644 index 9f40059..0000000 --- a/src/games/sof2.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::protocols::quake; -use crate::protocols::quake::two::Player; -use crate::protocols::quake::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult> { - quake::three::query(&SocketAddr::new(*address, port.unwrap_or(20100)), None) -} diff --git a/src/games/teamfortress2.rs b/src/games/teamfortress2.rs deleted file mode 100644 index 418c8e6..0000000 --- a/src/games/teamfortress2.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::TEAMFORTRESS2.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/tfc.rs b/src/games/tfc.rs deleted file mode 100644 index e8c8093..0000000 --- a/src/games/tfc.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::TFC.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/theforest.rs b/src/games/theforest.rs deleted file mode 100644 index ce4a717..0000000 --- a/src/games/theforest.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::THEFOREST.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/unrealtournament.rs b/src/games/unrealtournament.rs deleted file mode 100644 index 453b4f1..0000000 --- a/src/games/unrealtournament.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::protocols::gamespy; -use crate::protocols::gamespy::one::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - gamespy::one::query(&SocketAddr::new(*address, port.unwrap_or(7778)), None) -} diff --git a/src/games/unturned.rs b/src/games/unturned.rs deleted file mode 100644 index 6ac05f1..0000000 --- a/src/games/unturned.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27015)), - SteamApp::UNTURNED.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/valve.rs b/src/games/valve.rs new file mode 100644 index 0000000..b9efb24 --- /dev/null +++ b/src/games/valve.rs @@ -0,0 +1,55 @@ +//! Valve game query modules + +use crate::protocols::valve::game_query_mod; + +game_query_mod!(a2oa, "ARMA 2: Operation Arrowhead", A2OA, 2304); +game_query_mod!(alienswarm, "Alien Swarm", ALIENSWARM, 27015); +game_query_mod!(aoc, "Age of Chivalry", AOC, 27015); +game_query_mod!(ase, "ARK: Survival Evolved", ASE, 27015); +game_query_mod!(asrd, "Alien Swarm: Reactive Drop", ASRD, 2304); +game_query_mod!(avorion, "Avorion", AVORION, 27020); +game_query_mod!( + ballisticoverkill, + "Ballistic Overkill", + BALLISTICOVERKILL, + 27016 +); +game_query_mod!(blackmesa, "Black Mesa", BLACKMESA, 27015); +game_query_mod!(brainbread2, "BrainBread 2", BRAINBREAD2, 27015); +game_query_mod!(codenamecure, "Codename CURE", CODENAMECURE, 27015); +game_query_mod!(colonysurvival, "Colony Survival", COLONYSURVIVAL, 27004); +game_query_mod!(counterstrike, "Counter-Strike", COUNTERSTRIKE, 27015); +game_query_mod!(creativerse, "Creativerse", CREATIVERSE, 26901); +game_query_mod!(cscz, "Counter Strike: Condition Zero", CSCZ, 27015); +game_query_mod!(csgo, "Counter-Strike: Global Offensive", CSGO, 27015); +game_query_mod!(css, "Counter-Strike: Source", CSS, 27015); +game_query_mod!(dod, "Day of Defeat", DOD, 27015); +game_query_mod!(dods, "Day of Defeat: Source", DODS, 27015); +game_query_mod!(doi, "Day of Infamy", DOI, 27015); +game_query_mod!(dst, "Don't Starve Together", DST, 27016); +game_query_mod!(garrysmod, "Garry's Mod", GARRYSMOD, 27016); +game_query_mod!(hl2d, "Half-Life 2 Deathmatch", HL2D, 27015); +game_query_mod!(hlds, "Half-Life Deathmatch: Source", HLDS, 27015); +game_query_mod!(hll, "Hell Let Loose", HLL, 26420); +game_query_mod!(imic, "Insurgency: Modern Infantry Combat", IMIC, 27015); +game_query_mod!(insurgency, "Insurgency", INSURGENCY, 27015); +game_query_mod!( + insurgencysandstorm, + "Insurgency: Sandstorm", + INSURGENCYSANDSTORM, + 27131 +); +game_query_mod!(left4dead, "Left 4 Dead", LEFT4DEAD, 27015); +game_query_mod!(left4dead2, "Left 4 Dead 2", LEFT4DEAD2, 27015); +game_query_mod!(ohd, "Operation: Harsh Doorstop", OHD, 27005); +game_query_mod!(onset, "Onset", ONSET, 7776); +game_query_mod!(projectzomboid, "Project Zomboid", PROJECTZOMBOID, 16261); +game_query_mod!(ror2, "Risk of Rain 2", ROR2, 27016); +game_query_mod!(rust, "Rust", RUST, 27015); +game_query_mod!(sco, "Sven Co-op", SCO, 27015); +game_query_mod!(sd2d, "7 Days To Die", SD2D, 26900); +game_query_mod!(teamfortress2, "Team Fortress 2", TEAMFORTRESS2, 27015); +game_query_mod!(tfc, "Team Fortress Classic", TFC, 27015); +game_query_mod!(theforest, "The Forest", THEFOREST, 27016); +game_query_mod!(unturned, "Unturned", UNTURNED, 27015); +game_query_mod!(vrising, "V Rising", VRISING, 27016); diff --git a/src/games/vrising.rs b/src/games/vrising.rs deleted file mode 100644 index 2efa849..0000000 --- a/src/games/vrising.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::{ - protocols::valve::{self, game, SteamApp}, - GDResult, -}; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult { - let valve_response = valve::query( - &SocketAddr::new(*address, port.unwrap_or(27016)), - SteamApp::VRISING.as_engine(), - None, - None, - )?; - - Ok(game::Response::new_from_valve_response(valve_response)) -} diff --git a/src/games/warsow.rs b/src/games/warsow.rs deleted file mode 100644 index 84a5796..0000000 --- a/src/games/warsow.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::protocols::quake; -use crate::protocols::quake::two::Player; -use crate::protocols::quake::Response; -use crate::GDResult; -use std::net::{IpAddr, SocketAddr}; - -pub fn query(address: &IpAddr, port: Option) -> GDResult> { - quake::three::query(&SocketAddr::new(*address, port.unwrap_or(44400)), None) -} diff --git a/src/protocols/gamespy/mod.rs b/src/protocols/gamespy/mod.rs index e46698f..41d51f8 100644 --- a/src/protocols/gamespy/mod.rs +++ b/src/protocols/gamespy/mod.rs @@ -31,3 +31,56 @@ pub enum VersionedPlayer<'a> { Two(&'a two::Player), Three(&'a three::Player), } + +/// Generate a module containing a query function for a gamespy game. +/// +/// * `mod_name` - The name to be given to the game module (see ID naming +/// conventions in CONTRIBUTING.md). +/// * `pretty_name` - The full name of the game, will be used as the +/// documentation for the created module. +/// * `gamespy_ver`, `default_port` - Passed through to [game_query_fn]. +macro_rules! game_query_mod { + ($mod_name: ident, $pretty_name: expr, $gamespy_ver: ident, $default_port: literal) => { + #[doc = $pretty_name] + pub mod $mod_name { + crate::protocols::gamespy::game_query_fn!($gamespy_ver, $default_port); + } + }; +} + +pub(crate) use game_query_mod; + +// Allow generating doc comments: +// https://users.rust-lang.org/t/macros-filling-text-in-comments/20473 +/// Generate a query function for a gamespy game. +/// +/// * `gamespy_ver` - The name of the [module](crate::protocols::gamespy) for +/// the gamespy version the game uses. +/// * `default_port` - The default port the game uses. +/// +/// ```rust,ignore +/// use crate::protocols::gamespy::game_query_fn; +/// game_query_fn!(one, 7778); +/// ``` +macro_rules! game_query_fn { + ($gamespy_ver: ident, $default_port: literal) => { + crate::protocols::gamespy::game_query_fn! {@gen $gamespy_ver, $default_port, concat!( + "Make a gamespy ", stringify!($gamespy_ver), " query with default timeout settings.\n\n", + "If port is `None`, then the default port (", stringify!($default_port), ") will be used.")} + }; + + (@gen $gamespy_ver: ident, $default_port: literal, $doc: expr) => { + #[doc = $doc] + pub fn query( + address: &std::net::IpAddr, + port: Option, + ) -> crate::GDResult { + crate::protocols::gamespy::$gamespy_ver::query( + &std::net::SocketAddr::new(*address, port.unwrap_or($default_port)), + None, + ) + } + }; +} + +pub(crate) use game_query_fn; diff --git a/src/protocols/quake/mod.rs b/src/protocols/quake/mod.rs index dfaaedd..dd3c213 100644 --- a/src/protocols/quake/mod.rs +++ b/src/protocols/quake/mod.rs @@ -18,3 +18,57 @@ pub enum QuakeVersion { Two, Three, } + +/// Generate a module containing a query function for a quake game. +/// +/// * `mod_name` - The name to be given to the game module (see ID naming +/// conventions in CONTRIBUTING.md). +/// * `pretty_name` - The full name of the game, will be used as the +/// documentation for the created module. +/// * `quake_ver`, `default_port` - Passed through to [game_query_fn]. +macro_rules! game_query_mod { + ($mod_name: ident, $pretty_name: expr, $quake_ver: ident, $default_port: literal) => { + #[doc = $pretty_name] + pub mod $mod_name { + crate::protocols::quake::game_query_fn!($quake_ver, $default_port); + } + }; +} + +pub(crate) use game_query_mod; + +// Allow generating doc comments: +// https://users.rust-lang.org/t/macros-filling-text-in-comments/20473 +/// Generate a query function for a quake game. +/// +/// * `quake_ver` - The name of the [module](crate::protocols::quake) for the +/// quake version the game uses. +/// * `default_port` - The default port the game uses. +/// +/// ```rust,ignore +/// use crate::protocols::quake::game_query_fn; +/// game_query_fn!(one, 27500); +/// ``` +macro_rules! game_query_fn { + ($quake_ver: ident, $default_port: literal) => { + use crate::protocols::quake::$quake_ver::Player; + crate::protocols::quake::game_query_fn! {@gen $quake_ver, Player, $default_port, concat!( + "Make a quake ", stringify!($quake_ver), " query with default timeout settings.\n\n", + "If port is `None`, then the default port (", stringify!($default_port), ") will be used.")} + }; + + (@gen $quake_ver: ident, $player_type: ty, $default_port: literal, $doc: expr) => { + #[doc = $doc] + pub fn query( + address: &std::net::IpAddr, + port: Option, + ) -> crate::GDResult> { + crate::protocols::quake::$quake_ver::query( + &std::net::SocketAddr::new(*address, port.unwrap_or($default_port)), + None, + ) + } + }; +} + +pub(crate) use game_query_fn; diff --git a/src/protocols/quake/three.rs b/src/protocols/quake/three.rs index 4942165..68a25ef 100644 --- a/src/protocols/quake/three.rs +++ b/src/protocols/quake/three.rs @@ -1,11 +1,13 @@ use crate::protocols::quake::client::{client_query, QuakeClient}; -use crate::protocols::quake::two::{Player, QuakeTwo}; +use crate::protocols::quake::two::QuakeTwo; use crate::protocols::quake::Response; use crate::protocols::types::TimeoutSettings; use crate::GDResult; use std::net::SocketAddr; use std::slice::Iter; +pub use crate::protocols::quake::two::Player; + struct QuakeThree; impl QuakeClient for QuakeThree { type Player = Player; diff --git a/src/protocols/valve/mod.rs b/src/protocols/valve/mod.rs index 3d98ab9..ab935b4 100644 --- a/src/protocols/valve/mod.rs +++ b/src/protocols/valve/mod.rs @@ -5,3 +5,56 @@ pub mod types; pub use protocol::*; pub use types::*; + +/// Generate a module containing a query function for a valve game. +/// +/// * `mod_name` - The name to be given to the game module (see ID naming +/// conventions in CONTRIBUTING.md). +/// * `pretty_name` - The full name of the game, will be used as the +/// documentation for the created module. +/// * `steam_app`, `default_port` - Passed through to [game_query_fn]. +macro_rules! game_query_mod { + ($mod_name: ident, $pretty_name: expr, $steam_app: ident, $default_port: literal) => { + #[doc = $pretty_name] + pub mod $mod_name { + crate::protocols::valve::game_query_fn!($steam_app, $default_port); + } + }; +} + +pub(crate) use game_query_mod; + +// Allow generating doc comments: +// https://users.rust-lang.org/t/macros-filling-text-in-comments/20473 +/// Generate a query function for a valve game. +/// +/// * `steam_app` - The entry in the [SteamApp] enum that the game uses. +/// * `default_port` - The default port the game uses. +/// +/// ```rust,ignore +/// use crate::protocols::valve::game_query_fn; +/// game_query_fn!(TEAMFORTRESS2, 27015); +/// ``` +macro_rules! game_query_fn { + ($steam_app: ident, $default_port: literal) => { + crate::protocols::valve::game_query_fn!{@gen $steam_app, $default_port, concat!( + "Make a valve query for ", stringify!($steam_app), " with default timeout settings and default extra request settings.\n\n", + "If port is `None`, then the default port (", stringify!($default_port), ") will be used.")} + }; + + (@gen $steam_app: ident, $default_port: literal, $doc: expr) => { + #[doc = $doc] + pub fn query(address: &std::net::IpAddr, port: Option) -> crate::GDResult { + let valve_response = crate::protocols::valve::query( + &std::net::SocketAddr::new(*address, port.unwrap_or($default_port)), + crate::protocols::valve::SteamApp::$steam_app.as_engine(), + None, + None, + )?; + + Ok(crate::protocols::valve::game::Response::new_from_valve_response(valve_response)) + } + }; +} + +pub(crate) use game_query_fn;