diff --git a/irc/client_lookup_set.go b/irc/client_lookup_set.go index 8a585ffd..1982d968 100644 --- a/irc/client_lookup_set.go +++ b/irc/client_lookup_set.go @@ -207,6 +207,23 @@ func (clients *ClientManager) AllWithCaps(capabs ...caps.Capability) (sessions [ return } +// AllWithCapsNotify returns all clients with the given capabilities, and that support cap-notify. +func (clients *ClientManager) AllWithCapsNotify(capabs ...caps.Capability) (sessions []*Session) { + capabs = append(capabs, caps.CapNotify) + clients.RLock() + defer clients.RUnlock() + for _, client := range clients.byNick { + for _, session := range client.Sessions() { + // cap-notify is implicit in cap version 302 and above + if session.capabilities.HasAll(capabs...) || 302 <= session.capVersion { + sessions = append(sessions, session) + } + } + } + + return +} + // FindAll returns all clients that match the given userhost mask. func (clients *ClientManager) FindAll(userhost string) (set ClientSet) { set = make(ClientSet) diff --git a/irc/handlers.go b/irc/handlers.go index ac8821bc..7270fb04 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -535,8 +535,12 @@ func capHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Respo if !client.registered { rb.session.capState = caps.NegotiatingState } - if len(msg.Params) > 1 && msg.Params[1] == "302" { - rb.session.capVersion = 302 + if 1 < len(msg.Params) { + num, err := strconv.Atoi(msg.Params[1]) + newVersion := caps.Version(num) + if err == nil && rb.session.capVersion < newVersion { + rb.session.capVersion = newVersion + } } // weechat 1.4 has a bug here where it won't accept the CAP reply unless it contains // the server.name source... otherwise it doesn't respond to the CAP message with diff --git a/irc/server.go b/irc/server.go index e4d2aadb..27f8952e 100644 --- a/irc/server.go +++ b/irc/server.go @@ -744,7 +744,7 @@ func (server *Server) applyConfig(config *Config, initial bool) (err error) { removedCaps.Union(updatedCaps) if !addedCaps.Empty() || !removedCaps.Empty() { - capBurstSessions = server.clients.AllWithCaps(caps.CapNotify) + capBurstSessions = server.clients.AllWithCapsNotify() added[caps.Cap301] = addedCaps.String(caps.Cap301, CapValues) added[caps.Cap302] = addedCaps.String(caps.Cap302, CapValues)