diff options
| author | Zeyla Hellyer <[email protected]> | 2017-10-30 10:12:22 -0700 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2017-10-30 10:19:24 -0700 |
| commit | 2ba4d03f15d57d9f0fb1cc4d4f4355ebbc483d0a (patch) | |
| tree | 077115b3ba070c20e2fb33f4655a64312902c094 /src | |
| parent | Add some docs to `BanOptions` (diff) | |
| download | serenity-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.rs | 51 |
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. |