wotbreplay_parser/models/data/
payload.rs

1use std::io::Read;
2
3use byteorder::{LittleEndian, ReadBytesExt};
4use serde::Serialize;
5use serde_with::serde_as;
6
7use crate::models::data::base_player_create::BasePlayerCreate;
8use crate::models::data::entity_method::EntityMethod;
9use crate::models::data::{read_pickled, read_quirky_length, read_string};
10use crate::result::Result;
11
12/// Packet payload.
13#[serde_as]
14#[derive(Debug, Serialize)]
15pub enum Payload {
16    /// Type 0.
17    BasePlayerCreate {
18        author_nickname: String,
19        arena_unique_id: u64,
20        arena_type_id: u32,
21        arguments: Box<BasePlayerCreate>,
22    },
23
24    /// Type 8.
25    EntityMethod(EntityMethod),
26
27    /// Default payload when type is not known by the parser.
28    Unknown { packet_type: u32 },
29}
30
31impl Payload {
32    /// Parse the raw packet payload.
33    pub fn new(packet_type: u32, raw_payload: &[u8]) -> Result<Self> {
34        let mut raw_payload = raw_payload;
35
36        let this = match packet_type {
37            0 => {
38                raw_payload.read_exact(&mut [0; 10])?;
39
40                let author_nickname = read_string(&mut raw_payload)?;
41                let arena_unique_id = raw_payload.read_u64::<LittleEndian>()?;
42                let arena_type_id = raw_payload.read_u32::<LittleEndian>()?;
43                let arguments = {
44                    let pickled_length = read_quirky_length(&mut raw_payload)?;
45                    read_pickled(&mut raw_payload, pickled_length)?
46                };
47                Self::BasePlayerCreate {
48                    arguments,
49                    author_nickname,
50                    arena_unique_id,
51                    arena_type_id,
52                }
53            }
54
55            8 => Self::EntityMethod(EntityMethod::new(raw_payload)?),
56
57            _ => Self::Unknown { packet_type },
58        };
59        Ok(this)
60    }
61}