diff options
| author | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
|---|---|---|
| committer | Mistivia <i@mistivia.com> | 2025-11-02 15:27:18 +0800 |
| commit | e9c24f4af7ed56760f6db7941827d09f6db9020b (patch) | |
| tree | 62128c43b883ce5e3148113350978755779bb5de /teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go | |
| parent | 58d5e7cfda4781d8a57ec52aefd02983835c301a (diff) | |
add matterbridge
Diffstat (limited to 'teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go')
| -rw-r--r-- | teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go b/teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go new file mode 100644 index 0000000..67cd86d --- /dev/null +++ b/teleirc/matterbridge/vendor/layeh.com/gumble/gumbleutil/acl.go @@ -0,0 +1,55 @@ +package gumbleutil + +import ( + "layeh.com/gumble/gumble" +) + +// UserGroups fetches the group names the given user belongs to in the given +// channel. The slice of group names sent via the returned channel. On error, +// the returned channel is closed without without sending a slice. +func UserGroups(client *gumble.Client, user *gumble.User, channel *gumble.Channel) <-chan []string { + ch := make(chan []string) + + if !user.IsRegistered() { + close(ch) + return ch + } + + var detacher gumble.Detacher + listener := Listener{ + Disconnect: func(e *gumble.DisconnectEvent) { + detacher.Detach() + close(ch) + }, + ChannelChange: func(e *gumble.ChannelChangeEvent) { + if e.Channel == channel && e.Type.Has(gumble.ChannelChangeRemoved) { + detacher.Detach() + close(ch) + } + }, + PermissionDenied: func(e *gumble.PermissionDeniedEvent) { + if e.Channel == channel && e.Type == gumble.PermissionDeniedPermission && (e.Permission&gumble.PermissionWrite) != 0 { + detacher.Detach() + close(ch) + } + }, + ACL: func(e *gumble.ACLEvent) { + if e.ACL.Channel != channel { + return + } + var names []string + for _, g := range e.ACL.Groups { + if (g.UsersAdd[user.UserID] != nil || g.UsersInherited[user.UserID] != nil) && g.UsersRemove[user.UserID] == nil { + names = append(names, g.Name) + } + } + detacher.Detach() + ch <- names + close(ch) + }, + } + detacher = client.Config.Attach(&listener) + channel.RequestACL() + + return ch +} |
