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(())
}

主要功能

  1. 提供Matrix协议中各种事件的序列化类型
  2. 支持高效的事件解析与序列化
  3. 可同时用于客户端和服务器端开发
  4. 完善的类型系统确保事件数据的正确性

许可证

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 库的主要功能:

  1. 解析 Matrix 协议中的消息事件
  2. 创建并发送新的事件
  3. 处理不同类型的房间事件
  4. 定义和处理自定义事件类型
  5. 处理加密事件

每个功能都有清晰的注释说明,可以直接运行测试。要使用此代码,请确保按照前面提到的 Cargo.toml 配置添加了正确的依赖项。

回到顶部