Support listing room members (#6)

This commit is contained in:
Ulyssa 2023-01-04 12:51:33 -08:00
parent d038da6844
commit 8ed037afca
No known key found for this signature in database
GPG key ID: 1B3965A3D18B9B64
11 changed files with 316 additions and 52 deletions

View file

@ -15,7 +15,7 @@ use matrix_sdk::{
encryption::verification::{SasVerification, Verification},
event_handler::Ctx,
reqwest,
room::{Messages, MessagesOptions, Room as MatrixRoom},
room::{Messages, MessagesOptions, Room as MatrixRoom, RoomMember},
ruma::{
api::client::{
room::create_room::v3::{Request as CreateRoomRequest, RoomPreset},
@ -102,6 +102,7 @@ pub enum WorkerTask {
GetRoom(OwnedRoomId, ClientReply<IambResult<(MatrixRoom, DisplayName)>>),
JoinRoom(String, ClientReply<IambResult<OwnedRoomId>>),
JoinedRooms(ClientReply<Vec<(MatrixRoom, DisplayName)>>),
Members(OwnedRoomId, ClientReply<IambResult<Vec<RoomMember>>>),
SpaceMembers(OwnedRoomId, ClientReply<IambResult<Vec<OwnedRoomId>>>),
Spaces(ClientReply<Vec<(MatrixRoom, DisplayName)>>),
SendMessage(OwnedRoomId, String, ClientReply<IambResult<EchoPair>>),
@ -187,6 +188,14 @@ impl Requester {
return response.recv();
}
pub fn members(&self, room_id: OwnedRoomId) -> IambResult<Vec<RoomMember>> {
let (reply, response) = oneshot();
self.tx.send(WorkerTask::Members(room_id, reply)).unwrap();
return response.recv();
}
pub fn space_members(&self, space: OwnedRoomId) -> IambResult<Vec<OwnedRoomId>> {
let (reply, response) = oneshot();
@ -327,6 +336,10 @@ impl ClientWorker {
assert!(self.initialized);
reply.send(self.login_and_sync(style).await);
},
WorkerTask::Members(room_id, reply) => {
assert!(self.initialized);
reply.send(self.members(room_id).await);
},
WorkerTask::SpaceMembers(space, reply) => {
assert!(self.initialized);
reply.send(self.space_members(space).await);
@ -744,6 +757,14 @@ impl ClientWorker {
}
}
async fn members(&mut self, room_id: OwnedRoomId) -> IambResult<Vec<RoomMember>> {
if let Some(room) = self.client.get_room(room_id.as_ref()) {
Ok(room.active_members().await.map_err(IambError::from)?)
} else {
Err(IambError::UnknownRoom(room_id).into())
}
}
async fn space_members(&mut self, space: OwnedRoomId) -> IambResult<Vec<OwnedRoomId>> {
let mut req = SpaceHierarchyRequest::new(&space);
req.limit = Some(1000u32.into());