private function __construct($nick, $ident, $host, $mode, $channel = '')
 {
     $this->nick = $nick;
     $this->ident = $ident;
     $this->host = $host;
     $this->mode = $mode;
     self::$users[$nick] = $this;
     if ($channel) {
         $this->channels[$channel] = IRCServerChannel::getChannel($channel);
         $this->channels[$channel]->users[$nick] = $this;
     }
 }
 /**
  * Process an incoming message
  *
  * @param string Raw line from the server
  */
 private function processIncoming($message)
 {
     $this->lastping = time();
     $parts = explode(' ', trim($message, ": \r\n")) + array('', '');
     switch ($parts[0]) {
         case 'NOTICE':
             if (!$this->authenticated && $parts[1] == 'AUTH') {
                 $this->send_line("NICK {$this->nick}");
                 $this->send_line("USER {$this->nick} localhost {$this->server} :{$this->nick}");
                 $this->authenticated = TRUE;
             }
             break;
         case 'PING':
             $this->send_line('PONG ' . $parts[1]);
     }
     switch ($parts[1]) {
         case 'PRIVMSG':
             $content = trim(implode(' ', array_slice($parts, 3)), ": ");
             if (substr($content, 0, 1) == "") {
                 $ctcp = true;
                 $content = trim($content, "");
             }
             if ($content == 'VERSION' && $ctcp) {
                 $this->sendCTCP(IRCServerUser::getByHostmask($parts[0])->nick, 'VERSION V7IRC');
             } else {
                 if ($parts[2] != $this->nick) {
                     // Process channel text
                     $user = IRCServerUser::getByHostmask($parts[0]);
                     $chan = IRCServerChannel::getChannel($parts[2]);
                     $chan->event_msg($user, $content);
                 } else {
                     // Process private message
                 }
             }
             break;
         case 'KICK':
             $content = trim(implode(' ', array_slice($parts, 4)), ": ");
             if ($parts[3] == $this->nick) {
                 $user = IRCServerUser::getByHostmask($parts[0]);
                 $chan = IRCServerChannel::getChannel($parts[2]);
                 $chan->online = FALSE;
                 $chan->event_kicked($user, $content);
             } else {
                 $user = IRCServerUser::getByHostmask($parts[0]);
                 $victim = IRCServerUser::getUser($parts[3]);
                 $chan = IRCServerChannel::getChannel($parts[2]);
                 unset($victim->channels[$chan->channel]);
                 $chan->event_kick($user, $content, $victim);
             }
             break;
         case 'NICK':
             $user = IRCServerUser::getByHostmask($parts[0]);
             foreach (IRCServerChannel::$channels as $name => $chan) {
                 $chan->event_nick($user, trim($parts[2], ':'));
             }
             break;
         case 'JOIN':
             $chan = IRCServerChannel::getChannel(trim($parts[2], ':'));
             $user = IRCServerUser::getByHostmask($parts[0], $chan->channel);
             $chan->event_join($user);
             break;
         case 'PART':
             $user = IRCServerUser::getByHostmask($parts[0]);
             $chan = IRCServerChannel::getChannel($parts[2]);
             unset($user->channels[$chan->channel]);
             $chan->event_part($user);
             break;
         case 'QUIT':
             $content = trim(implode(' ', array_slice($parts, 3)), ": ");
             $user = IRCServerUser::getByHostmask($parts[0]);
             foreach (IRCServerChannel::$channels as $chan) {
                 foreach ($chan->users as $chanuser) {
                     if ($chanuser == $user) {
                         unset($user->channels[$chan->channel]);
                         $chan->event_quit($user, $content);
                     }
                 }
             }
             break;
         case 'NOTICE':
             if (in_array($parts[2], array('AUTH', '*', '***'))) {
                 if (!$this->authenticated) {
                     $this->send_line("NICK {$this->nick}");
                     $this->send_line("USER {$this->nick} localhost {$this->server} :{$this->nick}");
                     $this->authenticated = TRUE;
                 }
                 break;
             }
             $content = trim(implode(' ', array_slice($parts, 3)), ": ");
             $user = IRCServerUser::getByHostmask($parts[0]);
             if ($parts[2] != $this->nick) {
                 $chan = IRCServerChannel::getChannel($parts[2]);
                 $chan->event_notice($user, $content);
             }
             break;
         case 'MODE':
             $content = trim(implode(' ', array_slice($parts, 3)), ": ");
             $user = IRCServerUser::getByHostmask($parts[0]);
             if ($parts[2] != $this->nick) {
                 $chan = IRCServerChannel::getChannel($parts[2]);
                 $chan->event_mode($user, $content);
                 $chan->add_modes($content);
             }
             break;
         case '005':
             $this->online = TRUE;
             break;
         case '332':
             $content = trim(implode(' ', array_slice($parts, 4)), ": ");
             $chan = IRCServerChannel::getChannel($parts[3]);
             $chan->topic = $content;
             break;
         case '353':
             $channel_obj = IRCServerChannel::getChannel(strtolower($parts[4]));
             $channel_obj->event_names(trim(implode(' ', array_slice($parts, 5)), ": "));
             break;
         case '366':
             $channel_obj = IRCServerChannel::getChannel(strtolower($parts[3]));
             $channel_obj->event_names_end();
             break;
     }
 }