From 16f0cec91104f4d0fa6ab1e490e81633ae78c190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 11 Nov 2025 17:30:00 +0100 Subject: [PATCH 1/4] feat(sdk): Add a power level value field for `StateEventType::SpaceChild` --- crates/matrix-sdk/src/room/power_levels.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/matrix-sdk/src/room/power_levels.rs b/crates/matrix-sdk/src/room/power_levels.rs index 8f0a7503e07..ab0c5a5e31f 100644 --- a/crates/matrix-sdk/src/room/power_levels.rs +++ b/crates/matrix-sdk/src/room/power_levels.rs @@ -54,6 +54,9 @@ pub struct RoomPowerLevelChanges { /// The level required to change the room's topic. #[cfg_attr(feature = "uniffi", uniffi(default = None))] pub room_topic: Option, + /// The level required to modify rooms in this space. + #[cfg_attr(feature = "uniffi", uniffi(default = None))] + pub manage_rooms_in_space: Option, } impl RoomPowerLevelChanges { @@ -70,6 +73,7 @@ impl RoomPowerLevelChanges { room_name: None, room_avatar: None, room_topic: None, + manage_rooms_in_space: None, } } } @@ -105,6 +109,11 @@ impl From for RoomPowerLevelChanges { .get(&StateEventType::RoomTopic.into()) .map(|v| (*v).into()) .or(Some(value.state_default.into())), + manage_rooms_in_space: value + .events + .get(&StateEventType::SpaceChild.into()) + .map(|v| (*v).into()) + .or(Some(value.state_default.into())), } } } @@ -150,6 +159,10 @@ impl RoomPowerLevelsExt for RoomPowerLevels { if let Some(room_topic) = settings.room_topic { self.events.insert(StateEventType::RoomTopic.into(), room_topic.try_into()?); } + if let Some(manage_rooms_in_space) = settings.manage_rooms_in_space { + self.events + .insert(StateEventType::SpaceChild.into(), manage_rooms_in_space.try_into()?); + } Ok(()) } @@ -223,6 +236,7 @@ mod tests { room_name: None, room_avatar: None, room_topic: None, + manage_rooms_in_space: None, }; // When applying the settings to the power levels. @@ -259,6 +273,7 @@ mod tests { room_name: Some(new_level.into()), room_avatar: Some(new_level.into()), room_topic: Some(new_level.into()), + manage_rooms_in_space: Some(new_level.into()), }; // When applying the settings to the power levels. @@ -272,6 +287,7 @@ mod tests { (StateEventType::RoomName.into(), new_level), (StateEventType::RoomAvatar.into(), new_level), (StateEventType::RoomTopic.into(), new_level), + (StateEventType::SpaceChild.into(), new_level), ]) ); // And the rest should remain unchanged. @@ -294,6 +310,7 @@ mod tests { (StateEventType::RoomName.into(), original_level), (StateEventType::RoomAvatar.into(), original_level), (StateEventType::RoomTopic.into(), original_level), + (StateEventType::SpaceChild.into(), original_level), ]); let settings = RoomPowerLevelChanges { @@ -307,6 +324,7 @@ mod tests { room_name: Some(power_levels.state_default.into()), room_avatar: None, room_topic: None, + manage_rooms_in_space: None, }; // When applying the settings to the power levels. @@ -321,6 +339,7 @@ mod tests { (StateEventType::RoomName.into(), power_levels.state_default), (StateEventType::RoomAvatar.into(), original_level), (StateEventType::RoomTopic.into(), original_level), + (StateEventType::SpaceChild.into(), original_level), ]) ); // And the rest should remain unchanged. From 95190ea7578f35a45b523fd01aea53fbee94c39c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Tue, 11 Nov 2025 17:30:21 +0100 Subject: [PATCH 2/4] feat(ffi): Expose the `manage_rooms_in_space` power level in the FFI layer --- bindings/matrix-sdk-ffi/src/room/power_levels.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bindings/matrix-sdk-ffi/src/room/power_levels.rs b/bindings/matrix-sdk-ffi/src/room/power_levels.rs index 766391bdbfa..b3e736db1e2 100644 --- a/bindings/matrix-sdk-ffi/src/room/power_levels.rs +++ b/bindings/matrix-sdk-ffi/src/room/power_levels.rs @@ -206,6 +206,8 @@ pub struct RoomPowerLevelsValues { pub room_avatar: i64, /// The level required to change the room's topic. pub room_topic: i64, + /// The level required to modify rooms in this space. + pub manage_rooms_in_space: i64, } impl From for RoomPowerLevelsValues { @@ -228,6 +230,7 @@ impl From for RoomPowerLevelsValues { room_name: state_event_level_for(&value, &TimelineEventType::RoomName), room_avatar: state_event_level_for(&value, &TimelineEventType::RoomAvatar), room_topic: state_event_level_for(&value, &TimelineEventType::RoomTopic), + manage_rooms_in_space: state_event_level_for(&value, &TimelineEventType::SpaceChild), } } } From 386633b7d75c84e079c4d0960d6ca0202befbfd0 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 13 Nov 2025 08:58:08 +0200 Subject: [PATCH 3/4] Rename `manage_rooms_in_space` to `space_child` for clarity and to have it match the other fields which take after their underlying state event name. --- .../matrix-sdk-ffi/src/room/power_levels.rs | 6 +++--- crates/matrix-sdk/src/room/power_levels.rs | 19 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/bindings/matrix-sdk-ffi/src/room/power_levels.rs b/bindings/matrix-sdk-ffi/src/room/power_levels.rs index b3e736db1e2..d257aaf2dc4 100644 --- a/bindings/matrix-sdk-ffi/src/room/power_levels.rs +++ b/bindings/matrix-sdk-ffi/src/room/power_levels.rs @@ -206,8 +206,8 @@ pub struct RoomPowerLevelsValues { pub room_avatar: i64, /// The level required to change the room's topic. pub room_topic: i64, - /// The level required to modify rooms in this space. - pub manage_rooms_in_space: i64, + /// The level required to change the space's children. + pub space_child: i64, } impl From for RoomPowerLevelsValues { @@ -230,7 +230,7 @@ impl From for RoomPowerLevelsValues { room_name: state_event_level_for(&value, &TimelineEventType::RoomName), room_avatar: state_event_level_for(&value, &TimelineEventType::RoomAvatar), room_topic: state_event_level_for(&value, &TimelineEventType::RoomTopic), - manage_rooms_in_space: state_event_level_for(&value, &TimelineEventType::SpaceChild), + space_child: state_event_level_for(&value, &TimelineEventType::SpaceChild), } } } diff --git a/crates/matrix-sdk/src/room/power_levels.rs b/crates/matrix-sdk/src/room/power_levels.rs index ab0c5a5e31f..cb33c1ab20a 100644 --- a/crates/matrix-sdk/src/room/power_levels.rs +++ b/crates/matrix-sdk/src/room/power_levels.rs @@ -54,9 +54,9 @@ pub struct RoomPowerLevelChanges { /// The level required to change the room's topic. #[cfg_attr(feature = "uniffi", uniffi(default = None))] pub room_topic: Option, - /// The level required to modify rooms in this space. + /// The level required to change the space's children. #[cfg_attr(feature = "uniffi", uniffi(default = None))] - pub manage_rooms_in_space: Option, + pub space_child: Option, } impl RoomPowerLevelChanges { @@ -73,7 +73,7 @@ impl RoomPowerLevelChanges { room_name: None, room_avatar: None, room_topic: None, - manage_rooms_in_space: None, + space_child: None, } } } @@ -109,7 +109,7 @@ impl From for RoomPowerLevelChanges { .get(&StateEventType::RoomTopic.into()) .map(|v| (*v).into()) .or(Some(value.state_default.into())), - manage_rooms_in_space: value + space_child: value .events .get(&StateEventType::SpaceChild.into()) .map(|v| (*v).into()) @@ -159,9 +159,8 @@ impl RoomPowerLevelsExt for RoomPowerLevels { if let Some(room_topic) = settings.room_topic { self.events.insert(StateEventType::RoomTopic.into(), room_topic.try_into()?); } - if let Some(manage_rooms_in_space) = settings.manage_rooms_in_space { - self.events - .insert(StateEventType::SpaceChild.into(), manage_rooms_in_space.try_into()?); + if let Some(space_child) = settings.space_child { + self.events.insert(StateEventType::SpaceChild.into(), space_child.try_into()?); } Ok(()) @@ -236,7 +235,7 @@ mod tests { room_name: None, room_avatar: None, room_topic: None, - manage_rooms_in_space: None, + space_child: None, }; // When applying the settings to the power levels. @@ -273,7 +272,7 @@ mod tests { room_name: Some(new_level.into()), room_avatar: Some(new_level.into()), room_topic: Some(new_level.into()), - manage_rooms_in_space: Some(new_level.into()), + space_child: Some(new_level.into()), }; // When applying the settings to the power levels. @@ -324,7 +323,7 @@ mod tests { room_name: Some(power_levels.state_default.into()), room_avatar: None, room_topic: None, - manage_rooms_in_space: None, + space_child: None, }; // When applying the settings to the power levels. From 0e44b20aa768fa138c2586cb41424d06d49289da Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Thu, 13 Nov 2025 09:04:42 +0200 Subject: [PATCH 4/4] Add changelogs --- bindings/matrix-sdk-ffi/CHANGELOG.md | 2 ++ crates/matrix-sdk/CHANGELOG.md | 3 +++ 2 files changed, 5 insertions(+) diff --git a/bindings/matrix-sdk-ffi/CHANGELOG.md b/bindings/matrix-sdk-ffi/CHANGELOG.md index 8a566d9615e..9f4f5e63b24 100644 --- a/bindings/matrix-sdk-ffi/CHANGELOG.md +++ b/bindings/matrix-sdk-ffi/CHANGELOG.md @@ -8,6 +8,8 @@ All notable changes to this project will be documented in this file. ### Breaking changes +- Expose the power level required to modify `m.space.child` on + `room::power_levels::RoomPowerLevelsValues`. - Rename `Client::login_with_qr_code` to `Client::new_login_with_qr_code_handler`. ([#5836](https://github.com/matrix-org/matrix-rust-sdk/pull/5836)) - Add the `sqlite` feature, along with the `indexeddb` feature, to enable either diff --git a/crates/matrix-sdk/CHANGELOG.md b/crates/matrix-sdk/CHANGELOG.md index b6aa5872eba..0ece703797d 100644 --- a/crates/matrix-sdk/CHANGELOG.md +++ b/crates/matrix-sdk/CHANGELOG.md @@ -8,6 +8,9 @@ All notable changes to this project will be documented in this file. ### Features +- Expose the power level required to modify `m.space.child` on + `room::power_levels::RoomPowerLevelChanges`. + ([#5857](https://github.com/matrix-org/matrix-rust-sdk/pull/5857)) - Add the `Client::server_versions_cached()` method. ([#5853](https://github.com/matrix-org/matrix-rust-sdk/pull/5853)) - Extend `authentication::oauth::OAuth::grant_login_with_qr_code` to support granting