permoverwrites.go
· 1.9 KiB · Go
Eredeti
func memberChannelPerms(g *discordgo.Guild, c *discordgo.Channel, m *discordgo.Member) int64 {
if g.OwnerID == m.User.ID {
return discordgo.PermissionAll
}
// Get everyone role of the guild
var everyoneRole *discordgo.Role
var roleMap = make(map[string]*discordgo.Role)
for _, role := range g.Roles {
roleMap[role.ID] = role
if role.ID == g.ID {
everyoneRole = role
}
}
var perms int64
// Apply everyone role
if everyoneRole != nil {
perms |= everyoneRole.Permissions
}
// Apply member roles
for _, role := range m.Roles {
if r, ok := roleMap[role]; ok {
perms |= r.Permissions
}
}
if perms&discordgo.PermissionAdministrator == discordgo.PermissionAdministrator {
return discordgo.PermissionAll // ADMINISTRATOR overrides all
}
// Now we have the base everyone perms, apply the rest of the perms in hierarchy order
var everyoneOverwrite *discordgo.PermissionOverwrite
var roleOverwrites []*discordgo.PermissionOverwrite
var memberOverwrites *discordgo.PermissionOverwrite
for _, overwrite := range c.PermissionOverwrites {
if overwrite.ID == g.ID {
everyoneOverwrite = overwrite
} else if overwrite.Type == discordgo.PermissionOverwriteTypeRole {
if slices.Contains(m.Roles, overwrite.ID) {
roleOverwrites = append(roleOverwrites, overwrite)
}
} else if overwrite.Type == discordgo.PermissionOverwriteTypeMember && overwrite.ID == m.User.ID {
if overwrite.ID == m.User.ID {
memberOverwrites = overwrite
}
}
}
// First, apply everyone overwrite
if everyoneOverwrite != nil {
perms &= ^everyoneOverwrite.Deny
perms |= everyoneOverwrite.Allow
}
// Next, apply role overwrites
for _, overwrite := range roleOverwrites {
perms &= ^overwrite.Deny
perms |= overwrite.Allow
}
// Finally, apply member overwrite
if memberOverwrites != nil {
perms &= ^memberOverwrites.Deny
perms |= memberOverwrites.Allow
}
return perms
}
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 | } |
74 |