[fractal/fractal-next] member: Add member role
- From: Julian Sparber <jsparber src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal/fractal-next] member: Add member role
- Date: Thu, 25 Nov 2021 14:15:53 +0000 (UTC)
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]