Compare commits

..
8 changed files with 77 additions and 24 deletions

No files matched your search

+6
View File
@@ -49,3 +49,9 @@ jobs:
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
args: --all-targets --all-features --tests -- -D warnings args: --all-targets --all-features --tests -- -D warnings
- name: Publish the crates (dry run)
run: |
cargo publish --allow-dirty --dry-run
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
-1
View File
@@ -45,7 +45,6 @@ jobs:
- name: Publish the crates - name: Publish the crates
run: | run: |
cargo login
cargo publish --allow-dirty cargo publish --allow-dirty
env: env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
+2 -3
View File
@@ -4,7 +4,7 @@ World of Tanks Blitz replay parser in Rust.
[![Crates.io](https://img.shields.io/crates/v/wotbreplay-parser)](https://crates.io/crates/wotbreplay-parser) [![Crates.io](https://img.shields.io/crates/v/wotbreplay-parser)](https://crates.io/crates/wotbreplay-parser)
[![Last commit](https://img.shields.io/github/last-commit/eigenein/wotbreplay-parser)](https://github.com/eigenein/wotbreplay-parser/commits/main) [![Last commit](https://img.shields.io/github/last-commit/eigenein/wotbreplay-parser)](https://github.com/eigenein/wotbreplay-parser/commits/main)
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/eigenein/wotbreplay-parser/Check)](https://github.com/eigenein/wotbreplay-parser/actions) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/eigenein/wotbreplay-parser/check.yaml)](https://github.com/eigenein/wotbreplay-parser/actions)
![License: MIT](https://img.shields.io/crates/l/wotbreplay-parser) ![License: MIT](https://img.shields.io/crates/l/wotbreplay-parser)
[![docs.rs](https://img.shields.io/docsrs/wotbreplay-parser)](https://docs.rs/wotbreplay-parser) [![docs.rs](https://img.shields.io/docsrs/wotbreplay-parser)](https://docs.rs/wotbreplay-parser)
@@ -14,8 +14,7 @@ World of Tanks Blitz replay parser in Rust.
use std::fs::File; use std::fs::File;
use anyhow::Result; use anyhow::Result;
use wotbreplay_parser::Replay; use wotbreplay_parser::prelude::*;
use wotbreplay_parser::models::TeamNumber;
fn main() -> Result<()> { fn main() -> Result<()> {
let battle_results = Replay::open(File::open("tests/replays/battle_results.wotbreplay")?)? let battle_results = Replay::open(File::open("tests/replays/battle_results.wotbreplay")?)?
+8 -10
View File
@@ -2,23 +2,21 @@
#![warn( #![warn(
clippy::all, clippy::all,
clippy::missing_const_for_fn,
clippy::trivially_copy_pass_by_ref,
clippy::map_unwrap_or,
clippy::explicit_into_iter_loop, clippy::explicit_into_iter_loop,
clippy::unused_self, clippy::manual_let_else,
clippy::needless_pass_by_value clippy::map_unwrap_or,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value,
clippy::trivially_copy_pass_by_ref,
clippy::unused_self
)] )]
mod error; mod error;
pub mod models; mod models;
pub mod prelude;
mod replay; mod replay;
mod result; mod result;
pub use crate::error::Error;
pub use crate::replay::Replay;
pub use crate::result::Result;
#[cfg(doctest)] #[cfg(doctest)]
mod test_readme { mod test_readme {
macro_rules! external_doc_test { macro_rules! external_doc_test {
+30 -3
View File
@@ -9,7 +9,7 @@ impl BattleResults {
/// Parse battle results from the buffer. /// Parse battle results from the buffer.
/// ///
/// Note, that this does NOT parse `battle_results.dat` itself, but the un-pickled tuple element. /// Note, that this does NOT parse `battle_results.dat` itself, but the un-pickled tuple element.
pub fn parse(buffer: impl Buf) -> Result<Self> { pub fn from_buffer(buffer: impl Buf) -> Result<Self> {
Self::decode(buffer).map_err(Error::DecodeFailed) Self::decode(buffer).map_err(Error::DecodeFailed)
} }
} }
@@ -26,7 +26,7 @@ pub struct BattleResults {
/// Replay's author results. /// Replay's author results.
#[prost(message, required, tag = "8")] #[prost(message, required, tag = "8")]
pub author_results: AuthorResults, pub author: Author,
/// Author's free XP, including premium. /// Author's free XP, including premium.
#[prost(uint32, tag = "137")] #[prost(uint32, tag = "137")]
@@ -72,6 +72,9 @@ pub struct PlayerInfo {
#[prost(string, optional, tag = "5")] #[prost(string, optional, tag = "5")]
pub clan_tag: Option<String>, pub clan_tag: Option<String>,
#[prost(message, required, tag = "7")]
pub avatar: Avatar,
} }
#[derive( #[derive(
@@ -176,7 +179,7 @@ impl PlayerResultsInfo {
} }
#[derive(Message, Serialize)] #[derive(Message, Serialize)]
pub struct AuthorResults { pub struct Author {
/// Earned credits, including premium and special awards and medals. /// Earned credits, including premium and special awards and medals.
#[prost(uint32, tag = "2")] #[prost(uint32, tag = "2")]
pub credits_earned: u32, pub credits_earned: u32,
@@ -187,4 +190,28 @@ pub struct AuthorResults {
#[prost(uint32, tag = "8")] #[prost(uint32, tag = "8")]
pub damage_dealt: u32, pub damage_dealt: u32,
#[prost(uint32, tag = "101")]
pub account_id: u32,
#[prost(enumeration = "TeamNumber", tag = "102")]
pub team_number: i32,
}
#[derive(Message, Serialize)]
pub struct Avatar {
#[prost(message, required, tag = "2")]
pub info: AvatarInfo,
}
#[derive(Message, Serialize)]
pub struct AvatarInfo {
#[prost(string, tag = "2")]
pub gfx_url: String,
#[prost(string, tag = "3")]
pub gfx2_url: String,
#[prost(string, tag = "4")]
pub kind: String,
} }
+10 -1
View File
@@ -4,8 +4,9 @@ use prost::Message;
use serde::Deserialize; use serde::Deserialize;
use serde_bytes::ByteBuf; use serde_bytes::ByteBuf;
use crate::error::Error;
use crate::models::BattleResults; use crate::models::BattleResults;
use crate::{Error, Result}; use crate::result::Result;
/// Represents un-pickled `battle_results.dat`. /// Represents un-pickled `battle_results.dat`.
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
@@ -29,3 +30,11 @@ impl BattleResultsDat {
BattleResults::decode(self.1.as_ref()).map_err(Error::DecodeFailed) BattleResults::decode(self.1.as_ref()).map_err(Error::DecodeFailed)
} }
} }
impl TryInto<BattleResults> for BattleResultsDat {
type Error = Error;
fn try_into(self) -> Result<BattleResults> {
self.decode_battle_results()
}
}
+4
View File
@@ -0,0 +1,4 @@
pub use crate::error::Error;
pub use crate::models::*;
pub use crate::replay::Replay;
pub use crate::result::Result;
+17 -6
View File
@@ -1,8 +1,7 @@
use std::fs::File; use std::fs::File;
use anyhow::Result; use anyhow::Result;
use wotbreplay_parser::models::TeamNumber; use wotbreplay_parser::prelude::*;
use wotbreplay_parser::Replay;
#[test] #[test]
fn player_results_ok() -> Result<()> { fn player_results_ok() -> Result<()> {
@@ -68,12 +67,23 @@ fn player_results_ok() -> Result<()> {
} }
#[test] #[test]
fn clan_tags_ok() -> Result<()> { fn player_info_ok() -> Result<()> {
let battle_results = Replay::open(File::open("tests/replays/player_results.wotbreplay")?)? let battle_results = Replay::open(File::open("tests/replays/player_results.wotbreplay")?)?
.read_battle_results()?; .read_battle_results()?;
assert_eq!(battle_results.players[1].info.clan_tag.as_deref(), Some("AN0NY")); assert_eq!(battle_results.players[1].info.clan_tag.as_deref(), Some("AN0NY"));
assert_eq!(battle_results.players[10].info.clan_tag.as_deref(), Some("BBS")); assert_eq!(battle_results.players[10].info.clan_tag.as_deref(), Some("BBS"));
assert_eq!(battle_results.players[10].info.avatar.info.kind, "legendary");
assert_eq!(
battle_results.players[10].info.avatar.info.gfx_url,
"https://stufficons.wgcdn.co/Gfx/avatar_UFO_legendary_anim/220523_104739_752791.webp"
);
assert_eq!(
battle_results.players[10].info.avatar.info.gfx2_url,
"https://stufficons.wgcdn.co/Gfx2/avatar_UFO_legendary_anim/220523_104755_251331.webp"
);
assert_eq!(battle_results.players[11].info.clan_tag, None); assert_eq!(battle_results.players[11].info.clan_tag, None);
Ok(()) Ok(())
@@ -111,9 +121,10 @@ fn author_results_ok() -> Result<()> {
let battle_results = Replay::open(File::open("tests/replays/author_results.wotbreplay")?)? let battle_results = Replay::open(File::open("tests/replays/author_results.wotbreplay")?)?
.read_battle_results()?; .read_battle_results()?;
assert_eq!(battle_results.author_results.credits_earned, 53623); assert_eq!(battle_results.author.credits_earned, 53623);
assert_eq!(battle_results.author_results.combat_xp, 2370); assert_eq!(battle_results.author.combat_xp, 2370);
assert_eq!(battle_results.author_results.damage_dealt, 1738); assert_eq!(battle_results.author.damage_dealt, 1738);
assert_eq!(battle_results.author.account_id, 594778041);
assert_eq!(battle_results.free_xp, 116); assert_eq!(battle_results.free_xp, 116);
Ok(()) Ok(())