+func (c *Client) Join(cmd string) {
+ args := strings.Split(cmd, " ")
+ rs := strings.Split(args[0], ",")
+ keys := []string{}
+ if len(args) > 1 {
+ keys = strings.Split(args[1], ",")
+ }
+RoomCycle:
+ for n, roomName := range rs {
+ if !RERoom.MatchString(roomName) {
+ c.ReplyNoChannel(roomName)
+ continue
+ }
+ var key string
+ if (n < len(keys)) && (keys[n] != "") {
+ key = keys[n]
+ }
+ roomsLock.RLock()
+ for roomNameExisting, room := range rooms {
+ if roomName != roomNameExisting {
+ continue
+ }
+ if (room.key != "") && (room.key != key) {
+ c.ReplyNicknamed("475", roomName, "Cannot join channel (+k)")
+ roomsLock.RUnlock()
+ return
+ }
+ room.events <- ClientEvent{c, EventNew, ""}
+ roomsLock.RUnlock()
+ continue RoomCycle
+ }
+ roomsLock.RUnlock()
+ roomNew := RoomRegister(roomName)
+ if *verbose {
+ log.Println("room", roomName, "created")
+ }
+ if key != "" {
+ roomNew.key = key
+ roomNew.StateSave()
+ }
+ roomNew.events <- ClientEvent{c, EventNew, ""}
+ }
+}
+
+func (client *Client) SendWhois(nicknames []string) {
+ var c *Client
+ for _, nickname := range nicknames {
+ nickname = strings.ToLower(nickname)
+ clientsLock.RLock()
+ for c = range clients {
+ if strings.ToLower(c.nickname) == nickname {
+ clientsLock.RUnlock()
+ goto Found
+ }
+ }
+ clientsLock.RUnlock()
+ client.ReplyNoNickChan(nickname)
+ continue
+ Found:
+ var host string
+ if *cloak != "" {
+ host = *cloak
+ } else {
+ host, _, err := net.SplitHostPort(c.conn.RemoteAddr().String())
+ if err != nil {
+ log.Printf("can't parse RemoteAddr %q: %v", host, err)
+ host = "Unknown"
+ }
+ }
+ client.ReplyNicknamed("311", c.nickname, c.username, host, "*", c.realname)
+ client.ReplyNicknamed("312", c.nickname, *hostname, *hostname)
+ if c.away != "" {
+ client.ReplyNicknamed("301", c.nickname, c.away)
+ }
+ subscriptions := make([]string, 0)
+ roomsLock.RLock()
+ for _, room := range rooms {
+ for subscriber := range room.members {
+ if subscriber.nickname == nickname {
+ subscriptions = append(subscriptions, room.name)
+ }
+ }
+ }
+ roomsLock.RUnlock()
+ sort.Strings(subscriptions)
+ client.ReplyNicknamed("319", c.nickname, strings.Join(subscriptions, " "))
+ client.ReplyNicknamed("318", c.nickname, "End of /WHOIS list")
+ }