diff --git a/irc.go b/irc.go index 1da97a2..407d6aa 100644 --- a/irc.go +++ b/irc.go @@ -728,6 +728,10 @@ func parseChatHistoryBound(param string) time.Time { } } +// whoxFields is the list of all WHOX field letters, by order of appearance in +// RPL_WHOSPCRPL messages. +var whoxFields = []byte("tcuihsnfdlaor") + type whoxInfo struct { Token string Username string @@ -739,6 +743,42 @@ type whoxInfo struct { Realname string } +func (info *whoxInfo) get(field byte) string { + switch field { + case 't': + return info.Token + case 'c': + return "*" + case 'u': + return info.Username + case 'i': + return "255.255.255.255" + case 'h': + return info.Hostname + case 's': + return info.Server + case 'n': + return info.Nickname + case 'f': + return info.Flags + case 'd': + return "0" + case 'l': // idle time + return "0" + case 'a': + account := "0" // WHOX uses "0" to mean "no account" + if info.Account != "" && info.Account != "*" { + account = info.Account + } + return account + case 'o': + return "0" + case 'r': + return info.Realname + } + return "" +} + func generateWHOXReply(prefix *irc.Prefix, nick, fields string, info *whoxInfo) *irc.Message { if fields == "" { return &irc.Message{ @@ -753,55 +793,18 @@ func generateWHOXReply(prefix *irc.Prefix, nick, fields string, info *whoxInfo) fieldSet[fields[i]] = true } - var params []string - if fieldSet['t'] { - params = append(params, info.Token) - } - if fieldSet['c'] { - params = append(params, "*") - } - if fieldSet['u'] { - params = append(params, info.Username) - } - if fieldSet['i'] { - params = append(params, "255.255.255.255") - } - if fieldSet['h'] { - params = append(params, info.Hostname) - } - if fieldSet['s'] { - params = append(params, info.Server) - } - if fieldSet['n'] { - params = append(params, info.Nickname) - } - if fieldSet['f'] { - params = append(params, info.Flags) - } - if fieldSet['d'] { - params = append(params, "0") - } - if fieldSet['l'] { // idle time - params = append(params, "0") - } - if fieldSet['a'] { - account := "0" // WHOX uses "0" to mean "no account" - if info.Account != "" && info.Account != "*" { - account = info.Account + var values []string + for _, field := range whoxFields { + if !fieldSet[field] { + continue } - params = append(params, account) - } - if fieldSet['o'] { - params = append(params, "0") - } - if fieldSet['r'] { - params = append(params, info.Realname) + values = append(values, info.get(field)) } return &irc.Message{ Prefix: prefix, Command: rpl_whospcrpl, - Params: append([]string{nick}, params...), + Params: append([]string{nick}, values...), } }