2) { $line2 = $line; array_shift($line2); array_shift($line2); if($line2[0]{0} == ':') { $line2[0]{0} = ' '; $line2[0] = ltrim($line2[0]); } $line2 = '(' . implode(' ', $line2) . ')'; } $sender = $line[0]; $sender{0} = ' '; $sender = ltrim($sender); $sender = explode('!', $sender); $sender[0] = strtolower($sender[0]); if(isset($lfiles[$sender[0]]) && $lfiles[$sender[0]]['show_servermsgs']) lfile_add('* ' . $sender[0] . ' (' . $sender[1] . ') has quit ' . $line2, $sender[0]); foreach($lfiles[$server]['channels'] as $channel => $tmp) { if(isset($lfiles[$channel]) && $lfiles[$channel]['users'][$sender[0]]) lfile_add('* ' . $sender[0] . ' (' . $sender[1] . ') has quit ' . $line2, $channel); } return 16; } function sendWhois() { global $line, $server, $lfiles; // 21:39:07 Sent: // WHOIS nick1,nick2 lfile_add('/' . $line[0] . ' ' . $line[1], $server); $line[1] = strtolower($line[1]); $nicks = explode(',', $line[1]); foreach($nicks as $nick2) { if(isset($lfiles[$nick2]) && $lfiles[$nick2]['show_servermsgs']) lfile_add('/' . $line[0] . ' ' . $nick2, $nick2); } return 15; } function receiveMode() { global $line, $server; // 18:55:48 Received: // :nick!~ident@host MODE nick :+ix // 18:56:08 Received: // :X!ident@host MODE #channel +o nick // 19:07:53 Received: // :X!ident@host MODE #channel +l 42 $line2 = $line; array_shift($line2); $line2 = implode(' ', $line2); $sender = $line[0]; $sender{0} = ' '; $sender = ltrim($sender); $sender = explode('!', $sender); $sender[0] = strtolower($sender[0]); $line[2] = strtolower($line[2]); if($line[2]{0} != '#') lfile_add('* ' . $sender[0] . ' (' . $sender[1] . ') sets ' . $line2, $server); else lfile_add('* ' . $sender[0] . ' (' . $sender[1] . ') sets ' . $line2, $line[2]); return 14; } function sendMode() { global $line, $server, $ofiles; // 18:55:43 Sent: // MODE nick +ix // 18:55:48 Sent: // MODE #channel $line2 = implode(' ', $line); lfile_add('/' . $line2, $server); $line[1] = strtolower($line[1]); if(isset($ofiles[$line[1]])) lfile_add('/' . $line2, $line[1]); return 13; } function receiveServer($tmp) { global $line, $tokens, $server, $lfiles, $cdate; // 18:54:50 Received: // NOTICE AUTH :*** Looking up your hostname // 14:51:09 Received: // :server NOTICE AUTH :*** Looking up your hostname... // 14:51:10 Received: // :server 001 nick :Welcome to the IRC server nick!~ident@host // 18:55:43 Received: // :server 002 nick :Your host is server, running version N // 18:55:43 Received: // :server 003 nick :This server was created Thu Jan 1 1970 at 00:00:00 UTC // 18:55:43 Received: // :server 251 nick :There are 1 users and 1 invisible on 1 servers // 18:55:43 Received: // :server 252 nick 1 :operator(s) online // 18:55:43 Received: // :server 254 nick 1 :channels formed // 18:55:43 Received: // :nick 255 nick :I have 1 clients and 1 servers // 14:51:10 Received: // :server 265 nick :Current Local Users: 1 Max: 2 // 14:51:10 Received: // :server 266 nick :Current Global Users: 1 Max: 2 // 18:55:43 Received: // :server NOTICE nick :Highest connection count: 1 (1 clients) // 18:55:43 Received: // :server 375 nick :- server Message of the Day - // 18:55:44 Received: // :server 372 nick :Type /MOTD to read the AUP before continuing using this service. // 18:55:44 Received: // :server 372 nick :The message of the day was last changed: 1970-01-01 00:00 // 18:55:44 Received: // :server 376 nick :End of /MOTD command. // 18:55:44 Received: // :server NOTICE nick :on 1 ca 1(1) ft 1(1) // 18:55:46 Received: // :server 302 nick :nick=+~ident@host // 18:55:01 Received: // :server 433 * nick :Nickname is already in use. // 18:55:12 Received: // :server 433 nick nick :Nickname is registered to someone else // 19:18:17 Received: // :server 396 nick host2 :is now your hidden host // 21:39:09 Received: // :server 311 nick nick2 ~ident host * :Real name // 21:39:09 Received: // :server 319 nick nick2 :#channel // 21:39:09 Received: // :server 312 nick nick2 server2 :Server name // 13:05:48 Received: // :server 330 nick nick2 username2 :is logged in as // 18:54:53 Received: // :server 317 nick nick2 1 2 :seconds idle, signon time // 21:39:09 Received: // :server 318 nick nick2 :End of /WHOIS list. // with or without : if($line[$tmp] == 317) { if($line[(4+$tmp)] > $cdate) { $cdate = $line[(4+$tmp)]; fake_close_files(); } $line[(4+$tmp)] = date('Y-m-d H:i:s', $line[(4+$tmp)]) . ' ('.$line[(4+$tmp)].')'; } else if($line[$tmp] == '001') fake_close_files(true); else if($line[$tmp] == 319) { $line[(2+$tmp)] = strtolower($line[(2+$tmp)]); $channels = $line; if($tmp == 1) array_shift($channels); array_shift($channels); array_shift($channels); array_shift($channels); if($channels[0]{0} == ':') { $channels[0]{0} = ' '; $channels[0] = ltrim($channels[0]); } foreach($channels as $channel) { if($channel{0} != '#') { $channel{0} = ' '; $channel = ltrim($channel); } $channel = strtolower($channel); if(isset($lfiles[$channel])) $lfiles[$channel]['users'][$line[(2+$tmp)]] = true; } } $line2 = $line; if($tmp == 1) array_shift($line2); array_shift($line2); array_shift($line2); $line2 = implode(' ', $line2); if($line[$tmp] == 'NOTICE') $line2 = 'NOTICE '.$line2; if($line[$tmp] == 372) $t = false; else $t = true; lfile_add($line2, $server, false, $t); $tmp2 = array(311, 319, 312, 330, 317, 318); if(in_array($line[$tmp], $tmp2)) { $line[(2+$tmp)] = strtolower($line[(2+$tmp)]); if(isset($lfiles[$line[(2+$tmp)]]) && $lfiles[$line[(2+$tmp)]]['show_servermsgs']) lfile_add('* ' . $line2, $line[(2+$tmp)], false, $t); } return 9; } function receivePartJoin() { global $line, $tokens, $lfiles; // 19:00:01 Received: // :nick!ident@host JOIN #channel,#channel2,#channel3 key // 14:51:16 Received: // :nick!ident@host JOIN :#channel,#channel2 key // 21:16:20 Received: // :nick!ident@host PART #channel,#channel2 // 13:15:56 Received: // :nick!ident@host PART #channel :message $line2 = ''; if($line[1] == 'JOIN') { $msg = 'joined'; $channels = $line; array_shift($channels); array_shift($channels); $channels = explode(',', implode(' ', $channels)); } else { $msg = 'left'; $channels = explode(',', $line[2]); if($tokens > 3) { $line2 = $line; array_shift($line2); array_shift($line2); array_shift($line2); if($line2[0]{0} == ':') { $line2[0]{0} = ' '; $line2[0] = ltrim($line2[0]); } $line2 = implode(' ', $line2); $line2 = ' ('.$line2.')'; } } $sender = $line[0]; $sender{0} = ' '; $sender = ltrim($sender); $sender = explode('!', $sender); $sender[0] = strtolower($sender[0]); foreach($channels as $channel) { $channel2 = explode(' ', $channel); $channel2[0] = strtolower($channel2[0]); lfile_add('* ' . $sender[0] . ' ('.$sender[1].') has ' . $msg . ' ' . $channel . $line2, $channel2[0]); if($line[1] == 'JOIN') $lfiles[$channel2[0]]['users'][$sender[0]] = true; else unset($lfiles[$channel2[0]]['users'][$sender[0]]); if(isset($lfiles[$sender[0]])) { $lfiles[$sender[0]]['show_ip'] = false; if($lfiles[$sender[0]]['show_servermsgs']) lfile_add('* ' . $sender[0] . ' ('.$sender[1].') has ' . $msg . ' ' . $channel . $line2, $sender[0]); } } return 12; } function sendCommands() { global $line, $server, $lfiles, $nick; // 19:18:11 Sent: // NICK nick2 // PASS|NICK|USER|SERVER|OPER|USERHOST|QUIT $line2 = implode(' ', $line); lfile_add('/' . $line2, $server); if($line[0] == 'QUIT') { foreach($lfiles as $f => $tmp2) { if($lfiles[$f]['show_servermsgs']) lfile_add('/' . $line2, $f); } } else if($line[0] == 'NICK') $nick = strtolower($line[1]); if($line[0] == 'QUIT' || $line[0] == 'USER') fake_close_files(true); return 8; } function sendPartJoin() { global $line, $lfiles, $server, $nick; // 15:11:25 Sent: // PART #channel,#channel2 // 18:55:43 Sent: // JOIN #channel,#channel2,#channel3 key $channels = $line; array_shift($channels); $line2 = implode(' ', $channels); lfile_add('/'.$line[0].' ' . $line2, $server); $channels = explode(',', $line2); foreach($channels as $channel) { $channel2 = explode(' ', $channel); $channel2[0] = strtolower($channel2[0]); lfile_init($channel2[0]); if($line[0] == 'JOIN') { $lfiles[$channel2[0]]['show_servermsgs'] = true; $lfiles[$channel2[0]]['users'][$nick] = true; $lfiles[$server]['channels'][$channel2[0]] = true; } else { $lfiles[$channel2[0]]['show_servermsgs'] = false; unset($lfiles[$channel2[0]]['users'][$nick]); unset($lfiles[$server]['channels'][$channel2[0]]); } lfile_add('/'.$line[0].' ' . $line2, $channel2[0]); } return 4; } function receiveTopicNames($tmp2) { global $line, $lfiles; // 18:55:48 Received: // :server 353 nick = #channel :nick nick2 nick3 nick4 // with or without : $line2 = $line; if($tmp2 == 1) array_shift($line2); array_shift($line2); array_shift($line2); array_shift($line2); array_shift($line2); $line2[0]{0} = ' '; $line2[0] = ltrim($line2[0]); $line[(3+$tmp2)] = strtolower($line[(3+$tmp2)]); lfile_init($line[(3+$tmp2)]); $lfiles[$line[(3+$tmp2)]]['show_servermsgs'] = true; foreach($line2 as $nick2) { if($nick2{0} == '@' || $tmp3{0} == '+') { $nick2{0} = ' '; $nick2 = ltrim($nick2); } $nick2 = strtolower($nick2); $lfiles[$line[(3+$tmp2)]]['users'][$nick2] = true; } $line2 = implode(' ', $line2); lfile_add('* Nicks in '.$line[(3+$tmp2)].': ' . $line2, $line[(3+$tmp2)]); return 7; } function receiveTopicBy($tmp2) { global $line, $lfiles, $cdate; // 12:45:33 Received: // :server 333 nick #channel nick2 2 // with or without : $line[(2+$tmp2)] = strtolower($line[(2+$tmp2)]); lfile_init($line[(2+$tmp2)]); $lfiles[$line[(2+$tmp2)]]['show_servermsgs'] = true; lfile_add('* Topic for ' . $line[(2+$tmp2)] . ' set by ' . $line[(3+$tmp2)] . ' at ' . date('Y-m-d H:i:s', $line[(4+$tmp2)]) . ' ('.$line[(4+$tmp2)].')', $line[(2+$tmp2)]); if($line[(4+$tmp2)] > $cdate) { $cdate = $line[(4+$tmp2)]; fake_close_files(); } return 6; } function receiveTopic($tmp2) { global $line, $tokens, $lfiles; // 12:45:33 Received: // :server 332 nick #channel :channel topic message // with or without : $tmp = $line; if($tmp2 == 1) array_shift($tmp); array_shift($tmp); array_shift($tmp); array_shift($tmp); $tmp = implode(' ', $tmp); $tmp{0} = ' '; $line[(2+$tmp2)] = strtolower($line[(2+$tmp2)]); lfile_init($line[(2+$tmp2)]); $lfiles[$line[(2+$tmp2)]]['show_servermsgs'] = true; lfile_add('* Topic for ' . $line[(2+$tmp2)] . ' is:' . $tmp, $line[(2+$tmp2)]); return 5; } function lfile_init($f) { global $dest, $lfiles, $ofiles; if(isset($lfiles[$f])) return false; $lfiles[$f] = array('show_date' => true, 'show_servermsgs' => true, 'show_ip' => true, 'users' => array()); $ofiles[$f] = fopen($dest.'/'.$f, 'ab'); return true; } function lfile_add($s, $f, $d = false, $t = true) { global $lfiles, $ofiles, $cdate, $time; lfile_init($f); if($lfiles[$f]['show_date'] || $d) { $lfiles[$f]['show_date'] = false; fwrite($ofiles[$f], "\n" . date('Y-m-d', $cdate) . ' ' . $time . " \n\n"); } if($t) fwrite($ofiles[$f], $time . ' ' . $s . " \n"); else fwrite($ofiles[$f], $s . " \n"); return true; } function timeManager() { global $cdate, $line, $time, $ptime, $time2, $ptime2; $tmp = str_replace(':', '', $line[0]); if(isset($tmp{6}) || !isset($tmp{5}) || !is_numeric($tmp)) return false; $time = $line[0]; $time2 = intval($tmp); if($cdate > 3 && $time2 < $ptime2) { $tmp3 = explode('-', date('Y-m-d', strtotime('+1 day', $cdate))); $cdate = mktime($time2[0], $time2[1], $time2[2], $tmp3[1], $tmp3[2], $tmp3[0]); fake_close_files(); } if($line[1] == 'Received:') return -3; return 3; } function fake_close_files($not_fake = false) { global $lfiles, $ofiles, $server; if($not_fake) { foreach($lfiles as $key => $val) { if($key == $server) continue; unset($lfiles[$key]); fclose($ofiles[$key]); unset($ofiles[$key]); } return true; } foreach($lfiles as $key => $val) { if($key == $server) continue; $lfiles[$key]['show_date'] = true; $lfiles[$key]['show_servermsgs'] = false; $lfiles[$key]['show_ip'] = true; $lfiles[$key]['users'] = array(); } return true; } $cdate = 0; $ofiles = array( $server => fopen($dest.'/'.$server, 'wb') ); if(!$ofiles[$server]) die('Failed opening '.$server); $fh = fopen($file, 'rb'); if(!$fh) die('Failed opening '.$file); $lfiles = array( $server => array('show_servermsgs' => true, 'show_date' => true, 'channels' => array(), 'users' => array()) ); $ptime2 = $ptime = $pltype = false; $fsize = filesize($file); if(!$fsize) die('Failed getting file size for '.$file); $percent = 0; echo "\n\nSize: ".$fsize." bytes Progress: 0% "; while(!feof($fh)) { set_time_limit(30); $line = fgets($fh); if(!$line) break; $size = ftell($fh)+1; $tmp = round(($size/$fsize)*100); if($tmp > $percent) { $percent = $tmp; if($percent == 10 || $percent == 50) { echo "\n\nElapsed time: ".round(getmicrotime()-$start, 3) . " seconds Speed: ".round($fsize/(getmicrotime()-$start), 3). " bytes per second Estimated time remaining: ".round((getmicrotime()-$start)*(100/$percent)-(getmicrotime()-$start), 3)." seconds Progress: "; } echo $percent . "% "; } if(!isset($line{2})) { $pltype = false; continue; } $ntype = false; $line = trim($line); if($line == '==== Logging started ====') { fake_close_files(true); lfile_add('*** Logging started ***', $server, true); $ntype = 11; } else { $line = explode(' ', $line); $tokens = count($line); } if(!$ntype && $pltype != -3 && $pltype != 3 && $tokens == 2 && ($line[1] == 'Received:' || $line[1] == 'Sent:')) $ntype = timeManager(); // 18:55:13 Received: if(!$ntype && $pltype == -3) { if($line[0]{0} == ':') $tmpc = 1; else $tmpc = 0; if($tokens >= 4 && $tmpc == 1 && $line[1] == 'PRIVMSG') $ntype = receivePriv(); if(!$ntype && $tmpc == 1 && $tokens >= 3 && ($line[1] == 'PART' || $line[1] == 'JOIN')) { if($line[2]{0} == ':') { $line[2]{0} = ' '; $line[2] = ltrim($line[2]); } if($line[2]{0} == '#') $ntype = receivePartJoin(); } if(!$ntype && $tokens >= 2 && $tmpc == 1 && $line[1] == 'QUIT') $ntype = receiveQuit(); $tmp = array(317, 330, 311, 319, 312, 318, 396, 433, 302, 372, 376, 'NOTICE', 375, 266, 265, 255, 254, 252, 251, '001', '002', '003'); if(!$ntype && in_array($line[$tmpc], $tmp)) $ntype = receiveServer($tmpc); if(!$ntype && $tokens >= (3+$tmpc) && $line[$tmpc] == 332 && $line[(2+$tmpc)]{0} == '#' && $line[(3+$tmpc)]{0} == ':') $ntype = receiveTopic($tmpc); if(!$ntype && $line[$tmpc] == 329 && $line[(2+$tmpc)]{0} == '#' && $tokens == (4+$tmpc) && $line[(3+$tmpc)] > $cdate) { // 22:12:34 Received: // :server 329 nick #channel 2 // i don't know what's this, but i'm using this for more date and time guessing :) // with or without the :server $cdate = $line[(3+$tmpc)]; fake_close_files(); $ntype = 2; } if(!$ntype && $tokens == (5+$tmpc) && $line[(2+$tmpc)]{0} == '#' && $line[$tmpc] == 333 && is_numeric($line[(4+$tmpc)])) $ntype = receiveTopicBy($tmpc); if(!$ntype && $tokens >= (5+$tmpc) && $line[(3+$tmpc)]{0} == '#' && $line[$tmpc] == 353) $ntype = receiveTopicNames($tmpc); if(!$ntype && $tokens >= 4 && $tmpc == 1 && $line[1] == 'MODE') $ntype = receiveMode(); if(!$ntype && $line[0] == 'ERROR') { // ERROR :Closing Link: nick by server (Too many connections from your host) fake_close_files(); lfile_add('* ' . implode(' ', $line), $server); $ntype = 10; } } // 18:55:13 Sent: if(!$ntype && $pltype == 3) { if($tokens >= 3 && $line[0] == 'PRIVMSG') $ntype = sendPriv(); if(!$ntype && $line[1]{0} == '#' && ($line[0] == 'PART' || $line[0] == 'JOIN')) $ntype = sendPartJoin(); $tmp = array('PASS', 'NICK', 'USER', 'SERVER', 'OPER', 'USERHOST', 'QUIT'); if(!$ntype && in_array($line[0], $tmp)) $ntype = sendCommands(); if(!$ntype && $tokens >= 2 && $line[0] == 'MODE') $ntype = sendMode(); if(!$ntype && $tokens == 2 && $line[0] == 'WHOIS') $ntype = sendWhois(); } $pltype = $ntype; $ptime = $time; $ptime2 = $time2; } fclose($fh); fake_close_files(true); fclose($ofiles[$server]); echo "\n\nElapsed time: " . round(getmicrotime()-$start, 3) . " seconds Speed: ".round($fsize/(getmicrotime()-$start), 3). " bytes per second Done!\n\n"; ?>