Skip to main content

agentlink_core/protocols/
events.rs

1//! MQTT Events Protocol
2//!
3//! This module defines all MQTT event types that can be received from the server.
4//! These events follow the protocol defined in MRD documentation.
5
6use serde::{Deserialize, Serialize};
7use serde_json::Value;
8
9use super::{
10    conversation::{Conversation, SyncConversationListData},
11    friend::{FriendRequest, Friendship, SyncFriendListData, SyncFriendRequestsData},
12    message::{NewMessageData, SyncMessageHistoryData},
13    user::User,
14};
15
16/// 服务端 MQTT 事件
17///
18/// 这些事件通过 MQTT 主题推送,使用 event_type 字段进行区分
19#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(tag = "event_type")]
21pub enum ServerEvent {
22    // ==================== 消息事件 ====================
23    /// 新消息
24    #[serde(rename = "new_message")]
25    NewMessage { data: NewMessageData },
26
27    /// 消息历史同步
28    #[serde(rename = "sync_message_history")]
29    SyncMessageHistory { data: SyncMessageHistoryData },
30
31    /// 消息状态更新
32    #[serde(rename = "message_status_updated")]
33    MessageStatusUpdated { data: MessageStatusUpdatedData },
34
35    /// 消息被删除
36    #[serde(rename = "message_deleted")]
37    MessageDeleted { data: MessageDeletedData },
38
39    // ==================== 会话事件 ====================
40    /// 会话列表同步
41    #[serde(rename = "sync_conversation_list")]
42    SyncConversationList { data: SyncConversationListData },
43
44    /// 会话更新
45    #[serde(rename = "conversation_updated")]
46    ConversationUpdated { data: Conversation },
47
48    /// 会话成员更新
49    #[serde(rename = "conversation_members_updated")]
50    ConversationMembersUpdated { data: ConversationMembersUpdatedData },
51
52    /// 用户被添加到会话
53    #[serde(rename = "added_to_conversation")]
54    AddedToConversation { data: Conversation },
55
56    /// 用户被从会话移除
57    #[serde(rename = "removed_from_conversation")]
58    RemovedFromConversation { data: RemovedFromConversationData },
59
60    // ==================== 好友事件 ====================
61    /// 好友列表同步
62    #[serde(rename = "sync_friend_list")]
63    SyncFriendList { data: SyncFriendListData },
64
65    /// 好友关系更新
66    #[serde(rename = "friendship_updated")]
67    FriendshipUpdated { data: Friendship },
68
69    /// 好友被删除
70    #[serde(rename = "friend_deleted")]
71    FriendDeleted { data: FriendDeletedData },
72
73    // ==================== 好友请求事件 ====================
74    /// 收到好友请求
75    #[serde(rename = "friend_request_received")]
76    FriendRequestReceived { data: FriendRequest },
77
78    /// 好友请求被响应
79    #[serde(rename = "friend_request_responded")]
80    FriendRequestResponded { data: FriendRequest },
81
82    /// 好友请求列表同步
83    #[serde(rename = "sync_friend_requests")]
84    SyncFriendRequests { data: SyncFriendRequestsData },
85
86    // ==================== 用户状态事件 ====================
87    /// 用户在线状态更新
88    #[serde(rename = "user_presence_updated")]
89    UserPresenceUpdated { data: UserPresenceData },
90
91    /// 用户信息更新
92    #[serde(rename = "user_info_updated")]
93    UserInfoUpdated { data: User },
94
95    // ==================== 黑名单事件 ====================
96    /// 被添加到黑名单
97    #[serde(rename = "added_to_blacklist")]
98    AddedToBlacklist { data: BlacklistEventData },
99
100    /// 被从黑名单移除
101    #[serde(rename = "removed_from_blacklist")]
102    RemovedFromBlacklist { data: BlacklistEventData },
103
104    // ==================== 系统事件 ====================
105    /// 通知
106    #[serde(rename = "notification")]
107    Notification { data: NotificationData },
108
109    /// 系统消息
110    #[serde(rename = "system_message")]
111    SystemMessage { data: SystemMessageData },
112
113    /// 同步完成
114    #[serde(rename = "sync_completed")]
115    SyncCompleted { data: SyncCompletedData },
116
117    /// 通用数据更新
118    #[serde(rename = "data_updated")]
119    DataUpdated { data: DataUpdatedData },
120}
121
122/// 消息状态更新数据
123#[derive(Debug, Clone, Serialize, Deserialize)]
124pub struct MessageStatusUpdatedData {
125    pub conversation_id: String,
126    pub message_id: String,
127    pub status: String,
128    pub updated_at: String,
129}
130
131/// 消息删除数据
132#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct MessageDeletedData {
134    pub conversation_id: String,
135    pub message_id: String,
136    pub deleted_at: String,
137}
138
139/// 会话成员更新数据
140#[derive(Debug, Clone, Serialize, Deserialize)]
141pub struct ConversationMembersUpdatedData {
142    pub conversation_id: String,
143    pub members: Vec<ConversationMemberInfo>,
144}
145
146/// 会话成员信息
147#[derive(Debug, Clone, Serialize, Deserialize)]
148pub struct ConversationMemberInfo {
149    pub user_id: String,
150    pub role: String,
151    pub joined_at: String,
152}
153
154/// 被移除会话数据
155#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct RemovedFromConversationData {
157    pub conversation_id: String,
158    pub removed_by: String,
159    pub removed_at: String,
160}
161
162/// 好友删除数据
163#[derive(Debug, Clone, Serialize, Deserialize)]
164pub struct FriendDeletedData {
165    pub friend_id: String,
166    pub deleted_at: String,
167}
168
169/// 用户在线状态数据
170#[derive(Debug, Clone, Serialize, Deserialize)]
171pub struct UserPresenceData {
172    pub user_id: String,
173    pub online: bool,
174    #[serde(skip_serializing_if = "Option::is_none")]
175    pub device_type: Option<String>,
176    #[serde(skip_serializing_if = "Option::is_none")]
177    pub last_seen_at: Option<String>,
178    pub timestamp: String,
179}
180
181/// 黑名单事件数据
182#[derive(Debug, Clone, Serialize, Deserialize)]
183pub struct BlacklistEventData {
184    pub user_id: String,
185    pub blocked_user_id: String,
186    pub timestamp: String,
187}
188
189/// 通知数据
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct NotificationData {
192    pub id: String,
193    #[serde(rename = "type")]
194    pub notification_type: String,
195    pub title: String,
196    pub content: String,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub data: Option<Value>,
199    pub created_at: String,
200}
201
202/// 系统消息数据
203#[derive(Debug, Clone, Serialize, Deserialize)]
204pub struct SystemMessageData {
205    pub id: String,
206    pub message: String,
207    #[serde(skip_serializing_if = "Option::is_none")]
208    pub data: Option<Value>,
209    pub created_at: String,
210}
211
212/// 同步完成数据
213#[derive(Debug, Clone, Serialize, Deserialize)]
214pub struct SyncCompletedData {
215    pub sync_type: String,
216    pub timestamp: String,
217    #[serde(default)]
218    pub item_count: i32,
219}
220
221/// 数据更新数据
222#[derive(Debug, Clone, Serialize, Deserialize)]
223pub struct DataUpdatedData {
224    pub data_type: String,
225    pub operation: String, // created, updated, deleted
226    #[serde(skip_serializing_if = "Option::is_none")]
227    pub data: Option<Value>,
228    pub timestamp: String,
229}
230
231/// 原始 MQTT 消息
232#[derive(Debug, Clone)]
233pub struct RawMqttMessage {
234    pub topic: String,
235    pub payload: Vec<u8>,
236    pub qos: u8,
237}
238
239/// 事件元数据
240#[derive(Debug, Clone, Serialize, Deserialize)]
241pub struct EventMeta {
242    pub seq_id: i64,
243    pub timestamp: String,
244    #[serde(skip_serializing_if = "Option::is_none")]
245    pub source: Option<String>,
246}
247
248/// 完整事件包装(包含元数据)
249#[derive(Debug, Clone, Serialize, Deserialize)]
250pub struct ServerEventEnvelope {
251    #[serde(flatten)]
252    pub event: ServerEvent,
253    #[serde(flatten)]
254    pub meta: EventMeta,
255}
256
257impl ServerEvent {
258    /// 获取事件类型字符串
259    pub fn event_type(&self) -> &'static str {
260        match self {
261            ServerEvent::NewMessage { .. } => "new_message",
262            ServerEvent::SyncMessageHistory { .. } => "sync_message_history",
263            ServerEvent::MessageStatusUpdated { .. } => "message_status_updated",
264            ServerEvent::MessageDeleted { .. } => "message_deleted",
265            ServerEvent::SyncConversationList { .. } => "sync_conversation_list",
266            ServerEvent::ConversationUpdated { .. } => "conversation_updated",
267            ServerEvent::ConversationMembersUpdated { .. } => "conversation_members_updated",
268            ServerEvent::AddedToConversation { .. } => "added_to_conversation",
269            ServerEvent::RemovedFromConversation { .. } => "removed_from_conversation",
270            ServerEvent::SyncFriendList { .. } => "sync_friend_list",
271            ServerEvent::FriendshipUpdated { .. } => "friendship_updated",
272            ServerEvent::FriendDeleted { .. } => "friend_deleted",
273            ServerEvent::FriendRequestReceived { .. } => "friend_request_received",
274            ServerEvent::FriendRequestResponded { .. } => "friend_request_responded",
275            ServerEvent::SyncFriendRequests { .. } => "sync_friend_requests",
276            ServerEvent::UserPresenceUpdated { .. } => "user_presence_updated",
277            ServerEvent::UserInfoUpdated { .. } => "user_info_updated",
278            ServerEvent::AddedToBlacklist { .. } => "added_to_blacklist",
279            ServerEvent::RemovedFromBlacklist { .. } => "removed_from_blacklist",
280            ServerEvent::Notification { .. } => "notification",
281            ServerEvent::SystemMessage { .. } => "system_message",
282            ServerEvent::SyncCompleted { .. } => "sync_completed",
283            ServerEvent::DataUpdated { .. } => "data_updated",
284        }
285    }
286
287    /// 判断是否为数据同步事件
288    pub fn is_sync_event(&self) -> bool {
289        matches!(
290            self,
291            ServerEvent::SyncMessageHistory { .. }
292                | ServerEvent::SyncConversationList { .. }
293                | ServerEvent::SyncFriendList { .. }
294                | ServerEvent::SyncFriendRequests { .. }
295                | ServerEvent::SyncCompleted { .. }
296        )
297    }
298
299    /// 获取关联的会话 ID(如果有)
300    pub fn conversation_id(&self) -> Option<String> {
301        match self {
302            ServerEvent::NewMessage { data } => Some(data.conversation_id.clone()),
303            ServerEvent::SyncMessageHistory { data } => Some(data.conversation_id.clone()),
304            ServerEvent::MessageStatusUpdated { data } => Some(data.conversation_id.clone()),
305            ServerEvent::MessageDeleted { data } => Some(data.conversation_id.clone()),
306            ServerEvent::ConversationUpdated { data } => Some(data.id.clone()),
307            ServerEvent::ConversationMembersUpdated { data } => Some(data.conversation_id.clone()),
308            ServerEvent::AddedToConversation { data } => Some(data.id.clone()),
309            ServerEvent::RemovedFromConversation { data } => Some(data.conversation_id.clone()),
310            _ => None,
311        }
312    }
313
314    /// 获取关联的用户 ID(如果有)
315    pub fn user_id(&self) -> Option<String> {
316        match self {
317            ServerEvent::UserPresenceUpdated { data } => Some(data.user_id.clone()),
318            ServerEvent::UserInfoUpdated { data } => Some(data.id.clone()),
319            ServerEvent::FriendshipUpdated { data } => Some(data.friend_id.clone()),
320            ServerEvent::FriendDeleted { data } => Some(data.friend_id.clone()),
321            _ => None,
322        }
323    }
324}