aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2017-10-30 10:12:22 -0700
committerZeyla Hellyer <[email protected]>2017-10-30 10:19:24 -0700
commit2ba4d03f15d57d9f0fb1cc4d4f4355ebbc483d0a (patch)
tree077115b3ba070c20e2fb33f4655a64312902c094 /src
parentAdd some docs to `BanOptions` (diff)
downloadserenity-2ba4d03f15d57d9f0fb1cc4d4f4355ebbc483d0a.tar.xz
serenity-2ba4d03f15d57d9f0fb1cc4d4f4355ebbc483d0a.zip
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.
Diffstat (limited to 'src')
-rw-r--r--src/model/guild/mod.rs51
1 files changed, 51 insertions, 0 deletions
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<U>(&self, user_id: U) -> Permissions
+ where U: Into<UserId> {
+ 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.