feat: Add GatheringSettings on Valve macros (#128)

* Initial macro modification for gathering settings

* Initial Valheim support

* Remove unused use

* Fix macro

Thanks bunch @Douile

* docs: Add Valheim to CHANGELOG and GAMES

* Add commentary regarding gathering settings comment generation

* Add GatheringSettings to game!

* Remove unused stuff

* Fix tests and add comment regarding the game argument
This commit is contained in:
CosminPerRam 2023-10-19 23:15:10 +03:00 committed by GitHub
parent 1ca6e6e85c
commit 501524b0da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 89 additions and 21 deletions

View file

@ -10,14 +10,25 @@ use crate::protocols::{
use crate::Game;
use crate::protocols::types::ProprietaryProtocol;
use crate::protocols::valve::GatheringSettings;
use phf::{phf_map, Map};
macro_rules! game {
($name: literal, $default_port: literal, $protocol: expr) => {
game!(
$name,
$default_port,
$protocol,
GatheringSettings::default().into_extra()
)
};
($name: literal, $default_port: literal, $protocol: expr, $extra_request_settings: expr) => {
Game {
name: $name,
default_port: $default_port,
protocol: $protocol,
request_settings: $extra_request_settings,
}
};
}
@ -86,6 +97,11 @@ pub static GAMES: Map<&'static str, Game> = phf_map! {
"theship" => game!("The Ship", 27015, Protocol::PROPRIETARY(ProprietaryProtocol::TheShip)),
"unturned" => game!("Unturned", 27015, Protocol::Valve(SteamApp::UNTURNED)),
"unrealtournament" => game!("Unreal Tournament", 7778, Protocol::Gamespy(GameSpyVersion::One)),
"valheim" => game!("Valheim", 2457, Protocol::Valve(SteamApp::VALHEIM), GatheringSettings {
players: true,
rules: false,
check_app_id: true,
}.into_extra()),
"vrising" => game!("V Rising", 27016, Protocol::Valve(SteamApp::VRISING)),
"jc2m" => game!("Just Cause 2: Multiplayer", 7777, Protocol::PROPRIETARY(ProprietaryProtocol::JC2M)),
"warsow" => game!("Warsow", 44400, Protocol::Quake(QuakeVersion::Three)),

View file

@ -39,6 +39,8 @@ pub struct Game {
pub default_port: u16,
/// The protocol the game's query uses
pub protocol: Protocol,
/// Request settings.
pub request_settings: ExtraRequestSettings,
}
#[cfg(feature = "game_defs")]
@ -78,7 +80,9 @@ pub fn query_with_timeout_and_extra_settings(
protocols::valve::query(
&socket_addr,
steam_app.as_engine(),
extra_settings.map(ExtraRequestSettings::into),
extra_settings
.or(Option::from(game.request_settings.clone()))
.map(ExtraRequestSettings::into),
timeout_settings,
)
.map(Box::new)?

View file

@ -53,4 +53,15 @@ 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!(
valheim,
"Valheim",
VALHEIM,
2457,
GatheringSettings {
players: true,
rules: false,
check_app_id: true,
}
);
game_query_mod!(vrising, "V Rising", VRISING, 27016);

View file

@ -15,9 +15,21 @@ pub use types::*;
/// * `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) => {
crate::protocols::valve::game_query_mod!(
$mod_name,
$pretty_name,
$steam_app,
$default_port,
GatheringSettings::default()
);
};
($mod_name: ident, $pretty_name: expr, $steam_app: ident, $default_port: literal, $gathering_settings: expr) => {
#[doc = $pretty_name]
pub mod $mod_name {
crate::protocols::valve::game_query_fn!($steam_app, $default_port);
use crate::protocols::valve::GatheringSettings;
crate::protocols::valve::game_query_fn!($steam_app, $default_port, $gathering_settings);
}
};
}
@ -36,19 +48,20 @@ pub(crate) use game_query_mod;
/// game_query_fn!(TEAMFORTRESS2, 27015);
/// ```
macro_rules! game_query_fn {
($steam_app: ident, $default_port: literal) => {
($steam_app: ident, $default_port: literal, $gathering_settings: expr) => {
// TODO: By using $gathering_settings, also add to doc if a game doesnt respond to certain gathering settings
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.")}
"If port is `None`, then the default port (", stringify!($default_port), ") will be used."), $gathering_settings}
};
(@gen $steam_app: ident, $default_port: literal, $doc: expr) => {
(@gen $steam_app: ident, $default_port: literal, $doc: expr, $gathering_settings: expr) => {
#[doc = $doc]
pub fn query(address: &std::net::IpAddr, port: Option<u16>) -> crate::GDResult<crate::protocols::valve::game::Response> {
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,
Some($gathering_settings),
None,
)?;

View file

@ -341,6 +341,8 @@ pub enum SteamApp {
HLL,
/// Barotrauma
BAROTRAUMA,
/// Valheim
VALHEIM,
}
impl SteamApp {
@ -383,6 +385,7 @@ impl SteamApp {
Self::BAROTRAUMA => Engine::new_source(602960),
Self::ROR2 => Engine::new_source(632_360),
Self::OHD => Engine::new_source_with_dedicated(736_590, 950_900),
Self::VALHEIM => Engine::new_source(892_970),
Self::ONSET => Engine::new_source(1_105_810),
Self::VRISING => Engine::new_source(1_604_030),
Self::HLL => Engine::new_source(686_810),
@ -422,15 +425,29 @@ pub struct GatheringSettings {
pub check_app_id: bool,
}
impl Default for GatheringSettings {
impl GatheringSettings {
/// Default values are true for both the players and the rules.
fn default() -> Self {
pub const fn default() -> Self {
Self {
players: true,
rules: true,
check_app_id: true,
}
}
pub const fn into_extra(self) -> ExtraRequestSettings {
ExtraRequestSettings {
hostname: None,
protocol_version: None,
gather_players: Some(self.players),
gather_rules: Some(self.rules),
check_app_id: Some(self.check_app_id),
}
}
}
impl Default for GatheringSettings {
fn default() -> Self { GatheringSettings::default() }
}
impl From<ExtraRequestSettings> for GatheringSettings {