Skip to content

Commit eb65787

Browse files
committed
GameServer: add total_spectator_count (connected spectators + qtv
clients)
1 parent daffea4 commit eb65787

2 files changed

Lines changed: 18 additions & 11 deletions

File tree

src/game_server/score.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,17 +51,11 @@ struct Params {
5151

5252
impl Params {
5353
pub fn from_game_server(server: &GameServer) -> Self {
54-
let spectator_count = {
55-
let qtv_spectator_count =
56-
server.qtv_stream().map_or(0, |q| q.client_names().len()) as u32;
57-
server.spectators().len() as u32 + qtv_spectator_count
58-
};
59-
6054
Self {
6155
player_count: server.players().iter().filter(|p| !p.is_bot()).count() as u32,
6256
player_limit: server.settings().maxclients.unwrap_or(8) as u32,
6357
deathmatch: server.settings().deathmatch,
64-
spectator_count,
58+
spectator_count: server.total_spectator_count(),
6559
}
6660
}
6761
}

src/game_server/server.rs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ impl GameServer {
5959
&self.spectators
6060
}
6161

62+
pub fn total_spectator_count(&self) -> u32 {
63+
let qtv_spec_count = self.qtv_stream().map_or(0, |q| q.client_names().len());
64+
(self.spectators().len() + qtv_spec_count) as u32
65+
}
66+
6267
pub fn qtv_stream(&self) -> Option<&QtvStream> {
6368
self.qtv_stream.as_ref()
6469
}
@@ -123,7 +128,7 @@ impl serde::Serialize for GameServer {
123128
where
124129
S: serde::Serializer,
125130
{
126-
let mut state = serializer.serialize_struct("GameServer", 14)?;
131+
let mut state = serializer.serialize_struct("GameServer", 15)?;
127132
state.serialize_field("server_type", &self.server_type())?;
128133
state.serialize_field("software_type", &self.software_type())?;
129134
state.serialize_field("address", &self.address())?;
@@ -145,6 +150,7 @@ impl serde::Serialize for GameServer {
145150
state.serialize_field("teams", self.teams())?;
146151
state.serialize_field("players", self.players())?;
147152
state.serialize_field("spectators", self.spectators())?;
153+
state.serialize_field("total_spectator_count", &self.total_spectator_count())?;
148154
state.serialize_field("qtv_stream", &self.qtv_stream())?;
149155
state.serialize_field("geo", self.geo())?;
150156

@@ -213,7 +219,13 @@ mod tests {
213219
..Default::default()
214220
},
215221
],
216-
qtv_stream: None,
222+
qtv_stream: Some(QtvStream {
223+
id: 1,
224+
name: "Local QTV".to_string(),
225+
number: Some(1),
226+
address: Some("10.10.10.10:28000".to_string()),
227+
client_names: vec!["hub".to_string()],
228+
}),
217229
geo: GeoInfo {
218230
country_code: Some("US".to_string()),
219231
country_name: Some("United States".to_string()),
@@ -234,7 +246,8 @@ mod tests {
234246
assert_eq!(server.players()[0].name(), "vikpe".to_string()); // ordered by team name, then player name
235247
assert_eq!(server.spectators().len(), 3);
236248
assert_eq!(server.spectators()[0].name(), "[ServeMe]".to_string()); // ordered by name
237-
assert_eq!(server.qtv_stream(), None);
249+
assert_eq!(server.total_spectator_count(), 4);
250+
assert_eq!(server.qtv_stream(), generic.qtv_stream());
238251
assert_eq!(server.geo(), generic.geo());
239252

240253
// standby (no teamplay) - players ordered by name
@@ -366,7 +379,7 @@ mod tests {
366379
},
367380
};
368381

369-
let server_json = r#"{"server_type":"game_server","software_type":"mvdsv","address":"10.10.10.10:28000","ip":"10.10.10.10","port":28000,"settings":{"admin":null,"broadcast":null,"city":null,"coords":null,"countrycode":null,"deathmatch":null,"epoch":null,"fpd":null,"fraglimit":null,"gamedir":null,"hostname":null,"hostport":null,"ktxmode":null,"ktxver":null,"map":null,"matchtag":null,"maxclients":8,"maxfps":null,"maxspectators":4,"mode":null,"needpass":null,"pm_ktjump":null,"progs":null,"qvm":null,"serverdemo":null,"status":null,"sv_antilag":null,"teamplay":null,"timelimit":null,"version":null,"z_ext":null},"client_count":0,"client_limit":12,"teams":[],"players":[],"spectators":[],"qtv_stream":null,"geo":{"country_code":"US","country_name":"United States","city":"New York","region":"North America","coords":{"lat":40.7128,"lng":-74.006}},"score":0}"#;
382+
let server_json = r#"{"server_type":"game_server","software_type":"mvdsv","address":"10.10.10.10:28000","ip":"10.10.10.10","port":28000,"settings":{"admin":null,"broadcast":null,"city":null,"coords":null,"countrycode":null,"deathmatch":null,"epoch":null,"fpd":null,"fraglimit":null,"gamedir":null,"hostname":null,"hostport":null,"ktxmode":null,"ktxver":null,"map":null,"matchtag":null,"maxclients":8,"maxfps":null,"maxspectators":4,"mode":null,"needpass":null,"pm_ktjump":null,"progs":null,"qvm":null,"serverdemo":null,"status":null,"sv_antilag":null,"teamplay":null,"timelimit":null,"version":null,"z_ext":null},"client_count":0,"client_limit":12,"teams":[],"players":[],"spectators":[],"total_spectator_count":0,"qtv_stream":null,"geo":{"country_code":"US","country_name":"United States","city":"New York","region":"North America","coords":{"lat":40.7128,"lng":-74.006}},"score":0}"#;
370383

371384
// ensure round-trip serialization
372385
assert_eq!(serde_json::to_string(&server)?, server_json);

0 commit comments

Comments
 (0)