Skip to main content

im_core/realtime/
events.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub enum ImEvent {
5    ConnectionStateChanged(ConnectionStateChanged),
6    MessageReceived(MessageReceivedEvent),
7    MessageUpdated(MessageUpdatedEvent),
8    GroupUpdated(GroupUpdatedEvent),
9    LocalNotification(LocalNotificationEvent),
10    HostNotification(HostNotificationEvent),
11    UnknownNotification(UnknownNotificationEvent),
12}
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15pub struct ConnectionStateChanged {
16    pub state: super::RealtimeConnectionState,
17    pub reason: Option<String>,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub struct MessageReceivedEvent {
22    pub message: crate::messages::Message,
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub attachment_summary: Option<AttachmentMessageSummary>,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub download_action: Option<AttachmentDownloadAction>,
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub sync: Option<RealtimeSyncHint>,
29    #[serde(default, skip_serializing_if = "Vec::is_empty")]
30    pub warnings: Vec<String>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct AttachmentMessageSummary {
35    #[serde(default, skip_serializing_if = "Option::is_none")]
36    pub attachment_id: Option<String>,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub filename: Option<String>,
39    #[serde(default, skip_serializing_if = "Option::is_none")]
40    pub mime_type: Option<String>,
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub size_bytes: Option<u64>,
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub content_type: Option<String>,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
48pub struct AttachmentDownloadAction {
49    pub thread: crate::messages::ThreadRef,
50    pub message_id: crate::ids::MessageId,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub attachment_id: Option<String>,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
56pub struct MessageUpdatedEvent {
57    pub message_id: crate::ids::MessageId,
58    pub thread: crate::messages::ThreadRef,
59    pub update_kind: MessageUpdateKind,
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub sync: Option<RealtimeSyncHint>,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub enum MessageUpdateKind {
66    Read,
67    DeliveryStateChanged,
68    Unknown,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
72pub struct GroupUpdatedEvent {
73    pub group: crate::ids::GroupRef,
74    pub update_kind: GroupUpdateKind,
75    #[serde(default, skip_serializing_if = "Option::is_none")]
76    pub event_type: Option<String>,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub group_event_seq: Option<i64>,
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub group_state_version: Option<String>,
81    #[serde(default, skip_serializing_if = "Option::is_none")]
82    pub actor_did: Option<String>,
83    #[serde(default, skip_serializing_if = "Option::is_none")]
84    pub subject_did: Option<String>,
85    #[serde(default, skip_serializing_if = "Option::is_none")]
86    pub membership_status: Option<String>,
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub changed_at: Option<String>,
89    #[serde(default, skip_serializing_if = "Option::is_none")]
90    pub sync: Option<RealtimeSyncHint>,
91}
92
93#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
94pub enum GroupUpdateKind {
95    Created,
96    Updated,
97    MemberAdded,
98    MemberRemoved,
99    MessageAdded,
100    Unknown,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104pub struct LocalNotificationEvent {
105    pub notification_id: Option<String>,
106    pub title: Option<String>,
107    pub body: Option<String>,
108    pub source: Option<String>,
109}
110
111#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
112pub struct HostNotificationEvent {
113    pub event_type: HostNotificationKind,
114    pub title: Option<String>,
115    pub body: Option<String>,
116    pub thread: Option<crate::messages::ThreadRef>,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120pub enum HostNotificationKind {
121    DirectMessage,
122    GroupMessage,
123    GroupState,
124    Mail,
125    Unknown,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
129pub struct UnknownNotificationEvent {
130    pub content_type: Option<String>,
131    pub notification_type: Option<String>,
132    pub reason: String,
133    #[serde(default, skip_serializing_if = "Option::is_none")]
134    pub sync: Option<RealtimeSyncHint>,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
138pub struct RealtimeSyncHint {
139    #[serde(default, skip_serializing_if = "Option::is_none")]
140    pub event_id: Option<String>,
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub event_seq: Option<String>,
143    #[serde(default, skip_serializing_if = "Option::is_none")]
144    pub event_type: Option<String>,
145    pub sync_dirty: bool,
146    pub gap_detected: bool,
147}