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) } }