@@ -927,32 +927,7 @@ fn filter_timeline_event(
927927 }
928928 }
929929
930- // We don't currently support most state events…
931- AnySyncTimelineEvent :: State ( state) => {
932- // … but we make an exception for knocked state events _if_ the current user
933- // can either accept or decline them.
934- if let AnySyncStateEvent :: RoomMember ( member) = state
935- && matches ! ( member. membership( ) , MembershipState :: Knock )
936- {
937- let can_accept_or_decline_knocks = match power_levels {
938- Some ( ( own_user_id, room_power_levels) ) => {
939- room_power_levels. user_can_invite ( own_user_id)
940- || room_power_levels. user_can_kick ( own_user_id)
941- }
942- _ => false ,
943- } ;
944-
945- // The current user can act on the knock changes, so they should be
946- // displayed
947- if can_accept_or_decline_knocks {
948- // We can only decide whether the user can accept or decline knocks if the
949- // event isn't redacted.
950- return matches ! ( member, SyncStateEvent :: Original ( _) ) ;
951- }
952- }
953-
954- false
955- }
930+ AnySyncTimelineEvent :: State ( state) => filter_any_sync_state_event ( state, power_levels) ,
956931 }
957932}
958933
@@ -993,6 +968,46 @@ fn filter_any_message_like_event_content(event: AnyMessageLikeEventContent) -> b
993968 }
994969}
995970
971+ fn filter_any_sync_state_event (
972+ event : AnySyncStateEvent ,
973+ power_levels : & Option < ( & UserId , RoomPowerLevels ) > ,
974+ ) -> bool {
975+ match event {
976+ AnySyncStateEvent :: RoomMember ( member) => {
977+ match member. membership ( ) {
978+ MembershipState :: Knock => {
979+ let can_accept_or_decline_knocks = match power_levels {
980+ Some ( ( own_user_id, room_power_levels) ) => {
981+ room_power_levels. user_can_invite ( own_user_id)
982+ || room_power_levels. user_can_kick ( own_user_id)
983+ }
984+ _ => false ,
985+ } ;
986+
987+ // The current user can act on the knock changes, so they should be
988+ // displayed
989+ if can_accept_or_decline_knocks {
990+ // We can only decide whether the user can accept or decline knocks if the
991+ // event isn't redacted.
992+ return matches ! ( member, SyncStateEvent :: Original ( _) ) ;
993+ }
994+
995+ false
996+ }
997+
998+ MembershipState :: Invite => {
999+ // We can only decide whether the user is invited if the event isn't redacted.
1000+ matches ! ( member, SyncStateEvent :: Original ( _) )
1001+ }
1002+
1003+ _ => false ,
1004+ }
1005+ }
1006+
1007+ _ => false ,
1008+ }
1009+ }
1010+
9961011#[ cfg( test) ]
9971012mod tests_latest_event_content {
9981013 use std:: ops:: Not ;
0 commit comments