2.4 KiB
房间升级
有时,由于各种原因,房间可能需要升级为不同的房间版本。本模块定义了一种在需要时将房间升级到不同房间版本的方法。
事件
{{% event event="m.room.tombstone" %}}
客户端行为
能够识别 m.room.tombstone
事件及 m.room.create
事件中的 predecessor
字段的客户端,应向用户传达房间已升级的信息。一种实现方式是将旧房间从用户的房间列表中隐藏,并显示横幅,在新旧房间间提供相互链接——确保在引用旧房间时永久链接仍能正常工作。另一种做法是虚拟合并房间,使旧房间的时间线能够无缝延续到新房间的时间线,用户无需在房间间切换即可继续体验。
{{% http-api spec="client-server" api="room_upgrades" %}}
服务器行为
当客户端请求将已知房间升级为已知版本时,服务器应:
-
检查用户有权限在房间中发送
m.room.tombstone
事件。 -
{{% changed-in v="1.4" %}} 创建一个替代房间,并在新房间中发送包含
predecessor
字段、相应room_version
以及从前置房间复制的type
字段的m.room.create
事件。如果前一个房间未设置type
,则新房间的创建事件同样不指定type
。 -
将可转移的状态事件复制到新房间。具体转移哪些内容留给实现方决定,不过推荐转移的状态事件包括:
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 命名空间之外的事件,客户端可能要求这些事件的发送者满足特定条件。
-
将所有本地别名迁移到新房间。
-
向旧房间发送
m.room.tombstone
事件,以指示该房间不再建议继续使用。 -
如有可能,还应修改旧房间的权限级别(power levels),以阻止发送事件和邀请新用户。例如,将
events_default
和invite
设置为50
与users_default + 1
中的较大者。
当用户加入新房间时,服务器应自动转移或复制用户的一些个性化设置,如通知、标签等。