atagen

macltok

public
Star0
Watch0
e7c1b037154dbbc671f2e08356a2201fdb4d1ebb
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
src/normalise/member.rsRust48 lines2.0 KB
1
use matrix_sdk::{Room, room::RoomMember};
2
use ruma::{OwnedUserId, events::room::member::MembershipState};
3
4
use crate::{MediaId, MemberMembership, MemberSummary, Sender};
5
6
pub(crate) fn member_summary(member: RoomMember) -> MemberSummary {
7
    MemberSummary {
8
        user_id: member.user_id().to_owned(),
9
        name: member.name().to_owned(),
10
        display_name: member.display_name().map(ToOwned::to_owned),
11
        avatar: member.avatar_url().map(MediaId::plain),
12
        membership: match member.membership() {
13
            MembershipState::Join => MemberMembership::Joined,
14
            MembershipState::Invite => MemberMembership::Invited,
15
            MembershipState::Leave => MemberMembership::Left,
16
            MembershipState::Knock => MemberMembership::Knocked,
17
            MembershipState::Ban => MemberMembership::Banned,
18
            value => MemberMembership::Custom(value.to_string()),
19
        },
20
        own: member.is_account_user(),
21
        name_ambiguous: member.name_ambiguous(),
22
        ignored: member.is_ignored(),
23
        service: member.is_service_member(),
24
    }
25
}
26
27
/// fetches the member list when it isn't synced yet, and settles for the store when that fails
28
pub(crate) async fn member_sender(room: &Room, user_id: &OwnedUserId) -> Option<Sender> {
29
    match room.get_member(user_id).await {
30
        Ok(Some(member)) => Some(sender(user_id, &member)),
31
        _ => stored_member_sender(room, user_id).await,
32
    }
33
}
34
35
/// what the state store already knows, without asking the server
36
pub(crate) async fn stored_member_sender(room: &Room, user_id: &OwnedUserId) -> Option<Sender> {
37
    let member = room.get_member_no_sync(user_id).await.ok().flatten()?;
38
    Some(sender(user_id, &member))
39
}
40
41
fn sender(user_id: &OwnedUserId, member: &RoomMember) -> Sender {
42
    Sender {
43
        user_id: user_id.clone(),
44
        display_name: member.display_name().map(str::to_owned),
45
        avatar: member.avatar_url().map(MediaId::plain),
46
        name_ambiguous: member.name_ambiguous(),
47
    }
48
}