docs: def handle_nick(self, params):
          """
          Handle the initial setting of the user's nickname and nick changes.
          """
          nick = params
  
          # Valid nickname?
          if re.search(r'[^a-zA-Z0-9\-\[\]\'`^{}_]', nick):
              raise IRCError.from_name('erroneusnickname', ':%s' % nick)
  
          if self.server.clients.get(nick, None) == self:
              # Already registered to user
              return
  
          if nick in self.server.clients:
              # Someone else is using the nick
              raise IRCError.from_name('nicknameinuse', 'NICK :%s' % (nick))
  
          if not self.nick:
              # New connection and nick is available; register and send welcome
              # and MOTD.
              self.nick = nick
              self.server.clients[nick] = self
              response = ':%s %s %s :%s' % (
                  self.server.servername,
                  events.codes['welcome'], self.nick, SRV_WELCOME)
              self.send_queue.append(response)
              response = ':%s 376 %s :End of MOTD command.' % (
                  self.server.servername, self.nick)
              self.send_queue.append(response)
              return
  
          # Nick is available. Change the nick.
          message = ':%s NICK :%s' % (self.client_ident(), nick)
  
          self.server.clients.pop(self.nick)
          self.nick = nick
          self.server.clients[self.nick] = self
  
          # Send a notification of the nick change to all the clients in the
          # channels the client is in.
          for channel in self.channels.values():
              self._send_to_others(message, channel)
  
          # Send a notification of the nick change to the client itself
          return message