Rust矩阵事件处理库ruma-events的使用,支持Matrix协议的高效事件解析与序列化
ruma-events
用于Matrix协议中可共享于客户端和服务器代码的事件序列化类型库。
安装
在项目目录中运行以下Cargo命令:
cargo add ruma-events
或者在Cargo.toml中添加以下行:
ruma-events = "0.30.4"
示例代码
以下是一个使用ruma-events处理Matrix事件的完整示例:
use ruma_events::{room::message::MessageEventContent, AnyMessageEventContent, EventJson};
use serde_json::json;
fn main() {
// 创建一个文本消息事件内容
let message_content = MessageEventContent::text_plain("Hello Matrix!");
// 将消息内容转换为AnyMessageEventContent
let any_message = AnyMessageEventContent::RoomMessage(message_content);
// 序列化为JSON
let event_json = EventJson::new(any_message).unwrap();
let serialized = serde_json::to_string(&event_json).unwrap();
println!("Serialized event: {}", serialized);
// 反序列化示例
let json_data = json!({
"content": {
"body": "Hello from JSON",
"msgtype": "m.text"
},
"type": "m.room.message"
});
let deserialized: EventJson<AnyMessageEventContent> = serde_json::from_value(json_data).unwrap();
println!("Deserialized event type: {}", deserialized.get_ref().event_type());
}
完整示例demo
use ruma_events::{
room::message::{MessageEventContent, MessageType},
AnyMessageEventContent, EventJson,
};
use serde_json::{json, Value};
fn main() -> Result<(), Box<dyn std::error::Error>> {
// 示例1: 创建不同类型的消息事件
let text_content = MessageEventContent::text_plain("Hello Matrix!");
let html_content = MessageEventContent::html(
"Hello <b>Matrix</b>!",
"Hello Matrix!",
);
// 示例2: 创建自定义消息类型
let custom_content = MessageEventContent::new(
MessageType::Text,
"Custom message".to_owned(),
).add_extra("custom_field", json!("value"));
// 示例3: 序列化多个事件类型
let events = vec![
AnyMessageEventContent::RoomMessage(text_content),
AnyMessageEventContent::RoomMessage(html_content),
AnyMessageEventContent::RoomMessage(custom_content),
];
for event in events {
let event_json = EventJson::new(event)?;
let serialized = serde_json::to_string_pretty(&event_json)?;
println!("Serialized event:\n{}\n", serialized);
}
// 示例4: 从JSON解析复杂事件
let complex_json = json!({
"type": "m.room.message",
"content": {
"msgtype": "m.text",
"body": "Hello from complex JSON",
"formatted_body": "Hello from <i>complex</i> JSON",
"format": "org.matrix.custom.html",
"custom_data": {"key": "value"}
}
});
let parsed: EventJson<AnyMessageEventContent> = serde_json::from_value(complex_json)?;
println!("Parsed event type: {}", parsed.get_ref().event_type());
Ok(())
}
主要功能
- 提供Matrix协议中各种事件的序列化类型
- 支持高效的事件解析与序列化
- 可同时用于客户端和服务器端开发
- 完善的类型系统确保事件数据的正确性
许可证
MIT License
1 回复
以下是基于您提供的内容整理的完整示例代码:
完整示例:使用 ruma-events 处理 Matrix 事件
use ruma_events::{
room::message::{MessageEventContent, TextMessageEventContent},
AnyMessageEvent, AnyRoomEvent, AnyStateEvent, CustomEventContent, EventJson,
HasDeserializeFields, RoomEventContent,
};
use ruma_identifiers::{EventId, RoomId, UserId};
use serde::{Deserialize, Serialize};
use serde_json::json;
use std::time::{SystemTime, UNIX_EPOCH};
fn main() {
// 示例1:解析事件
parse_message_event();
// 示例2:创建并发送事件
let event = create_message_event();
println!("Created event ID: {}", event.event_id);
// 示例3:处理不同类型的事件
let room_event = serde_json::from_value::<EventJson<AnyRoomEvent>>(json!({
"content": {
"body": "Test message",
"msgtype": "m.text"
},
"event_id": "$test:example.com",
"origin_server_ts": 1_000_001,
"sender": "@user:example.com",
"type": "m.room.message"
})).unwrap();
process_event(room_event);
// 示例4:自定义事件处理
handle_custom_event();
// 示例5:加密事件处理
let encrypted_event = serde_json::from_value::<EventJson<AnyRoomEvent>>(json!({
"content": {
"algorithm": "m.megolm.v1.aes-sha2",
"ciphertext": "AwgAEnACgAk...",
"device_id": "ABC123",
"sender_key": "Abc123",
"session_id": "XYZ789"
},
"event_id": "$encrypted:example.com",
"origin_server_ts": 1_000_002,
"sender": "@user:example.com",
"type": "m.room.encrypted"
})).unwrap();
handle_encrypted_event(encrypted_event);
}
// 示例1:解析消息事件
fn parse_message_event() {
let json_data = json!({
"content": {
"body": "Hello world!",
"msgtype": "m.text"
},
"event_id": "$h29iv0s8:example.com",
"origin_server_ts": 1_000_000,
"sender": "@carl:example.com",
"type": "m.room.message"
});
let event: EventJson<MessageEventContent> =
serde_json::from_value(json_data).unwrap();
println!("[解析事件] 消息内容: {}", event.content.body);
println!("[解析事件] 发送者: {}", event.sender);
}
// 示例2:创建消息事件
fn create_message_event() -> EventJson<MessageEventContent> {
let content = MessageEventContent::Text(TextMessageEventContent {
body: "Hello from Ruma!".to_string(),
formatted: None,
relates_to: None,
});
let event_id = EventId::new("example.com").unwrap();
let sender = UserId::new("example.com").unwrap();
let room_id = RoomId::new("example.com").unwrap();
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_millis() as u64;
EventJson {
content,
event_id,
origin_server_ts: timestamp,
room_id: Some(room_id),
sender,
unsigned: None,
}
}
// 示例3:处理不同类型的事件
fn process_event(event: EventJson<AnyRoomEvent>) {
match event.content {
AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(msg)) => {
println!("[处理事件] 收到消息: {}", msg.body);
}
AnyRoomEvent::State(AnyStateEvent::RoomMember(member)) => {
println!("[处理事件] 成员事件: {}", member.user_id);
}
_ => println!("[处理事件] 未处理的事件类型"),
}
}
// 示例4:自定义事件类型
#[derive(Clone, Debug, Deserialize, Serialize)]
struct MyCustomEventContent {
message: String,
count: u32,
}
impl RoomEventContent for MyCustomEventContent {
fn event_type(&self) -> &str {
"my.custom.event"
}
}
impl HasDeserializeFields for MyCustomEventContent {
fn has_field(_: &str) -> bool {
true
}
}
fn handle_custom_event() {
let json_data = json!({
"content": {
"message": "Custom event",
"count": 42
},
"type": "my.custom.event",
"event_id": "$custom:example.com",
"origin_server_ts": 1_000_000,
"sender": "@user:example.com",
"room_id": "!room:example.com"
});
let event: EventJson<CustomEventContent<MyCustomEventContent>> =
serde_json::from_value(json_data).unwrap();
println!("[自定义事件] 消息: {}", event.content.0.message);
println!("[自定义事件] 计数: {}", event.content.0.count);
}
// 示例5:处理加密事件
fn handle_encrypted_event(event: EventJson<AnyRoomEvent>) {
if let AnyRoomEvent::Message(AnyMessageEvent::RoomEncrypted(encrypted)) = event.content {
println!("[加密事件] 加密算法类型: {}", encrypted.algorithm);
// 实际应用中这里应该添加解密逻辑
}
}
这个完整示例展示了 ruma-events 库的主要功能:
- 解析 Matrix 协议中的消息事件
- 创建并发送新的事件
- 处理不同类型的房间事件
- 定义和处理自定义事件类型
- 处理加密事件
每个功能都有清晰的注释说明,可以直接运行测试。要使用此代码,请确保按照前面提到的 Cargo.toml 配置添加了正确的依赖项。