No description
Find a file
Tom c3281be419
[Protocol] Retry failed requests (#95)
* Add retry count to TimeoutSettings

This can be used to specify how many times to re-send requests that
fail. The default value is "1" so the if the first request fails, 1 more
attempt will be made.

* Add retries to valve queries

* [Protocol] &Optional<TimeoutSettings> add get_retries_or_default

Allow fetching the number of retries or the default retries value from a
borrowed optional TimeoutSettings.

* [Protocol] Add retries to minecraft protocol

* [Protocol] Add retries to quake

* [Protocol] Add retries to gamespy

* [Protocol] Update TimeoutSettings docs, and change default retries to 0

* Remove logging from retry_on_timeout

* [Protocol] TimeoutSettings make retries non-optional

* [Protocol] Move retry logic into lower level query functions

Retries are now implemented as wrappers on the single function that
would need to be retried on timeout.

In order to avoid cloning of TimeoutSettings, Socket::apply_timeouts()
was changed to accept a borrowed TimeoutSettings. And extra helpers were
added to the TimeoutSettings impl to reduce repetition.

* [Examples] Add retries to the generic example

* Also retry on PacketSend error

Sending packets could also timeout and until error_generic_member_access
is stable we have no way of determining the type of the underlying
`std::error::Error`.

* Add retry unit tests

* [Docs] Update changelog
2023-09-25 22:12:54 +03:00
.github Add/Update badge 2023-09-22 21:20:17 +00:00
examples [Protocol] Retry failed requests (#95) 2023-09-25 22:12:54 +03:00
src [Protocol] Retry failed requests (#95) 2023-09-25 22:12:54 +03:00
.actrc [CI] Improve checks (#71) 2023-07-12 23:40:10 +03:00
.gitignore [Crate] Add formatting (#22) 2023-03-14 10:31:37 +02:00
.pre-commit-config.yaml [Generic] Add struct for all extra request settings (#93) 2023-09-05 01:13:12 +03:00
.rustfmt.toml [Crate] Bump rustfmt version to 1.6.0 (#69) 2023-07-10 18:32:17 +03:00
Cargo.toml [Crate] Remove license-file field due to cargo warning that only one is needed. 2023-09-21 23:18:25 +03:00
CHANGELOG.md [Protocol] Retry failed requests (#95) 2023-09-25 22:12:54 +03:00
GAMES.md [Games] Update game definitions to match node-gamedig names (#100) 2023-09-23 00:20:01 +03:00
LICENSE.md [Crate] Update LICENSE.md to specify GameDig organization 2023-08-23 21:24:25 +03:00
PROTOCOLS.md [Protocol] Add GameSpy 2 support. (#47) 2023-06-12 19:38:34 +03:00
README.md [CI] Add node comparison badge (#99) 2023-09-21 23:51:10 +03:00
RESPONSES.md [Protocol] Standardize fields (#84) 2023-08-15 20:44:18 +03:00
SERVICES.md [Service] Add valve master server query service (#34) 2023-04-28 18:00:04 +03:00
VERSIONS.md [Crate] Add rich error type (#80) 2023-08-05 12:36:48 +03:00

rust-GameDig CI Latest Version Crates.io License:MIT node coverage

Warning: This project goes through frequent API breaking changes and hasn't been thoroughly tested.

rust-GameDig is a game servers/services query library that fetches the availability and details of those, this library brings what node-GameDig does, to pure Rust!

Community

Checkout the GameDig Community Discord Server here.
Note that it isn't be a replacement for GitHub issues, if you have found a problem within the library or want to request a feature, it's better to do so here rather than on Discord.

Usage

Minimum Supported Rust Version is 1.65.0 and the code is cross-platform.

Pick a game/service/protocol (check the GAMES, SERVICES and PROTOCOLS files to see the currently supported ones), provide the ip and the port (be aware that some game servers use a separate port for the info queries, the port can also be optional if the server is running the default ports) then query on it.

Team Fortress 2 query example:

use gamedig::games::tf2;

fn main() {
    let response = tf2::query(&"127.0.0.1".parse().unwrap(), None); 
        // None is the default port (which is 27015), could also be Some(27015)
    
    match response { // Result type, must check what it is...
        Err(error) => println!("Couldn't query, error: {}", error),
        Ok(r) => println!("{:#?}", r)
    }
}

Response (note that some games have a different structure):

{
  protocol: 17,
  name: "Team Fortress 2 Dedicated Server.",
  map: "ctf_turbine",
  game: "tf2",
  appid: 440,
  players_online: 0,
  players_details: [],
  players_maximum: 69,
  players_bots: 0,
  server_type: Dedicated,
  has_password: false,
  vac_secured: true,
  version: "7638371",
  port: Some(27015),
  steam_id: Some(69753253289735296),
  tv_port: None,
  tv_name: None,
  keywords: Some("alltalk,nocrits"),
  rules: [
    "mp_autoteambalance": "1",
    "mp_maxrounds": "5",
    //....
  ]
}

Want to see more examples? Checkout the examples folder.

Documentation

The documentation is available at docs.rs.
Curious about the history and what changed between versions? Everything is in the CHANGELOG file.

Contributing

If you want see your favorite game/service being supported here, open an issue, and I'll prioritize it (or do a pull request if you want to implement it yourself)!