Refactor CS membership query

This commit is contained in:
dasha_uwu
2026-02-04 22:22:44 +05:00
committed by Jason Volk
parent baa1e52302
commit a257d846c7
2 changed files with 34 additions and 61 deletions

View File

@@ -14,7 +14,7 @@ use ruma::{
},
};
use tuwunel_core::{
Err, Result, at,
Err, Result, at, is_equal_to, is_not_equal_to,
matrix::Event,
utils::{
future::{BoolExt, TryExtExt},
@@ -53,7 +53,15 @@ pub(crate) async fn get_member_events_route(
.ready_filter_map(Result::ok)
.ready_filter(|((ty, _), _)| *ty == StateEventType::RoomMember)
.map(at!(1))
.ready_filter_map(|pdu| membership_filter(pdu, membership, not_membership))
.ready_filter(|pdu| {
pdu.get_content::<RoomMemberEventContent>()
.is_ok_and(|content| {
let event_membership = content.membership;
membership.is_none_or(is_equal_to!(&event_membership))
&& not_membership.is_none_or(is_not_equal_to!(&event_membership))
})
})
.map(Event::into_format)
.collect()
.boxed()
@@ -94,70 +102,23 @@ pub(crate) async fn joined_members_route(
.ready_filter_map(Result::ok)
.ready_filter(|((ty, _), _)| *ty == StateEventType::RoomMember)
.map(at!(1))
.ready_filter_map(|pdu| membership_filter(pdu, Some(&MembershipState::Join), None))
.ready_filter_map(|pdu| {
let content = pdu.get_content::<RoomMemberEventContent>().ok()?;
let sender = pdu.sender().to_owned();
let member = RoomMember {
display_name: content.displayname,
avatar_url: content.avatar_url,
};
Some((sender, member))
let matches = content.membership == MembershipState::Join;
matches.then(|| {
let sender = pdu.sender().to_owned();
let member = RoomMember {
display_name: content.displayname,
avatar_url: content.avatar_url,
};
(sender, member)
})
})
.collect()
.boxed()
.await,
})
}
fn membership_filter<Pdu: Event>(
pdu: Pdu,
for_membership: Option<&MembershipState>,
not_membership: Option<&MembershipState>,
) -> Option<impl Event> {
let membership_state_filter = match for_membership {
| Some(MembershipState::Ban) => MembershipState::Ban,
| Some(MembershipState::Invite) => MembershipState::Invite,
| Some(MembershipState::Knock) => MembershipState::Knock,
| Some(MembershipState::Leave) => MembershipState::Leave,
| Some(_) | None => MembershipState::Join,
};
let not_membership_state_filter = match not_membership {
| Some(MembershipState::Ban) => MembershipState::Ban,
| Some(MembershipState::Invite) => MembershipState::Invite,
| Some(MembershipState::Join) => MembershipState::Join,
| Some(MembershipState::Knock) => MembershipState::Knock,
| Some(_) | None => MembershipState::Leave,
};
let evt_membership = pdu
.get_content::<RoomMemberEventContent>()
.ok()?
.membership;
if for_membership.is_some() && not_membership.is_some() {
if membership_state_filter != evt_membership
|| not_membership_state_filter == evt_membership
{
None
} else {
Some(pdu)
}
} else if for_membership.is_some() && not_membership.is_none() {
if membership_state_filter != evt_membership {
None
} else {
Some(pdu)
}
} else if not_membership.is_some() && for_membership.is_none() {
if not_membership_state_filter == evt_membership {
None
} else {
Some(pdu)
}
} else {
Some(pdu)
}
}

View File

@@ -147,7 +147,7 @@ macro_rules! is_zero {
};
}
/// Functor for equality i.e. .is_some_and(is_equal!(2))
/// Functor for equality i.e. .is_some_and(is_equal_to!(2))
#[macro_export]
macro_rules! is_equal_to {
($val:ident) => {
@@ -159,6 +159,18 @@ macro_rules! is_equal_to {
};
}
/// Functor for inequality i.e. .is_some_and(is_not_equal_to!(2))
#[macro_export]
macro_rules! is_not_equal_to {
($val:ident) => {
|x| x != $val
};
($val:expr_2021) => {
|x| x != $val
};
}
/// Functor for less i.e. .is_some_and(is_less_than!(2))
#[macro_export]
macro_rules! is_less_than {