+ if !allowed {
+ c.ReplyNicknamed("475", r.name, "Cannot join channel (+k)")
+ return
+ }
+ r.RLock()
+ nicknames := make([]string, 0, len(r.members))
+ for member := range r.members {
+ nicknames = append(nicknames, member.nickname)
+ }
+ r.RUnlock()
+ sort.Strings(nicknames)
+ maxLen := 512 - len(*hostname) - 2 - 2
+
+MoreNicknames:
+ lenAll := 0
+ lenName := 0
+ for i, n := range nicknames {
+ lenName = len(n) + 1
+ if lenAll+lenName >= maxLen {
+ c.ReplyNicknamed("353", "=", r.name, strings.Join(nicknames[:i-1], " "))
+ nicknames = nicknames[i:]
+ goto MoreNicknames
+ }
+ lenAll += lenName
+ }
+ if len(nicknames) > 0 {
+ c.ReplyNicknamed("353", "=", r.name, strings.Join(nicknames, " "))
+ }
+ c.ReplyNicknamed("366", r.name, "End of NAMES list")