use ruma::events::{
AnySyncStateEvent, AnySyncTimelineEvent, SyncStateEvent, TimelineEventType,
room::member::MembershipChange,
};
pub enum TimelineEventFilter {
Include(Vec<TimelineEventCondition>),
Exclude(Vec<TimelineEventCondition>),
}
impl TimelineEventFilter {
pub fn filter(&self, event: &AnySyncTimelineEvent) -> bool {
match self {
Self::Include(conditions) => conditions.iter().any(|c| c.matches(event)),
Self::Exclude(conditions) => !conditions.iter().any(|c| c.matches(event)),
}
}
}
#[derive(Clone)]
pub enum TimelineEventCondition {
EventType(TimelineEventType),
MembershipChange,
ProfileChange,
}
impl TimelineEventCondition {
fn matches(&self, event: &AnySyncTimelineEvent) -> bool {
match self {
Self::EventType(event_type) => event.event_type() == *event_type,
Self::MembershipChange => match event {
AnySyncTimelineEvent::State(AnySyncStateEvent::RoomMember(
SyncStateEvent::Original(ev),
)) => !matches!(ev.membership_change(), MembershipChange::ProfileChanged { .. }),
_ => false,
},
Self::ProfileChange => match event {
AnySyncTimelineEvent::State(AnySyncStateEvent::RoomMember(
SyncStateEvent::Original(ev),
)) => {
matches!(ev.membership_change(), MembershipChange::ProfileChanged { .. })
}
_ => false,
},
}
}
}