mirror of
https://github.com/tribufu/rust-gamedig
synced 2026-06-01 09:42:41 +00:00
Simplified Valve ServerRules and ServerPlayers
This commit is contained in:
parent
00ead6d946
commit
3c6cbda0f5
1 changed files with 19 additions and 31 deletions
|
|
@ -1,4 +1,3 @@
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
use crate::errors::GDError;
|
use crate::errors::GDError;
|
||||||
use crate::utils::{buffer, complete_address, concat_u8_arrays};
|
use crate::utils::{buffer, complete_address, concat_u8_arrays};
|
||||||
|
|
@ -23,8 +22,8 @@ pub enum Environment {
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Response {
|
pub struct Response {
|
||||||
pub info: ServerInfo,
|
pub info: ServerInfo,
|
||||||
pub players: Option<ServerPlayers>,
|
pub players: Option<Vec<ServerPlayer>>,
|
||||||
pub rules: Option<ServerRules>
|
pub rules: Option<Vec<ServerRule>>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// General server information's.
|
/// General server information's.
|
||||||
|
|
@ -64,16 +63,9 @@ pub struct ServerInfo {
|
||||||
pub extra_data: Option<ExtraData>
|
pub extra_data: Option<ExtraData>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Server's players.
|
/// A server player.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ServerPlayers {
|
pub struct ServerPlayer {
|
||||||
pub count: u8,
|
|
||||||
pub players: Vec<Player>
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Data about a player
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub struct Player {
|
|
||||||
/// Player's name.
|
/// Player's name.
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// General score.
|
/// General score.
|
||||||
|
|
@ -86,11 +78,11 @@ pub struct Player {
|
||||||
pub money: Option<u32>, //the_ship
|
pub money: Option<u32>, //the_ship
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Server's rules.
|
/// A server rule.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ServerRules {
|
pub struct ServerRule {
|
||||||
pub count: u16,
|
pub name: String,
|
||||||
pub map: HashMap<String, String>
|
pub value: String
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Only present for [the ship](https://developer.valvesoftware.com/wiki/The_Ship).
|
/// Only present for [the ship](https://developer.valvesoftware.com/wiki/The_Ship).
|
||||||
|
|
@ -305,16 +297,16 @@ impl ValveProtocol {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the server player's.
|
/// Get the server player's.
|
||||||
pub fn get_server_players(&self, app: &App) -> Result<ServerPlayers, GDError> {
|
pub fn get_server_players(&self, app: &App) -> Result<Vec<ServerPlayer>, GDError> {
|
||||||
let buf = self.get_request_data(app, Request::PLAYERS)?;
|
let buf = self.get_request_data(app, Request::PLAYERS)?;
|
||||||
let mut pos = 0;
|
let mut pos = 0;
|
||||||
|
|
||||||
let count = buffer::get_u8(&buf, &mut pos)?;
|
let count = buffer::get_u8(&buf, &mut pos)?;
|
||||||
let mut players: Vec<Player> = Vec::new();
|
let mut players: Vec<ServerPlayer> = Vec::new();
|
||||||
|
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
pos += 1; //skip the index byte
|
pos += 1; //skip the index byte
|
||||||
players.push(Player {
|
players.push(ServerPlayer {
|
||||||
name: buffer::get_string(&buf, &mut pos)?,
|
name: buffer::get_string(&buf, &mut pos)?,
|
||||||
score: buffer::get_u32_le(&buf, &mut pos)?,
|
score: buffer::get_u32_le(&buf, &mut pos)?,
|
||||||
duration: buffer::get_f32_le(&buf, &mut pos)?,
|
duration: buffer::get_f32_le(&buf, &mut pos)?,
|
||||||
|
|
@ -329,14 +321,11 @@ impl ValveProtocol {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ServerPlayers {
|
Ok(players)
|
||||||
count,
|
|
||||||
players
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the server rules's.
|
/// Get the server rules's.
|
||||||
pub fn get_server_rules(&self, app: &App) -> Result<Option<ServerRules>, GDError> {
|
pub fn get_server_rules(&self, app: &App) -> Result<Option<Vec<ServerRule>>, GDError> {
|
||||||
if *app == App::CSGO { //cause csgo response here is broken after feb 21 2014
|
if *app == App::CSGO { //cause csgo response here is broken after feb 21 2014
|
||||||
return Ok(None);
|
return Ok(None);
|
||||||
}
|
}
|
||||||
|
|
@ -345,17 +334,16 @@ impl ValveProtocol {
|
||||||
let mut pos = 0;
|
let mut pos = 0;
|
||||||
|
|
||||||
let count = buffer::get_u16_le(&buf, &mut pos)?;
|
let count = buffer::get_u16_le(&buf, &mut pos)?;
|
||||||
let mut rules: HashMap<String, String> = HashMap::new();
|
let mut rules: Vec<ServerRule> = Vec::new();
|
||||||
|
|
||||||
for _ in 0..count {
|
for _ in 0..count {
|
||||||
rules.insert(buffer::get_string(&buf, &mut pos)?, //name
|
rules.push(ServerRule {
|
||||||
buffer::get_string(&buf, &mut pos)?); //value
|
name: buffer::get_string(&buf, &mut pos)?,
|
||||||
|
value: buffer::get_string(&buf, &mut pos)?
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Some(ServerRules {
|
Ok(Some(rules))
|
||||||
count,
|
|
||||||
map: rules
|
|
||||||
}))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn query(app: App, address: &str, port: u16, gather: GatheringSettings) -> Result<Response, GDError> {
|
pub(crate) fn query(app: App, address: &str, port: u16, gather: GatheringSettings) -> Result<Response, GDError> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue