Skip to content

Commit e673f85

Browse files
Velin92poljar
authored andcommitted
feature (bindings): expose beacon and beacon_info power levels on the FFI
1 parent 9909bec commit e673f85

2 files changed

Lines changed: 94 additions & 2 deletions

File tree

bindings/matrix-sdk-ffi/src/room/power_levels.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ use std::collections::HashMap;
1717
use anyhow::Result;
1818
use ruma::{
1919
OwnedUserId, UserId,
20-
events::{TimelineEventType, room::power_levels::RoomPowerLevels as RumaPowerLevels},
20+
events::{
21+
MessageLikeEventType as RumaMessageLikeEventType, StateEventType as RumaStateEventType,
22+
TimelineEventType, room::power_levels::RoomPowerLevels as RumaPowerLevels,
23+
},
2124
};
2225

2326
use crate::{
@@ -226,6 +229,10 @@ pub struct RoomPowerLevelsValues {
226229
pub room_topic: i64,
227230
/// The level required to change the space's children.
228231
pub space_child: i64,
232+
/// The level required to send a beacon (live location) message event.
233+
pub beacon: i64,
234+
/// The level required to send a beacon info state event.
235+
pub beacon_info: i64,
229236
}
230237

231238
impl From<RumaPowerLevels> for RoomPowerLevelsValues {
@@ -237,6 +244,13 @@ impl From<RumaPowerLevels> for RoomPowerLevelsValues {
237244
let default_state: i64 = power_levels.state_default.into();
238245
power_levels.events.get(event_type).map_or(default_state, |&level| level.into())
239246
}
247+
fn message_event_level_for(
248+
power_levels: &RumaPowerLevels,
249+
event_type: &TimelineEventType,
250+
) -> i64 {
251+
let default_events: i64 = power_levels.events_default.into();
252+
power_levels.events.get(event_type).map_or(default_events, |&level| level.into())
253+
}
240254
Self {
241255
ban: value.ban.into(),
242256
invite: value.invite.into(),
@@ -249,6 +263,8 @@ impl From<RumaPowerLevels> for RoomPowerLevelsValues {
249263
room_avatar: state_event_level_for(&value, &TimelineEventType::RoomAvatar),
250264
room_topic: state_event_level_for(&value, &TimelineEventType::RoomTopic),
251265
space_child: state_event_level_for(&value, &TimelineEventType::SpaceChild),
266+
beacon: message_event_level_for(&value, &RumaMessageLikeEventType::Beacon.into()),
267+
beacon_info: state_event_level_for(&value, &RumaStateEventType::BeaconInfo.into()),
252268
}
253269
}
254270
}

crates/matrix-sdk/src/room/power_levels.rs

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::collections::HashMap;
55
use ruma::{
66
OwnedUserId,
77
events::{
8-
StateEventType,
8+
MessageLikeEventType, StateEventType,
99
room::power_levels::{
1010
PossiblyRedactedRoomPowerLevelsEventContent, RoomPowerLevels,
1111
RoomPowerLevelsEventContent,
@@ -57,6 +57,12 @@ pub struct RoomPowerLevelChanges {
5757
/// The level required to change the space's children.
5858
#[cfg_attr(feature = "uniffi", uniffi(default = None))]
5959
pub space_child: Option<i64>,
60+
/// The level required to send a beacon (live location) message event.
61+
#[cfg_attr(feature = "uniffi", uniffi(default = None))]
62+
pub beacon: Option<i64>,
63+
/// The level required to send a beacon info state event.
64+
#[cfg_attr(feature = "uniffi", uniffi(default = None))]
65+
pub beacon_info: Option<i64>,
6066
}
6167

6268
impl RoomPowerLevelChanges {
@@ -74,6 +80,8 @@ impl RoomPowerLevelChanges {
7480
room_avatar: None,
7581
room_topic: None,
7682
space_child: None,
83+
beacon: None,
84+
beacon_info: None,
7785
}
7886
}
7987
}
@@ -114,6 +122,16 @@ impl From<RoomPowerLevels> for RoomPowerLevelChanges {
114122
.get(&StateEventType::SpaceChild.into())
115123
.map(|v| (*v).into())
116124
.or(Some(value.state_default.into())),
125+
beacon: value
126+
.events
127+
.get(&MessageLikeEventType::Beacon.into())
128+
.map(|v| (*v).into())
129+
.or(Some(value.events_default.into())),
130+
beacon_info: value
131+
.events
132+
.get(&StateEventType::BeaconInfo.into())
133+
.map(|v| (*v).into())
134+
.or(Some(value.state_default.into())),
117135
}
118136
}
119137
}
@@ -162,6 +180,12 @@ impl RoomPowerLevelsExt for RoomPowerLevels {
162180
if let Some(space_child) = settings.space_child {
163181
self.events.insert(StateEventType::SpaceChild.into(), space_child.try_into()?);
164182
}
183+
if let Some(beacon) = settings.beacon {
184+
self.events.insert(MessageLikeEventType::Beacon.into(), beacon.try_into()?);
185+
}
186+
if let Some(beacon_info) = settings.beacon_info {
187+
self.events.insert(StateEventType::BeaconInfo.into(), beacon_info.try_into()?);
188+
}
165189

166190
Ok(())
167191
}
@@ -236,6 +260,8 @@ mod tests {
236260
room_avatar: None,
237261
room_topic: None,
238262
space_child: None,
263+
beacon: None,
264+
beacon_info: None,
239265
};
240266

241267
// When applying the settings to the power levels.
@@ -273,6 +299,8 @@ mod tests {
273299
room_avatar: Some(new_level.into()),
274300
room_topic: Some(new_level.into()),
275301
space_child: Some(new_level.into()),
302+
beacon: None,
303+
beacon_info: None,
276304
};
277305

278306
// When applying the settings to the power levels.
@@ -324,6 +352,8 @@ mod tests {
324352
room_avatar: None,
325353
room_topic: None,
326354
space_child: None,
355+
beacon: None,
356+
beacon_info: None,
327357
};
328358

329359
// When applying the settings to the power levels.
@@ -351,6 +381,52 @@ mod tests {
351381
assert_eq!(power_levels.users_default, original_levels.users_default);
352382
}
353383

384+
#[test]
385+
fn test_apply_beacon_settings() {
386+
// Given a set of power levels and some settings that only change the beacon
387+
// and beacon_info event levels.
388+
let mut power_levels = default_power_levels();
389+
390+
let new_level = int!(25);
391+
let settings = RoomPowerLevelChanges {
392+
ban: None,
393+
invite: None,
394+
kick: None,
395+
redact: None,
396+
events_default: None,
397+
state_default: None,
398+
users_default: None,
399+
room_name: None,
400+
room_avatar: None,
401+
room_topic: None,
402+
space_child: None,
403+
beacon: Some(new_level.into()),
404+
beacon_info: Some(new_level.into()),
405+
};
406+
407+
// When applying the settings to the power levels.
408+
let original_levels = power_levels.clone();
409+
power_levels.apply(settings).unwrap();
410+
411+
// Then levels for the beacon events should be added.
412+
assert_eq!(
413+
power_levels.events.get(&MessageLikeEventType::Beacon.into()).copied(),
414+
Some(new_level)
415+
);
416+
assert_eq!(
417+
power_levels.events.get(&StateEventType::BeaconInfo.into()).copied(),
418+
Some(new_level)
419+
);
420+
// And the rest should remain unchanged.
421+
assert_eq!(power_levels.ban, original_levels.ban);
422+
assert_eq!(power_levels.invite, original_levels.invite);
423+
assert_eq!(power_levels.kick, original_levels.kick);
424+
assert_eq!(power_levels.redact, original_levels.redact);
425+
assert_eq!(power_levels.events_default, original_levels.events_default);
426+
assert_eq!(power_levels.state_default, original_levels.state_default);
427+
assert_eq!(power_levels.users_default, original_levels.users_default);
428+
}
429+
354430
#[test]
355431
fn test_user_power_level_changes_add_mod() {
356432
// Given a set of power levels and a new set of power levels that adds a new

0 commit comments

Comments
 (0)