ircd/irc/snomanager.go

120 lines
2.5 KiB
Go
Raw Normal View History

2017-05-07 23:15:16 +00:00
package irc
import (
"fmt"
"sync"
2017-06-15 16:14:19 +00:00
"github.com/goshuirc/irc-go/ircfmt"
2017-06-14 18:00:53 +00:00
"github.com/oragono/oragono/irc/sno"
2017-05-07 23:15:16 +00:00
)
// SnoManager keeps track of which clients to send snomasks to.
type SnoManager struct {
2017-11-22 09:41:11 +00:00
sendListMutex sync.RWMutex // tier 2
2017-05-07 23:15:16 +00:00
sendLists map[sno.Mask]map[*Client]bool
}
2019-05-12 08:30:48 +00:00
func (m *SnoManager) Initialize() {
2017-05-07 23:15:16 +00:00
m.sendLists = make(map[sno.Mask]map[*Client]bool)
}
// AddMasks adds the given snomasks to the client.
func (m *SnoManager) AddMasks(client *Client, masks ...sno.Mask) {
m.sendListMutex.Lock()
defer m.sendListMutex.Unlock()
for _, mask := range masks {
2018-04-16 03:20:37 +00:00
// confirm mask is valid
if !sno.ValidMasks[mask] {
continue
}
2017-05-07 23:15:16 +00:00
currentClientList := m.sendLists[mask]
if currentClientList == nil {
currentClientList = map[*Client]bool{}
}
currentClientList[client] = true
m.sendLists[mask] = currentClientList
}
}
// RemoveMasks removes the given snomasks from the client.
func (m *SnoManager) RemoveMasks(client *Client, masks ...sno.Mask) {
m.sendListMutex.Lock()
defer m.sendListMutex.Unlock()
for _, mask := range masks {
currentClientList := m.sendLists[mask]
if len(currentClientList) == 0 {
2017-05-07 23:15:16 +00:00
continue
}
delete(currentClientList, client)
m.sendLists[mask] = currentClientList
}
}
// RemoveClient removes the given client from all of our lists.
func (m *SnoManager) RemoveClient(client *Client) {
m.sendListMutex.Lock()
defer m.sendListMutex.Unlock()
for mask := range m.sendLists {
currentClientList := m.sendLists[mask]
if len(currentClientList) == 0 {
2017-05-07 23:15:16 +00:00
continue
}
delete(currentClientList, client)
m.sendLists[mask] = currentClientList
}
}
// Send sends the given snomask to all users signed up for it.
func (m *SnoManager) Send(mask sno.Mask, content string) {
m.sendListMutex.RLock()
defer m.sendListMutex.RUnlock()
currentClientList := m.sendLists[mask]
if len(currentClientList) == 0 {
2017-05-07 23:15:16 +00:00
return
}
// make the message
name := sno.NoticeMaskNames[mask]
if name == "" {
name = string(mask)
}
message := fmt.Sprintf(ircfmt.Unescape("$c[grey]-$r%s$c[grey]-$c %s"), name, content)
// send it out
for client := range currentClientList {
client.Notice(message)
}
}
// String returns the snomasks currently enabled.
func (m *SnoManager) String(client *Client) string {
m.sendListMutex.RLock()
defer m.sendListMutex.RUnlock()
var masks string
for mask, clients := range m.sendLists {
for c := range clients {
if c == client {
masks += string(mask)
break
}
}
}
return masks
}