From 68582dd868032944a794f4eb7bfa2e71d29891f5 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 13 Nov 2024 00:59:53 +0000 Subject: [PATCH] add parallel query for current membership state Signed-off-by: Jason Volk --- src/service/rooms/state_cache/mod.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/service/rooms/state_cache/mod.rs b/src/service/rooms/state_cache/mod.rs index 11684eab..6e330fdc 100644 --- a/src/service/rooms/state_cache/mod.rs +++ b/src/service/rooms/state_cache/mod.rs @@ -10,7 +10,7 @@ use conduit::{ warn, Result, }; use database::{serialize_to_vec, Deserialized, Ignore, Interfix, Json, Map}; -use futures::{stream::iter, Stream, StreamExt}; +use futures::{future::join4, stream::iter, Stream, StreamExt}; use itertools::Itertools; use ruma::{ events::{ @@ -566,6 +566,24 @@ impl Service { self.db.userroomid_leftstate.qry(&key).await.is_ok() } + pub async fn user_membership(&self, user_id: &UserId, room_id: &RoomId) -> Option { + let states = join4( + self.is_joined(user_id, room_id), + self.is_left(user_id, room_id), + self.is_invited(user_id, room_id), + self.once_joined(user_id, room_id), + ) + .await; + + match states { + (true, ..) => Some(MembershipState::Join), + (_, true, ..) => Some(MembershipState::Leave), + (_, _, true, ..) => Some(MembershipState::Invite), + (false, false, false, true) => Some(MembershipState::Ban), + _ => None, + } + } + #[tracing::instrument(skip(self), level = "debug")] pub fn servers_invite_via<'a>(&'a self, room_id: &'a RoomId) -> impl Stream + Send + 'a { type KeyVal<'a> = (Ignore, Vec<&'a ServerName>);