1use crate::realtime::utils::*;
2use crate::{
3 CharacterID, ExperienceID, FacilityID, Faction, FiremodeID, Loadout, OutfitID, VehicleID,
4 WeaponID, WorldID, ZoneID,
5};
6use std::fmt::{Display, Formatter};
7
8use chrono::{DateTime, Duration, Utc};
9use serde::{Deserialize, Serialize};
10use serde_with::{DeserializeAs, SerializeAs, TimestampMilliSeconds, TimestampSeconds};
11
12#[derive(Clone, PartialEq, Eq, Debug, Hash)]
13pub enum EventNames {
14 AchievementEarned,
15 BattleRankUp,
16 Death,
17 ItemAdded,
18 SkillAdded,
19 VehicleDestroy,
20 GainExperience,
21 GainExperienceId(ExperienceID),
22 PlayerFacilityCapture,
23 PlayerFacilityDefend,
24 ContinentLock,
25 ContinentUnlock,
26 FacilityControl,
27 MetagameEvent,
28 PlayerLogin,
29 PlayerLogout,
30}
31
32impl serde::Serialize for EventNames {
33 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
34 where
35 S: serde::Serializer,
36 {
37 use self::EventNames::*;
38
39 match *self {
40 AchievementEarned => {
41 serializer.serialize_unit_variant("EventNames", 0, "AchievementEarned")
42 }
43 BattleRankUp => serializer.serialize_unit_variant("EventNames", 1, "BattleRankUp"),
44 Death => serializer.serialize_unit_variant("EventNames", 2, "Death"),
45 ItemAdded => serializer.serialize_unit_variant("EventNames", 3, "ItemAdded"),
46 SkillAdded => serializer.serialize_unit_variant("EventNames", 4, "SkillAdded"),
47 VehicleDestroy => serializer.serialize_unit_variant("EventNames", 5, "VehicleDestroy"),
48 GainExperience => serializer.serialize_unit_variant("EventNames", 6, "GainExperience"),
49 GainExperienceId(value) => {
50 let event_name = format!("GainExperience_experience_id_{}", value);
51
52 serializer.serialize_str(&event_name)
53 }
54 PlayerFacilityCapture => {
55 serializer.serialize_unit_variant("EventNames", 8, "PlayerFacilityCapture")
56 }
57 PlayerFacilityDefend => {
58 serializer.serialize_unit_variant("EventNames", 9, "PlayerFacilityDefend")
59 }
60 ContinentLock => serializer.serialize_unit_variant("EventNames", 10, "ContinentLock"),
61 ContinentUnlock => {
62 serializer.serialize_unit_variant("EventNames", 11, "ContinentUnlock")
63 }
64 FacilityControl => {
65 serializer.serialize_unit_variant("EventNames", 12, "FacilityControl")
66 }
67 MetagameEvent => serializer.serialize_unit_variant("EventNames", 13, "MetagameEvent"),
68 PlayerLogin => serializer.serialize_unit_variant("EventNames", 14, "PlayerLogin"),
69 PlayerLogout => serializer.serialize_unit_variant("EventNames", 15, "PlayerLogout"),
70 }
71 }
72}
73
74#[derive(Deserialize, PartialEq, Debug, Clone)]
75#[serde(tag = "event_name")]
76pub enum Event {
77 PlayerLogin(PlayerLogin),
78 PlayerLogout(PlayerLogout),
79 Death(Death),
80 VehicleDestroy(VehicleDestroy),
81 GainExperience(GainExperience),
82 PlayerFacilityCapture(PlayerFacilityCapture),
83 PlayerFacilityDefend(PlayerFacilityDefend),
84 ContinentLock(ContinentLock),
85 ContinentUnlock(ContinentUnlock),
86 FacilityControl(FacilityControl),
87 MetagameEvent(MetagameEvent),
88 ItemAdded(ItemAdded),
89 AchievementEarned,
90 SkillAdded,
91 BattleRankUp,
92}
93
94impl Display for Event {
95 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
96 match self {
97 Event::PlayerLogin(_) => {
98 write!(f, "PlayerLogin")
99 }
100 Event::PlayerLogout(_) => {
101 write!(f, "PlayerLogout")
102 }
103 Event::Death(_) => {
104 write!(f, "Death")
105 }
106 Event::VehicleDestroy(_) => {
107 write!(f, "VehicleDestroy")
108 }
109 Event::GainExperience(_) => {
110 write!(f, "GainExperience")
111 }
112 Event::PlayerFacilityCapture(_) => {
113 write!(f, "PlayerFacilityCapture")
114 }
115 Event::PlayerFacilityDefend(_) => {
116 write!(f, "PlayerFacilityDefend")
117 }
118 Event::ContinentLock(_) => {
119 write!(f, "ContinentLock")
120 }
121 Event::ContinentUnlock(_) => {
122 write!(f, "ContinentUnlock")
123 }
124 Event::FacilityControl(_) => {
125 write!(f, "FacilityControl")
126 }
127 Event::MetagameEvent(_) => {
128 write!(f, "MetagameEvent")
129 }
130 Event::ItemAdded(_) => {
131 write!(f, "ItemAdded")
132 }
133 Event::AchievementEarned => {
134 write!(f, "AchievementEarned")
135 }
136 Event::SkillAdded => {
137 write!(f, "SkillAdded")
138 }
139 Event::BattleRankUp => {
140 write!(f, "BattleRankUp")
141 }
142 }
143 }
144}
145
146#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
147pub struct PlayerLogin {
148 #[serde(deserialize_with = "deserialize_from_str")]
149 pub character_id: CharacterID,
150 #[serde(
151 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
152 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
153 )]
154 pub timestamp: DateTime<Utc>,
155 #[serde(deserialize_with = "deserialize_from_str")]
156 pub world_id: WorldID,
157}
158
159#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
160pub struct PlayerLogout {
161 #[serde(deserialize_with = "deserialize_from_str")]
162 pub character_id: CharacterID,
163 #[serde(
164 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
165 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
166 )]
167 pub timestamp: DateTime<Utc>,
168 #[serde(deserialize_with = "deserialize_from_str")]
169 pub world_id: WorldID,
170}
171
172#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
173pub struct Death {
174 #[serde(deserialize_with = "deserialize_from_str")]
175 pub attacker_character_id: CharacterID,
176 #[serde(deserialize_with = "deserialize_from_str")]
177 pub attacker_fire_mode_id: FiremodeID,
178 #[serde(deserialize_with = "deserialize_from_str")]
179 pub attacker_loadout_id: Loadout,
180 #[serde(deserialize_with = "deserialize_from_str")]
181 pub attacker_vehicle_id: VehicleID,
182 #[serde(deserialize_with = "deserialize_from_str")]
183 pub attacker_weapon_id: WeaponID,
184 #[serde(deserialize_with = "deserialize_from_str")]
185 pub character_id: CharacterID,
186 #[serde(deserialize_with = "deserialize_from_str")]
187 pub character_loadout_id: Loadout,
188 #[serde(deserialize_with = "de_bool_from_str_int")]
189 pub is_headshot: bool,
190 #[serde(
191 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
192 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
193 )]
194 pub timestamp: DateTime<Utc>,
195 #[serde(default, deserialize_with = "deserialize_from_str")]
196 pub vehicle_id: VehicleID,
197 #[serde(deserialize_with = "deserialize_from_str")]
198 pub world_id: WorldID,
199 #[serde(deserialize_with = "deserialize_from_str")]
200 pub zone_id: ZoneID,
201}
202
203#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
204pub struct VehicleDestroy {
205 #[serde(deserialize_with = "deserialize_from_str")]
206 pub attacker_character_id: CharacterID,
207 #[serde(deserialize_with = "deserialize_from_str")]
208 pub attacker_loadout_id: Loadout,
209 #[serde(deserialize_with = "deserialize_from_str")]
210 pub attacker_vehicle_id: VehicleID,
211 #[serde(deserialize_with = "deserialize_from_str")]
212 pub attacker_weapon_id: WeaponID,
213 #[serde(deserialize_with = "deserialize_from_str")]
214 pub character_id: CharacterID,
215 #[serde(deserialize_with = "deserialize_from_str")]
216 pub facility_id: FacilityID,
217 #[serde(deserialize_with = "deserialize_from_str")]
218 pub faction_id: Faction,
219 #[serde(
220 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
221 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
222 )]
223 pub timestamp: DateTime<Utc>,
224 #[serde(deserialize_with = "deserialize_from_str")]
225 pub vehicle_id: VehicleID,
226 #[serde(deserialize_with = "deserialize_from_str")]
227 pub world_id: WorldID,
228 #[serde(deserialize_with = "deserialize_from_str")]
229 pub zone_id: ZoneID,
230}
231
232#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
233pub struct GainExperience {
234 #[serde(deserialize_with = "deserialize_from_str")]
235 pub character_id: CharacterID,
236 #[serde(deserialize_with = "deserialize_from_str")]
237 pub experience_id: ExperienceID,
238 #[serde(deserialize_with = "deserialize_from_str")]
239 pub loadout_id: Loadout,
240 #[serde(deserialize_with = "deserialize_from_str")]
241 pub other_id: CharacterID,
242 #[serde(
243 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
244 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
245 )]
246 pub timestamp: DateTime<Utc>,
247 #[serde(deserialize_with = "deserialize_from_str")]
248 pub world_id: WorldID,
249 #[serde(deserialize_with = "deserialize_from_str")]
250 pub zone_id: ZoneID,
251 #[serde(deserialize_with = "deserialize_from_str")]
252 pub amount: u16,
253 #[serde(deserialize_with = "deserialize_from_str")]
254 pub team_id: Faction,
255}
256
257#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
258pub struct PlayerFacilityCapture {
259 #[serde(deserialize_with = "deserialize_from_str")]
260 pub character_id: CharacterID,
261 #[serde(deserialize_with = "deserialize_from_str")]
262 pub facility_id: FacilityID,
263 pub outfit_id: OutfitID,
264 #[serde(
265 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
266 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
267 )]
268 pub timestamp: DateTime<Utc>,
269 #[serde(deserialize_with = "deserialize_from_str")]
270 pub world_id: WorldID,
271 #[serde(deserialize_with = "deserialize_from_str")]
272 pub zone_id: ZoneID,
273}
274
275#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
276pub struct PlayerFacilityDefend {
277 #[serde(deserialize_with = "deserialize_from_str")]
278 pub character_id: CharacterID,
279 #[serde(deserialize_with = "deserialize_from_str")]
280 pub facility_id: FacilityID,
281 pub outfit_id: OutfitID,
282 #[serde(
283 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
284 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
285 )]
286 pub timestamp: DateTime<Utc>,
287 #[serde(deserialize_with = "deserialize_from_str")]
288 pub world_id: WorldID,
289 #[serde(deserialize_with = "deserialize_from_str")]
290 pub zone_id: ZoneID,
291}
292
293#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
294pub struct FacilityControl {
295 #[serde(
296 deserialize_with = "deserialize_duration_from_str",
297 serialize_with = "serialize_duration"
298 )]
299 pub duration_held: Duration,
300 #[serde(deserialize_with = "deserialize_from_str")]
301 pub facility_id: FacilityID,
302 #[serde(deserialize_with = "deserialize_from_str")]
303 pub new_faction_id: Faction,
304 #[serde(deserialize_with = "deserialize_from_str")]
305 pub old_faction_id: Faction,
306 pub outfit_id: OutfitID,
307 #[serde(
308 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
309 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
310 )]
311 pub timestamp: DateTime<Utc>,
312 #[serde(deserialize_with = "deserialize_from_str")]
313 pub world_id: WorldID,
314 #[serde(deserialize_with = "deserialize_from_str")]
315 pub zone_id: ZoneID,
316}
317
318#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
319pub struct ContinentLock {
320 #[serde(
321 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
322 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
323 )]
324 pub timestamp: DateTime<Utc>,
325 #[serde(deserialize_with = "deserialize_from_str")]
326 pub world_id: WorldID,
327 #[serde(deserialize_with = "deserialize_from_str")]
328 pub zone_id: ZoneID,
329 #[serde(deserialize_with = "deserialize_from_str")]
330 pub triggering_faction: Faction,
331 #[serde(deserialize_with = "deserialize_from_str")]
332 pub previous_faction: Faction,
333 #[serde(deserialize_with = "deserialize_from_str")]
334 pub vs_population: u16,
335 #[serde(deserialize_with = "deserialize_from_str")]
336 pub nc_population: u16,
337 #[serde(deserialize_with = "deserialize_from_str")]
338 pub tr_population: u16,
339 #[serde(deserialize_with = "deserialize_from_str")]
340 pub metagame_event_id: u8,
341}
342
343#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
344pub struct ContinentUnlock {
345 #[serde(
346 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
347 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
348 )]
349 pub timestamp: DateTime<Utc>,
350 #[serde(deserialize_with = "deserialize_from_str")]
351 pub world_id: WorldID,
352 #[serde(deserialize_with = "deserialize_from_str")]
353 pub zone_id: ZoneID,
354 #[serde(deserialize_with = "deserialize_from_str")]
355 pub triggering_faction: Faction,
356 #[serde(deserialize_with = "deserialize_from_str")]
357 pub previous_faction: Faction,
358 #[serde(deserialize_with = "deserialize_from_str")]
359 pub vs_population: u16,
360 #[serde(deserialize_with = "deserialize_from_str")]
361 pub nc_population: u16,
362 #[serde(deserialize_with = "deserialize_from_str")]
363 pub tr_population: u16,
364 #[serde(deserialize_with = "deserialize_from_str")]
365 pub metagame_event_id: u8,
366}
367
368#[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
369pub struct MetagameEvent {
370 #[serde(
371 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
372 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
373 )]
374 pub timestamp: DateTime<Utc>,
375 #[serde(deserialize_with = "deserialize_from_str")]
376 pub world_id: WorldID,
377 #[serde(deserialize_with = "deserialize_from_str")]
378 pub instance_id: u32,
379 #[serde(deserialize_with = "deserialize_from_str")]
380 pub experience_bonus: f32,
381 #[serde(deserialize_with = "deserialize_from_str")]
382 pub faction_nc: f32,
383 #[serde(deserialize_with = "deserialize_from_str")]
384 pub faction_tr: f32,
385 #[serde(deserialize_with = "deserialize_from_str")]
386 pub faction_vs: f32,
387 #[serde(deserialize_with = "deserialize_from_str")]
388 pub metagame_event_id: u8,
389 #[serde(deserialize_with = "deserialize_from_str")]
390 pub metagame_event_state: u8,
391 pub metagame_event_state_name: String,
392 #[serde(deserialize_with = "deserialize_from_str")]
393 pub zone_id: ZoneID,
394}
395
396#[derive(Serialize, Deserialize, PartialEq, Eq, Debug, Clone, Hash)]
397pub struct ItemAdded {
398 #[serde(deserialize_with = "deserialize_from_str")]
399 pub character_id: CharacterID,
400 pub context: String,
401 #[serde(
402 deserialize_with = "TimestampSeconds::<String>::deserialize_as",
403 serialize_with = "TimestampMilliSeconds::<i64>::serialize_as"
404 )]
405 pub timestamp: DateTime<Utc>,
406 #[serde(deserialize_with = "deserialize_from_str")]
407 pub item_count: u8,
408 #[serde(deserialize_with = "deserialize_from_str")]
409 pub item_id: u64,
410 #[serde(deserialize_with = "deserialize_from_str")]
411 pub world_id: WorldID,
412 #[serde(deserialize_with = "deserialize_from_str")]
413 pub zone_id: ZoneID,
414}