matrix_sdk/room/
member.rs1use std::ops::Deref;
2
3use ruma::{
4 events::room::{power_levels::UserPowerLevel, MediaSource},
5 int,
6};
7
8use crate::{
9 media::{MediaFormat, MediaRequestParameters},
10 BaseRoomMember, Client, Result,
11};
12
13#[derive(Debug, Clone)]
15pub struct RoomMember {
16 inner: BaseRoomMember,
17 pub(crate) client: Client,
18}
19
20impl Deref for RoomMember {
21 type Target = BaseRoomMember;
22
23 fn deref(&self) -> &Self::Target {
24 &self.inner
25 }
26}
27
28impl RoomMember {
29 pub(crate) fn new(client: Client, member: BaseRoomMember) -> Self {
30 Self { inner: member, client }
31 }
32
33 pub async fn avatar(&self, format: MediaFormat) -> Result<Option<Vec<u8>>> {
66 let Some(url) = self.avatar_url() else { return Ok(None) };
67 let request = MediaRequestParameters { source: MediaSource::Plain(url.to_owned()), format };
68 Ok(Some(self.client.media().get_media_content(&request, true).await?))
69 }
70
71 pub async fn ignore(&self) -> Result<()> {
74 self.client.account().ignore_user(self.inner.user_id()).await
75 }
76
77 pub async fn unignore(&self) -> Result<()> {
80 self.client.account().unignore_user(self.inner.user_id()).await
81 }
82
83 pub fn is_account_user(&self) -> bool {
85 match self.client.user_id() {
86 Some(id) => id == self.inner.user_id(),
87 None => false,
88 }
89 }
90
91 pub fn suggested_role_for_power_level(&self) -> RoomMemberRole {
93 RoomMemberRole::suggested_role_for_power_level(self.power_level())
94 }
95}
96
97#[derive(Clone, Debug, PartialEq)]
99#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
100pub enum RoomMemberRole {
101 Creator,
112 Administrator,
114 Moderator,
116 User,
118}
119
120impl RoomMemberRole {
121 pub fn suggested_role_for_power_level(power_level: UserPowerLevel) -> Self {
123 match power_level {
124 UserPowerLevel::Infinite => RoomMemberRole::Creator,
125 UserPowerLevel::Int(value) => {
126 if value >= int!(100) {
127 Self::Administrator
128 } else if value >= int!(50) {
129 Self::Moderator
130 } else {
131 Self::User
132 }
133 }
134 _ => unimplemented!(),
139 }
140 }
141
142 pub fn suggested_power_level(&self) -> UserPowerLevel {
144 match self {
145 Self::Creator => UserPowerLevel::Infinite,
146 Self::Administrator => UserPowerLevel::Int(int!(100)),
147 Self::Moderator => UserPowerLevel::Int(int!(50)),
148 Self::User => UserPowerLevel::Int(int!(0)),
149 }
150 }
151}
152
153#[cfg(test)]
154mod tests {
155 use super::*;
156
157 #[test]
158 fn test_suggested_roles() {
159 assert_eq!(
160 RoomMemberRole::Administrator,
161 RoomMemberRole::suggested_role_for_power_level(int!(100).into())
162 );
163 assert_eq!(
164 RoomMemberRole::Moderator,
165 RoomMemberRole::suggested_role_for_power_level(int!(50).into())
166 );
167 assert_eq!(
168 RoomMemberRole::User,
169 RoomMemberRole::suggested_role_for_power_level(int!(0).into())
170 );
171 }
172
173 #[test]
174 fn test_unexpected_power_levels() {
175 assert_eq!(
176 RoomMemberRole::Administrator,
177 RoomMemberRole::suggested_role_for_power_level(int!(200).into())
178 );
179 assert_eq!(
180 RoomMemberRole::Administrator,
181 RoomMemberRole::suggested_role_for_power_level(int!(101).into())
182 );
183 assert_eq!(
184 RoomMemberRole::Moderator,
185 RoomMemberRole::suggested_role_for_power_level(int!(99).into())
186 );
187 assert_eq!(
188 RoomMemberRole::Moderator,
189 RoomMemberRole::suggested_role_for_power_level(int!(51).into())
190 );
191 assert_eq!(
192 RoomMemberRole::User,
193 RoomMemberRole::suggested_role_for_power_level(int!(-1).into())
194 );
195 assert_eq!(
196 RoomMemberRole::User,
197 RoomMemberRole::suggested_role_for_power_level(int!(-100).into())
198 );
199 }
200
201 #[test]
202 fn test_default_power_levels() {
203 assert_eq!(int!(100), RoomMemberRole::Administrator.suggested_power_level());
204 assert_eq!(int!(50), RoomMemberRole::Moderator.suggested_power_level());
205 assert_eq!(int!(0), RoomMemberRole::User.suggested_power_level());
206
207 assert_eq!(
208 RoomMemberRole::Administrator,
209 RoomMemberRole::suggested_role_for_power_level(
210 RoomMemberRole::Administrator.suggested_power_level()
211 )
212 );
213 assert_eq!(
214 RoomMemberRole::Moderator,
215 RoomMemberRole::suggested_role_for_power_level(
216 RoomMemberRole::Moderator.suggested_power_level()
217 )
218 );
219 assert_eq!(
220 RoomMemberRole::User,
221 RoomMemberRole::suggested_role_for_power_level(
222 RoomMemberRole::User.suggested_power_level()
223 )
224 );
225 }
226}