[fractal/fractal-next] member: Add member role



commit fe8ad34895b1171a3b70497c41a320b2aa02cf5d
Author: Kai A. Hiller <V02460 gmail com>
Date:   Thu Aug 19 01:53:03 2021 +0200

    member: Add member role

 po/POTFILES.in                  |  1 +
 src/meson.build                 |  1 +
 src/session/room/member.rs      | 17 +++++++++++++
 src/session/room/member_role.rs | 53 +++++++++++++++++++++++++++++++++++++++++
 src/session/room/mod.rs         |  2 ++
 5 files changed, 74 insertions(+)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 69132992..1278d7ca 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -91,6 +91,7 @@ src/session/room/highlight_flags.rs
 src/session/room/item.rs
 src/session/room/member.rs
 src/session/room/member_list.rs
+src/session/room/member_role.rs
 src/session/room/mod.rs
 src/session/room/timeline.rs
 src/session/sidebar/account_switcher/add_account.rs
diff --git a/src/meson.build b/src/meson.build
index 261d372a..0df36dcf 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -73,6 +73,7 @@ sources = files(
   'session/room/item.rs',
   'session/room/member.rs',
   'session/room/member_list.rs',
+  'session/room/member_role.rs',
   'session/room/mod.rs',
   'session/room/power_levels.rs',
   'session/room/room_type.rs',
diff --git a/src/session/room/member.rs b/src/session/room/member.rs
index 65f86027..e63cca8b 100644
--- a/src/session/room/member.rs
+++ b/src/session/room/member.rs
@@ -8,6 +8,7 @@ use matrix_sdk::RoomMember;
 
 use crate::prelude::*;
 use crate::session::room::power_levels::{PowerLevel, POWER_LEVEL_MAX, POWER_LEVEL_MIN};
+use crate::session::room::MemberRole;
 use crate::session::{Room, User};
 
 mod imp {
@@ -79,6 +80,22 @@ impl Member {
         self.notify("power-level");
     }
 
+    pub fn role(&self) -> MemberRole {
+        self.power_level().into()
+    }
+
+    pub fn is_admin(&self) -> bool {
+        self.role().is_admin()
+    }
+
+    pub fn is_mod(&self) -> bool {
+        self.role().is_mod()
+    }
+
+    pub fn is_peasant(&self) -> bool {
+        self.role().is_peasant()
+    }
+
     /// Update the user based on the the room member state event
     pub fn update_from_room_member(&self, member: &RoomMember) {
         if member.user_id() != self.user_id() {
diff --git a/src/session/room/member_role.rs b/src/session/room/member_role.rs
new file mode 100644
index 00000000..f444ce31
--- /dev/null
+++ b/src/session/room/member_role.rs
@@ -0,0 +1,53 @@
+use std::fmt;
+
+use gettextrs::gettext;
+use gtk::glib;
+
+use crate::session::room::power_levels::PowerLevel;
+
+/// Role of a room member, like admin or moderator.
+#[glib::gflags("MemberRole")]
+pub enum MemberRole {
+    #[glib::gflags(name = "ADMIN")]
+    ADMIN = 1,
+    #[glib::gflags(name = "MOD")]
+    MOD = 2,
+    #[glib::gflags(name = "PEASANT")]
+    PEASANT = 0,
+}
+
+impl MemberRole {
+    pub fn is_admin(&self) -> bool {
+        matches!(*self, Self::ADMIN)
+    }
+
+    pub fn is_mod(&self) -> bool {
+        matches!(*self, Self::MOD)
+    }
+
+    pub fn is_peasant(&self) -> bool {
+        matches!(*self, Self::PEASANT)
+    }
+}
+
+impl From<PowerLevel> for MemberRole {
+    fn from(power_level: PowerLevel) -> Self {
+        if (100..).contains(&power_level) {
+            Self::ADMIN
+        } else if (50..100).contains(&power_level) {
+            Self::MOD
+        } else {
+            Self::PEASANT
+        }
+    }
+}
+
+impl fmt::Display for MemberRole {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        match *self {
+            Self::ADMIN => write!(f, "{}", gettext("Admin")),
+            Self::MOD => write!(f, "{}", gettext("Moderator")),
+            _ => write!(f, "{}", gettext("Normal user")),
+        }
+    }
+}
diff --git a/src/session/room/mod.rs b/src/session/room/mod.rs
index da22f45d..15c6929f 100644
--- a/src/session/room/mod.rs
+++ b/src/session/room/mod.rs
@@ -3,6 +3,7 @@ mod highlight_flags;
 mod item;
 mod member;
 mod member_list;
+mod member_role;
 mod power_levels;
 mod room_type;
 mod timeline;
@@ -12,6 +13,7 @@ pub use self::highlight_flags::HighlightFlags;
 pub use self::item::Item;
 pub use self::item::ItemType;
 pub use self::member::Member;
+pub use self::member_role::MemberRole;
 pub use self::power_levels::{
     PowerLevel, PowerLevels, RoomAction, POWER_LEVEL_MAX, POWER_LEVEL_MIN,
 };


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]