Add v8 permissions changes

This commit is contained in:
Carson Hoffman 2021-01-20 18:11:20 -05:00
parent 9eb033c0db
commit 3773e286e6
No known key found for this signature in database
GPG key ID: 05B660CB452C657F
3 changed files with 28 additions and 20 deletions

View file

@ -465,7 +465,7 @@ func (s *Session) UserGuildSettingsEdit(guildID string, settings *UserGuildSetti
// //
// NOTE: This function is now deprecated and will be removed in the future. // NOTE: This function is now deprecated and will be removed in the future.
// Please see the same function inside state.go // Please see the same function inside state.go
func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions int, err error) { func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions int64, err error) {
// Try to just get permissions from state. // Try to just get permissions from state.
apermissions, err = s.State.UserChannelPermissions(userID, channelID) apermissions, err = s.State.UserChannelPermissions(userID, channelID)
if err == nil { if err == nil {
@ -507,7 +507,7 @@ func (s *Session) UserChannelPermissions(userID, channelID string) (apermissions
// Calculates the permissions for a member. // Calculates the permissions for a member.
// https://support.discord.com/hc/en-us/articles/206141927-How-is-the-permission-hierarchy-structured- // https://support.discord.com/hc/en-us/articles/206141927-How-is-the-permission-hierarchy-structured-
func memberPermissions(guild *Guild, channel *Channel, userID string, roles []string) (apermissions int) { func memberPermissions(guild *Guild, channel *Channel, userID string, roles []string) (apermissions int64) {
if userID == guild.OwnerID { if userID == guild.OwnerID {
apermissions = PermissionAll apermissions = PermissionAll
return return
@ -542,13 +542,11 @@ func memberPermissions(guild *Guild, channel *Channel, userID string, roles []st
} }
} }
denies := 0 var denies, allows int64
allows := 0
// Member overwrites can override role overrides, so do two passes // Member overwrites can override role overrides, so do two passes
for _, overwrite := range channel.PermissionOverwrites { for _, overwrite := range channel.PermissionOverwrites {
for _, roleID := range roles { for _, roleID := range roles {
if overwrite.Type == "role" && roleID == overwrite.ID { if overwrite.Type == PermissionOverwriteTypeRole && roleID == overwrite.ID {
denies |= overwrite.Deny denies |= overwrite.Deny
allows |= overwrite.Allow allows |= overwrite.Allow
break break
@ -560,7 +558,7 @@ func memberPermissions(guild *Guild, channel *Channel, userID string, roles []st
apermissions |= allows apermissions |= allows
for _, overwrite := range channel.PermissionOverwrites { for _, overwrite := range channel.PermissionOverwrites {
if overwrite.Type == "member" && overwrite.ID == userID { if overwrite.Type == PermissionOverwriteTypeMember && overwrite.ID == userID {
apermissions &= ^overwrite.Deny apermissions &= ^overwrite.Deny
apermissions |= overwrite.Allow apermissions |= overwrite.Allow
break break
@ -1809,13 +1807,13 @@ func (s *Session) ChannelInviteCreate(channelID string, i Invite) (st *Invite, e
// ChannelPermissionSet creates a Permission Override for the given channel. // ChannelPermissionSet creates a Permission Override for the given channel.
// NOTE: This func name may changed. Using Set instead of Create because // NOTE: This func name may changed. Using Set instead of Create because
// you can both create a new override or update an override with this function. // you can both create a new override or update an override with this function.
func (s *Session) ChannelPermissionSet(channelID, targetID, targetType string, allow, deny int) (err error) { func (s *Session) ChannelPermissionSet(channelID, targetID string, targetType PermissionOverwriteType, allow, deny int) (err error) {
data := struct { data := struct {
ID string `json:"id"` ID string `json:"id"`
Type string `json:"type"` Type PermissionOverwriteType `json:"type"`
Allow int `json:"allow"` Allow int `json:"allow"`
Deny int `json:"deny"` Deny int `json:"deny"`
}{targetID, targetType, allow, deny} }{targetID, targetType, allow, deny}
_, err = s.RequestWithBucketID("PUT", EndpointChannelPermission(channelID, targetID), data, EndpointChannelPermission(channelID, "")) _, err = s.RequestWithBucketID("PUT", EndpointChannelPermission(channelID, targetID), data, EndpointChannelPermission(channelID, ""))

View file

@ -997,7 +997,7 @@ func (s *State) OnInterface(se *Session, i interface{}) (err error) {
// UserChannelPermissions returns the permission of a user in a channel. // UserChannelPermissions returns the permission of a user in a channel.
// userID : The ID of the user to calculate permissions for. // userID : The ID of the user to calculate permissions for.
// channelID : The ID of the channel to calculate permission for. // channelID : The ID of the channel to calculate permission for.
func (s *State) UserChannelPermissions(userID, channelID string) (apermissions int, err error) { func (s *State) UserChannelPermissions(userID, channelID string) (apermissions int64, err error) {
if s == nil { if s == nil {
return 0, ErrNilState return 0, ErrNilState
} }
@ -1022,7 +1022,7 @@ func (s *State) UserChannelPermissions(userID, channelID string) (apermissions i
// MessagePermissions returns the permissions of the author of the message // MessagePermissions returns the permissions of the author of the message
// in the channel in which it was sent. // in the channel in which it was sent.
func (s *State) MessagePermissions(message *Message) (apermissions int, err error) { func (s *State) MessagePermissions(message *Message) (apermissions int64, err error) {
if s == nil { if s == nil {
return 0, ErrNilState return 0, ErrNilState
} }

View file

@ -322,12 +322,22 @@ type ChannelFollow struct {
WebhookID string `json:"webhook_id"` WebhookID string `json:"webhook_id"`
} }
// PermissionOverwriteType represents the type of resource on which
// a permission overwrite acts.
type PermissionOverwriteType int
// The possible permission overwrite types.
const (
PermissionOverwriteTypeRole PermissionOverwriteType = iota
PermissionOverwriteTypeMember
)
// A PermissionOverwrite holds permission overwrite data for a Channel // A PermissionOverwrite holds permission overwrite data for a Channel
type PermissionOverwrite struct { type PermissionOverwrite struct {
ID string `json:"id"` ID string `json:"id"`
Type string `json:"type"` Type PermissionOverwriteType `json:"type"`
Deny int `json:"deny"` Deny int64 `json:"deny,string"`
Allow int `json:"allow"` Allow int64 `json:"allow,string"`
} }
// Emoji struct holds data related to Emoji's // Emoji struct holds data related to Emoji's
@ -564,7 +574,7 @@ type Guild struct {
ApproximatePresenceCount int `json:"approximate_presence_count"` ApproximatePresenceCount int `json:"approximate_presence_count"`
// Permissions of our user // Permissions of our user
Permissions int `json:"permissions"` Permissions int64 `json:"permissions,string"`
} }
// MessageNotifications is the notification level for a guild // MessageNotifications is the notification level for a guild
@ -650,7 +660,7 @@ type Role struct {
// The permissions of the role on the guild (doesn't include channel overrides). // The permissions of the role on the guild (doesn't include channel overrides).
// This is a combination of bit masks; the presence of a certain permission can // This is a combination of bit masks; the presence of a certain permission can
// be checked by performing a bitwise AND between this int and the permission. // be checked by performing a bitwise AND between this int and the permission.
Permissions int `json:"permissions"` Permissions int64 `json:"permissions,string"`
} }
// Mention returns a string which mentions the role // Mention returns a string which mentions the role