code: func (conn *Conn) h_353(line *Line) {
  	if !line.argslen(2) {
  		return
  	}
  	if ch := conn.st.GetChannel(line.Args[2]); ch != nil {
  		nicks := strings.Split(line.Args[len(line.Args)-1], " ")
  		for _, nick := range nicks {
  			// UnrealIRCd's coders are lazy and leave a trailing space
  			if nick == "" {
  				continue
  			}
  			switch c := nick[0]; c {
  			case '~', '&', '@', '%', '+':
  				nick = nick[1:]
  				fallthrough
  			default:
  				if conn.st.GetNick(nick) == nil {
  					// we don't know this nick yet!
  					conn.st.NewNick(nick)
  				}
  				if _, ok := conn.st.IsOn(ch.Name, nick); !ok {
  					// This nick isn't associated with this channel yet!
  					conn.st.Associate(ch.Name, nick)
  				}
  				switch c {
  				case '~':
  					conn.st.ChannelModes(ch.Name, "+q", nick)
  				case '&':
  					conn.st.ChannelModes(ch.Name, "+a", nick)
  				case '@':
  					conn.st.ChannelModes(ch.Name, "+o", nick)
  				case '%':
  					conn.st.ChannelModes(ch.Name, "+h", nick)
  				case '+':
  					conn.st.ChannelModes(ch.Name, "+v", nick)
  				}
  			}
  		}
  	} else {
  		logging.Warn("irc.353(): received NAMES list for unknown channel %s",
  			line.Args[2])
  	}
  }
docs: // Handle 353 names reply