Use member profile rather than global profile for joined_members (fixes #121)

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-08-10 23:48:25 +00:00
parent 0c8df52d18
commit a3666fe672

View File

@@ -1,5 +1,5 @@
use axum::extract::State; use axum::extract::State;
use futures::{FutureExt, StreamExt, future::join}; use futures::{FutureExt, StreamExt};
use ruma::{ use ruma::{
api::client::membership::{ api::client::membership::{
get_member_events::{self, v3::MembershipEventFilter}, get_member_events::{self, v3::MembershipEventFilter},
@@ -10,14 +10,7 @@ use ruma::{
room::member::{MembershipState, RoomMemberEventContent}, room::member::{MembershipState, RoomMemberEventContent},
}, },
}; };
use tuwunel_core::{ use tuwunel_core::{Err, Result, at, matrix::Event, utils::stream::ReadyExt};
Err, Result, at,
matrix::Event,
utils::{
future::TryExtExt,
stream::{BroadbandExt, ReadyExt},
},
};
use crate::Ruma; use crate::Ruma;
@@ -31,19 +24,17 @@ pub(crate) async fn get_member_events_route(
State(services): State<crate::State>, State(services): State<crate::State>,
body: Ruma<get_member_events::v3::Request>, body: Ruma<get_member_events::v3::Request>,
) -> Result<get_member_events::v3::Response> { ) -> Result<get_member_events::v3::Response> {
let sender_user = body.sender_user();
let membership = body.membership.as_ref();
let not_membership = body.not_membership.as_ref();
if !services if !services
.rooms .rooms
.state_accessor .state_accessor
.user_can_see_state_events(sender_user, &body.room_id) .user_can_see_state_events(body.sender_user(), &body.room_id)
.await .await
{ {
return Err!(Request(Forbidden("You don't have permission to view this room."))); return Err!(Request(Forbidden("You don't have permission to view this room.")));
} }
let membership = body.membership.as_ref();
let not_membership = body.not_membership.as_ref();
Ok(get_member_events::v3::Response { Ok(get_member_events::v3::Response {
chunk: services chunk: services
.rooms .rooms
@@ -82,19 +73,23 @@ pub(crate) async fn joined_members_route(
Ok(joined_members::v3::Response { Ok(joined_members::v3::Response {
joined: services joined: services
.rooms .rooms
.state_cache .state_accessor
.room_members(&body.room_id) .room_state_full(&body.room_id)
.map(ToOwned::to_owned) .ready_filter_map(Result::ok)
.broad_then(async |user_id| { .ready_filter(|((ty, _), _)| *ty == StateEventType::RoomMember)
let (display_name, avatar_url) = join( .map(at!(1))
services.users.displayname(&user_id).ok(), .ready_filter_map(|pdu| {
services.users.avatar_url(&user_id).ok(), let content = pdu.get_content::<RoomMemberEventContent>().ok()?;
) let sender = pdu.sender().to_owned();
.await; let member = RoomMember {
display_name: content.displayname,
avatar_url: content.avatar_url,
};
(user_id, RoomMember { display_name, avatar_url }) Some((sender, member))
}) })
.collect() .collect()
.boxed()
.await, .await,
}) })
} }