Last active 1701943929

rootspring's Avatar rootspring revised this gist 1701943929. 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