code: func (conn *Conn) h_JOIN(line *Line) {
  	ch := conn.st.GetChannel(line.Args[0])
  	nk := conn.st.GetNick(line.Nick)
  	if ch == nil {
  		// first we've seen of this channel, so should be us joining it
  		// NOTE this will also take care of nk == nil && ch == nil
  		if !conn.Me().Equals(nk) {
  			logging.Warn("irc.JOIN(): JOIN to unknown channel %s received "+
  				"from (non-me) nick %s", line.Args[0], line.Nick)
  			return
  		}
  		conn.st.NewChannel(line.Args[0])
  		// since we don't know much about this channel, ask server for info
  		// we get the channel users automatically in 353 and the channel
  		// topic in 332 on join, so we just need to get the modes
  		conn.Mode(line.Args[0])
  		// sending a WHO for the channel is MUCH more efficient than
  		// triggering a WHOIS on every nick from the 353 handler
  		conn.Who(line.Args[0])
  	}
  	if nk == nil {
  		// this is the first we've seen of this nick
  		conn.st.NewNick(line.Nick)
  		conn.st.NickInfo(line.Nick, line.Ident, line.Host, "")
  		// since we don't know much about this nick, ask server for info
  		conn.Who(line.Nick)
  	}
  	// this takes care of both nick and channel linking \o/
  	conn.st.Associate(line.Args[0], line.Nick)
  }
docs: // Handle JOINs to channels to maintain state