From eac6a6978271f448b290d55b7da3686a6860e80f Mon Sep 17 00:00:00 2001 From: Daniel Oaks Date: Thu, 5 Oct 2017 23:29:34 +1000 Subject: [PATCH] Fix some notes and add some comments. --- irc/client_lookup_set.go | 12 ++++++++++-- irc/database.go | 4 ++-- irc/monitor.go | 13 ++++++++----- irc/server.go | 1 + irc/types.go | 22 +++++++++++++++------- 5 files changed, 36 insertions(+), 16 deletions(-) diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index 11cc0332..7c0070e3 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -224,17 +224,21 @@ func (clients *ClientLookupSet) Find(userhost string) *Client { //TODO(dan): move this over to generally using glob syntax instead? // kinda more expected in normal ban/etc masks, though regex is useful (probably as an extban?) + +// UserMaskSet holds a set of client masks and lets you match hostnames to them. type UserMaskSet struct { masks map[string]bool regexp *regexp.Regexp } +// NewUserMaskSet returns a new UserMaskSet. func NewUserMaskSet() *UserMaskSet { return &UserMaskSet{ masks: make(map[string]bool), } } +// Add adds the given mask to this set. func (set *UserMaskSet) Add(mask string) bool { casefoldedMask, err := Casefold(mask) if err != nil { @@ -249,6 +253,7 @@ func (set *UserMaskSet) Add(mask string) bool { return true } +// AddAll adds the given masks to this set. func (set *UserMaskSet) AddAll(masks []string) (added bool) { for _, mask := range masks { if !added && !set.masks[mask] { @@ -260,6 +265,7 @@ func (set *UserMaskSet) AddAll(masks []string) (added bool) { return } +// Remove removes the given mask from this set. func (set *UserMaskSet) Remove(mask string) bool { if !set.masks[mask] { return false @@ -269,6 +275,7 @@ func (set *UserMaskSet) Remove(mask string) bool { return true } +// Match matches the given n!u@h. func (set *UserMaskSet) Match(userhost string) bool { if set.regexp == nil { return false @@ -276,17 +283,18 @@ func (set *UserMaskSet) Match(userhost string) bool { return set.regexp.MatchString(userhost) } +// String returns the masks in this set. func (set *UserMaskSet) String() string { masks := make([]string, len(set.masks)) index := 0 for mask := range set.masks { masks[index] = mask - index += 1 + index++ } return strings.Join(masks, " ") } -// Generate a regular expression from the set of user mask +// setRegexp generates a regular expression from the set of user mask // strings. Masks are split at the two types of wildcards, `*` and // `?`. All the pieces are meta-escaped. `*` is replaced with `.*`, // the regexp equivalent. Likewise, `?` is replaced with `.`. The diff --git a/irc/database.go b/irc/database.go index 305e0667..f5c15bda 100644 --- a/irc/database.go +++ b/irc/database.go @@ -53,7 +53,7 @@ func InitDB(path string) { } } -// open an existing database, performing a schema version check +// OpenDatabase returns an existing database, performing a schema version check. func OpenDatabase(path string) (*buntdb.DB, error) { // open data store db, err := buntdb.Open(path) @@ -65,7 +65,7 @@ func OpenDatabase(path string) (*buntdb.DB, error) { err = db.View(func(tx *buntdb.Tx) error { version, _ := tx.Get(keySchemaVersion) if version != latestDbSchema { - return fmt.Errorf("Database must be updated. Expected schema v%s, got v%s.", latestDbSchema, version) + return fmt.Errorf("Database must be updated. Expected schema v%s, got v%s", latestDbSchema, version) } return nil }) diff --git a/irc/monitor.go b/irc/monitor.go index bcda0858..5b3aa347 100644 --- a/irc/monitor.go +++ b/irc/monitor.go @@ -12,6 +12,7 @@ import ( "github.com/goshuirc/irc-go/ircmsg" ) +// MonitorManager keeps track of who's monitoring which nicks. type MonitorManager struct { sync.RWMutex // client -> nicks it's watching @@ -21,6 +22,7 @@ type MonitorManager struct { // (all nicks must be normalized externally by casefolding) } +// NewMonitorManager returns a new MonitorManager. func NewMonitorManager() *MonitorManager { mm := MonitorManager{ watching: make(map[*Client]map[string]bool), @@ -29,7 +31,8 @@ func NewMonitorManager() *MonitorManager { return &mm } -var MonitorLimitExceeded = errors.New("Monitor limit exceeded") +// ErrMonitorLimitExceeded is used when the monitor list exceeds our limit. +var ErrMonitorLimitExceeded = errors.New("Monitor limit exceeded") // AlertAbout alerts everyone monitoring `client`'s nick that `client` is now {on,off}line. func (manager *MonitorManager) AlertAbout(client *Client, online bool) { @@ -69,7 +72,7 @@ func (manager *MonitorManager) Add(client *Client, nick string, limit int) error } if len(manager.watching[client]) >= limit { - return MonitorLimitExceeded + return ErrMonitorLimitExceeded } manager.watching[client][nick] = true @@ -92,7 +95,7 @@ func (manager *MonitorManager) RemoveAll(client *Client) { manager.Lock() defer manager.Unlock() - for nick, _ := range manager.watching[client] { + for nick := range manager.watching[client] { delete(manager.watchedby[nick], client) } delete(manager.watching, client) @@ -172,7 +175,7 @@ func monitorAddHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bo } err = server.monitorManager.Add(client, casefoldedTarget, limit) - if err == MonitorLimitExceeded { + if err == ErrMonitorLimitExceeded { client.Send(nil, server.name, ERR_MONLISTFULL, client.getNick(), strconv.Itoa(server.limits.MonitorEntries), strings.Join(targets, ",")) break } else if err != nil { @@ -206,7 +209,7 @@ func monitorListHandler(server *Server, client *Client, msg ircmsg.IrcMessage) b monitorList := server.monitorManager.List(client) var nickList []string - for _, cfnick := range(monitorList) { + for _, cfnick := range monitorList { replynick := cfnick // report the uncasefolded nick if it's available, i.e., the client is online if mclient := server.clients.Get(cfnick); mclient != nil { diff --git a/irc/server.go b/irc/server.go index f6ba641f..17d5c871 100644 --- a/irc/server.go +++ b/irc/server.go @@ -1592,6 +1592,7 @@ func (server *Server) setupListeners(config *Config) { } } +// GetDefaultChannelModes returns our default channel modes. func (server *Server) GetDefaultChannelModes() Modes { server.configurableStateMutex.RLock() defer server.configurableStateMutex.RUnlock() diff --git a/irc/types.go b/irc/types.go index 559d178b..c9322a92 100644 --- a/irc/types.go +++ b/irc/types.go @@ -64,8 +64,10 @@ func (channels *ChannelNameMap) Len() int { return len(channels.Chans) } +// ModeSet holds a set of modes. type ModeSet map[Mode]bool +// String returns the modes in this set. func (set ModeSet) String() string { if len(set) == 0 { return "" @@ -79,35 +81,44 @@ func (set ModeSet) String() string { return strings.Join(strs, "") } +// ClientSet is a set of clients. type ClientSet map[*Client]bool +// Add adds the given client to this set. func (clients ClientSet) Add(client *Client) { clients[client] = true } +// Remove removes the given client from this set. func (clients ClientSet) Remove(client *Client) { delete(clients, client) } +// Has returns true if the given client is in this set. func (clients ClientSet) Has(client *Client) bool { return clients[client] } +// MemberSet is a set of members with modes. type MemberSet map[*Client]ModeSet +// Add adds the given client to this set. func (members MemberSet) Add(member *Client) { members[member] = make(ModeSet) } +// Remove removes the given client from this set. func (members MemberSet) Remove(member *Client) { delete(members, member) } +// Has returns true if the given client is in this set. func (members MemberSet) Has(member *Client) bool { _, ok := members[member] return ok } +// HasMode returns true if the given client is in this set with the given mode. func (members MemberSet) HasMode(member *Client, mode Mode) bool { modes, ok := members[member] if !ok { @@ -116,6 +127,7 @@ func (members MemberSet) HasMode(member *Client, mode Mode) bool { return modes[mode] } +// AnyHasMode returns true if any of our clients has the given mode. func (members MemberSet) AnyHasMode(mode Mode) bool { for _, modes := range members { if modes[mode] { @@ -125,19 +137,15 @@ func (members MemberSet) AnyHasMode(mode Mode) bool { return false } +// ChannelSet is a set of channels. type ChannelSet map[*Channel]bool +// Add adds the given channel to this set. func (channels ChannelSet) Add(channel *Channel) { channels[channel] = true } +// Remove removes the given channel from this set. func (channels ChannelSet) Remove(channel *Channel) { delete(channels, channel) } - -func (channels ChannelSet) First() *Channel { - for channel := range channels { - return channel - } - return nil -}