diff --git a/restapi.go b/restapi.go index f79641c..337a7f8 100644 --- a/restapi.go +++ b/restapi.go @@ -376,6 +376,8 @@ func (s *Session) UserGuildSettingsEdit(guildID string, settings *UserGuildSetti return } +// NOTE: This function is now deprecated and will be removed in the future. +// Please see the same function inside state.go // 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. diff --git a/state.go b/state.go index b56031c..e9eb4d6 100644 --- a/state.go +++ b/state.go @@ -680,3 +680,67 @@ func (s *State) onInterface(se *Session, i interface{}) (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 *State) 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.Member(guild.ID, userID) + if err != nil { + return + } + + for _, role := range guild.Roles { + for _, roleID := range member.Roles { + if role.ID == roleID { + 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 &= ^overwrite.Deny + apermissions |= overwrite.Allow + break + } + } + } + + for _, overwrite := range channel.PermissionOverwrites { + if overwrite.Type == "member" && overwrite.ID == userID { + apermissions &= ^overwrite.Deny + apermissions |= overwrite.Allow + break + } + } + + if apermissions&PermissionManageRoles > 0 { + apermissions |= PermissionAllChannel + } + + return +}