mirror of
https://github.com/eigenein/wotbreplay-parser.git
synced 2026-10-21 02:17:02 +02:00
💥 Hide raw payloads behind the feature flag, and improve the performance
This commit is contained in:
1 parent
2d2c85c18a
commit
a177447ca1
4 files changed
+40
-44
No files matched your search
+2
-1
@@ -12,7 +12,8 @@ categories = ["parsing"]
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
meta = ["dep:serde_json"]
|
meta = ["dep:serde_json"] # `meta.json` parsing
|
||||||
|
raw-payload = [] # save raw packet payloads, enabling increases memory usage and decreases performance
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bytes = "1.4.0"
|
bytes = "1.4.0"
|
||||||
|
|||||||
@@ -15,48 +15,37 @@ pub mod update_arena;
|
|||||||
#[serde_as]
|
#[serde_as]
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
pub enum EntityMethod {
|
pub enum EntityMethod {
|
||||||
/// Subtype `0x2F`.
|
/// Subtype 47.
|
||||||
UpdateArena {
|
UpdateArena {
|
||||||
field_number: u64,
|
field_number: u64,
|
||||||
arguments: UpdateArena,
|
arguments: UpdateArena,
|
||||||
|
|
||||||
/// Original payload for investigation.
|
|
||||||
#[serde_as(as = "serde_with::hex::Hex")]
|
|
||||||
payload: Vec<u8>,
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/// Default variant when subtype is not known by the parser.
|
/// Default variant when subtype is not known by the parser.
|
||||||
Unknown {
|
Unknown { sub_type: u32 },
|
||||||
sub_type: u32,
|
|
||||||
|
|
||||||
/// Whole packet payload (including the sub-type).
|
|
||||||
#[serde_as(as = "serde_with::hex::Hex")]
|
|
||||||
payload: Vec<u8>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EntityMethod {
|
impl EntityMethod {
|
||||||
/// Parse the entity method payload.
|
/// Parse the entity method payload.
|
||||||
pub fn new(payload: Vec<u8>) -> Result<Self> {
|
pub fn new(payload: &[u8]) -> Result<Self> {
|
||||||
let mut reader = payload.as_slice();
|
let mut payload = payload;
|
||||||
|
|
||||||
reader.read_u32::<LittleEndian>()?;
|
payload.read_u32::<LittleEndian>()?;
|
||||||
let sub_type = reader.read_u32::<LittleEndian>()?;
|
let sub_type = payload.read_u32::<LittleEndian>()?;
|
||||||
|
|
||||||
let this = match sub_type {
|
let this = match sub_type {
|
||||||
0x2F => {
|
47 => {
|
||||||
let _inner_length = reader.read_u32::<LittleEndian>()?;
|
let _inner_length = payload.read_u32::<LittleEndian>()?;
|
||||||
|
|
||||||
let field_number = decode_varint(&mut reader)?;
|
let field_number = decode_varint(&mut payload)?;
|
||||||
let message_length = read_quirky_length(&mut reader)?;
|
let message_length = read_quirky_length(&mut payload)?;
|
||||||
Self::UpdateArena {
|
Self::UpdateArena {
|
||||||
field_number,
|
field_number,
|
||||||
arguments: UpdateArena::decode(&reader[..message_length])?,
|
arguments: UpdateArena::decode(&payload[..message_length])?,
|
||||||
payload,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => Self::Unknown { sub_type, payload },
|
_ => Self::Unknown { sub_type },
|
||||||
};
|
};
|
||||||
Ok(this)
|
Ok(this)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,20 @@ use std::io::Read;
|
|||||||
|
|
||||||
use byteorder::{LittleEndian, ReadBytesExt};
|
use byteorder::{LittleEndian, ReadBytesExt};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use serde_with::serde_as;
|
||||||
|
|
||||||
use crate::models::data::payload::Payload;
|
use crate::models::data::payload::Payload;
|
||||||
use crate::result::Result;
|
use crate::result::Result;
|
||||||
|
|
||||||
|
#[serde_as]
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
pub struct Packet {
|
pub struct Packet {
|
||||||
pub clock: f32,
|
pub clock: f32,
|
||||||
pub payload: Payload,
|
pub payload: Payload,
|
||||||
|
|
||||||
|
#[cfg(feature = "raw-payload")]
|
||||||
|
#[serde_as(as = "serde_with::hex::Hex")]
|
||||||
|
pub raw_payload: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Packet {
|
impl Packet {
|
||||||
@@ -18,8 +24,13 @@ impl Packet {
|
|||||||
let type_ = reader.read_u32::<LittleEndian>()?;
|
let type_ = reader.read_u32::<LittleEndian>()?;
|
||||||
let clock = reader.read_f32::<LittleEndian>()?;
|
let clock = reader.read_f32::<LittleEndian>()?;
|
||||||
let payload = Self::read_payload(reader, length as usize)?;
|
let payload = Self::read_payload(reader, length as usize)?;
|
||||||
let payload = Payload::new(type_, payload)?;
|
let this = Self {
|
||||||
let this = Self { clock, payload };
|
clock,
|
||||||
|
payload: Payload::new(type_, &payload)?,
|
||||||
|
|
||||||
|
#[cfg(feature = "raw-payload")]
|
||||||
|
raw_payload: payload,
|
||||||
|
};
|
||||||
Ok(Some(this))
|
Ok(Some(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+13
-18
@@ -25,32 +25,27 @@ pub enum Payload {
|
|||||||
EntityMethod(EntityMethod),
|
EntityMethod(EntityMethod),
|
||||||
|
|
||||||
/// Default payload when type is not known by the parser.
|
/// Default payload when type is not known by the parser.
|
||||||
Unknown {
|
Unknown { packet_type: u32 },
|
||||||
packet_type: u32,
|
|
||||||
|
|
||||||
/// Whole packet payload.
|
|
||||||
#[serde_as(as = "serde_with::hex::Hex")]
|
|
||||||
raw: Vec<u8>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Payload {
|
impl Payload {
|
||||||
/// Parse the packet payload.
|
/// Parse the packet payload.
|
||||||
pub fn new(packet_type: u32, payload: Vec<u8>) -> Result<Self> {
|
pub fn new(packet_type: u32, payload: &[u8]) -> Result<Self> {
|
||||||
|
let mut payload = payload;
|
||||||
|
|
||||||
let this = match packet_type {
|
let this = match packet_type {
|
||||||
0 => {
|
0 => {
|
||||||
let mut reader = payload.as_slice();
|
payload.read_exact(&mut [0; 10])?;
|
||||||
reader.read_exact(&mut [0; 10])?;
|
|
||||||
|
|
||||||
let author_nickname = read_string(&mut reader)?;
|
let author_nickname = read_string(&mut payload)?;
|
||||||
let arena_unique_id = reader.read_u64::<LittleEndian>()?;
|
let arena_unique_id = payload.read_u64::<LittleEndian>()?;
|
||||||
let arena_type_id = reader.read_u32::<LittleEndian>()?;
|
let arena_type_id = payload.read_u32::<LittleEndian>()?;
|
||||||
let type_0 = {
|
let arguments = {
|
||||||
let pickled_length = read_quirky_length(&mut reader)?;
|
let pickled_length = read_quirky_length(&mut payload)?;
|
||||||
read_pickled(&mut reader, pickled_length)?
|
read_pickled(&mut payload, pickled_length)?
|
||||||
};
|
};
|
||||||
Self::BasePlayerCreate {
|
Self::BasePlayerCreate {
|
||||||
arguments: type_0,
|
arguments,
|
||||||
author_nickname,
|
author_nickname,
|
||||||
arena_unique_id,
|
arena_unique_id,
|
||||||
arena_type_id,
|
arena_type_id,
|
||||||
@@ -59,7 +54,7 @@ impl Payload {
|
|||||||
|
|
||||||
8 => Self::EntityMethod(EntityMethod::new(payload)?),
|
8 => Self::EntityMethod(EntityMethod::new(payload)?),
|
||||||
|
|
||||||
_ => Self::Unknown { raw: payload, packet_type },
|
_ => Self::Unknown { packet_type },
|
||||||
};
|
};
|
||||||
Ok(this)
|
Ok(this)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user