This repository has been archived by the owner on Sep 4, 2019. It is now read-only.
/
permissionutils.go
86 lines (69 loc) · 2.24 KB
/
permissionutils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package gophbot
import (
"github.com/bwmarrin/discordgo"
)
// ComputeBasePermissions calculates the permissions a guild member has, outside the scope of a channel
func ComputeBasePermissions(member *discordgo.Member, guild *discordgo.Guild) (int, error) {
if guild.OwnerID == member.User.ID {
return discordgo.PermissionAll, nil
}
everyone, err := GetRole(guild.ID, guild.ID)
if err != nil {
return 0, err
}
permissions := everyone.Permissions
for _, roleID := range member.Roles {
role, err := GetRole(guild.ID, roleID)
if err != nil {
return 0, err
}
permissions |= role.Permissions
}
if permissions&discordgo.PermissionAdministrator == discordgo.PermissionAdministrator {
return discordgo.PermissionAll, nil
}
return permissions, nil
}
// ComputeOverwrites calculates the permissions a channel member has, given the guilds base permissions
func ComputeOverwrites(basePermissions int, member *discordgo.Member, channel *discordgo.Channel) (int, error) {
if basePermissions&discordgo.PermissionAdministrator == discordgo.PermissionAdministrator {
return discordgo.PermissionAll, nil
}
everyone, err := GetRole(channel.GuildID, channel.GuildID)
if err != nil {
return 0, err
}
everyoneOverwrite := GetOverwrite(channel, everyone)
if everyoneOverwrite != nil {
basePermissions &= ^everyoneOverwrite.Deny
basePermissions |= everyoneOverwrite.Allow
}
var allow, deny int
for _, roleID := range member.Roles {
overwrite := GetOverwriteByID(channel, roleID, "role")
if overwrite != nil {
allow |= overwrite.Allow
deny |= overwrite.Deny
}
}
basePermissions &= ^deny
basePermissions |= allow
memberOverwrite := GetOverwriteByID(channel, member.User.ID, "user")
if memberOverwrite != nil {
basePermissions &= ^memberOverwrite.Deny
basePermissions |= memberOverwrite.Allow
}
return basePermissions, nil
}
// ComputePermissions calculates the permissions a channel member has, using the guilds base permissions
func ComputePermissions(member *discordgo.Member, channel *discordgo.Channel) (int, error) {
guild, err := GetGuild(channel.GuildID)
if err != nil {
return 0, err
}
base, err := ComputeBasePermissions(member, guild)
if err != nil {
return 0, err
}
return ComputeOverwrites(base, member, channel)
}