Refactor CS membership query
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user