docs: def handle_join(self, params):
          """
          Handle the JOINing of a user to a channel. Valid channel names start
          with a # and consist of a-z, A-Z, 0-9 and/or '_'.
          """
          channel_names = params.split(' ', 1)[0]  # Ignore keys
          for channel_name in channel_names.split(','):
              r_channel_name = channel_name.strip()
  
              # Valid channel name?
              if not re.match('^#([a-zA-Z0-9_])+$', r_channel_name):
                  raise IRCError.from_name(
                      'nosuchchannel',
                      '%s :No such channel' % r_channel_name)
  
              # Add user to the channel (create new channel if not exists)
              channel = self.server.channels.setdefault(
                  r_channel_name,
                  IRCChannel(r_channel_name))
              channel.clients.add(self)
  
              # Add channel to user's channel list
              self.channels[channel.name] = channel
  
              # Send the topic
              response_join = ':%s TOPIC %s :%s' % (
                  channel.topic_by,
                  channel.name, channel.topic)
              self.send_queue.append(response_join)
  
              # Send join message to everybody in the channel, including yourself
              # and send user list of the channel back to the user.
              response_join = ':%s JOIN :%s' % (
                  self.client_ident(),
                  r_channel_name)
              for client in channel.clients:
                  client.send_queue.append(response_join)
  
              nicks = [client.nick for client in channel.clients]
              _vals = (
                  self.server.servername, self.nick, channel.name,
                  ' '.join(nicks))
              response_userlist = ':%s 353 %s = %s :%s' % _vals
              self.send_queue.append(response_userlist)
  
              _vals = self.server.servername, self.nick, channel.name
              response = ':%s 366 %s %s :End of /NAMES list' % _vals
              self.send_queue.append(response)