Advertisement
Guest User

Untitled

a guest
May 7th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 33.89 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. TODO:
  5. finish working on !master's modules compatibility
  6. activatemaster() gives mysql errors because you're not connected when you use modules! need to think of a way to save the masters to a file
  7. add the ability to save the bound commands to modules instead of databases (and it can be changed a runtime; if it is it will get all the commands in the database/modules and put them into the other)
  8. fetchmaster() and fetchcmd() use nearly the same code; make a smaller proc to fetch blind data from files (or even just fetch the name/row and return it in $row format) and shorten both procs?
  9. add mode detection (parsed from the 005 numeric's CHANMODES setting) so we can see when someone gets +o etc
  10. try to make the NAMES list parsing more like irssi's; i don't really like that it just pads 17 spaces to the right...
  11. add "timer" hooks to loop()
  12. there is a PHP internal function that has the same functionallity as implodefrom(), find it and use it in place of implodefrom()
  13. */
  14.  
  15. class aMessage {
  16.     var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
  17. }
  18.  
  19. class aIRC {
  20.     var $cM;
  21.     var $lastping, $pongwait, $pingsent, $pingpong, $modules, $logging, $modfolder, $dbbackupfolder;
  22.     var $host, $fp, $port, $logfile, $con, $server, $cmdChar, $sver;
  23.     var $cNick, $joinnick, $username, $realname, $joinchan, $auth, $authnick, $masters, $banned;
  24.     var $channames, $powers;
  25.     var $debug, $firstcon, $locked, $quit, $version, $kickrejoin, $rejoinwait, $invitejoin;
  26.     var $cTableName, $iTableName, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
  27. }
  28.  
  29. $IRC = new aIRC;
  30. $IRC->cM = new aMessage;
  31. $IRC->cM->param = array();
  32. $IRC->host = "localhost";
  33. $IRC->port = 6667;
  34. $IRC->joinchan = array("#Tootoot222", "#mixster", "#SRL-School", "#SRL");
  35. $IRC->joinnick = "Furry";
  36. $IRC->username = "Furry";
  37. $IRC->realname = "Furry";
  38. $IRC->authnick = "Tootoot222";
  39. $IRC->cNick = $IRC->joinnick;
  40. $IRC->auth = "";
  41. $IRC->server = "";
  42. $IRC->cmdChar = "!";
  43. $IRC->sver = "4.1";
  44. $IRC->logfile = "logfile_v" . $IRC->sver . ".txt";
  45. $IRC->modfolder = "./modules_v" . $IRC->sver . "/";
  46. $IRC->dbbackupfolder = "./db_backup_v" . $IRC->sver . "/";
  47. $IRC->rejoinwait = 5;
  48. $IRC->kickrejoin = true;
  49. $IRC->invitejoin = false;
  50. $IRC->locked = false;
  51. $IRC->logging = true;
  52. $IRC->modules = false;
  53. $IRC->debug = false;
  54. $IRC->pingpong = false;
  55. $IRC->channames = array();
  56. $IRC->powers = array(array(), array());
  57. $IRC->version = "Version " . $IRC->sver;
  58.  
  59. set_time_limit(0); //to ensure the script doesn't time out
  60.  
  61. date_default_timezone_set("America/Chicago"); //change this to your timezone
  62.  
  63. $firstmaster = "Tootoot222";
  64. $firstpass = "wat";
  65. $IRC->masters = array(strtolower($firstmaster) => 100);
  66.  
  67. $IRC->MySQLServer = "localhost";   
  68. $IRC->MySQLDatabase = "ircbotv4";
  69. $IRC->MySQLAccountName = "root";
  70. $IRC->MySQLAccountpassword = "";
  71. $IRC->iTableName = "imasters3";
  72. $IRC->cTableName = "cmd4";
  73. $IRC->hTableName = "hooks2";
  74.  
  75. function output($message, $newline = true, $timestamp = true) {
  76.     global $IRC;
  77.     foreach(explode("\r\n", $message) as $m) {
  78.         $out = ($timestamp ? "[" . date("H:i:s") . "] " : "") . $m . ($newline ? "\r\n" : "");
  79.         echo($out);
  80.         if($IRC->logging) {
  81.             fwrite($IRC->logfile, $out);
  82.         }
  83.     }
  84. }
  85.  
  86. function send($data, $out = true) {
  87.     global $IRC;
  88.     $a = explode("\n", $data);
  89.     foreach($a as $aa) {
  90.         fputs($IRC->fp, $aa . "\n");
  91.         if($out) {
  92.             output("-> " . $aa);
  93.         }
  94.     }
  95. }
  96.  
  97. function sendcmd($cmd, $param = false, $mess = false) {
  98.     send($cmd . ($param !== false ? (" " . (is_array($param) ? implode(" ", $param) : $param)) : "") . ((($param !== false) && ($mess !== false)) ? (" :" . $mess) : ""));
  99. }
  100.  
  101. function implodefrom($glue, $pieces, $from = 0) {
  102.     $r = "";
  103.     if(is_array($pieces)) {
  104.         $from = max(0, $from);
  105.         $r = $pieces[$from];
  106.         for($i = ($from + 1); $i < sizeof($pieces); $i++) {
  107.             $r .= $glue . $pieces[$i];
  108.         }
  109.     }
  110.     return($r);
  111. }
  112.  
  113. function startsWith($haystack, $needle) {
  114.     if(is_array($needle)) {
  115.         foreach($needle as $n) {
  116.             if(strpos($haystack, $n) === 0) {
  117.                 return($n);
  118.             }
  119.         }
  120.     }
  121.     return(strpos($haystack, $needle) === 0);
  122. }
  123.  
  124. function instr($needle, $haystack, $sensitive = false) {
  125.     if($sensitive) {
  126.         return((false !== strpos($haystack, $needle)) ? true : false);
  127.     }else {
  128.         return((false !== stristr($haystack, $needle)) ? true : false);
  129.     }
  130. }
  131.  
  132. function table_exists($tablename) {
  133.     global $IRC;
  134.     return(mysql_result(mysql_query("SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_schema = '" . $IRC->MySQLDatabase . "' AND table_name = '" . $tablename . "'", $IRC->con), 0) == 1);
  135. }
  136.  
  137. function startupbind() {
  138.     global $IRC;
  139.     if(!$IRC->modules && (!$IRC->con)) {
  140.         if(!($IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword))) {
  141.             output("MySQL error in startupMySQL: " . mysql_error());
  142.             output("Error! Failed to connect to MySQL; will not be using databases; will be using modules instead (experemental)! (continuing in 10 seconds)");
  143.             $IRC->modules = true;
  144.             sleep(10);
  145.         }else {
  146.             mysql_query("CREATE DATABASE IF NOT EXISTS " . $IRC->MySQLDatabase, $IRC->con);
  147.             mysql_select_db($IRC->MySQLDatabase, $IRC->con);
  148.             if(!table_exists($IRC->cTableName)) {
  149.                 mysql_query("CREATE TABLE " . $IRC->cTableName . "(name VARCHAR(30), code MEDIUMTEXT, privs INT, maker VARCHAR(30))", $IRC->con);
  150.             }
  151.             if(!table_exists($IRC->iTableName)) {
  152.                 global $firstmaster, $firstpass;
  153.                 mysql_query("CREATE TABLE " . $IRC->iTableName . "(name VARCHAR(30), pass VARCHAR(32), privs INT)", $IRC->con);
  154.                 mysql_query("INSERT INTO " . $IRC->iTableName . "(name, pass, privs) VALUES ('$firstmaster', '" . md5($firstpass) . "', 100)", $IRC->con);
  155.             }
  156.             if(!table_exists($IRC->hTableName)) {
  157.                 mysql_query("CREATE TABLE " . $IRC->hTableName . "(name VARCHAR(30), code MEDIUMTEXT, active BOOL)", $IRC->con);
  158.             }
  159.             return(true);
  160.         }
  161.     }
  162.     if(!file_exists($IRC->modfolder)) {
  163.         mkdir($IRC->modfolder);
  164.     }
  165.     return(false);
  166. }
  167.  
  168. function fetchcmd($cmd = "", $r = "", $hook = false) {
  169.     global $IRC;
  170.     $r = ($r ? $r : ($cmd ? "code" : "name"));
  171.     if($IRC->modules) {
  172.         if($dh = opendir($IRC->modfolder)) {
  173.             $rrr = array();
  174.             while(($file = readdir($dh)) !== false) {
  175.                 if((!is_dir($IRC->modfolder . $file)) && (stripos($file, ($hook ? "hook" : "cmd") . ".$cmd") === 0)) {
  176.                     $a = explode(".", $file);
  177.                     if($r != "*") {
  178.                         switch(strtoupper($r)) {
  179.                             case "CODE":
  180.                                 $rr = file_get_contents($IRC->modfolder . $file);
  181.                                 break;
  182.                             case "NAME":
  183.                                 $rr = $a[1];
  184.                                 break;
  185.                             case "PRIVS":
  186.                             case "ACTIVE":
  187.                                 $rr = $a[2];
  188.                                 break;
  189.                             case "MAKER":
  190.                                 $rr = $a[3];
  191.                                 break;
  192.                         }
  193.                     }else {
  194.                         $rr = array("name" => $a[1], ($hook ? "active" : "privs") => $a[2], "code" => file_get_contents($IRC->modfolder . $file), "maker" => $a[3]);
  195.                     }
  196.                     if($cmd) {
  197.                         closedir($dh);
  198.                         return($rr);
  199.                     }else {
  200.                         $rrr[] = $rr;
  201.                     }
  202.                 }
  203.             }
  204.             closedir($dh);
  205.             return($rrr);
  206.         }else {
  207.             output("fetchcmd failed to open modfolder! " . $IRC->modfolder);
  208.         }
  209.     }else {
  210.         $q = mysql_query("SELECT $r FROM " . ($hook ? $IRC->hTableName : $IRC->cTableName) . ($cmd ? " WHERE name='$cmd'" : ""), $IRC->con);
  211.         if(!$cmd) {
  212.             $rr = array();
  213.             while($row = mysql_fetch_array($q)) {
  214.                 if("*" == $r) {
  215.                     $rr[] = $row;
  216.                 }else {
  217.                     $rr[] = $row[$r];
  218.                 }
  219.             }
  220.             return($rr);
  221.         }else {
  222.             $row = mysql_fetch_array($q);
  223.             return((("*" != $r) ? $row[$r] : $row));
  224.         }
  225.     }
  226. }
  227.  
  228. function dumpDB($message = "", $oldcode = "", $newcode = "") {
  229.     global $IRC;
  230.     if(!file_exists($IRC->dbbackupfolder)) {
  231.         mkdir($IRC->dbbackupfolder);
  232.     }
  233.     $basename = "db_backup";
  234.     for($n = 1; file_exists($filename = ($IRC->dbbackupfolder . $basename . str_pad($n, 4, "0", STR_PAD_LEFT) . ".txt")); $n++);
  235.     if(!$fh = fopen($filename, 'w')) {
  236.         output("Failed to open database dumpfile: " . $filename . "\r\n");
  237.         return(false);
  238.     }
  239.     fwrite($fh, "//Dumpfile " . $n . " created on " . date("D M jS H:i:s", time()) . "\r\n\r\n");
  240.     fwrite($fh, "//" . $IRC->cM->sender . "; modules = " . ($IRC->modules ? "true" : "false") . ";" . ($message ? " " . $message : "") . ($oldcode ? "\r\n\r\n//Old code:\r\n" . $oldcode : "") . ($newcode ? "\r\n\r\n//New code:\r\n" . $newcode : ""));
  241.     fwrite($fh, "\r\n\r\n//*** commands: ***");
  242.     $cmds = fetchcmd("",  "*");
  243.     foreach($cmds as $row) {
  244.         fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["privs"] . " - " . $row["maker"] . ":\r\n" . $row["code"]);
  245.     }
  246.     fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** hooks: ***");
  247.     $cmds = fetchcmd("", "*", true);
  248.     foreach($cmds as $row) {
  249.         fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["active"] . ":\r\n" . $row["code"]);
  250.     }
  251.     fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** masters: ***");
  252.     $q = mysql_query("SELECT * FROM " . $IRC->mTableName, $IRC->con);
  253.     while($row = mysql_fetch_array($q)) {
  254.         fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["privs"] . ":\r\n" . $row["pass"]);
  255.     }
  256.     fclose($fh);
  257.     return(true);
  258. }
  259.  
  260. function swapbound() {
  261.     global $IRC;
  262.     $IRC->modules = !$IRC->modules;
  263.     startupbind();
  264.     if($IRC->modules && $IRC->con) {
  265.         for($n = 1; file_exists($foldername = ($IRC->modfolder . "backup" . str_pad($n, 4, "0", STR_PAD_LEFT) . "/")); $n++);
  266.         mkdir($foldername);
  267.         if($dh = opendir($IRC->modfolder)) {
  268.             while(($file = readdir($dh)) !== false) {
  269.                 if(!is_dir($IRC->modfolder . $file)) {
  270.                     rename($IRC->modfolder . $file, $foldername . $file);
  271.                 }
  272.             }
  273.             closedir($dh);
  274.         }
  275.         for($i = 0; $i < 2; $i++) {
  276.             $q = mysql_query("SELECT * FROM " . ($i ? $IRC->cTableName : $IRC->hTableName), $IRC->con);
  277.             while($row = mysql_fetch_array($q)) {
  278.                 file_put_contents($IRC->modfolder . ($i ? "cmd." : "hook.") . strtoupper($row["name"]) . "." . ($i ? ($row["privs"] . "." . strtolower($row["maker"])) : ($row["active"])) . ".php", $row["code"]);
  279.             }
  280.         }
  281.     }else {
  282.         dumpDB("Backing up database before replacing with modules");
  283.         mysql_query("DELETE FROM " . $IRC->cTableName);
  284.         mysql_query("DELETE FROM " . $IRC->hTableName);
  285.         if($dh = opendir($IRC->modfolder)) {
  286.             while(($file = readdir($dh)) !== false) {
  287.                 if(!is_dir($IRC->modfolder . $file)) {
  288.                     $n = explode(".", $file);
  289.                     if("cmd" == strtoupper($n[0])) {
  290.                         $cmd = mysql_real_escape_string(strtoupper($n[1]));
  291.                         $privs = min(max((is_numeric($n1) ? $n[2] : 100), -1), 100);
  292.                         $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
  293.                         $maker = mysql_real_escape_string($n[3]);
  294.                         mysql_query("INSERT INTO " . $IRC->cTableName . " (name, privs, code, maker) VALUES ('$cmd', $privs, '$code', '$maker')");
  295.                     }elseif("HOOK" == strtoupper($n[0])) {
  296.                         $cmd = mysql_real_escape_string(strtoupper($n[1]));
  297.                         $active = (($n[2] == true) ? "1" : "0");
  298.                         $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
  299.                         mysql_query("INSERT INTO " . $IRC->hTableName . " (name, active, code) VALUES ('$cmd', $active, '$code')");
  300.                     }
  301.                 }
  302.             }
  303.             closedir($dh);
  304.         }
  305.     }
  306. }
  307.  
  308. function fetchmaster($name = "", $r = "privs") {
  309.     global $IRC;
  310.     if($IRC->modules) {
  311.         if($dh = opendir($IRC->modfolder)) {
  312.             $rrr = array();
  313.             while(($file = readdir($dh)) !== false) {
  314.                 if((!is_dir($IRC->modfolder . $file)) && (stripos($file, "master.$name") === 0)) {
  315.                     $a = explode(".", $file);
  316.                     if($r != "*") {
  317.                         switch(strtoupper($r)) { //master.tootoot222.100.txt
  318.                             case "PASS":
  319.                                 $rr = file_get_contents($IRC->modfolder . $file);
  320.                                 break;
  321.                             case "NAME":
  322.                                 $rr = $a[1];
  323.                                 break;
  324.                             case "PRIVS":
  325.                                 $rr = $a[2];
  326.                                 break;
  327.                         }
  328.                     }else {
  329.                         $rr = array("name" => $a[1], "privs" => $a[2], "code" => file_get_contents($IRC->modfolder . $file));
  330.                     }
  331.                     if($name) {
  332.                         closedir($dh);
  333.                         return($rr);
  334.                     }else {
  335.                         $rrr[] = $rr;
  336.                     }
  337.                 }
  338.             }
  339.             closedir($dh);
  340.             return($rrr);
  341.         }else {
  342.             output("fetchmaster failed to open modfolder! " . $IRC->modfolder);
  343.         }
  344.     }else {
  345.         $q = mysql_query("SELECT $r FROM " . $IRC->iTableName . ($name ? " WHERE name='$name'" : ""), $IRC->con);
  346.         if(!$name) {
  347.             $rr = array();
  348.             while($row = mysql_fetch_array($q)) {
  349.                 if("*" == $r) {
  350.                     $rr[] = $row;
  351.                 }else {
  352.                     $rr[] = $row[$r];
  353.                 }
  354.             }
  355.             return($rr);
  356.         }else {
  357.             $row = mysql_fetch_array($q);
  358.             var_dump($row);
  359.             return((("*" != $r) ? $row[$r] : $row));
  360.         }
  361.     }
  362. }
  363.  
  364. function activatemaster($name, $nick, $pass) {
  365.     global $IRC;
  366.     $row = fetchmaster($name, "*");
  367.     var_dump($row);
  368.     if(md5($pass) == $row["pass"]) {
  369.         echo("good login\r\n");
  370.     }
  371.     /*$n = mysql_real_escape_string($name);
  372.     $r = mysql_fetch_array(mysql_query("SELECT * FROM " . $IRC->iTableName . " WHERE name='" . $n . "'", $IRC->con));
  373.     if($r["privs"] < 1) {
  374.         mysql_query("DELETE FROM " . $IRC->iTableName . " WHERE name='" . mysql_real_escape_string($name) . "'", $IRC->con);
  375.         return(false);
  376.     }
  377.     if(md5($pass) == $r["pass"]) {
  378.         $IRC->masters[strtolower($nick)] = $r["privs"];
  379.         return(true);
  380.     }
  381.     return(false);*/
  382. }
  383.  
  384. function handleBotCommands() {
  385.     global $IRC;
  386.     if((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick))) {
  387.         $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
  388.         if(((!$IRC->locked) || ($userprivs > 49)) && ($userprivs >= 0)) {
  389.             $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
  390.             $r = implodefrom(" ", $a, 1);
  391.             $reqprivs = fetchcmd($a[0], "privs");
  392.             $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
  393.             $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
  394.             eval(fetchcmd($a[0]));
  395.             if($userprivs >= 100) {
  396.                 $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
  397.                 switch(strtoupper($a[0])) {
  398.                     case "BIND":
  399.                         switch(strtoupper($a[1])) {
  400.                             case "ADD":
  401.                                 if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 4))) || (!(is_numeric($a[3])))) {
  402.                                     break;
  403.                                 }
  404.                                 $p = min(max($a[3], -1), 100);
  405.                                 send("PRIVMSG " . $chan . " :Binding command " . strtoupper($a[2]) . " with " . $p . " privs");
  406.                                 dumpDB("Binding command " . strtoupper($a[2]) . " with " . $p . " privs", fetchcmd(strtoupper($a[2])), $o);
  407.                                 if(!$IRC->modules) {
  408.                                     mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[2]) . "'", $IRC->con);
  409.                                     mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs, maker) VALUES ('" . mysql_real_escape_string(strtoupper($a[2])) . "', '" . mysql_real_escape_string($o) . "', " . $p . ", '" . mysql_real_escape_string(strtolower($IRC->cM->nick)) . "')", $IRC->con);
  410.                                 }else {
  411.                                     file_put_contents($IRC->modfolder . "cmd." . strtoupper($a[2]) . ".$p." . strtolower($IRC->cM->nick) . ".php", $o);
  412.                                 }
  413.                                 break;
  414.                             case "DEL":
  415.                             case "DELETE":
  416.                                 $co = fetchcmd($a[2]);
  417.                                 dumpDB("Deleted command " . strtoupper($a[2]), $co);
  418.                                 if(!$IRC->modules) {
  419.                                     mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  420.                                 }else {
  421.                                     $row = fetchcmd($a[2], "*");
  422.                                     unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
  423.                                 }
  424.                                 send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was deleted.");
  425.                                 break;
  426.                             case "REN":
  427.                             case "RENAME":
  428.                                 if((sizeof($a) < 4) ) {
  429.                                     break;
  430.                                 }
  431.                                 $b = fetchcmd($a[3]);
  432.                                 dumpDB("Renaming command \"" . strtoupper($a[2]) . "\" to \"" . strtoupper($a[3]) . "\"", $b);
  433.                                 if(!$IRC->modules) {
  434.                                     mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  435.                                     mysql_query("UPDATE " . $IRC->cTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  436.                                 }else {
  437.                                     $row = fetchcmd($a[2], "*");
  438.                                     rename($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php", $IRC->modfolder . "cmd." . strtoupper($a[3]) . "." . $row["privs"] . "." . strtolower($row["maker"]) . ".php");
  439.                                 }
  440.                                 send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
  441.                                 break;
  442.                             case "LNK":
  443.                             case "LINK":
  444.                                 if((sizeof($a) < 4) || (strtoupper($a[2]) == strtoupper($a[3]))) {
  445.                                     break;
  446.                                 }
  447.                                 $b = fetchcmd($a[3]);
  448.                                 $p = fetchcmd($a[2], "privs");
  449.                                 send("PRIVMSG " . $chan . " :Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]));
  450.                                 dumpDB("Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]), $b);
  451.                                 if(!$IRC->modules) {
  452.                                     mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  453.                                     mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs, maker) VALUES ('" . mysql_real_escape_string(strtoupper($a[3])) . "', " . mysql_real_escape_string('$reqprivs = fetchcmd("' . $a[2] . '", "privs"); eval(fetchcmd("' . $a[2] . '"));') . ", " . ($a[4] ? min(max($a[4], -1), 100) : $p[0]) . ", '" . mysql_real_escape_string(strtolower($IRC->cM->nick)) . "')", $IRC->con);
  454.                                 }else {
  455.                                     $row = fetchcmd($a[2], "*");
  456.                                     unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
  457.                                     file_put_contents($IRC->modfolder . "cmd." . strtoupper($a[3]) . ".$p." . strtolower($IRC->cM->nick) . ".php", $o);
  458.                                 }
  459.                                 break;
  460.                             case "APP":
  461.                             case "APPEND":
  462.                                 if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
  463.                                     break;
  464.                                 }
  465.                                 send("PRIVMSG " . $chan . " :Appending command " . strtoupper($a[2]));
  466.                                 dumpDB("Appending command " . strtoupper($a[2]), $co = fetchcmd(strtoupper($a[2])), $o);
  467.                                 if(!$IRC->modules) {
  468.                                     mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string($co . $o) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  469.                                 }else {
  470.                                     $row = fetchcmd($a[2], "*");
  471.                                 }
  472.                                 break;
  473.                             case "PRV":
  474.                             case "PRIVS":
  475.                                 if(sizeof($a) < 4) {
  476.                                     break;
  477.                                 }
  478.                                 $p = min(max($a[3], -1), 100);
  479.                                 send("PRIVMSG " . $chan . " :Changing privlages of command " . strtoupper($a[2]) . " to " . $p);
  480.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET privs=" . $p . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  481.                                 break;
  482.                             case "UPD":
  483.                             case "UPDATE":
  484.                                 if((sizeof($a) < 5) || (!($o = implodefrom(" ", $a, 4))) || (!is_numeric($a[3]))) {
  485.                                     break;
  486.                                 }
  487.                                 $car = explode("\r\n", fetchcmd(strtoupper($a[2])));
  488.                                 send("PRIVMSG " . $chan . " :Updating line " . $a[3] . " of command " . strtoupper($a[2]));
  489.                                 dumpDB("Updating line " . $a[3] . " of command " . strtoupper($a[2]), $car[$a[3]], $o);
  490.                                 $car[$a[3]] = $o;
  491.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string(implode("\r\n", $car)) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  492.                                 break;
  493.                         }
  494.                         break;
  495.                     case "HOOK":
  496.                         switch(strtoupper($a[1])) {
  497.                             case "ADD":
  498.                                 if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
  499.                                     break;
  500.                                 }
  501.                                 send("PRIVMSG " . $chan . " :Adding hook " . strtoupper($a[2]));
  502.                                 mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  503.                                 mysql_query("INSERT INTO " . $IRC->hTableName . "(name, code, active) VALUES ('" . mysql_real_escape_string(strtoupper($a[2])) . "', '" . mysql_real_escape_string($o) . "', 0)", $IRC->con);
  504.                                 break;
  505.                             case "DEL":
  506.                             case "DELETE":
  507.                                 $co = explode(" ", implodefrom(" ", $a, 2));
  508.                                 foreach($co as $del) {
  509.                                     mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($del) . "'", $IRC->con);
  510.                                 }
  511.                                 $s = ((sizeof($co) - 1) ? "s" : "");
  512.                                 send("PRIVMSG " . $chan . " :Hook" . $s . " '" . strtoupper($a[2]) . "' was deleted.");
  513.                                 break;
  514.                             case "REN":
  515.                             case "RENAME":
  516.                                 if((sizeof($a) < 4) ) {
  517.                                     break;
  518.                                 }
  519.                                 if($c = fetchcmd($a[2])) {
  520.                                     $b = fetchcmd($a[3]);
  521.                                     mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  522.                                 }
  523.                                 mysql_query("UPDATE " . $IRC->hTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  524.                                 send("PRIVMSG " . $chan . " :Hook '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
  525.                                 break;
  526.                             case "ACT":
  527.                             case "ACTIVATE":
  528.                                 if(sizeof($a) < 3) {
  529.                                     break;
  530.                                 }
  531.                                 switch(strtoupper($a[3])) {
  532.                                     case "OFF":
  533.                                     case "0":
  534.                                     case "FALSE":
  535.                                         $nstate = "0";
  536.                                         break;
  537.                                     default:
  538.                                         $nstate = "1";
  539.                                 }
  540.                                 send("PRIVMSG " . $chan . " :" . ($nstate ? "A" : "Dea") . "ctivating hook " . strtoupper($a[2]));
  541.                                 mysql_query("UPDATE " . $IRC->hTableName . " SET active=" . $nstate . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  542.                                 break;
  543.                         }
  544.                         break;
  545.                 }
  546.             }
  547.         }
  548.     }
  549. }
  550.  
  551. function handleChatCommands() {
  552.     global $IRC;
  553.     if(!$IRC->cM->nick) {
  554.         return false;
  555.     }
  556.     $chr1 = chr(1);
  557.     if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
  558.         $a = explode(" ", $IRC->cM->mess);
  559.         $tok = implodefrom(" ", $a, 1);
  560.         $tok = trim(substr($tok, 0, strlen($tok) - 1));
  561.         if($tok) {
  562.             $tok2 = strtoupper(substr($a[0], 1));
  563.             if($tok2 != "ACTION") {
  564.                 $tokk = ": ";
  565.             }
  566.         }else {
  567.             $tok2 = strtoupper(substr($a[0], 1, strlen($tok2) - 1));
  568.         }
  569.         if($tok2 != "ACTION") {
  570.             output($IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] requested CTCP " . $tok2 . " from " . $IRC->cM->param[0] . $tokk . $tok);
  571.         }
  572.         switch($tok2) {
  573.             case "ACTION":
  574.                 output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
  575.                 break;
  576.             case "PING":
  577.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . $tok . $chr1);
  578.                 break;
  579.             case "TIME":
  580.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "TIME " . date("D M jS H:i:s") . $chr1);
  581.                 break;
  582.             case "VERSION":
  583.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "VERSION Toot PHP Bot " . $IRC->version . $chr1);
  584.                 break;     
  585.             case "FINGER":
  586.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER I'm a bot, I don't idle" . $chr1);
  587.                 break;
  588.         }
  589.         return true;
  590.     }
  591.     if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
  592.         output("[" . $IRC->cM->param[0] . "] <" . $IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick] . $IRC->cM->nick . "> " . $IRC->cM->mess);
  593.     }else {
  594.         output("-*" . $IRC->cM->nick . "*- " . $IRC->cM->mess);
  595.     }
  596.     if(startsWith($IRC->cM->mess, $IRC->cmdChar)) {
  597.         handleBotCommands();
  598.     }
  599.     return true;
  600. }
  601.  
  602. function handleNormalCommands() {
  603.     global $IRC;
  604.     $h = true;
  605.     switch(strtoupper(trim($IRC->cM->cmd))) {
  606.         case "KICK":
  607.             unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->param[1]]);
  608.             if(strtolower($IRC->cM->param[1]) == strtolower($IRC->cNick)) {
  609.                 $who = "You were";
  610.                 unset($IRC->channames[strtolower($IRC->cM->param[0])]);
  611.             }else {
  612.                 $who = $IRC->cM->param[1] . " was";
  613.                 $stillalive = false;
  614.                 foreach($IRC->channames as $c) {
  615.                     if(in_array($IRC->cM->param[1], $c)) {
  616.                         $stillalive = true;
  617.                         break;
  618.                     }
  619.                 }
  620.                 if(!$stillalive) {
  621.                     unset($IRC->masters[strtolower($IRC->cM->nick)]);
  622.                 }
  623.             }
  624.             output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $IRC->cM->mess . "]");
  625.             if(($IRC->cM->param[1] == $IRC->cNick) && ($IRC->kickrejoin)) {
  626.                 sleep($IRC->rejoinwait);
  627.                 send("JOIN :" . $IRC->cM->param[0]);
  628.             }
  629.             break;
  630.         case "MODE":
  631.             if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
  632.                 $o = $IRC->cM->mess;
  633.             }else {
  634.                 $o = implodefrom(" ", $IRC->cM->param, 1);
  635.             }
  636.             output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
  637.             break;
  638.         case "NOTICE":
  639.             output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
  640.             break;
  641.         case "PRIVMSG":
  642.             $h = handleChatCommands();
  643.             break;
  644.         case "PART":
  645.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
  646.             unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
  647.             $stillalive = false;
  648.             foreach($IRC->channames as $c) {
  649.                 if(in_array($IRC->cM->nick, $c)) {
  650.                     echo($IRC->cM->nick . " is still in $c");
  651.                     $stillalive = true;
  652.                     break;
  653.                 }
  654.             }
  655.             if(!$stillalive) {
  656.                 unset($IRC->masters[strtolower($IRC->cM->nick)]);
  657.             }
  658.             unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
  659.             if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  660.                 unset($IRC->channames[strtolower($IRC->cM->param[0])]);
  661.             }
  662.             break;
  663.         case "JOIN":
  664.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
  665.             $IRC->channames[strtolower($IRC->cM->mess)][$IRC->cM->nick] = " ";
  666.             break;
  667.         case "QUIT":
  668.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
  669.             $a = array_keys($IRC->channames);
  670.             for($i = 0; $i < sizeof($a); $i++) {
  671.                 unset($IRC->channames[$a[$i]][$IRC->cM->nick]);
  672.             }
  673.             unset($IRC->masters[strtolower($IRC->cM->nick)]);
  674.             break;
  675.         case "NICK":
  676.             if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  677.                 $who = "You are";
  678.                 $IRC->cNick = $IRC->cM->mess;
  679.             }else {
  680.                 $who = $IRC->cM->nick . " is";
  681.             }
  682.             output("-!- " . $who . " now known as " . $IRC->cM->mess);
  683.             $aa = array_keys($IRC->channames);
  684.             for($i = 0; $i < sizeof($aa); $i++) {
  685.                 $IRC->channames[$aa[$i]][$IRC->cM->mess] = $IRC->channames[$aa[$i]][$IRC->cM->nick];
  686.                 unset($IRC->channames[$aa[$i]][$IRC->cM->nick]);
  687.             }
  688.             $IRC->masters[strtolower($IRC->cM->mess)] = $IRC->masters[strtolower($IRC->cM->nick)];
  689.             unset($IRC->masters[strtolower($IRC->cM->nick)]);
  690.             break;
  691.         case "TOPIC":
  692.             output("-!- " . $IRC->cM->nick . " changed the topic of " . $IRC->cM->param[0] . " to: " . $IRC->cM->mess);
  693.             break;
  694.         case "PONG":
  695.             if($IRC->pingpong) {
  696.                 output("-!- Server PONG reply from " . $IRC->cM->nick . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $IRC->pingsent));
  697.             }
  698.             $IRC->lastping = time();
  699.             $IRC->pongwait = false;
  700.             break;
  701.         case "INVITE":
  702.             output("-!- " . $IRC->cM->nick . " invites you to " . $IRC->cM->mess);
  703.             break;
  704.         default:
  705.             $h = false;
  706.     }
  707.     $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
  708.     $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
  709.     if(!$IRC->modules && ($IRC->con)) {
  710.         $q = mysql_query("SELECT * FROM " . $IRC->hTableName, $IRC->con);
  711.         while($row = mysql_fetch_array($q)) {
  712.             if($row["active"]) {
  713.                 eval($row["code"]);
  714.             }
  715.         }
  716.     }
  717.     return($h);
  718. }
  719.  
  720. function handleNumberCommands() {
  721.     global $IRC;
  722.     switch($IRC->cM->cmd) {
  723.         case "001":
  724.             $IRC->server = $IRC->cM->nick;
  725.             output($IRC->cM->mess);
  726.             $IRC->cNick = trim(substr($IRC->cM->mess, strrpos($IRC->cM->mess, " ")));
  727.             send("PRIVMSG NickServ :ID " . $IRC->auth);
  728.             foreach($IRC->joinchan as $c) {
  729.                 send("JOIN " . $c);
  730.             }
  731.             $IRC->firstcon = false;
  732.             break;
  733.         case "004":
  734.             $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  735.             break;
  736.         case "005":
  737.             $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  738.             if(($p = strpos(strtoupper($IRC->cM->mess), "PREFIX=")) && ($a = substr($IRC->cM->mess, $p = $p + 8, strpos($IRC->cM->mess, " ", $p) - $p))) {
  739.                 $aa = explode(")", $a);
  740.                 $IRC->powers = array(array(), array());
  741.                 for($i = 0; $i < strlen($aa[0]); $i++) {
  742.                     $IRC->powers[0][] = $aa[0][$i];
  743.                 }
  744.                 for($i = 0; $i < strlen($aa[1]); $i++) {
  745.                     $IRC->powers[1][] = $aa[1][$i];
  746.                 }
  747.             }
  748.             break;
  749.         case "252":
  750.         case "254":
  751.             output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
  752.             break;
  753.         case "332":
  754.             output("-!- Topic for " . $IRC->cM->param[1] . " is: " . $IRC->cM->mess);
  755.             break;
  756.         case "333":
  757.             output("-!- Topic for " . $IRC->cM->param[1] . " set by " . $IRC->cM->param[2] . " on " . date("D M jS H:i:s", $IRC->cM->param[3]));
  758.             break;
  759.         case "341":
  760.             output("-!- " . $IRC->cM->param[1] . " has been invited to " . $IRC->cM->param[2]);
  761.             break;
  762.         case "353":
  763.             $ndat = $IRC->cM->wline . "\n";
  764.             while(!instr("366 " . $IRC->cNick, $ndat)) {
  765.                 if($rd = fgets($IRC->fp, 1024)) {
  766.                     $ndat .= $rd;
  767.                 }
  768.             }
  769.             $c = strtolower($cc = substr($ndat, $p = (strpos(strtoupper($ndat), "366 " . strtoupper($IRC->cNick)) + strlen("366 " . strtoupper($IRC->cNick))) + 1, strpos($ndat, " ", $p) - $p));
  770.             $e = explode("\n", $ndat);
  771.             foreach($e as $a) {
  772.                 parseMessage(trim($a), false);
  773.                 if($IRC->cM->cmd != "353") {
  774.                     break;
  775.                 }
  776.                 $tmp = explode(" ", $IRC->cM->mess);
  777.                 foreach($tmp as $t) {
  778.                     $names[] = $t;
  779.                 }
  780.                 $IRC->cM->mess = "";
  781.             }
  782.             sort($names);
  783.             output("[Users " . $cc . "]", false);
  784.             output("", false, false);
  785.             for($i = 0; $i < sizeof($names); $i++) {
  786.                 if(in_array($names[$i][0], $IRC->powers[1])) {
  787.                     $IRC->channames[$c][substr($names[$i], 1)] = $names[$i][0];
  788.                 }else {
  789.                     $IRC->channames[$c][$names[$i]] = " ";
  790.                 }
  791.                 if(($i % 5) == 0) {
  792.                     output("", true, false);
  793.                     output("", false);
  794.                 }
  795.                 output("[" . str_pad($IRC->channames[$c][$names[$i]] . $names[$i], 17, " ", STR_PAD_RIGHT) . "] ", false, false);
  796.             }
  797.             output("", true, false);
  798.             output("-!- " . $cc . ": Total of " . sizeof($names) . " nicks");
  799.             break;
  800.         case "421":
  801.             output("-!- Unknown command: \"" . $IRC->cM->param[1] . "\"");
  802.             break;
  803.         case "442":
  804.             output("-!- " . $IRC->cM->param[1] . " " . $IRC->cM->mess);
  805.             break;
  806.         case "433":
  807.             output("-!- Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
  808.             if($IRC->firstcon) {
  809.                 send("NICK " . $IRC->joinnick . rand(100, 999));
  810.                 send("PRIVMSG NickServ :ghost " . $IRC->joinnick . " " . $IRC->auth);
  811.             }          
  812.             break;
  813.         case "474":
  814.             output("-!- Unable to join channel " . $IRC->cM->param[1] . ": " . $IRC->cM->mess);
  815.             break;
  816.         default:
  817.             output("-!- " . $IRC->cM->mess);
  818.             break;
  819.     }
  820.     return true;
  821. }
  822.  
  823. function parseMessage($buffer, $handle = true) {
  824.     global $IRC;
  825.     $buffer = explode("\n", $buffer);
  826.     $IRC->cM->wline = $buffer = trim($buffer[0], "\r");
  827.     if(!trim($buffer)) {
  828.         return;
  829.     }
  830.     if($IRC->debug) {
  831.         output($buffer);
  832.     }
  833.     switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
  834.         case ":":
  835.             $IRC->cM->sender = substr(strtok($IRC->cM->wline, " "), 1);
  836.             $IRC->cM->cmd = strtok(" ");
  837.             $IRC->cM->param = explode(" ", trim(strtok(" " . strtok(""), ":")));
  838.             $IRC->cM->mess = strtok("");
  839.             $IRC->cM->nick = strtok($IRC->cM->sender, "!");
  840.             $IRC->cM->user = strtok("@");
  841.             $IRC->cM->host = strtok("");
  842.             if($handle) {
  843.                 if(is_numeric($IRC->cM->cmd)) {
  844.                     if(handleNumberCommands()) {
  845.                         break;
  846.                     }
  847.                 }
  848.                 if(handleNormalCommands()) {
  849.                     break;
  850.                 }
  851.                 output("Unknown message: " . $IRC->cM->wline);
  852.             }
  853.             break;
  854.         case "NOTICE":
  855.             $IRC->cM->mess = substr($IRC->cM->wline, strpos($IRC->cM->wline, ":") + 1);
  856.             $ss = $IRC->server;
  857.             if(startsWith(strtoupper($IRC->cM->wline), "NOTICE AUTH")) {
  858.                 $ss = $IRC->nick;
  859.             }
  860.             output("!" . $ss . " " . $IRC->cM->mess);
  861.             break;
  862.         case "PING":
  863.             if($IRC->pingpong) {
  864.                 output($buffer);
  865.             }
  866.             $IRC->cM->wline[1] = "O";
  867.             send($IRC->cM->wline, $IRC->pingpong);
  868.             break;
  869.         case "ERROR":
  870.             output($IRC->cM->wline);
  871.             break;
  872.         default:
  873.             output("Unknown message: " . $IRC->cM->wline);
  874.             break;
  875.     }
  876. }
  877.  
  878. function loop() {
  879.     global $IRC;
  880.     if((($IRC->pongwait) && ((time() - $IRC->lastping) > 240)) || (((!$IRC->connected) || (feof($IRC->fp)) && (!($IRC->quit))))) {
  881.         if($IRC->connected) {
  882.             $IRC->channames = array(array(), array());
  883.             if(!feof($IRC->fp)) {
  884.                 send("QUIT :Lost connection");
  885.             }
  886.             fclose($IRC->fp);
  887.         }
  888.         $IRC->connected = false;
  889.         output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
  890.         if($IRC->fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
  891.             output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
  892.             stream_set_timeout($IRC->fp, 0, 1);
  893.             $IRC->firstcon = true;
  894.             $IRC->connected = true;
  895.             $IRC->pongwait = false;
  896.             $IRC->lastping = time();
  897.             send("USER " . $IRC->username . " * * :" . $IRC->realname);
  898.             send("NICK " . $IRC->joinnick);
  899.         }else {
  900.             sleep(30);
  901.             return;
  902.         }
  903.     }
  904.     if((!$IRC->pongwait) && (time() - $IRC->lastping) > 30) {
  905.         $IRC->pongwait = true;
  906.         $IRC->pingsent = microtime(true);
  907.         send("PING :" . $IRC->server, $IRC->pingpong);
  908.     }
  909.     if($rawdata = fgets($IRC->fp, 1024)) {
  910.         parseMessage($rawdata);
  911.     }
  912.     if($rawdata1 = fgets(STDIN, 1024)) {
  913.         output("<- " . $rawdata1, false);
  914.         $IRC->cM->sender = "root";
  915.         eval($rawdata1);
  916.     }
  917.     return($rawdata);
  918. }
  919.  
  920. $IRC->connected = false;
  921. $IRC->lastping = time();
  922. $IRC->pongwait = false;
  923. $IRC->pingsent = microtime(true);
  924. stream_set_blocking(STDIN, 0);
  925. if($IRC->logging) {
  926.     $IRC->logfile = fopen($IRC->logfile, "a");
  927.     fwrite($IRC->logfile, "\r\n*** Log opened on " . date("D M jS H:i:s", time()) . " ***\r\n\r\n");
  928. }
  929. startupbind();
  930. while(!$IRC->quit) {
  931.     usleep(10000);
  932.     loop();
  933. }
  934. if(!feof($IRC->fp)) {
  935.     send("QUIT :I couldn't think of a whitty quit message");
  936. }
  937. fclose($IRC->fp);
  938. if($IRC->logging) {
  939.     fclose($IRC->logfile);
  940. }
  941. if($IRC->con) {
  942.     mysql_close($IRC->con);
  943. }
  944. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement