wotbreplay_parser/models/data/
payload.rs1use 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#[serde_as]
14#[derive(Debug, Serialize)]
15pub enum Payload {
16 BasePlayerCreate {
18 author_nickname: String,
19 arena_unique_id: u64,
20 arena_type_id: u32,
21 arguments: Box<BasePlayerCreate>,
22 },
23
24 EntityMethod(EntityMethod),
26
27 Unknown { packet_type: u32 },
29}
30
31impl Payload {
32 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}