From cd24674ebbb34bbefa5de8fc0338f88ff1fe4d96 Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Fri, 4 Mar 2016 08:07:32 +0000 Subject: [PATCH 1/3] Added UserChannelPermissions function --- restapi.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ structs.go | 35 +++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/restapi.go b/restapi.go index 93b71ea..48e4f7a 100644 --- a/restapi.go +++ b/restapi.go @@ -327,6 +327,72 @@ func (s *Session) UserGuilds() (st []*Guild, err error) { return } +// UserChannelPermissions returns the permission of a user in a channel. +// userID : The ID of the user to calculate permissions for. +// channelID : The ID of the channel to calculate permission for. +func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions int, err error) { + + channel, err := s.Channel(channelID) + if err != nil { + return + } + + guild, err := s.Guild(channel.GuildID) + if err != nil { + return + } + + if userID == guild.OwnerID { + apermissions = PermissionAll + return + } + + member, err := s.GuildMember(guild.ID, userID) + if err != nil { + return + } + + apermissions = 0 + + for _, role := range guild.Roles { + for _, roleID := range member.Roles { + if role.ID == roleID { + apermissions = apermissions | role.Permissions + break + } + } + } + + if apermissions & (PermissionManageRoles) > 0 { + apermissions = PermissionAll + } + + // Member overwrites can override role overrides, so do two passes + for _, overwrite := range channel.PermissionOverwrites { + for _, roleID := range member.Roles { + if overwrite.Type == "role" && roleID == overwrite.ID { + apermissions = apermissions & ^overwrite.Deny + apermissions = apermissions | overwrite.Allow + break + } + } + } + + for _, overwrite := range channel.PermissionOverwrites { + if overwrite.Type == "member" && overwrite.ID == userID { + apermissions = apermissions & ^overwrite.Deny + apermissions = apermissions | overwrite.Allow + break + } + } + + if apermissions & PermissionManageRoles > 0 { + apermissions |= PermissionAllChannel + } + + return +} + // ------------------------------------------------------------------------------------------------ // Functions specific to Discord Guilds // ------------------------------------------------------------------------------------------------ diff --git a/structs.go b/structs.go index 34fe7f1..e9396d6 100644 --- a/structs.go +++ b/structs.go @@ -365,3 +365,38 @@ type State struct { Ready MaxMessageCount int } + +// Constants for the different bit offsets of general permissions +const ( + PermissionCreateInstantInvite = 1 << iota + PermissionKickMembers + PermissionBanMembers + PermissionManageRoles + PermissionManageChannels + PermissionManageServer + + PermissionAll = 66321471 + PermissionAllChannel = 66321433 +) + +// Constants for the different bit offsets of text channel permissions +const ( + PermissionReadMessages = 1 << (iota + 10) + PermissionSendMessages + PermissionSendTTSMessages + PermissionManageMessages + PermissionEmbedLinks + PermissionAttachFiles + PermissionReadMessageHistory + PermissionMentionEveryone +) + +// Constants for the different bit offsets of voice permissions +const ( + PermissionVoiceConnect = 1 << (iota + 20) + PermissionVoiceSpeak + PermissionVoiceMuteMembers + PermissionVoiceDeafenMembers + PermissionVoiceMoveMembers + PermissionVoiceUseVAD +) \ No newline at end of file From 539b9d203fae7212f4a81a15617cbcf96831d653 Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Fri, 4 Mar 2016 05:50:11 -0800 Subject: [PATCH 2/3] Fix UserChannelPermissions --- restapi.go | 16 +++++++--------- structs.go | 26 +++++++++++++------------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/restapi.go b/restapi.go index 48e4f7a..7534cae 100644 --- a/restapi.go +++ b/restapi.go @@ -352,27 +352,25 @@ func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions return } - apermissions = 0 - for _, role := range guild.Roles { for _, roleID := range member.Roles { if role.ID == roleID { - apermissions = apermissions | role.Permissions + apermissions |= role.Permissions break } } } - if apermissions & (PermissionManageRoles) > 0 { - apermissions = PermissionAll + if apermissions & PermissionManageRoles > 0 { + apermissions |= PermissionAll } // Member overwrites can override role overrides, so do two passes for _, overwrite := range channel.PermissionOverwrites { for _, roleID := range member.Roles { if overwrite.Type == "role" && roleID == overwrite.ID { - apermissions = apermissions & ^overwrite.Deny - apermissions = apermissions | overwrite.Allow + apermissions &= ^overwrite.Deny + apermissions |= overwrite.Allow break } } @@ -380,8 +378,8 @@ func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions for _, overwrite := range channel.PermissionOverwrites { if overwrite.Type == "member" && overwrite.ID == userID { - apermissions = apermissions & ^overwrite.Deny - apermissions = apermissions | overwrite.Allow + apermissions &= ^overwrite.Deny + apermissions |= overwrite.Allow break } } diff --git a/structs.go b/structs.go index e9396d6..cc5e113 100644 --- a/structs.go +++ b/structs.go @@ -366,19 +366,6 @@ type State struct { MaxMessageCount int } -// Constants for the different bit offsets of general permissions -const ( - PermissionCreateInstantInvite = 1 << iota - PermissionKickMembers - PermissionBanMembers - PermissionManageRoles - PermissionManageChannels - PermissionManageServer - - PermissionAll = 66321471 - PermissionAllChannel = 66321433 -) - // Constants for the different bit offsets of text channel permissions const ( PermissionReadMessages = 1 << (iota + 10) @@ -399,4 +386,17 @@ const ( PermissionVoiceDeafenMembers PermissionVoiceMoveMembers PermissionVoiceUseVAD +) + +// Constants for the different bit offsets of general permissions +const ( + PermissionCreateInstantInvite = 1 << iota + PermissionKickMembers + PermissionBanMembers + PermissionManageRoles + PermissionManageChannels + PermissionManageServer + + PermissionAllChannel = PermissionReadMessages | PermissionSendMessages | PermissionSendTTSMessages | PermissionManageMessages | PermissionEmbedLinks | PermissionAttachFiles | PermissionReadMessageHistory | PermissionMentionEveryone | PermissionVoiceConnect | PermissionVoiceSpeak | PermissionVoiceMuteMembers | PermissionVoiceDeafenMembers | PermissionVoiceMoveMembers | PermissionVoiceUseVAD | PermissionCreateInstantInvite | PermissionManageRoles | PermissionManageChannels + PermissionAll = PermissionAllChannel | PermissionKickMembers | PermissionBanMembers | PermissionManageServer ) \ No newline at end of file From 0969cc3d86ccc74367e8f0a666b2140b17b28c1f Mon Sep 17 00:00:00 2001 From: abalabahaha Date: Fri, 4 Mar 2016 06:12:17 -0800 Subject: [PATCH 3/3] Format the permission constants --- structs.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/structs.go b/structs.go index cc5e113..2646541 100644 --- a/structs.go +++ b/structs.go @@ -397,6 +397,27 @@ const ( PermissionManageChannels PermissionManageServer - PermissionAllChannel = PermissionReadMessages | PermissionSendMessages | PermissionSendTTSMessages | PermissionManageMessages | PermissionEmbedLinks | PermissionAttachFiles | PermissionReadMessageHistory | PermissionMentionEveryone | PermissionVoiceConnect | PermissionVoiceSpeak | PermissionVoiceMuteMembers | PermissionVoiceDeafenMembers | PermissionVoiceMoveMembers | PermissionVoiceUseVAD | PermissionCreateInstantInvite | PermissionManageRoles | PermissionManageChannels - PermissionAll = PermissionAllChannel | PermissionKickMembers | PermissionBanMembers | PermissionManageServer -) \ No newline at end of file + PermissionAllText = PermissionReadMessages | + PermissionSendMessages | + PermissionSendTTSMessages | + PermissionManageMessages | + PermissionEmbedLinks | + PermissionAttachFiles | + PermissionReadMessageHistory | + PermissionMentionEveryone + PermissionAllVoice = PermissionVoiceConnect | + PermissionVoiceSpeak | + PermissionVoiceMuteMembers | + PermissionVoiceDeafenMembers | + PermissionVoiceMoveMembers | + PermissionVoiceUseVAD + PermissionAllChannel = PermissionAllText | + PermissionAllVoice | + PermissionCreateInstantInvite | + PermissionManageRoles | + PermissionManageChannels + PermissionAll = PermissionAllChannel | + PermissionKickMembers | + PermissionBanMembers | + PermissionManageServer +)