diff options
author | delthas <delthas@dille.cc> | 2021-07-12 19:19:40 +0200 |
---|---|---|
committer | Hubert Hirtz <hubert@hirtz.pm> | 2021-07-12 19:27:17 +0200 |
commit | 63d17a738bea58e83efb9aaddd5d522d92793945 (patch) | |
tree | 0cc8217063dd3a82bed2d6a2824060fa641b5919 | |
parent | Ignore case when searching for a /BUFFER (diff) |
Sort channel members by name
This is used for nick autocomplete and for /NAMES.
It will also be used for the vertical user list in the UI in a upcoming
patch.
-rw-r--r-- | irc/session.go | 3 | ||||
-rw-r--r-- | irc/tokens.go | 14 |
2 files changed, 17 insertions, 0 deletions
diff --git a/irc/session.go b/irc/session.go index e50312f..dabec03 100644 --- a/irc/session.go +++ b/irc/session.go @@ -5,6 +5,7 @@ import ( "encoding/base64" "errors" "fmt" + "sort" "strconv" "strings" "time" @@ -207,6 +208,7 @@ func (s *Session) Users() []string { // Names returns the list of users in the given channel, or nil if this channel // is not known by the session. +// The list is sorted according to member name. func (s *Session) Names(channel string) []Member { var names []Member if c, ok := s.channels[s.Casemap(channel)]; ok { @@ -218,6 +220,7 @@ func (s *Session) Names(channel string) []Member { }) } } + sort.Sort(members(names)) return names } diff --git a/irc/tokens.go b/irc/tokens.go index 9c669bb..aa5d4b6 100644 --- a/irc/tokens.go +++ b/irc/tokens.go @@ -517,6 +517,20 @@ type Member struct { Name *Prefix } +type members []Member + +func (m members) Len() int { + return len(m) +} + +func (m members) Less(i, j int) bool { + return strings.ToLower(m[i].Name.Name) < strings.ToLower(m[j].Name.Name) +} + +func (m members) Swap(i, j int) { + m[i], m[j] = m[j], m[i] +} + // ParseNameReply parses the last parameter of RPL_NAMREPLY, according to the // membership prefixes of the server. func ParseNameReply(trailing string, prefixes string) (names []Member) { |