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, PartialEq, Eq)]
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")]
65#[allow(clippy::enum_variant_names)]
66enum Message {
67 ConnectionStateChanged {
68 #[serde(deserialize_with = "deserialize_from_str")]
69 connected: bool,
70 },
71 Heartbeat {
72 online: HashMap<String, String>,
74 },
75 ServiceMessage {
76 payload: Event,
77 },
78 ServiceStateChanged {
79 #[serde(deserialize_with = "deserialize_from_str")]
80 online: bool,
81 detail: String,
83 },
84 Subscription {
85 subscription: Subscription,
86 },
87}