diff --git a/docs/MANUAL.md b/docs/MANUAL.md index 6b944974..178813cf 100644 --- a/docs/MANUAL.md +++ b/docs/MANUAL.md @@ -476,7 +476,7 @@ To unset this mode: ### +s - Secret -If this mode is set, it means that your channel should be marked as 'secret'. Your channel won't show up in `/LIST` or `/WHOIS`. +If this mode is set, it means that your channel should be marked as 'secret'. Your channel won't show up in `/LIST` or `/WHOIS`, and non-members won't be able to see its members with `/NAMES` or `/WHO`. To set this mode: diff --git a/irc/handlers.go b/irc/handlers.go index d2d50c34..0f5b3898 100644 --- a/irc/handlers.go +++ b/irc/handlers.go @@ -1953,21 +1953,28 @@ func namesHandler(server *Server, client *Client, msg ircmsg.IrcMessage, rb *Res // TODO: in a post-federation world, process `target` (server to forward request to) + // implement the modern behavior: https://modern.ircdocs.horse/#names-message + // "Servers MAY only return information about the first and silently ignore the others." + // "If no parameter is given for this command, servers SHOULD return one RPL_ENDOFNAMES numeric + // with the parameter set to an asterix character" + if len(channels) == 0 { - for _, channel := range server.channels.Channels() { - channel.Names(client, rb) - } + rb.Add(nil, server.name, RPL_ENDOFNAMES, client.Nick(), "*", client.t("End of NAMES list")) return false } - for _, chname := range channels { - channel := server.channels.Get(chname) - if channel != nil { + chname := channels[0] + success := false + channel := server.channels.Get(chname) + if channel != nil { + if !channel.flags.HasMode(modes.Secret) || channel.hasClient(client) || client.HasMode(modes.Operator) { channel.Names(client, rb) - } else if chname != "" { - rb.Add(nil, server.name, RPL_ENDOFNAMES, client.Nick(), chname, client.t("End of NAMES list")) + success = true } } + if !success { // channel.Names() sends this numeric itself on success + rb.Add(nil, server.name, RPL_ENDOFNAMES, client.Nick(), chname, client.t("End of NAMES list")) + } return false }