@@ -5,7 +5,7 @@ use std::collections::HashMap;
55use 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
6268impl 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