summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordelthas <delthas@dille.cc>2021-07-12 19:19:40 +0200
committerHubert Hirtz <hubert@hirtz.pm>2021-07-12 19:27:17 +0200
commit63d17a738bea58e83efb9aaddd5d522d92793945 (patch)
tree0cc8217063dd3a82bed2d6a2824060fa641b5919
parentIgnore 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.go3
-rw-r--r--irc/tokens.go14
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) {