Skip to main content

auraxis/realtime/
event.rs

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}