• 简体中文
  • 房间与事件

    事件模型

    Matrix 中的每个操作都是一个事件。事件在每个房间内形成有向无环图(DAG)。

    事件类型

    类型用途示例
    m.room.create房间创建每个房间的第一个事件
    m.room.member成员变更加入、退出、邀请、封禁
    m.room.name房间显示名称{"name": "综合讨论"}
    m.room.topic房间话题{"topic": "讨论区"}
    m.room.message聊天消息{"msgtype": "m.text", "body": "你好"}
    m.room.state房间状态自定义状态事件
    m.room.redaction事件撤回移除事件内容
    m.relates_to事件关系线程、批注、编辑

    事件结构

    {
      "event_id": "$abc123",
      "room_id": "!room:localhost",
      "sender": "@alice:localhost",
      "type": "m.room.message",
      "state_key": null,
      "content": {
        "msgtype": "m.text",
        "body": "你好,Matrix!"
      },
      "origin_server_ts": 1625000000000,
      "unsigned": {
        "age": 12345
      }
    }

    房间生命周期

    创建

    POST /createRoom → 创建 m.room.create 事件
                     → 创建 m.room.member(创建者加入)
                     → 创建 m.room.power_levels
                     → 创建 m.room.history_visibility

    房间创建从 creation_content.type 中提取类型以支持:

    • 普通房间(默认)
    • 空间m.space

    状态事件

    状态事件具有 state_key,表示房间的当前状态。只有具有给定 (type, state_key) 对的最新事件才被视为"当前"。

    成员关系

    m.room.member 事件跟踪用户成员状态:

    成员状态含义
    join用户在房间中
    invite用户已被邀请
    leave用户已退出或被踢出
    ban用户已被封禁

    成员变更会触发:

    • 设备列表变更通知(/sync 中的 device_lists.changed
    • 房间成员计数更新
    • 权限级别重算

    事件关系

    事件可以通过 m.relates_to 相互关联:

    关系类型用途示例
    m.thread线程对话在线程中回复
    m.annotation反应/表情对消息点 👍
    m.replace编辑编辑已发送的消息
    m.reference引用引用另一个事件

    关系持久化在 event_relations 表中,通过 /relations API 查询。

    事件撤回

    撤回会移除事件内容,同时保留事件包装器。被撤回的事件保留其 event_idroom_idsendertype,但内容被清空,仅保留每种事件类型的白名单字段。

    空间层级

    空间是 creation_content.type = "m.space" 的房间。子房间通过 m.space.child 状态事件关联。层级 API 遍历此树以返回房间结构:

    GET /hierarchy/{roomId} → {
      rooms: [
        { room_id, name, topic, num_joined_members, room_type }
      ]
    }

    层级遍历具有循环安全性,并进行权限过滤(只返回请求者可见的房间)。