docs-matrix-spec/locales/zh-Hans/client-server-api/modules/room_upgrades.md
2025-04-20 16:13:37 +08:00

2.4 KiB
Raw Blame History

房间升级

有时,由于各种原因,房间可能需要升级为不同的房间版本。本模块定义了一种在需要时将房间升级到不同房间版本的方法。

事件

{{% event event="m.room.tombstone" %}}

客户端行为

能够识别 m.room.tombstone 事件及 m.room.create 事件中的 predecessor 字段的客户端,应向用户传达房间已升级的信息。一种实现方式是将旧房间从用户的房间列表中隐藏,并显示横幅,在新旧房间间提供相互链接——确保在引用旧房间时永久链接仍能正常工作。另一种做法是虚拟合并房间,使旧房间的时间线能够无缝延续到新房间的时间线,用户无需在房间间切换即可继续体验。

{{% http-api spec="client-server" api="room_upgrades" %}}

服务器行为

当客户端请求将已知房间升级为已知版本时,服务器应:

  1. 检查用户有权限在房间中发送 m.room.tombstone 事件。

  2. {{% changed-in v="1.4" %}} 创建一个替代房间,并在新房间中发送包含 predecessor 字段、相应 room_version 以及从前置房间复制的 type 字段的 m.room.create 事件。如果前一个房间未设置 type,则新房间的创建事件同样不指定 type

  3. 将可转移的状态事件复制到新房间。具体转移哪些内容留给实现方决定,不过推荐转移的状态事件包括:

    • m.room.server_acl
    • m.room.encryption
    • m.room.name
    • m.room.avatar
    • m.room.topic
    • m.room.guest_access
    • m.room.history_visibility
    • m.room.join_rules
    • m.room.power_levels

    会员事件不应用于转移到新房间,这是因为服务器在技术上无法冒充来自其他主服务器的用户。此外,服务器也不应转移对发送者有敏感要求的状态事件,例如 Matrix 命名空间之外的事件,客户端可能要求这些事件的发送者满足特定条件。

  4. 将所有本地别名迁移到新房间。

  5. 向旧房间发送 m.room.tombstone 事件,以指示该房间不再建议继续使用。

  6. 如有可能还应修改旧房间的权限级别power levels以阻止发送事件和邀请新用户。例如events_defaultinvite 设置为 50users_default + 1 中的较大者。

当用户加入新房间时,服务器应自动转移或复制用户的一些个性化设置,如通知、标签等。