private static function loop($line)
 {
     $d = IRC::split($line);
     if ($d === null) {
         return;
     }
     if ($d['type'] == 'direct') {
         switch ($d['command']) {
             case 'ping':
                 self::send('PONG :' . $d['pieces'][0]);
                 break;
         }
     } else {
         switch ($d['command']) {
             case '376':
             case '422':
                 self::send('JOIN ' . self::$channel);
                 break;
             case 'privmsg':
                 if (strtolower($d['target']) == self::$channel) {
                     $rawmessage = $d['pieces'][0];
                     $message = str_replace("", '', $rawmessage);
                     $message = preg_replace('/\\003(\\d\\d?(,\\d\\d?)?)?/', '', $message);
                     $data = parseFeed($message);
                     if ($data === false) {
                         return;
                     }
                     $data['line'] = $message;
                     $data['rawline'] = $rawmessage;
                     if (stripos('N', $data['flags']) !== false) {
                         self::bail($data, 'New article');
                         return;
                     }
                     $stalkchannel = array();
                     foreach (Globals::$stalk as $key => $value) {
                         if (myfnmatch(str_replace('_', ' ', $key), str_replace('_', ' ', $data['user']))) {
                             $stalkchannel = array_merge($stalkchannel, explode(',', $value));
                         }
                     }
                     foreach (Globals::$edit as $key => $value) {
                         if (myfnmatch(str_replace('_', ' ', $key), str_replace('_', ' ', ($data['namespace'] == 'Main:' ? '' : $data['namespace']) . $data['title']))) {
                             $stalkchannel = array_merge($stalkchannel, explode(',', $value));
                         }
                     }
                     $stalkchannel = array_unique($stalkchannel);
                     foreach ($stalkchannel as $chan) {
                         IRC::say($chan, 'New edit: [[' . ($data['namespace'] == 'Main:' ? '' : $data['namespace']) . $data['title'] . ']] https://en.wikipedia.org/w/index.php?title=' . urlencode($data['namespace'] . $data['title']) . '&diff=prev&oldid=' . urlencode($data['revid']) . ' * ' . $data['user'] . ' * ' . $data['comment']);
                     }
                     switch ($data['namespace'] . $data['title']) {
                         case 'User:'******'/Run':
                             Globals::$run = Api::$q->getpage('User:'******'/Run');
                             break;
                         case 'Wikipedia:Huggle/Whitelist':
                             Globals::$wl = Api::$q->getpage('Wikipedia:Huggle/Whitelist');
                             break;
                         case 'User:'******'/Optin':
                             Globals::$optin = Api::$q->getpage('User:'******'/Optin');
                             break;
                         case 'User:'******'/AngryOptin':
                             Globals::$aoptin = Api::$q->getpage('User:'******'/AngryOptin');
                             break;
                     }
                     if ($data['namespace'] != 'Main:' and !preg_match('/\\* \\[\\[(' . preg_quote($data['namespace'] . $data['title'], '/') . ')\\]\\] \\- .*/i', Globals::$optin)) {
                         self::bail($data, 'Outside of valid namespaces');
                         return;
                     }
                     echo 'Processing: ' . $message . "\n";
                     Process::processEdit($data);
                 }
                 break;
         }
     }
 }