Skip to content

Commit

Permalink
Refactor players, teams.
Browse files Browse the repository at this point in the history
  • Loading branch information
vikpe committed Jun 9, 2024
1 parent d3084b0 commit b02773c
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 32 deletions.
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ categories = ["parsing"]
keywords = ["demos", "mvd", "parser", "quake", "quakeworld"]
repository = "https://github.com/vikpe/mvdparser"
authors = ["Viktor Persson <viktor.persson@arcsin.se>"]
version = "0.13.0"
version = "0.13.1"
edition = "2021"
license = "MIT"
include = [
Expand Down
66 changes: 35 additions & 31 deletions src/players.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::collections::HashMap;

use anyhow::Result;
use ktxstats::v3::KtxstatsV3;

use crate::clients::clients;
use crate::frags::frags_per_player_name;
Expand All @@ -10,11 +11,14 @@ use crate::player;
use crate::player::Player;

pub fn players(data: &[u8]) -> Result<Vec<Player>> {
players_from_ktxstats(data).or_else(|_| players_from_parsing(data))
if let Ok(stats) = ktxstats_v3(data) {
players_from_ktxstats(&stats)
} else {
players_from_parsing(data)
}
}

pub fn players_from_ktxstats(data: &[u8]) -> Result<Vec<Player>> {
let stats = ktxstats_v3(data)?;
pub fn players_from_ktxstats(stats: &KtxstatsV3) -> Result<Vec<Player>> {
let mut players: Vec<Player> = stats.players.iter().map(Player::from).collect();
players.sort_by(player::sort());
Ok(players)
Expand Down Expand Up @@ -57,46 +61,46 @@ mod tests {
{
let demo_data = read("tests/files/duel_equ_vs_kaboom[povdmm4]20240422-1038.mvd")?;
let from_parsing = players_from_parsing(&demo_data)?;
let from_ktx = players_from_ktxstats(&demo_data)?;
let from_ktxstats = players_from_ktxstats(&ktxstats_v3(&demo_data)?)?;

assert_eq!(from_parsing.len(), from_ktx.len());
assert_eq!(from_parsing.len(), from_ktxstats.len());
for n in 0..from_parsing.len() {
assert_eq!(from_parsing[n].frags, from_ktx[n].frags);
assert_eq!(from_parsing[n].name, from_ktx[n].name);
assert_eq!(from_parsing[n].team, from_ktx[n].team);
assert_eq!(from_parsing[n].color, from_ktx[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktx[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktx[n].is_bot);
assert_eq!(from_parsing[n].frags, from_ktxstats[n].frags);
assert_eq!(from_parsing[n].name, from_ktxstats[n].name);
assert_eq!(from_parsing[n].team, from_ktxstats[n].team);
assert_eq!(from_parsing[n].color, from_ktxstats[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktxstats[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktxstats[n].is_bot);
}
}
{
let demo_data = read("tests/files/4on4_oeks_vs_tsq[dm2]20240426-1716.mvd")?;
let from_parsing = players_from_parsing(&demo_data)?;
let from_ktx = players_from_ktxstats(&demo_data)?;
let from_ktxstats = players_from_ktxstats(&ktxstats_v3(&demo_data)?)?;

assert_eq!(from_parsing.len(), from_ktx.len());
assert_eq!(from_parsing.len(), from_ktxstats.len());
for n in 0..from_parsing.len() {
assert_eq!(from_parsing[n].frags, from_ktx[n].frags);
assert_eq!(from_parsing[n].name, from_ktx[n].name);
assert_eq!(from_parsing[n].team, from_ktx[n].team);
assert_eq!(from_parsing[n].color, from_ktx[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktx[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktx[n].is_bot);
assert_eq!(from_parsing[n].frags, from_ktxstats[n].frags);
assert_eq!(from_parsing[n].name, from_ktxstats[n].name);
assert_eq!(from_parsing[n].team, from_ktxstats[n].team);
assert_eq!(from_parsing[n].color, from_ktxstats[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktxstats[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktxstats[n].is_bot);
}
}
{
let demo_data = read("tests/files/ffa_5[dm4]20240501-1229.mvd")?;
let from_parsing = players_from_parsing(&demo_data)?;
let from_ktx = players_from_ktxstats(&demo_data)?;
let from_ktxstats = players_from_ktxstats(&ktxstats_v3(&demo_data)?)?;

assert_eq!(from_parsing.len(), from_ktx.len());
assert_eq!(from_parsing.len(), from_ktxstats.len());
for n in 0..from_parsing.len() {
assert_eq!(from_parsing[n].frags, from_ktx[n].frags);
assert_eq!(from_parsing[n].name, from_ktx[n].name);
assert_eq!(from_parsing[n].team, from_ktx[n].team);
assert_eq!(from_parsing[n].color, from_ktx[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktx[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktx[n].is_bot);
assert_eq!(from_parsing[n].frags, from_ktxstats[n].frags);
assert_eq!(from_parsing[n].name, from_ktxstats[n].name);
assert_eq!(from_parsing[n].team, from_ktxstats[n].team);
assert_eq!(from_parsing[n].color, from_ktxstats[n].color);
assert!(from_parsing[n].ping.abs_diff(from_ktxstats[n].ping) < 5);
assert_eq!(from_parsing[n].is_bot, from_ktxstats[n].is_bot);
}
}

Expand Down Expand Up @@ -320,9 +324,9 @@ mod tests {
#[test]
fn test_players_from_ktxstats() -> Result<()> {
{
let demo_data = read("tests/files/duel_equ_vs_kaboom[povdmm4]20240422-1038.mvd");
let demo_data = read("tests/files/duel_equ_vs_kaboom[povdmm4]20240422-1038.mvd")?;
assert_eq!(
players_from_ktxstats(&demo_data?)?,
players_from_ktxstats(&ktxstats_v3(&demo_data)?)?,
vec![
Player {
name: "KabÏÏm".to_string(),
Expand All @@ -344,9 +348,9 @@ mod tests {
);
}
{
let demo_data = read("tests/files/ctf_blue_vs_red[ctf5]20240520-1925.mvd");
let demo_data = read("tests/files/ctf_blue_vs_red[ctf5]20240520-1925.mvd")?;
assert_eq!(
players_from_ktxstats(&demo_data?)?,
players_from_ktxstats(&ktxstats_v3(&demo_data)?)?,
vec![
Player {
name: "ì÷ú\u{ad}velocity".to_string(),
Expand Down
21 changes: 21 additions & 0 deletions src/teams.rs
Original file line number Diff line number Diff line change
@@ -1,19 +1,26 @@
use anyhow::Result;
use ktxstats::v3::KtxstatsV3;

use crate::players;
use crate::players::players_from_ktxstats;
use crate::team::{teams_from_players, Team};

pub fn teams(data: &[u8]) -> Result<Vec<Team>> {
Ok(teams_from_players(&players(data)?))
}

pub fn teams_from_ktxstats(stats: &KtxstatsV3) -> Result<Vec<Team>> {
Ok(teams_from_players(&players_from_ktxstats(stats)?))
}

#[cfg(test)]
mod tests {
use std::fs::read;

use anyhow::Result;
use pretty_assertions::assert_eq;

use crate::ktxstats_v3;
use crate::player::Player;

use super::*;
Expand Down Expand Up @@ -111,4 +118,18 @@ mod tests {

Ok(())
}

#[test]
fn test_teams_from_ktxstats() -> Result<()> {
{
let demo_data = read("tests/files/4on4_oeks_vs_tsq[dm2]20240426-1716.mvd")?;

assert_eq!(
teams(&demo_data)?,
teams_from_ktxstats(&ktxstats_v3(&demo_data)?)?
);
}

Ok(())
}
}

0 comments on commit b02773c

Please sign in to comment.