Advertisement
Guest User

Untitled

a guest
May 7th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 14.10 KB | None | 0 0
  1. <?php
  2.  
  3. class aMessage {
  4.     var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
  5. }
  6.  
  7. class aIRC {
  8.     var $cM, $host, $port, $cNick, $oldNick, $joinnick, $joinchan, $con, $auth, $toBeBanned, $firstcon, $mTableName, $cTableName, $server, $cmdChar, $locked, $pingpong, $masterNick, $quit, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
  9. }
  10.  
  11. $IRC = new aIRC;
  12. $IRC->cM = new aMessage;
  13. $IRC->cM->param = array();
  14. $IRC->host = "irc.freenode.net";
  15. $IRC->port = 8001;
  16. $IRC->joinchan = array("#Tootoot222", "#SRL", "#mixster", "#SRL-School");
  17. $IRC->joinnick = "Toot^Bot";
  18. $IRC->cNick = $IRC->joinnick;
  19. $IRC->oldNick = "";
  20. $IRC->auth = "";
  21. $IRC->server = "";
  22. $IRC->cmdChar = "!";
  23. $IRC->locked = false;
  24. $IRC->pingpong = false;
  25.  
  26. $IRC->toBeBanned = array();
  27.  
  28. $IRC->MySQLServer = "localhost";   
  29. $IRC->MySQLDatabase = "ircbotv2";
  30. $IRC->MySQLAccountName = "root";
  31. $IRC->MySQLAccountpassword = "";
  32. $IRC->mTableName = "masters3";
  33. $IRC->cTableName = "cmd";
  34.  
  35. function output($message) {
  36.     echo("[" . date("H:i:s") . "] " . $message . "\r\n");
  37. }
  38.  
  39. function send($data, $out = true) {
  40.     if(!trim($data)) {
  41.       return;
  42.     }
  43.     global $fp;
  44.     $a = explode("\r\n", $data);
  45.     foreach($a as $aa) {
  46.         fputs($fp, $aa . "\r\n");
  47.         if($out) {
  48.             output("-> " . $aa);
  49.         }
  50.     }
  51. }
  52.  
  53. function startsWith($haystack, $needle) {
  54.     if(is_array($needle)) {
  55.         foreach($needle as $n) {
  56.             if(strpos($haystack, $n) === 0) {
  57.                 return($n);
  58.             }
  59.         }
  60.     }
  61.     return(strpos($haystack, $needle) === 0);
  62. }
  63.  
  64. function instr($haystack, $needle) {
  65.     return((strpos($haystack, $needle) != 0) || (strpos($haystack, $needle) === 0));
  66. }
  67.  
  68. function isNumber($s) {
  69.     $l = sizeof($s);
  70.     if($l == 0) {
  71.         return false;
  72.     }
  73.     for($i = 0; $i < $l; $i++) {
  74.         if(!in_array($s[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))) {
  75.             return false;
  76.         }
  77.     }
  78.     return true;
  79. }
  80.  
  81. function fetchcmdcode($cmd) {
  82.     global $IRC;
  83.     $row = mysql_fetch_array(mysql_query("SELECT code FROM " . $IRC->cTableName . " WHERE name='" . $cmd . "'", $IRC->con));
  84.     return($row["code"]);
  85. }
  86.  
  87. function fetchmasters($sel = true, $item = "*", $privs = 1, $ins = false) {
  88.     global $IRC;
  89.     if($sel) {
  90.         $q = mysql_query("SELECT " . $item . " FROM " . $IRC->mTableName, $IRC->con);
  91.         $r = array();
  92.         while($row = mysql_fetch_array($q)) {
  93.             $r[] = $row["name"];
  94.         }
  95.     }elseif($ins) {
  96.         mysql_query("INSERT INTO " . $IRC->mTableName . "(name, cname, privs) VALUES ('" . $item . "', '" . strtoupper($item) . "', " . $privs . ")", $IRC->con);
  97.     }else {
  98.         if($item) {
  99.             $n = " WHERE cname='" . strtoupper($item) . "'";
  100.         }
  101.         mysql_query("DELETE FROM " . $IRC->mTableName . $n, $IRC->con);
  102.     }
  103.     return($r);
  104. }
  105.  
  106. function isMaster($nick) {
  107.     global $IRC;
  108.     foreach(($IRC->masterNick = fetchmasters()) as $n) {
  109.         if(strtolower($n) == strtolower($nick)) {
  110.             return(true);
  111.         }
  112.     }
  113.     return(false);
  114. }
  115.  
  116. function handleNumberCommands() {
  117.     global $IRC;
  118.     switch($IRC->cM->cmd) {
  119.         case "001":
  120.             $IRC->server = $IRC->cM->host;
  121.             output($IRC->cM->mess);
  122.             if($IRC->firstcon) {
  123.                 send("NICK :" . $IRC->joinnick);
  124.                 send("PRIVMSG NickServ :ID " . $IRC->cNick . " " . $IRC->auth);
  125.                 foreach($IRC->joinchan as $c) {
  126.                     send("JOIN " . $c);
  127.                 }
  128.                 $IRC->firstcon = false;
  129.             }
  130.             break;
  131.         case "005":
  132.         case "252":
  133.         case "254":
  134.             output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
  135.             break;
  136.         case "311":
  137.             output($IRC->cM->mess);
  138.             foreach($IRC->toBeBanned as $b) {
  139.                 if(startsWith($b, $IRC->cM->param[1])) {
  140.                     $w = explode(" ", $b);
  141.                     send("MODE " . $w[1] . " +b *!*@" . $IRC->cM->param[3]);
  142.                     $aa = $w[2] . " :";
  143.                     for($i = 3; $i < sizeof($w); $i++) {
  144.                         $aa = $aa . $w[$i] . " ";
  145.                     }
  146.                     $aa = trim($aa);
  147.                     send("KICK " . $w[1] . " " . $aa);
  148.                 }
  149.             }
  150.             break;
  151.         case "332":
  152.             output("Topic for " . $IRC->cM->param[1] . " is: " . $IRC->cM->mess);
  153.             break;
  154.         case "333":
  155.             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]));
  156.             break;
  157.         case "421":
  158.             output("Unknown command: \"" . $IRC->cM->param[1] . "\"");
  159.             break;
  160.         case '433':
  161.             output("Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
  162.             $IRC->cNick = $IRC->oldNick;
  163.             if($IRC->firstcon) {
  164.                 send("NICK :" . $IRC->joinnick . rand(100, 999));
  165.                 send("PRIVMSG NickServ :ghost " . $IRC->joinnick . " " . $IRC->auth);
  166.             }          
  167.             break;
  168.         case '474':
  169.             output('Unable to join channel ' . $IRC->cM->param[1] . ': ' . $IRC->cM->mess);
  170.             break;
  171.         default:
  172.             output($IRC->cM->mess);
  173.             break;
  174.     }
  175.     return true;
  176. }
  177.  
  178. function handleBotCommands() {
  179.     global $IRC;
  180.     global $quit;
  181.     if((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick))) {
  182.         $ismaster = isMaster($IRC->cM->nick);
  183.         $ispm = strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick);
  184.         if((!$IRC->locked) || ($ismaster)) {
  185.             $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
  186.             for($i = 1; $i < sizeof($a); $i++) {
  187.                 $r = $r . $a[$i] . " ";
  188.             }
  189.             $r = trim($r);
  190.             eval(fetchcmdcode(strtoupper($a[0])));
  191.             if($ismaster) {
  192.                 switch(strtoupper($a[0])) {
  193.                     case "QUIT" :
  194.                         if(!($q = $r)) {
  195.                             $q = "PHP bot made by Tootoot222. Version 2";
  196.                         }
  197.                         send("QUIT :" . $q);
  198.                         $quit = true;
  199.                         break;
  200.                     case "SEND":
  201.                         send($r);
  202.                         break;
  203.                     case "BIND":
  204.                         switch(strtoupper($a[1])) {
  205.                             case "ADD":
  206.                                 for($i = 3; $i < sizeof($a); $i++) {
  207.                                     $o = $o . $a[$i] . " ";
  208.                                 }
  209.                                 $o = trim($o);
  210.                                 send("PRIVMSG " . $IRC->cM->param[0] . " :Binding command " . strtoupper($a[2]));
  211.                                 mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . strtoupper($a[2]) . "'", $IRC->con);
  212.                                 mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code) VALUES ('" . strtoupper($a[2]) . "', '" . $o . "')", $IRC->con);
  213.                                 break;
  214.                             case "DEL":
  215.                                 mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . strtoupper($a[2]) . "'", $IRC->con);
  216.                                 send("PRIVMSG " . $IRC->cM->param[0] . " :Command '" . strtoupper($a[2]) . "' was deleted.");
  217.                                 break;
  218.                             default:
  219.                                 fetchcmdcode($a[1]);
  220.                                 break;
  221.                         }
  222.                         break;
  223.                 }
  224.             }
  225.         }
  226.     }
  227. }
  228.  
  229. function handleChatCommands() {
  230.     global $IRC;
  231.     if(!$IRC->cM->nick) {
  232.         return false;
  233.     }
  234.     $chr1 = chr(001);
  235.     if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
  236.         $a = explode(" ", $IRC->cM->mess);
  237.         $tok = "";
  238.         for($i = 1; $i < sizeof($a); $i++) {
  239.             $tok = $tok . $a[$i] . " ";
  240.         }
  241.         $tok = trim(substr($tok, 0, strlen($tok) - 1));
  242.         if($tok) {
  243.             $tok2 = strtoupper(substr($a[0], 1));
  244.             if($tok2 != "ACTION") {
  245.                 $tok = ": " . $tok;
  246.             }
  247.         }else {
  248.             $tok2 = strtoupper(substr($a[0], 1, strlen($tok2) - 1));
  249.         }
  250.         if($tok2 != "ACTION") {
  251.             output($IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] requested CTCP " . $tok2 . " from " . $IRC->cM->param[0] . $tok);
  252.         }
  253.         switch($tok2) {
  254.             case "ACTION":
  255.                 output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
  256.                 break;
  257.             case "PING":
  258.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . time() . $chr1);
  259.                 break;
  260.             case "TIME":
  261.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "TIME " . date("D M jS H:i:s") . $chr1);
  262.                 break;
  263.             case "VERSION":
  264.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "VERSION Toot PHP Bot v2" . $chr1);
  265.                 break;
  266.             case "FINGER":
  267.                 send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER wat" . $chr1);
  268.                 break;
  269.         }
  270.         return true;
  271.     }
  272.     if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
  273.         output("[" . $IRC->cM->param[0] . "] <" . $IRC->cM->nick . "> " . $IRC->cM->mess);
  274.     }else {
  275.         output("*" . $IRC->cM->nick . "* " . $IRC->cM->mess);
  276.     }
  277.     if(startsWith($IRC->cM->mess, $IRC->cmdChar)) {
  278.         handleBotCommands();
  279.     }
  280.     return true;
  281. }
  282.  
  283. function handleNormalCommands() {
  284.     global $IRC;
  285.     global $lastping;
  286.     global $pongwait;
  287.     global $pingsent;
  288.     switch(strtoupper(trim($IRC->cM->cmd))) {
  289.         case "KICK":
  290.             if($IRC->cM->param[1] == $IRC->cNick) {
  291.                 $who = "You were";
  292.             }else {
  293.                 $who = $IRC->cM->param[1] . " was";
  294.             }
  295.             output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $cMessage->mess . "]");
  296.             if($IRC->cM->param[1] == $IRC->cNick) {
  297.                 send("JOIN :" . $IRC->cM->param[0]);
  298.             }
  299.             break;
  300.         case "MODE":
  301.             $t = array();
  302.             if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
  303.                 $o = $IRC->cM->mess;
  304.             }else {
  305.                 for($i = 1; $i < sizeof($IRC->cM->param); $i++) {
  306.                     $o = $o . $IRC->cM->param[$i] . " ";
  307.                 }
  308.                 $o = trim($o);
  309.             }
  310.             if($IRC->cM->nick) {
  311.                 output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
  312.             }else {
  313.                 output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->host);
  314.             }
  315.             break;
  316.         case "NOTICE":
  317.             output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
  318.             break;
  319.         case "PRIVMSG":
  320.             return handleChatCommands();
  321.         case "PART":
  322.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
  323.             break;
  324.         case "JOIN":
  325.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
  326.             break;
  327.         case "QUIT":
  328.             output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
  329.             break;
  330.         case "NICK":
  331.             if(strtolower($IRC->cM->mess) == strtolower($IRC->cNick)) {
  332.                 $who = "You are";
  333.                 $IRC->cNick = $IRC->cM->mess;
  334.             }else {
  335.                 $who = $IRC->cM->nick . " is";
  336.             }
  337.             output("-!- " . $who . " now known as " . $IRC->cM->mess);
  338.             if(isMaster($IRC->cM->nick)) {
  339.                 foreach(($IRC->masterNick = fetchmasters()) as $n) {
  340.                     if(strtolower($n) == strtolower($IRC->cM->nick)) {
  341.                         mysql_query("UPDATE " . $IRC->mTableName . " SET name='" . $IRC->cM->mess . "', cname='" . strtoupper($IRC->cM->mess) . "' WHERE cname='" . strtoupper($n) . "'");
  342.                     }
  343.                 }
  344.             }
  345.             if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  346.                 $IRC->cNick = $IRC->cM->mess;
  347.             }
  348.             break;
  349.         case "TOPIC":
  350.             output("-!- " . $IRC->cM->nick . " changed the topic of " . $IRC->cM->param[0] . " to: " . $IRC->cM->mess);
  351.             break;
  352.         case "PONG":
  353.             if($IRC->pingpong) {
  354.                 output("-!- Server PONG reply from " . $IRC->cM->host . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $pingsent));
  355.             }
  356.             $lastping = time();
  357.             $pongwait = false;
  358.             break;
  359.         default:
  360.             return false;
  361.     }
  362.     return true;
  363. }
  364.  
  365. function parseMessage($buffer) {
  366.     global $IRC;
  367.     $a = explode("\n", $buffer);
  368.     foreach($a as $rawdata) {
  369.         if(!($IRC->cM->wline = trim($rawdata))) {
  370.             return;
  371.         }
  372.         switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
  373.             case ":":
  374.                 $IRC->cM->mess = substr($IRC->cM->wline, 1);
  375.                 $p = strpos($IRC->cM->mess, " ");
  376.                 $IRC->cM->host = substr($IRC->cM->mess, 0, $p);
  377.                 $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  378.                 if(($p = strpos($IRC->cM->host, "!")) || ($p === 0)) {
  379.                     $IRC->cM->nick = substr($IRC->cM->host, 0, $p);
  380.                     $IRC->cM->host = substr($IRC->cM->host, $p + 1);
  381.                     if(($p = strpos($IRC->cM->host, "@")) || ($p === 0)) {
  382.                         $IRC->cM->user = substr($IRC->cM->host, 0, $p);
  383.                         $IRC->cM->host = substr($IRC->cM->host, $p + 1);
  384.                     }
  385.                 }
  386.                 $IRC->cM->cmd = substr($IRC->cM->mess, 0, $p = strpos($IRC->cM->mess, " "));
  387.                 $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  388.                 if(!(($p = strpos($IRC->cM->mess, ":")) || ($p === 0))) {
  389.                     $p = strlen($IRC->cM->mess);
  390.                 }
  391.                 $IRC->cM->param = explode(" ", trim(substr($IRC->cM->mess, 0, $p)));
  392.                 $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
  393.                 if(isNumber($IRC->cM->cmd)) {
  394.                     if(handleNumberCommands()) {
  395.                         break;
  396.                     }
  397.                 }
  398.                 if(handleNormalCommands()) {
  399.                     break;
  400.                 }
  401.                 output("Unknown message: " . $IRC->cM->wline);
  402.                 break;
  403.             case "NOTICE":
  404.                 $IRC->cM->mess = substr($IRC->cM->wline, strpos($IRC->cM->wline, ":") + 1);
  405.                 $ss = $IRC->server;
  406.                 if(startsWith(strtoupper($IRC->cM->wline), "NOTICE AUTH")) {
  407.                     $ss = $IRC->host;
  408.                 }
  409.                 output("!" . $ss . " " . $IRC->cM->mess);
  410.                 break;
  411.             case "PING":
  412.                 if($IRC->pingpong) {
  413.                     output($rawdata);
  414.                 }
  415.                 $IRC->cM->wline[1] = "O";
  416.                 send($IRC->cM->wline, $IRC->pingpong);
  417.                 break;
  418.         }
  419.     }
  420. }
  421.  
  422. function onConnect() {
  423.     global $IRC;
  424.     send("USER " . $IRC->cNick . " * * :" . $IRC->cNick);
  425.     send("NICK " . $IRC->joinnick);
  426.     send("PRIVMSG NickServ :ID " . $IRC->cNick . " " . $IRC->auth);
  427.     foreach($IRC->joinchan as $c) {
  428.         send("JOIN " . $c);
  429.     }
  430. }
  431.  
  432. if(!$IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword)){
  433.     output("MySQL error in fetchcmdcode: " . mysql_error());
  434.     mysql_close($IRC->con);
  435.     die;
  436. }
  437. mysql_select_db($IRC->MySQLDatabase, $IRC->con);
  438.  
  439. $IRC->connected = false;
  440. $lastping = time();
  441. $pongwait = false;
  442. $pingsent = microtime(true);
  443. $IRC->masterNick = fetchmasters();
  444.    
  445. while(!$quit) {
  446.     if((($pongwait) && ((time() - $lastping) > 300)) || ((!$IRC->connected) || (feof($fp) && (!($quit))))) {
  447.         if($IRC->connected) {
  448.             send("QUIT :Lost connection");
  449.             fclose($fp);
  450.         }
  451.         $IRC->connected = false;
  452.         output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
  453.         if($fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
  454.             $IRC->firstcon = true;
  455.             output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
  456.             $IRC->connected = true;
  457.             onConnect();
  458.             $lastping = time();
  459.             $pongwait = false;
  460.         }else {
  461.             sleep(30);
  462.             continue;
  463.         }
  464.     }
  465.     if((!$pongwait) && (time() - $lastping) > 30) {
  466.         $pongwait = true;
  467.         $pingsent = microtime(true);
  468.         send("PING :" . $IRC->server, $IRC->pingpong);
  469.     }
  470.     if($rawdata = fgets($fp, 1024)) {
  471.         parseMessage($rawdata);
  472.     }
  473. }
  474. fclose($fp);
  475. mysql_close($IRC->con);
  476. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement