auraxis/realtime/
mod.rs

1pub mod client;
2pub mod event;
3pub mod subscription;
4mod utils;
5
6use event::Event;
7use serde;
8use serde::{Deserialize, Serialize};
9use std::collections::HashMap;
10use subscription::SubscriptionSettings;
11use subscription::{CharacterSubscription, EventSubscription, WorldSubscription};
12use utils::{deserialize_from_str, serialize_optional_bool};
13
14pub const REALTIME_URL: &str = "wss://push.planetside2.com/streaming";
15
16#[derive(Serialize, Clone, Debug)]
17#[serde(rename_all = "camelCase")]
18pub enum Service {
19    Event,
20}
21
22#[derive(Serialize)]
23#[serde(tag = "action", rename_all = "camelCase")]
24enum Action {
25    Echo {
26        payload: serde_json::Value,
27        service: Service,
28    },
29    #[serde(rename_all = "camelCase")]
30    Subscribe(SubscriptionSettings),
31    #[serde(rename_all = "camelCase")]
32    ClearSubscribe {
33        #[serde(
34            skip_serializing_if = "Option::is_none",
35            serialize_with = "serialize_optional_bool"
36        )]
37        all: Option<bool>,
38        #[serde(skip_serializing_if = "Option::is_none")]
39        event_names: Option<EventSubscription>,
40        #[serde(skip_serializing_if = "Option::is_none")]
41        characters: Option<CharacterSubscription>,
42        #[serde(skip_serializing_if = "Option::is_none")]
43        worlds: Option<WorldSubscription>,
44        service: Service,
45    },
46    RecentCharacterIds {
47        service: Service,
48    },
49    RecentCharacterIdsCount {
50        service: Service,
51    },
52}
53
54#[derive(Deserialize, PartialEq, Debug)]
55#[serde(rename_all = "camelCase")]
56struct Subscription {
57    pub character_count: u64,
58    pub event_names: Vec<String>,
59    pub logical_and_characters_with_worlds: bool,
60    pub worlds: Vec<String>,
61}
62
63#[derive(Deserialize, PartialEq, Debug)]
64#[serde(tag = "type", rename_all = "camelCase")]
65enum Message {
66    ConnectionStateChanged {
67        #[serde(deserialize_with = "deserialize_from_str")]
68        connected: bool,
69    },
70    Heartbeat {
71        // TODO: EventServerEndpoint / WorldId / request::WorldIds -> bool
72        online: HashMap<String, String>,
73    },
74    ServiceMessage {
75        payload: Event,
76    },
77    ServiceStateChanged {
78        #[serde(deserialize_with = "deserialize_from_str")]
79        online: bool,
80        // TODO: EventServerEndpoint / WorldId / request::WorldIds
81        detail: String,
82    },
83    Subscription {
84        subscription: Subscription,
85    },
86}