g_rust/extension/parsers/
stuffdata.rs

1use std::collections::HashMap;
2use crate::extension::parsers::stuffdata::StuffData::{CrackableStuffData, EmptyStuffData, HighScoreStuffData, IntArrayStuffData, LegacyStuffData, MapStuffData, StringArrayStuffData, VoteResultStuffData};
3use crate::protocol::hpacket::HPacket;
4use crate::protocol::vars::packetvariable::PacketVariable;
5
6#[derive(Clone, Debug, PartialEq)]
7pub enum StuffData {
8    LegacyStuffData {
9        legacy_string: String,
10        unique_serial_data: Option<UniqueSerialData>
11    },
12    MapStuffData {
13        map: HashMap<String, String>,
14        unique_serial_data: Option<UniqueSerialData>
15    },
16    StringArrayStuffData {
17        values: Vec<String>,
18        unique_serial_data: Option<UniqueSerialData>
19    },
20    VoteResultStuffData {
21        legacy_string: String,
22        result: i32,
23        unique_serial_data: Option<UniqueSerialData>
24    },
25    EmptyStuffData  {
26        unique_serial_data: Option<UniqueSerialData>
27    },
28    IntArrayStuffData {
29        values: Vec<i32>,
30        unique_serial_data: Option<UniqueSerialData>
31    },
32    HighScoreStuffData {
33        legacy_string: String,
34        score_type: i32,
35        clear_type: i32,
36        entries: Vec<HighScoreData>
37    },
38    CrackableStuffData {
39        legacy_string: String,
40        hits: i32,
41        target: i32,
42        unique_serial_data: Option<UniqueSerialData>
43    }
44}
45
46impl StuffData {
47    pub fn get_unique_serial_data(&self) -> Option<UniqueSerialData> {
48        match self {
49            LegacyStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
50            MapStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
51            StringArrayStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
52            VoteResultStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
53            EmptyStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
54            IntArrayStuffData { unique_serial_data, .. } => unique_serial_data.clone(),
55            HighScoreStuffData { .. } => None,
56            CrackableStuffData { unique_serial_data, .. } => unique_serial_data.clone()
57        }
58    }
59}
60
61impl Default for StuffData {
62    fn default() -> Self {
63        EmptyStuffData {
64            unique_serial_data: None
65        }
66    }
67}
68
69impl PacketVariable for StuffData {
70    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
71        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
72
73        let cat: i32 = packet.read();
74
75        (match cat & 255 {
76            0 => LegacyStuffData {
77                legacy_string: packet.read(),
78                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
79            },
80            1 => MapStuffData {
81                map: packet.read(),
82                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
83            },
84            2 => StringArrayStuffData {
85                values: packet.read(),
86                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
87            },
88            3 => VoteResultStuffData {
89                legacy_string: packet.read(),
90                result: packet.read(),
91                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
92            },
93            4 => EmptyStuffData {
94                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
95            },
96            5 => IntArrayStuffData {
97                values: packet.read(),
98                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
99            },
100            6 => HighScoreStuffData {
101                legacy_string: packet.read(),
102                score_type: packet.read(),
103                clear_type: packet.read(),
104                entries: packet.read()
105            },
106            7 => CrackableStuffData {
107                legacy_string: packet.read(),
108                hits: packet.read(),
109                target: packet.read(),
110                unique_serial_data: if cat & 256 > 0 { packet.read() } else { None }
111            },
112            _ => panic!("Unknown stuff data type")
113        }, packet.read_index - 6)
114    }
115
116    fn to_packet(&self) -> Vec<u8> {
117        match self {
118            LegacyStuffData {
119                legacy_string, unique_serial_data
120            } => (
121                0i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
122                legacy_string.clone(), unique_serial_data.clone()
123            ).to_packet(),
124            MapStuffData {
125                map, unique_serial_data
126            } => (
127                1i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
128                map.clone(), unique_serial_data.clone()
129            ).to_packet(),
130            StringArrayStuffData {
131                values, unique_serial_data
132            } => (
133                2i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
134                values.clone(), unique_serial_data.clone()
135            ).to_packet(),
136            VoteResultStuffData {
137                legacy_string, result, unique_serial_data
138            } => (
139                3i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
140                legacy_string.clone(), *result, unique_serial_data.clone()
141            ).to_packet(),
142            EmptyStuffData {
143                unique_serial_data
144            } => (
145                4i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
146                unique_serial_data.clone()
147            ).to_packet(),
148            IntArrayStuffData {
149                values, unique_serial_data
150            } => (
151                5i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
152                values.clone(), unique_serial_data.clone()
153            ).to_packet(),
154            HighScoreStuffData {
155                legacy_string, score_type, clear_type, entries
156            } => (
157                6i32,
158                legacy_string.clone(), *score_type, *clear_type, entries.clone()
159            ).to_packet(),
160            CrackableStuffData {
161                legacy_string, hits, target, unique_serial_data
162            } => (
163                7i32 | if unique_serial_data.is_some() { 256i32 } else { 0i32 },
164                legacy_string.clone(), *hits, *target, unique_serial_data.clone()
165            ).to_packet()
166        }
167    }
168}
169
170#[derive(Clone, Debug, Default, PacketVariable, PartialEq)]
171pub struct UniqueSerialData {
172    pub number: i32,
173    pub size: i32
174}
175
176#[derive(Clone, Debug, Default, PacketVariable, PartialEq)]
177pub struct HighScoreData {
178    pub score: i32,
179    pub users: Vec<String>
180}
181
182// #[derive(Clone, Debug, Default, PacketVariable, PartialEq)]
183// pub struct StuffData {}