-func (room *Room) SendTopic(client *Client) {
- if *room.topic == "" {
- client.ReplyNicknamed("331", *room.name, "No topic is set")
- } else {
- client.ReplyNicknamed("332", *room.name, *room.topic)
+func (r *Room) SendNames(c *Client) {
+ allowed := false
+ if r.key == "" {
+ allowed = true
+ } else if _, isMember := r.members[c]; isMember {
+ allowed = true
+ }
+ 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