From 2ba4d03f15d57d9f0fb1cc4d4f4355ebbc483d0a Mon Sep 17 00:00:00 2001 From: Zeyla Hellyer Date: Mon, 30 Oct 2017 10:12:22 -0700 Subject: Add Guild::member_permissions Add a method on the Guild for calculating only a member's guild-only permissions, not including the permissions for either the default channel or any specific channel. --- src/model/guild/mod.rs | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'src') diff --git a/src/model/guild/mod.rs b/src/model/guild/mod.rs index aa9fd1d..0a8fe16 100644 --- a/src/model/guild/mod.rs +++ b/src/model/guild/mod.rs @@ -1004,6 +1004,57 @@ impl Guild { } } + /// Calculate a [`Member`]'s permissions in the guild. + /// + /// [`Member`]: struct.Member.html + pub fn member_permissions(&self, user_id: U) -> Permissions + where U: Into { + let user_id = user_id.into(); + + if user_id == self.owner_id { + return Permissions::all(); + } + + let everyone = match self.roles.get(&RoleId(self.id.0)) { + Some(everyone) => everyone, + None => { + error!( + "(╯°□°)╯︵ ┻━┻ @everyone role ({}) missing in '{}'", + self.id, + self.name, + ); + + return Permissions::empty(); + }, + }; + + let member = match self.members.get(&user_id) { + Some(member) => member, + None => return everyone.permissions, + }; + + let mut permissions = everyone.permissions; + + for role in &member.roles { + if let Some(role) = self.roles.get(&role) { + if role.permissions.contains(Permissions::ADMINISTRATOR) { + return Permissions::all(); + } + + permissions |= role.permissions; + } else { + warn!( + "(╯°□°)╯︵ ┻━┻ {} on {} has non-existent role {:?}", + member.user.read().unwrap().id, + self.id, + role, + ); + } + } + + permissions + } + /// Moves a member to a specific voice channel. /// /// Requires the [Move Members] permission. -- cgit v1.2.3