Advertisement
Guest User

Untitled

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