-// Send message to all room's subscribers, possibly excluding someone
-func (room *Room) Broadcast(msg string, client_to_ignore ...*Client) {
- for member := range room.members {
- if (len(client_to_ignore) > 0) && member == client_to_ignore[0] {
+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
+ }
+ if len(nicknames) > 0 {
+ c.ReplyNicknamed("353", "=", r.name, strings.Join(nicknames, " "))
+ }
+ c.ReplyNicknamed("366", r.name, "End of NAMES list")
+}
+
+func (r *Room) Broadcast(msg string, excludes ...*Client) {
+ var exclude *Client
+ if len(excludes) > 0 {
+ exclude = excludes[0]
+ }
+ r.RLock()
+ for member := range r.members {
+ if member == exclude {