Skip to main content

tuwunel_service/rooms/state_res/
events.rs

1//! Helper traits and types to work with events (aka PDUs).
2
3pub mod create;
4pub mod join_rules;
5pub mod member;
6pub mod power_levels;
7pub mod third_party_invite;
8
9pub use self::{
10	create::RoomCreateEvent,
11	join_rules::{JoinRule, RoomJoinRulesEvent},
12	member::{RoomMemberEvent, RoomMemberEventContent},
13	power_levels::{RoomPowerLevelsEvent, RoomPowerLevelsIntField},
14	third_party_invite::RoomThirdPartyInviteEvent,
15};
16
17/// Whether the given event is a power event.
18///
19/// Definition in the spec:
20///
21/// > A power event is a state event with type `m.room.power_levels` or
22/// > `m.room.join_rules`, or a
23/// > state event with type `m.room.member` where the `membership` is `leave` or
24/// > `ban` and the
25/// > `sender` does not match the `state_key`. The idea behind this is that
26/// > power events are events
27/// > that might remove someone’s ability to do something in the room.
28///
29/// `m.room.create` is included in the match below, extending the spec
30/// definition to match Synapse and Ruma.
31pub(super) fn is_power_event<Pdu>(event: &Pdu) -> bool
32where
33	Pdu: tuwunel_core::matrix::Event,
34{
35	use ruma::events::{TimelineEventType, room::member::MembershipState};
36
37	match event.event_type() {
38		| TimelineEventType::RoomPowerLevels
39		| TimelineEventType::RoomJoinRules
40		| TimelineEventType::RoomCreate => event.state_key() == Some(""),
41		| TimelineEventType::RoomMember => {
42			let content = RoomMemberEventContent::new(event.content());
43			if content.membership().is_ok_and(|membership| {
44				matches!(membership, MembershipState::Leave | MembershipState::Ban)
45			}) {
46				return Some(event.sender().as_str()) != event.state_key();
47			}
48
49			false
50		},
51		| _ => false,
52	}
53}