rootspring revised this gist . Go to revision
1 file changed, 73 insertions
permoverwrites.go(file created)
@@ -0,0 +1,73 @@ | |||
1 | + | func memberChannelPerms(g *discordgo.Guild, c *discordgo.Channel, m *discordgo.Member) int64 { | |
2 | + | if g.OwnerID == m.User.ID { | |
3 | + | return discordgo.PermissionAll | |
4 | + | } | |
5 | + | ||
6 | + | // Get everyone role of the guild | |
7 | + | var everyoneRole *discordgo.Role | |
8 | + | ||
9 | + | var roleMap = make(map[string]*discordgo.Role) | |
10 | + | for _, role := range g.Roles { | |
11 | + | roleMap[role.ID] = role | |
12 | + | if role.ID == g.ID { | |
13 | + | everyoneRole = role | |
14 | + | } | |
15 | + | } | |
16 | + | ||
17 | + | var perms int64 | |
18 | + | ||
19 | + | // Apply everyone role | |
20 | + | if everyoneRole != nil { | |
21 | + | perms |= everyoneRole.Permissions | |
22 | + | } | |
23 | + | ||
24 | + | // Apply member roles | |
25 | + | for _, role := range m.Roles { | |
26 | + | if r, ok := roleMap[role]; ok { | |
27 | + | perms |= r.Permissions | |
28 | + | } | |
29 | + | } | |
30 | + | ||
31 | + | if perms&discordgo.PermissionAdministrator == discordgo.PermissionAdministrator { | |
32 | + | return discordgo.PermissionAll // ADMINISTRATOR overrides all | |
33 | + | } | |
34 | + | ||
35 | + | // Now we have the base everyone perms, apply the rest of the perms in hierarchy order | |
36 | + | var everyoneOverwrite *discordgo.PermissionOverwrite | |
37 | + | var roleOverwrites []*discordgo.PermissionOverwrite | |
38 | + | var memberOverwrites *discordgo.PermissionOverwrite | |
39 | + | ||
40 | + | for _, overwrite := range c.PermissionOverwrites { | |
41 | + | if overwrite.ID == g.ID { | |
42 | + | everyoneOverwrite = overwrite | |
43 | + | } else if overwrite.Type == discordgo.PermissionOverwriteTypeRole { | |
44 | + | if slices.Contains(m.Roles, overwrite.ID) { | |
45 | + | roleOverwrites = append(roleOverwrites, overwrite) | |
46 | + | } | |
47 | + | } else if overwrite.Type == discordgo.PermissionOverwriteTypeMember && overwrite.ID == m.User.ID { | |
48 | + | if overwrite.ID == m.User.ID { | |
49 | + | memberOverwrites = overwrite | |
50 | + | } | |
51 | + | } | |
52 | + | } | |
53 | + | ||
54 | + | // First, apply everyone overwrite | |
55 | + | if everyoneOverwrite != nil { | |
56 | + | perms &= ^everyoneOverwrite.Deny | |
57 | + | perms |= everyoneOverwrite.Allow | |
58 | + | } | |
59 | + | ||
60 | + | // Next, apply role overwrites | |
61 | + | for _, overwrite := range roleOverwrites { | |
62 | + | perms &= ^overwrite.Deny | |
63 | + | perms |= overwrite.Allow | |
64 | + | } | |
65 | + | ||
66 | + | // Finally, apply member overwrite | |
67 | + | if memberOverwrites != nil { | |
68 | + | perms &= ^memberOverwrites.Deny | |
69 | + | perms |= memberOverwrites.Allow | |
70 | + | } | |
71 | + | ||
72 | + | return perms | |
73 | + | } |
Newer
Older