Advertisement
Guest User

Untitled

a guest
May 7th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 23.75 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. TODO:
  5. if a master quit or parts all channels, or was never on the channel when added, move to inactive list (inactive list is un-viewable to non-masters)
  6. if an inactive master joins/nicks, readd to active masters list (perhaps auth with a user-generated password?)
  7. i probably should comment more stuff, it's getting kinda complex; would hate to have to rewrite/relearn
  8. make it listen on a local port, to be used as a bouncer (so i can use the bot as a regular nick with another client, or perhaps just a simple PHP script)
  9. */
  10.  
  11. class aMessage {
  12.     var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
  13. }
  14.  
  15. class aIRC {
  16.     var $cM;
  17.     var $lastping, $pongwait, $pingsent, $pingpong;
  18.     var $host, $fp, $port, $logfile, $con, $server, $cmdChar, $bport, $bfp;
  19.     var $cNick, $joinnick, $username, $realname, $joinchan, $auth, $authnick, $masterNick;
  20.     var $channames, $powers, $tempnames, $cnameslist;
  21.     var $debug, $firstcon, $locked, $quit, $version;
  22.     var $mTableName, $cTableName, $iTableName, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
  23. }
  24.  
  25. $IRC = new aIRC;
  26. $IRC->cM = new aMessage;
  27. $IRC->cM->param = array();
  28. $IRC->host = "irc.freenode.net";
  29. $IRC->port = 8001;
  30. $IRC->bport = 6660;
  31. $IRC->joinchan = array("#Tootoot222", "#mixster", "#SRL-School", "#SRL");
  32. $IRC->joinnick = "Furry";
  33. $IRC->username = "Furry";
  34. $IRC->realname = "Furry";
  35. $IRC->authnick = "Tootoot222";
  36. $IRC->cNick = $IRC->joinnick;
  37. $IRC->auth = "";
  38. $IRC->server = "";
  39. $IRC->cmdChar = "!";
  40. $IRC->locked = false;
  41. $IRC->debug = false;
  42. $IRC->pingpong = false;
  43. $IRC->powers = array(array(), array());
  44. $IRC->channames = array(array(array()));
  45. $IRC->tempnames = array();
  46. $IRC->cnameslist = "";
  47. $IRC->version = "Version 3";
  48.  
  49. date_default_timezone_set("America/Chicago"); //change this to your timezone
  50.  
  51. $firstmaster = "Tootoot222"; //set this if you haven't created the database/tables yet
  52.  
  53. $IRC->MySQLServer = "localhost";   
  54. $IRC->MySQLDatabase = "ircbotv3";
  55. $IRC->MySQLAccountName = "root";
  56. $IRC->MySQLAccountpassword = "";
  57. $IRC->mTableName = "masters5";
  58. $IRC->iTableName = "imasters2";
  59. $IRC->cTableName = "cmd3";
  60.  
  61. $IRC->logfile = fopen("logfile.txt", "a");
  62. fwrite($IRC->logfile, "\r\n*** Log opened on " . date("D M jS H:i:s", time()) . " ***\r\n\r\n");
  63.  
  64. /*if(!$IRC->bfp = fsockopen("127.0.0.1", $IRC->bport, $errno, $errdesc)) {
  65.     output("Unable to open loopback: " . $errno . " - " . $errdesc . "\r\n");
  66. }*/
  67.  
  68. $IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword) or die("MySQL error: " . mysql_error() . "\r\n");
  69. mysql_query("CREATE DATABASE IF NOT EXISTS " . $IRC->MySQLDatabase, $IRC->con);
  70. mysql_select_db($IRC->MySQLDatabase, $IRC->con);
  71.  
  72. function table_exists($tablename) {
  73.     global $IRC;
  74.     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);
  75. }
  76.  
  77. if(!table_exists($IRC->cTableName)) {
  78.     mysql_query("CREATE TABLE " . $IRC->cTableName . "(name VARCHAR(25), code MEDIUMTEXT, privs INT, maker VARCHAR(20))", $IRC->con);
  79. }
  80. if(!table_exists($IRC->mTableName)) {
  81.     mysql_query("CREATE TABLE " . $IRC->mTableName . "(name VARCHAR(20), privs INT)", $IRC->con);
  82.     mysql_query("INSERT INTO " . $IRC->mTableName . "(name, privs) VALUES ('" . $firstmaster . "', 100)", $IRC->con);
  83. }
  84. if(!table_exists($IRC->iTableName)) {
  85.     mysql_query("CREATE TABLE " . $IRC->iTableName . "(name VARCHAR(20), privs INT)", $IRC->con);
  86. }
  87.  
  88. function output($message, $newline = true, $timestamp = true) {
  89.     global $IRC;
  90.     foreach(explode("\r\n", $message) as $m) {
  91.         $out = ($timestamp ? "[" . date("H:i:s") . "] " : "") . $m . ($newline ? "\r\n" : "");
  92.         echo($out);
  93.         fwrite($IRC->logfile, $out);
  94.     }
  95. }
  96.  
  97. function send($data, $out = true) {
  98.     if(!trim($data)) {
  99.       return;
  100.     }
  101.     global $IRC;
  102.     $a = explode("\r\n", $data);
  103.     foreach($a as $aa) {
  104.         fputs($IRC->fp, $aa . "\r\n");
  105.         if($out) {
  106.             output("-> " . $aa);
  107.         }
  108.     }
  109. }
  110.  
  111. function implodefrom($glue, $pieces, $from = 0) {
  112.     $r = "";
  113.     if(is_array($pieces)) {
  114.         $from = max(0, $from);
  115.         $r = $pieces[$from];
  116.         for($i = ($from + 1); $i < sizeof($pieces); $i++) {
  117.             $r .= $glue . $pieces[$i];
  118.         }
  119.     }
  120.     return($r);
  121. }
  122.  
  123. function notnull($c1, $c2) {
  124.     return($c1 ? $c1 : $c2);
  125. }
  126.  
  127. function startsWith($haystack, $needle) {
  128.     if(is_array($needle)) {
  129.         foreach($needle as $n) {
  130.             if(strpos($haystack, $n) === 0) {
  131.                 return($n);
  132.             }
  133.         }
  134.     }
  135.     return(strpos($haystack, $needle) === 0);
  136. }
  137.  
  138. function instr($needle, $haystack, $insensitive = 0) {
  139.     if($insensitive) {
  140.         return((false !== stristr($haystack, $needle)) ? true : false);
  141.     }else {
  142.         return((false !== strpos($haystack, $needle)) ? true : false);
  143.     }
  144. }
  145.  
  146. function dumpDB($message = "", $oldcode = "", $newcode = "") {
  147.     global $IRC;
  148.     if(!file_exists("./DB_backup/")) {
  149.         mkdir("./DB_backup/");
  150.     }
  151.     $basename = "db_backup";
  152.     $n = 1;
  153.     while(file_exists($filename = ("./DB_backup/" . $basename . $n . ".txt"))) {
  154.         $n++;
  155.     }
  156.     if(!$fh = fopen($filename, 'w')) {
  157.         return("failed to open file: " . $filename);
  158.     }
  159.     fwrite($fh, "//Dumpfile " . $n . " created on " . date("D M jS H:i:s", time()) . "\r\n\r\n");
  160.     fwrite($fh, "//" . $IRC->cM->sender . ";" . ($message ? " " . $message : "") . ($oldcode ? "\r\n\r\n//Old code:\r\n" . $oldcode : "") . ($newcode ? "\r\n\r\n//New code:\r\n" . $newcode : ""));
  161.     $q = mysql_query("SELECT * FROM " . $IRC->cTableName . " ORDER BY name ASC", $IRC->con);
  162.     while($row = mysql_fetch_array($q)) {
  163.         fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . ":\r\n" . $row["code"]);
  164.     }
  165.     fclose($fh);
  166.     return(true);
  167. }
  168.  
  169. function fetchcmd($cmd, $r = "code") {
  170.     global $IRC;
  171.     $row = mysql_fetch_array(mysql_query("SELECT * FROM " . $IRC->cTableName . ($cmd ? " WHERE name='" . $cmd . "'" : ""), $IRC->con));
  172.     return($row[$r]);
  173. }
  174.  
  175. function fetchmasters($name = "", $privs = false, $active = true) {
  176.     global $IRC;
  177.     if($active) {
  178.         $t = $IRC->mTableName;
  179.     }else {
  180.         $t = $IRC->iTableName;
  181.     }
  182.     if($privs) {
  183.         $n = "privs";
  184.     }else {
  185.         $n = "name";
  186.     }
  187.     if($name) {
  188.         $e = " WHERE name='" . $name . "'";
  189.     }
  190.     $q = mysql_query("SELECT " . $n . " FROM " . $t . $e, $IRC->con);
  191.     $r = array();
  192.     while($row = mysql_fetch_array($q)) {
  193.         $r[] = $row[$n];
  194.     }
  195.     return($r);
  196. }
  197.  
  198. function removemasters($names, $all = false, $active = true) {
  199.     global $IRC;
  200.     if(!$all) {
  201.         if(!is_array($names)) {
  202.             $names = array($names);
  203.         }
  204.         if($active) {
  205.             $t = $IRC->mTableName;
  206.         }else {
  207.             $t = $IRC->iTableName;
  208.         }
  209.         foreach($names as $n) {
  210.             mysql_query("DELETE FROM " . $t . " WHERE name='" . $n . "'", $IRC->con);
  211.         }
  212.     }else {
  213.         mysql_query("DELETE FROM " . $IRC->mTableName, $IRC->con);
  214.     }
  215. }
  216.  
  217. function addmasters($names, $privs, $active = true, $upd = false) {
  218.     global $IRC;
  219.     if(sizeof($names) != sizeof($privs)) {
  220.         $p = $privs;
  221.         $privs = array();
  222.         for($i = 0; $i < sizeof($names); $i++) {
  223.             $privs[$i] = $p;
  224.         }
  225.     }
  226.     if($active) {
  227.         $t = $IRC->mTableName;
  228.     }else {
  229.         $t = $IRC->iTableName;
  230.     }
  231.     if(!$upd) {
  232.         removemasters($names);
  233.     }
  234.     for($i = 0; $i < sizeof($names); $i++) {
  235.         if(!$upd) {
  236.             mysql_query("INSERT INTO " . $t . "(name, privs) VALUES ('" . $names[$i] . "', " . $privs[$i] . ")", $IRC->con);
  237.         }else {
  238.             mysql_query("UPDATE " . $t . " SET name='" . $privs[$i] . "' WHERE name='" . $names[$i] . "'", $IRC->con);
  239.         }
  240.     }
  241. }
  242.  
  243. function swapmasters($names) {
  244.     global $IRC;
  245.     if(!is_array($names)) {
  246.         $names = array($names);
  247.     }
  248.     foreach($names as $n) {
  249.         $r = mysql_fetch_array(mysql_query("SELECT * FROM " . $IRC->iTableName . " WHERE name='" . $n . "'", $IRC->con));
  250.         mysql_query("DELETE FROM " . $IRC->mTableName . " WHERE name='" . $n . "'", $IRC->con);
  251.         mysql_query("INSERT INTO " . $IRC->mTableName . "(name, privs) VALUES ('" . $r["name"] . "', " . $r["privs"] . ")", $IRC->con);
  252.         mysql_query("DELETE FROM " . $IRC->iTableName . " WHERE name='" . $n . "'", $IRC->con);
  253.     }
  254. }
  255.  
  256. function handleBotCommands() {
  257.     global $IRC;
  258.     if((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick))) {
  259.         $userprivs = fetchmasters($IRC->cM->nick, true);
  260.         $userprivs = $userprivs[0] ? $userprivs[0] : 0;
  261.         $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
  262.         if(((!$IRC->locked) || ($userprivs > 49)) && ($userprivs >= 0)) {
  263.             $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
  264.             $r = implodefrom(" ", $a, 1);
  265.             $reqprivs = fetchcmd($a[0], "privs");
  266.             $hasprivs = $userprivs >= $reqprivs;
  267.             eval(fetchcmd($a[0]));
  268.             if($userprivs >= 100) {
  269.                 switch(strtoupper($a[0])) {
  270.                     case "BIND":
  271.                         if($ispm) {
  272.                             $chan = $IRC->cM->nick;
  273.                         }else {
  274.                             $chan = $IRC->cM->param[0];
  275.                         }
  276.                         switch(strtoupper($a[1])) {
  277.                             case "ADD": //!bind[0] ADD[1] Newcommand[2] 100[3] send();[4]
  278.                                 if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 4))) || (!(is_numeric($a[3])))) {
  279.                                     break;
  280.                                 }
  281.                                 $p = min($a[3], 100);
  282.                                 send("PRIVMSG " . $chan . " :Binding command " . strtoupper($a[2]) . " with " . $p . " privs");
  283.                                 dumpDB("Binding command " . strtoupper($a[2]) . " with " . $p . " privs", fetchcmd(strtoupper($a[2])), $o);
  284.                                 mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  285.                                 mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs) VALUES ('" . strtoupper($a[2]) . "', '" . $o . "', " . $p . ")", $IRC->con);
  286.                                 break;
  287.                             case "DEL":
  288.                                 $co = fetchcmd($a[2]);
  289.                                 mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  290.                                 dumpDB("Deleted command " . strtoupper($a[2]), $co);
  291.                                 send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was deleted.");
  292.                                 break;
  293.                             case "REN":
  294.                                 if((sizeof($a) < 4) ) {
  295.                                     break;
  296.                                 }
  297.                                 if($c = fetchcmd($a[2])) {
  298.                                     $b = fetchcmd($a[3]);
  299.                                     mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[3] . "'", $IRC->con);
  300.                                 }
  301.                                 dumpDB("Renaming command \"" . strtoupper($a[2]) . "\" to \"" . strtoupper($a[3]) . "\"", $b ? $b : "");
  302.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET name='" . strtoupper($a[3]) . "' WHERE name='" . $a[2] . "'");
  303.                                 send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
  304.                                 break;
  305.                             case "LNK":
  306.                                 if((sizeof($a) < 4) || (strtoupper($a[2]) == strtoupper($a[3]))) {
  307.                                     break;
  308.                                 }
  309.                                 send("PRIVMSG " . $chan . " :Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]));
  310.                                 dumpDB("Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]));
  311.                                 mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[3] . "'", $IRC->con);
  312.                                 $p = fetchcmd($a[2], "privs");
  313.                                 mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs) VALUES ('" . strtoupper($a[3]) . "', '\$reqprivs = fetchcmd(\"" . $a[2] . "\", \"privs\"); \$hasprivs = \$userprivs >= \$reqprivs; eval(fetchcmd(\"" . $a[2] . "\"));', " . ($a[4] ? min($a[4], 100) : $p[0]) . ")", $IRC->con);
  314.                                 break;
  315.                             case "APP":
  316.                                 if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
  317.                                     break;
  318.                                 }
  319.                                 send("PRIVMSG " . $chan . " :Appending command " . strtoupper($a[2]));
  320.                                 dumpDB("Appending command " . strtoupper($a[2]), $co = fetchcmd(strtoupper($a[2])), $o);
  321.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . $co . $o . "' WHERE name='" . $a[2] . "'");
  322.                                 break;
  323.                             case "PRV":
  324.                                 if(sizeof($a) < 4) {
  325.                                     break;
  326.                                 }
  327.                                 $p = min($a[3], 100);
  328.                                 send("PRIVMSG " . $chan . " :Changing privlages of command " . strtoupper($a[2]) . " to " . $p);
  329.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET privs=" . $p . " WHERE name='" . $a[2] . "'");
  330.                                 break;
  331.                             case "UPD": //!bind upd test 4 send("wat");
  332.                                 if((sizeof($a) < 5) || (!($o = implodefrom(" ", $a, 4))) || (!is_numeric($a[3]))) {
  333.                                     break;
  334.                                 }
  335.                                 $car = explode("\r\n", fetchcmd(strtoupper($a[2])));
  336.                                 send("PRIVMSG " . $chan . " :Updating line " . $a[3] . " of command " . strtoupper($a[2]));
  337.                                 dumpDB("Updating line " . $a[3] . " of command " . strtoupper($a[2]), $car[$a[3]], $o);
  338.                                 $car[$a[3]] = $o;
  339.                                 mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . implode("\r\n", $car) . "' WHERE name='" . $a[2] . "'");
  340.                                 break;
  341.                         }
  342.                         break;
  343.                 }
  344.             }
  345.         }
  346.     }
  347. }
  348.  
  349. function handleChatCommands() {
  350.     global $IRC;
  351.     if(!$IRC->cM->nick) {
  352.         return false;
  353.     }
  354.     $chr1 = chr(1);
  355.     if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
  356.         $a = explode(" ", $IRC->cM->mess);
  357.         $tok = implodefrom(" ", $a, 1);
  358.         $tok = trim(substr($tok, 0, strlen($tok) - 1));
  359.         if($tok) {
  360.             $tok2 = strtoupper(substr($a[0], 1));
  361.             if($tok2 != "ACTION") {
  362.                 $tokk = ": ";
  363.             }
  364.         }else {
  365.             $tok2 = strtoupper(substr($a[0], 1, strlen($tok2) - 1));
  366.         }
  367.         if($tok2 != "ACTION") {
  368.             output($IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] requested CTCP " . $tok2 . " from " . $IRC->cM->param[0] . $tokk . $tok);
  369.         }
  370.         switch($tok2) {
  371.             case "ACTION":
  372.                 output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
  373.                 break;
  374.             case "PING":
  375.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . $tok . $chr1);
  376.                 break;
  377.             case "TIME":
  378.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "TIME " . date("D M jS H:i:s") . $chr1);
  379.                 break;
  380.             case "VERSION":
  381.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "VERSION Toot PHP Bot " . $IRC->version . $chr1);
  382.                 break;
  383.             case "FINGER":
  384.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER wat" . $chr1);
  385.                 break;
  386.         }
  387.         return true;
  388.     }
  389.     if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
  390.         output("[" . $IRC->cM->param[0] . "] <" . $IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick] . $IRC->cM->nick . "> " . $IRC->cM->mess);
  391.     }else {
  392.         output("-*" . $IRC->cM->nick . "*- " . $IRC->cM->mess);
  393.     }
  394.     if(startsWith($IRC->cM->mess, $IRC->cmdChar)) {
  395.         handleBotCommands();
  396.     }
  397.     return true;
  398. }
  399.  
  400. function handleNormalCommands() {
  401.     global $IRC;
  402.     switch(strtoupper(trim($IRC->cM->cmd))) {
  403.         case "KICK":
  404.             if(strtolower($IRC->cM->param[1]) == strtolower($IRC->cNick)) {
  405.                 $who = "You were";
  406.             }else {
  407.                 $who = $IRC->cM->param[1] . " was";
  408.             }
  409.             unset($IRC->channicks[strtolower($IRC->cM->param[0])][$IRC->cM->param[1]]);
  410.             output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $IRC->cM->mess . "]");
  411.             if($IRC->cM->param[1] == $IRC->cNick) {
  412.                 send("JOIN :" . $IRC->cM->param[0]);
  413.             }
  414.             break;
  415.         case "MODE":
  416.             if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
  417.                 $o = $IRC->cM->mess;
  418.             }else {
  419.                 $o = implodefrom(" ", $IRC->cM->param, 1);
  420.             }
  421.             if($IRC->cM->nick) {
  422.                 output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
  423.             }else {
  424.                 output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->host);
  425.             }
  426.             break;
  427.         case "NOTICE":
  428.             output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
  429.             break;
  430.         case "PRIVMSG":
  431.             return handleChatCommands();
  432.         case "PART":
  433.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
  434.             unset($IRC->channicks[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
  435.             break;
  436.         case "JOIN":
  437.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
  438.             $IRC->channicks[strtolower($IRC->cM->mess)][$IRC->cM->nick] = " ";
  439.             break;
  440.         case "QUIT":
  441.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
  442.             $a = array_keys($IRC->channames);
  443.             for($i = 0; $i < sizeof($a); $i++) {
  444.                 unset($IRC->channames[$a[$i]][$IRC->cM->nick]);
  445.             }
  446.             break;
  447.         case "NICK":
  448.             if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  449.                 $who = "You are";
  450.                 $IRC->cNick = $IRC->cM->mess;
  451.             }else {
  452.                 $who = $IRC->cM->nick . " is";
  453.             }
  454.             output("-!- " . $who . " now known as " . $IRC->cM->mess);
  455.             $aa = array_keys($IRC->channames);
  456.             for($i = 0; $i < sizeof($aa); $i++) {
  457.                 $IRC->channames[$aa[$i]][$IRC->cM->mess] = $IRC->channames[$aa[$i]][$IRC->cM->nick];
  458.                 unset($IRC->channames[$aa[$i]][$IRC->cM->nick]);
  459.             }
  460.             addmasters(array($IRC->cM->nick), array($IRC->cM->mess), true, true);
  461.             break;
  462.         case "TOPIC":
  463.             output("-!- " . $IRC->cM->nick . " changed the topic of " . $IRC->cM->param[0] . " to: " . $IRC->cM->mess);
  464.             break;
  465.         case "PONG":
  466.             if($IRC->pingpong) {
  467.                 output("-!- Server PONG reply from " . $IRC->cM->host . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $IRC->pingsent));
  468.             }
  469.             $IRC->lastping = time();
  470.             $IRC->pongwait = false;
  471.             break;
  472.         default:
  473.             return false;
  474.     }
  475.     return true;
  476. }
  477.  
  478. function handleNumberCommands() {
  479.     global $IRC;
  480.     switch($IRC->cM->cmd) {
  481.         case "001":
  482.             $IRC->server = $IRC->cM->host;
  483.             output($IRC->cM->mess);
  484.             if($IRC->firstcon) {
  485.                 send("NICK " . $IRC->joinnick);
  486.                 send("PRIVMSG NickServ :ID " . $IRC->joinnick . " " . $IRC->auth);
  487.                 foreach($IRC->joinchan as $c) {
  488.                     send("JOIN " . $c);
  489.                 }
  490.                 $IRC->firstcon = false;
  491.             }
  492.             break;
  493.         case "004":
  494.             $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  495.             break;
  496.         case "005":
  497.             $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  498.             if($a = substr($IRC->cM->mess, $p = (strpos(strtoupper($IRC->cM->mess), "PREFIX=") + 8), strpos($IRC->cM->mess, " ", $p) - $p)) {
  499.                 $aa = explode(")", $a);
  500.                 $IRC->powers = array(array(), array());
  501.                 for($i = 0; $i < strlen($aa[0]); $i++) {
  502.                     $IRC->powers[0][] = $aa[0][$i];
  503.                 }
  504.                 for($i = 0; $i < strlen($aa[1]); $i++) {
  505.                     $IRC->powers[1][] = $aa[1][$i];
  506.                 }
  507.             }
  508.         case "252":
  509.         case "254":
  510.             output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
  511.             break;
  512.         case "332":
  513.             output("Topic for " . $IRC->cM->param[1] . " is: " . $IRC->cM->mess);
  514.             break;
  515.         case "333":
  516.             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]));
  517.             break;
  518.         case "353":
  519.             //break;
  520.             $cc = $IRC->cM->param[2];
  521.             $c = strtolower($cc);
  522.             $ndat = $IRC->cM->wline;
  523.             while(!instr("366 " . $IRC->cNick . " " . $c, $ndat, true)) {
  524.                 if($rd = fgets($IRC->fp, 1024)) {
  525.                     $ndat .= $rd;
  526.                 }
  527.             }
  528.             unset($IRC->tempnames[$c]);
  529.             $IRC->tempnames[$c] = "";
  530.             foreach(explode("\n", $ndat) as $a) {
  531.                 parseMessage($a, false);
  532.                 if($IRC->cM->cmd != "353") {
  533.                     break;
  534.                 }
  535.                 $IRC->tempnames[$c] .= $IRC->cM->mess;
  536.                 $IRC->cM->mess = "";
  537.             }
  538.             $names = explode(" ", $IRC->tempnames[$c]);
  539.             unset($IRC->tempnames[$c]);
  540.             sort($names);
  541.             output("[Users " . $cc . "]", false);
  542.             output("", false, false);
  543.             for($i = 0; $i < sizeof($names); $i++) {
  544.                 if(in_array($names[$i][0], $IRC->powers[1])) {
  545.                     $IRC->channames[$c][substr($names[$i], 1)] = $names[$i][0];
  546.                 }else {
  547.                     $IRC->channames[$c][$names[$i]] = " ";
  548.                 }
  549.                 if(($i % 5) == 0) {
  550.                     output("", true, false);
  551.                     output("", false);
  552.                 }
  553.                 output("[" . str_pad($IRC->channames[$c][$names[$i]] . $names[$i], 17, " ", STR_PAD_RIGHT) . "] ", false, false);
  554.             }
  555.             output("", true, false);
  556.             output("-!- " . $cc . ": Total of " . sizeof($names) . " nicks");
  557.             break;
  558.         case "421":
  559.             output("Unknown command: \"" . $IRC->cM->param[1] . "\"");
  560.             break;
  561.         case '433':
  562.             output("Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
  563.             if($IRC->firstcon) {
  564.                 send("NICK " . $IRC->joinnick . rand(100, 999));
  565.                 send("PRIVMSG NickServ :ghost " . $IRC->joinnick . " " . $IRC->auth);
  566.             }          
  567.             break;
  568.         case '474':
  569.             output('Unable to join channel ' . $IRC->cM->param[1] . ': ' . $IRC->cM->mess);
  570.             break;
  571.         default:
  572.             output($IRC->cM->mess);
  573.             break;
  574.     }
  575.     return true;
  576. }
  577.  
  578. function parseMessage($buffer, $handle = true) {
  579.     global $IRC;
  580.     $buffer = substr($buffer, 0, strpos($buffer, "\n"));
  581.     if(!($IRC->cM->wline = trim($buffer))) {
  582.         return;
  583.     }
  584.     if($IRC->debug) {
  585.         output($buffer);
  586.     }
  587.     switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
  588.         case ":":
  589.             $IRC->cM->sender = substr($IRC->cM->mess = substr($IRC->cM->wline, 1), 0, $p = strpos($IRC->cM->mess, " "));
  590.             $IRC->cM->host = $IRC->cM->sender;
  591.             $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  592.             if(($p = strpos($IRC->cM->host, "!")) || ($p === 0)) {
  593.                 $IRC->cM->nick = substr($IRC->cM->host, 0, $p);
  594.                 $IRC->cM->host = substr($IRC->cM->host, $p + 1);
  595.                 if(($p = strpos($IRC->cM->host, "@")) || ($p === 0)) {
  596.                     $IRC->cM->user = substr($IRC->cM->host, 0, $p);
  597.                     $IRC->cM->host = substr($IRC->cM->host, $p + 1);
  598.                 }
  599.             }
  600.             $IRC->cM->cmd = substr($IRC->cM->mess, 0, $p = strpos($IRC->cM->mess, " "));
  601.             $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  602.             if(!(($p = strpos($IRC->cM->mess, ":")) || ($p === 0))) {
  603.                 $p = strlen($IRC->cM->mess);
  604.             }
  605.             $IRC->cM->param = explode(" ", trim(substr($IRC->cM->mess, 0, $p)));
  606.             $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  607.             if(!$handle) {
  608.                 continue;
  609.             }
  610.             if(is_numeric($IRC->cM->cmd)) {
  611.                 if(handleNumberCommands()) {
  612.                     break;
  613.                 }
  614.             }
  615.             if(handleNormalCommands()) {
  616.                 break;
  617.             }
  618.             output("Unknown message: " . $IRC->cM->wline);
  619.             break;
  620.         case "NOTICE":
  621.             $IRC->cM->mess = substr($IRC->cM->wline, strpos($IRC->cM->wline, ":") + 1);
  622.             $ss = $IRC->server;
  623.             if(startsWith(strtoupper($IRC->cM->wline), "NOTICE AUTH")) {
  624.                 $ss = $IRC->host;
  625.             }
  626.             output("!" . $ss . " " . $IRC->cM->mess);
  627.             break;
  628.         case "PING":
  629.             if($IRC->pingpong) {
  630.                 output($buffer);
  631.             }
  632.             $IRC->cM->wline[1] = "O";
  633.             send($IRC->cM->wline, $IRC->pingpong);
  634.             break;
  635.         case "ERROR":
  636.             output($IRC->cM->wline);
  637.             break;
  638.         default:
  639.             output("Unknown message: " . $IRC->cM->wline);
  640.             break;
  641.     }
  642. }
  643.  
  644. function onConnect() {
  645.     global $IRC;
  646.     send("USER " . $IRC->username . " * * :" . $IRC->realname);
  647.     send("NICK " . $IRC->joinnick);
  648.     $IRC->cNick = $IRC->joinnick;
  649.     if($IRC->auth) {
  650.         send("PRIVMSG NickServ :ID " . $IRC->joinnick . " " . $IRC->auth);
  651.     }
  652.     foreach($IRC->joinchan as $c) {
  653.         send("JOIN " . $c);
  654.     }
  655. }
  656.  
  657. $IRC->connected = false;
  658. $IRC->lastping = time();
  659. $IRC->pongwait = false;
  660. $IRC->pingsent = microtime(true);
  661. $IRC->masterNick = fetchmasters();
  662.    
  663. while(!$IRC->quit) {
  664.     if((($IRC->pongwait) && ((time() - $IRC->lastping) > 300)) || (((!$IRC->connected) || (feof($IRC->fp)) && (!($IRC->quit))))) {
  665.         if($IRC->connected) {
  666.             if(!feof($IRC->fp)) {
  667.                 send("QUIT :Lost connection");
  668.             }
  669.             fclose($IRC->fp);
  670.         }
  671.         $IRC->connected = false;
  672.         output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
  673.         if($IRC->fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
  674.             output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
  675.             stream_set_timeout($IRC->fp, 0, 1);
  676.             $IRC->firstcon = true;
  677.             $IRC->connected = true;
  678.             $IRC->pongwait = false;
  679.             $IRC->lastping = time();
  680.             onConnect();
  681.         }else {
  682.             sleep(30);
  683.             continue;
  684.         }
  685.     }
  686.     if((!$IRC->pongwait) && (time() - $IRC->lastping) > 30) {
  687.         $IRC->pongwait = true;
  688.         $IRC->pingsent = microtime(true);
  689.         send("PING :" . $IRC->server, $IRC->pingpong);
  690.     }
  691.     if($rawdata = fgets($IRC->fp, 1024)) {
  692.         parseMessage($rawdata);
  693.     }
  694.    
  695. }
  696. fclose($IRC->fp);
  697. fclose($IRC->logfile);
  698. mysql_close($IRC->con);
  699. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement