47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package irc
|
|
|
|
import (
|
|
"git.chromaticdragon.app/pyrex/minimal-irc-server/v2/src/transport"
|
|
)
|
|
|
|
type BroadcastGroup struct {
|
|
channels []canonicalChannelName
|
|
users []*User
|
|
specificallyExcludedUsers []*User
|
|
}
|
|
|
|
func NewBroadcastGroup() *BroadcastGroup {
|
|
return &BroadcastGroup{}
|
|
}
|
|
|
|
func (bcg *BroadcastGroup) AddChannels(names ...canonicalChannelName) {
|
|
bcg.channels = append(bcg.channels, names...)
|
|
}
|
|
|
|
func (bcg *BroadcastGroup) AddUsers(users ...*User) {
|
|
bcg.users = append(bcg.users, users...)
|
|
}
|
|
|
|
func (bcg *BroadcastGroup) AddSpecificallyExcludedUsers(users ...*User) {
|
|
bcg.specificallyExcludedUsers = append(bcg.users, users...)
|
|
}
|
|
|
|
func Broadcast(bcg *BroadcastGroup, content transport.Content) {
|
|
g := GetGlobals()
|
|
allUsers := make(map[*User]struct{})
|
|
for _, c := range bcg.channels {
|
|
for u := range g.Users.ByCanonicalChannel(c) {
|
|
allUsers[u] = struct{}{}
|
|
}
|
|
}
|
|
for _, u := range bcg.users {
|
|
allUsers[u] = struct{}{}
|
|
}
|
|
for _, u := range bcg.specificallyExcludedUsers {
|
|
delete(allUsers, u)
|
|
}
|
|
for u := range allUsers {
|
|
g.Server.SendMessage(u.clientId, content)
|
|
}
|
|
}
|