From a377b76a55b4116a70224da805a0d2b1add6c7c4 Mon Sep 17 00:00:00 2001 From: CosminPerRam Date: Tue, 13 Jun 2023 22:09:51 +0300 Subject: [PATCH] [Games] Generic query add support for GS2 protocol and Halo:CE game --- src/games/definitions.rs | 1 + src/games/mod.rs | 1 + src/protocols/gamespy/mod.rs | 6 ++-- src/protocols/gamespy/protocols/two/types.rs | 35 ++++++++++++++++++++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/games/definitions.rs b/src/games/definitions.rs index 1c199f1..d16ab25 100644 --- a/src/games/definitions.rs +++ b/src/games/definitions.rs @@ -54,6 +54,7 @@ pub static GAMES: Map<&'static str, Game> = phf_map! { "ffow" => game!("Frontlines: Fuel of War", 5478, Protocol::FFOW), "gm" => game!("Garry's Mod", 27016, Protocol::Valve(SteamApp::GM)), "hl2dm" => game!("Half-Life 2 Deathmatch", 27015, Protocol::Valve(SteamApp::HL2DM)), + "haloce" => game!("Halo: Combat Evolved", 2302, Protocol::Gamespy(GameSpyVersion::Two)), "hldms" => game!("Half-Life Deathmatch: Source", 27015, Protocol::Valve(SteamApp::HLDMS)), "hll" => game!("Hell Let Loose", 26420, Protocol::Valve(SteamApp::HLL)), "ins" => game!("Insurgency", 27015, Protocol::Valve(SteamApp::INS)), diff --git a/src/games/mod.rs b/src/games/mod.rs index fa68e5e..df0228e 100644 --- a/src/games/mod.rs +++ b/src/games/mod.rs @@ -153,6 +153,7 @@ pub fn query(game: &Game, address: &IpAddr, port: Option) -> GDResult { match version { GameSpyVersion::One => protocols::gamespy::one::query(&socket_addr, None).map(|r| r.into())?, + GameSpyVersion::Two => protocols::gamespy::two::query(&socket_addr, None).map(|r| r.into())?, GameSpyVersion::Three => protocols::gamespy::three::query(&socket_addr, None).map(|r| r.into())?, } } diff --git a/src/protocols/gamespy/mod.rs b/src/protocols/gamespy/mod.rs index be8e952..0db17f3 100644 --- a/src/protocols/gamespy/mod.rs +++ b/src/protocols/gamespy/mod.rs @@ -11,12 +11,14 @@ pub use protocols::*; #[derive(Debug, Clone, PartialEq)] pub enum GameSpyVersion { One, + Two, Three, } #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Clone, PartialEq)] pub enum VersionedExtraResponse { - One(protocols::one::ExtraResponse), - Three(protocols::three::ExtraResponse), + One(one::ExtraResponse), + Two(two::ExtraResponse), + Three(three::ExtraResponse), } diff --git a/src/protocols/gamespy/protocols/two/types.rs b/src/protocols/gamespy/protocols/two/types.rs index 086204c..e488bcb 100644 --- a/src/protocols/gamespy/protocols/two/types.rs +++ b/src/protocols/gamespy/protocols/two/types.rs @@ -1,5 +1,8 @@ use std::collections::HashMap; +use crate::protocols::gamespy::VersionedExtraResponse; +use crate::protocols::types::SpecificResponse; +use crate::protocols::GenericResponse; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; @@ -32,3 +35,35 @@ pub struct Response { pub players: Vec, pub unused_entries: HashMap, } + +/// Non-generic query response +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct ExtraResponse { + pub teams: Vec, + pub players_minimum: Option, + pub unused_entries: HashMap, + pub players: Vec, +} + +impl From for GenericResponse { + fn from(r: Response) -> Self { + Self { + name: Some(r.name), + description: None, + game: None, + game_version: None, + map: Some(r.map), + players_maximum: r.players_maximum.try_into().unwrap(), // FIXME: usize to u64 may fail + players_online: r.players_online.try_into().unwrap(), + players_bots: None, + has_password: Some(r.has_password), + inner: SpecificResponse::Gamespy(VersionedExtraResponse::Two(ExtraResponse { + teams: r.teams, + players_minimum: r.players_minimum, + unused_entries: r.unused_entries, + players: r.players, + })), + } + } +}