Added UserChannelPermissions function

This commit is contained in:
abalabahaha 2016-03-04 08:07:32 +00:00 committed by abalabahaha
parent d0c30f0f14
commit cd24674ebb
2 changed files with 101 additions and 0 deletions

View file

@ -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
// ------------------------------------------------------------------------------------------------

View file

@ -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
)