|
@@ -31,8 +31,8 @@ func NewMonitorManager() *MonitorManager {
|
31
|
31
|
|
32
|
32
|
var MonitorLimitExceeded = errors.New("Monitor limit exceeded")
|
33
|
33
|
|
34
|
|
-// alertMonitors alerts everyone monitoring us that we're online.
|
35
|
|
-func (manager *MonitorManager) alertMonitors(client *Client, online bool) {
|
|
34
|
+// AlertAbout alerts everyone monitoring `client`'s nick that `client` is now {on,off}line.
|
|
35
|
+func (manager *MonitorManager) AlertAbout(client *Client, online bool) {
|
36
|
36
|
cfnick := client.getNickCasefolded()
|
37
|
37
|
nick := client.getNick()
|
38
|
38
|
var watchers []*Client
|
|
@@ -59,18 +59,8 @@ func (manager *MonitorManager) alertMonitors(client *Client, online bool) {
|
59
|
59
|
}()
|
60
|
60
|
}
|
61
|
61
|
|
62
|
|
-// clearMonitorList clears our MONITOR list.
|
63
|
|
-func (manager *MonitorManager) clearMonitorList(client *Client) {
|
64
|
|
- manager.Lock()
|
65
|
|
- defer manager.Unlock()
|
66
|
|
-
|
67
|
|
- for nick, _ := range manager.watching[client] {
|
68
|
|
- delete(manager.watchedby[nick], client)
|
69
|
|
- }
|
70
|
|
- delete(manager.watching, client)
|
71
|
|
-}
|
72
|
|
-
|
73
|
|
-func (manager *MonitorManager) addMonitor(client *Client, nick string, limit int) error {
|
|
62
|
+// Add registers `client` to receive notifications about `nick`.
|
|
63
|
+func (manager *MonitorManager) Add(client *Client, nick string, limit int) error {
|
74
|
64
|
manager.Lock()
|
75
|
65
|
defer manager.Unlock()
|
76
|
66
|
|
|
@@ -90,7 +80,8 @@ func (manager *MonitorManager) addMonitor(client *Client, nick string, limit int
|
90
|
80
|
return nil
|
91
|
81
|
}
|
92
|
82
|
|
93
|
|
-func (manager *MonitorManager) removeMonitor(client *Client, nick string) error {
|
|
83
|
+// Remove unregisters `client` from receiving notifications about `nick`.
|
|
84
|
+func (manager *MonitorManager) Remove(client *Client, nick string) error {
|
94
|
85
|
manager.Lock()
|
95
|
86
|
defer manager.Unlock()
|
96
|
87
|
// deleting from nil maps is fine
|
|
@@ -99,7 +90,19 @@ func (manager *MonitorManager) removeMonitor(client *Client, nick string) error
|
99
|
90
|
return nil
|
100
|
91
|
}
|
101
|
92
|
|
102
|
|
-func (manager *MonitorManager) listMonitors(client *Client) (nicks []string) {
|
|
93
|
+// RemoveAll unregisters `client` from receiving notifications about *all* nicks.
|
|
94
|
+func (manager *MonitorManager) RemoveAll(client *Client) {
|
|
95
|
+ manager.Lock()
|
|
96
|
+ defer manager.Unlock()
|
|
97
|
+
|
|
98
|
+ for nick, _ := range manager.watching[client] {
|
|
99
|
+ delete(manager.watchedby[nick], client)
|
|
100
|
+ }
|
|
101
|
+ delete(manager.watching, client)
|
|
102
|
+}
|
|
103
|
+
|
|
104
|
+// List lists all nicks that `client` is registered to receive notifications about.
|
|
105
|
+func (manager *MonitorManager) List(client *Client) (nicks []string) {
|
103
|
106
|
manager.RLock()
|
104
|
107
|
defer manager.RUnlock()
|
105
|
108
|
for nick := range manager.watching[client] {
|
|
@@ -141,7 +144,7 @@ func monitorRemoveHandler(server *Server, client *Client, msg ircmsg.IrcMessage)
|
141
|
144
|
if err != nil {
|
142
|
145
|
continue
|
143
|
146
|
}
|
144
|
|
- server.monitorManager.removeMonitor(client, cfnick)
|
|
147
|
+ server.monitorManager.Remove(client, cfnick)
|
145
|
148
|
}
|
146
|
149
|
|
147
|
150
|
return false
|
|
@@ -171,7 +174,7 @@ func monitorAddHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bo
|
171
|
174
|
continue
|
172
|
175
|
}
|
173
|
176
|
|
174
|
|
- err = server.monitorManager.addMonitor(client, casefoldedTarget, limit)
|
|
177
|
+ err = server.monitorManager.Add(client, casefoldedTarget, limit)
|
175
|
178
|
if err == MonitorLimitExceeded {
|
176
|
179
|
client.Send(nil, server.name, ERR_MONLISTFULL, client.getNick(), strconv.Itoa(server.limits.MonitorEntries), strings.Join(targets, ","))
|
177
|
180
|
break
|
|
@@ -198,12 +201,12 @@ func monitorAddHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bo
|
198
|
201
|
}
|
199
|
202
|
|
200
|
203
|
func monitorClearHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
201
|
|
- server.monitorManager.clearMonitorList(client)
|
|
204
|
+ server.monitorManager.RemoveAll(client)
|
202
|
205
|
return false
|
203
|
206
|
}
|
204
|
207
|
|
205
|
208
|
func monitorListHandler(server *Server, client *Client, msg ircmsg.IrcMessage) bool {
|
206
|
|
- monitorList := server.monitorManager.listMonitors(client)
|
|
209
|
+ monitorList := server.monitorManager.List(client)
|
207
|
210
|
|
208
|
211
|
for _, line := range argsToStrings(maxLastArgLength, monitorList, ",") {
|
209
|
212
|
client.Send(nil, server.name, RPL_MONLIST, client.getNick(), line)
|
|
@@ -218,7 +221,7 @@ func monitorStatusHandler(server *Server, client *Client, msg ircmsg.IrcMessage)
|
218
|
221
|
var online []string
|
219
|
222
|
var offline []string
|
220
|
223
|
|
221
|
|
- monitorList := server.monitorManager.listMonitors(client)
|
|
224
|
+ monitorList := server.monitorManager.List(client)
|
222
|
225
|
|
223
|
226
|
for _, name := range monitorList {
|
224
|
227
|
target := server.clients.Get(name)
|