Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- class aMessage {
- var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
- }
- class aIRC {
- var $cM, $host, $port, $cNick, $oldNick, $joinnick, $joinchan, $con, $auth, $toBeBanned, $firstcon, $mTableName, $cTableName, $server, $cmdChar, $locked, $pingpong, $masterNick, $quit, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
- }
- $IRC = new aIRC;
- $IRC->cM = new aMessage;
- $IRC->cM->param = array();
- $IRC->host = "irc.freenode.net";
- $IRC->port = 8001;
- $IRC->joinchan = array("#Tootoot222", "#SRL", "#mixster");
- $IRC->joinnick = "Toot^Bot";
- $IRC->cNick = $IRC->joinnick;
- $IRC->oldNick = "";
- $IRC->auth = "";
- $IRC->server = "";
- $IRC->cmdChar = "!";
- $IRC->locked = false;
- $IRC->pingpong = false;
- $IRC->toBeBanned = array();
- $IRC->MySQLServer = "localhost";
- $IRC->MySQLDatabase = "ircbotv2";
- $IRC->MySQLAccountName = "root";
- $IRC->MySQLAccountpassword = "";
- $IRC->mTableName = "masters3";
- $IRC->cTableName = "cmd";
- function output($message) {
- echo("[" . date("H:i:s") . "] " . $message . "\r\n");
- }
- function send($data, $out = true) {
- if(!trim($data)) {
- return;
- }
- global $fp;
- $a = explode("\r\n", $data);
- foreach($a as $aa) {
- fputs($fp, $aa . "\r\n");
- if($out) {
- output("-> " . $aa);
- }
- }
- }
- function startsWith($haystack, $needle) {
- if(is_array($needle)) {
- foreach($needle as $n) {
- if(strpos($haystack, $n) === 0) {
- return($n);
- }
- }
- }
- return(strpos($haystack, $needle) === 0);
- }
- function instr($haystack, $needle) {
- return((strpos($haystack, $needle) != 0) || (strpos($haystack, $needle) === 0));
- }
- function isNumber($s) {
- $l = sizeof($s);
- if($l == 0) {
- return false;
- }
- for($i = 0; $i < $l; $i++) {
- if(!in_array($s[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9"))) {
- return false;
- }
- }
- return true;
- }
- function fetchcmdcode($cmd) {
- global $IRC;
- $row = mysql_fetch_array(mysql_query("SELECT code FROM " . $IRC->cTableName . " WHERE name='" . $cmd . "'", $IRC->con));
- return($row["code"]);
- }
- function fetchmasters($sel = true, $item = "*", $privs = 1, $ins = false) {
- global $IRC;
- if($sel) {
- $q = mysql_query("SELECT " . $item . " FROM " . $IRC->mTableName, $IRC->con);
- $r = array();
- while($row = mysql_fetch_array($q)) {
- $r[] = $row["name"];
- }
- }elseif($ins) {
- mysql_query("INSERT INTO " . $IRC->mTableName . "(name, cname, privs) VALUES ('" . $item . "', '" . strtoupper($item) . "', " . $privs . ")", $IRC->con);
- }else {
- if($item) {
- $n = " WHERE cname='" . strtoupper($item) . "'";
- }
- mysql_query("DELETE FROM " . $IRC->mTableName . $n, $IRC->con);
- }
- return($r);
- }
- function isMaster($nick) {
- global $IRC;
- foreach(($IRC->masterNick = fetchmasters()) as $n) {
- if(strtolower($n) == strtolower($nick)) {
- return(true);
- }
- }
- return(false);
- }
- function handleNumberCommands() {
- global $IRC;
- switch($IRC->cM->cmd) {
- case "001":
- $IRC->server = $IRC->cM->host;
- output($IRC->cM->mess);
- if($IRC->firstcon) {
- send("NICK :" . $IRC->joinnick);
- send("PRIVMSG NickServ :ID " . $IRC->cNick . " " . $IRC->auth);
- foreach($IRC->joinchan as $c) {
- send("JOIN " . $c);
- }
- $IRC->firstcon = false;
- }
- break;
- case "005":
- case "252":
- case "254":
- output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
- break;
- case "311":
- output($IRC->cM->mess);
- foreach($IRC->toBeBanned as $b) {
- if(startsWith($b, $IRC->cM->param[1])) {
- $w = explode(" ", $b);
- send("MODE " . $w[1] . " +b *!*@" . $IRC->cM->param[3]);
- $aa = $w[2] . " :";
- for($i = 3; $i < sizeof($w); $i++) {
- $aa = $aa . $w[$i] . " ";
- }
- $aa = trim($aa);
- send("KICK " . $w[1] . " " . $aa);
- }
- }
- break;
- case "332":
- output("Topic for " . $IRC->cM->param[1] . " is: " . $IRC->cM->mess);
- break;
- case "333":
- 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]));
- break;
- case "421":
- output("Unknown command: \"" . $IRC->cM->param[1] . "\"");
- break;
- case '433':
- output("Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
- $IRC->cNick = $IRC->oldNick;
- if($IRC->firstcon) {
- send("NICK :" . $IRC->joinnick . rand(100, 999));
- send("PRIVMSG NickServ :ghost " . $IRC->joinnick . " " . $IRC->auth);
- }
- break;
- case '474':
- output('Unable to join channel ' . $IRC->cM->param[1] . ': ' . $IRC->cM->mess);
- break;
- default:
- output($IRC->cM->mess);
- break;
- }
- return true;
- }
- function handleBotCommands() {
- global $IRC;
- global $quit;
- if((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick))) {
- $ismaster = isMaster($IRC->cM->nick);
- $ispm = strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick);
- if((!$IRC->locked) || ($ismaster)) {
- $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
- for($i = 1; $i < sizeof($a); $i++) {
- $r = $r . $a[$i] . " ";
- }
- $r = trim($r);
- eval(fetchcmdcode(strtoupper($a[0])));
- if($ismaster) {
- switch(strtoupper($a[0])) {
- case "QUIT" :
- if(!($q = $r)) {
- $q = "PHP bot made by Tootoot222. Version 2";
- }
- send("QUIT :" . $q);
- $quit = true;
- break;
- case "SEND":
- send($r);
- break;
- case "BIND":
- switch(strtoupper($a[1])) {
- case "ADD":
- for($i = 3; $i < sizeof($a); $i++) {
- $o = $o . $a[$i] . " ";
- }
- $o = trim($o);
- send("PRIVMSG " . $IRC->cM->param[0] . " :Binding command " . strtoupper($a[2]));
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . strtoupper($a[2]) . "'", $IRC->con);
- mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code) VALUES ('" . strtoupper($a[2]) . "', '" . $o . "')", $IRC->con);
- break;
- case "DEL":
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . strtoupper($a[2]) . "'", $IRC->con);
- send("PRIVMSG " . $IRC->cM->param[0] . " :Command '" . strtoupper($a[2]) . "' was deleted.");
- break;
- default:
- fetchcmdcode($a[1]);
- break;
- }
- break;
- }
- }
- }
- }
- }
- function handleChatCommands() {
- global $IRC;
- if(!$IRC->cM->nick) {
- return false;
- }
- $chr1 = chr(001);
- if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
- $a = explode(" ", $IRC->cM->mess);
- $tok = "";
- for($i = 1; $i < sizeof($a); $i++) {
- $tok = $tok . $a[$i] . " ";
- }
- $tok = trim(substr($tok, 0, strlen($tok) - 1));
- if($tok) {
- $tok = ": " . $tok;
- $tok2 = strtoupper(substr($a[0], 1));
- }else {
- $tok2 = strtoupper(substr($a[0], 1, strlen($tok2) - 1));
- }
- if($tok2 != "ACTION") {
- output($IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] requested CTCP " . $tok2 . " from " . $IRC->cM->param[0] . $tok);
- }
- switch($tok2) {
- case "ACTION":
- output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
- break;
- case "PING":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . time() . $chr1);
- break;
- case "TIME":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "TIME " . date("D M jS H:i:s") . $chr1);
- break;
- case "VERSION":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "VERSION Toot PHP Bot v2" . $chr1);
- break;
- case "FINGER":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER wat" . $chr1);
- break;
- }
- return true;
- }
- if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
- output("[" . $IRC->cM->param[0] . "] <" . $IRC->cM->nick . "> " . $IRC->cM->mess);
- }else {
- output("*" . $IRC->cM->nick . "* " . $IRC->cM->mess);
- }
- if(startsWith($IRC->cM->mess, $IRC->cmdChar)) {
- handleBotCommands();
- }
- return true;
- }
- function handleNormalCommands() {
- global $IRC;
- global $lastping;
- global $pongwait;
- global $pingsent;
- switch(strtoupper(trim($IRC->cM->cmd))) {
- case "KICK":
- if($IRC->cM->param[1] == $IRC->cNick) {
- $who = "You were";
- }else {
- $who = $IRC->cM->param[1] . " was";
- }
- output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $cMessage->mess . "]");
- if($IRC->cM->param[1] == $IRC->cNick) {
- send("JOIN :" . $IRC->cM->param[0]);
- }
- break;
- case "MODE":
- $t = array();
- if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
- $o = $IRC->cM->mess;
- }else {
- for($i = 1; $i < sizeof($IRC->cM->param); $i++) {
- $o = $o . $IRC->cM->param[$i] . " ";
- }
- $o = trim($o);
- }
- if($IRC->cM->nick) {
- output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
- }else {
- output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->host);
- }
- break;
- case "NOTICE":
- output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
- break;
- case "PRIVMSG":
- return handleChatCommands();
- case "PART":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
- break;
- case "JOIN":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
- break;
- case "QUIT":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
- break;
- case "NICK":
- if(strtolower($IRC->cM->mess) == strtolower($IRC->cNick)) {
- $who = "You are";
- $IRC->cNick = $IRC->cM->mess;
- }else {
- $who = $IRC->cM->nick . " is";
- }
- output("-!- " . $who . " now known as " . $IRC->cM->mess);
- if(isMaster($IRC->cM->nick)) {
- foreach(($IRC->masterNick = fetchmasters()) as $n) {
- if(strtolower($n) == strtolower($IRC->cM->nick)) {
- mysql_query("UPDATE " . $IRC->mTableName . " SET name='" . $IRC->cM->mess . "', cname='" . strtoupper($IRC->cM->mess) . "' WHERE cname='" . strtoupper($n) . "'");
- }
- }
- }
- if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
- $IRC->cNick = $IRC->cM->mess;
- }
- break;
- case "TOPIC":
- output("-!- " . $IRC->cM->nick . " changed the topic of " . $IRC->cM->param[0] . " to: " . $IRC->cM->mess);
- break;
- case "PONG":
- if($IRC->pingpong) {
- output("-!- Server PONG reply from " . $IRC->cM->host . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $pingsent));
- }
- $lastping = time();
- $pongwait = false;
- break;
- default:
- return false;
- }
- return true;
- }
- function parseMessage($buffer) {
- global $IRC;
- $a = explode("\n", $buffer);
- foreach($a as $rawdata) {
- if(!($IRC->cM->wline = trim($rawdata))) {
- return;
- }
- switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
- case ":":
- $IRC->cM->mess = substr($IRC->cM->wline, 1);
- $p = strpos($IRC->cM->mess, " ");
- $IRC->cM->host = substr($IRC->cM->mess, 0, $p);
- $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
- if(($p = strpos($IRC->cM->host, "!")) || ($p === 0)) {
- $IRC->cM->nick = substr($IRC->cM->host, 0, $p);
- $IRC->cM->host = substr($IRC->cM->host, $p + 1);
- if(($p = strpos($IRC->cM->host, "@")) || ($p === 0)) {
- $IRC->cM->user = substr($IRC->cM->host, 0, $p);
- $IRC->cM->host = substr($IRC->cM->host, $p + 1);
- }
- }
- $IRC->cM->cmd = substr($IRC->cM->mess, 0, $p = strpos($IRC->cM->mess, " "));
- $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
- if(!(($p = strpos($IRC->cM->mess, ":")) || ($p === 0))) {
- $p = strlen($IRC->cM->mess);
- }
- $IRC->cM->param = explode(" ", trim(substr($IRC->cM->mess, 0, $p)));
- $IRC->cM->mess = substr($IRC->cM->mess, $p + 1);
- if(isNumber($IRC->cM->cmd)) {
- if(handleNumberCommands()) {
- break;
- }
- }
- if(handleNormalCommands()) {
- break;
- }
- output("Unknown message: " . $IRC->cM->wline);
- break;
- case "NOTICE":
- $IRC->cM->mess = substr($IRC->cM->wline, strpos($IRC->cM->wline, ":") + 1);
- $ss = $IRC->server;
- if(startsWith(strtoupper($IRC->cM->wline), "NOTICE AUTH")) {
- $ss = $IRC->host;
- }
- output("!" . $ss . " " . $IRC->cM->mess);
- break;
- case "PING":
- if($IRC->pingpong) {
- output($rawdata);
- }
- $IRC->cM->wline[1] = "O";
- send($IRC->cM->wline, $IRC->pingpong);
- break;
- }
- }
- }
- function onConnect() {
- global $IRC;
- send("USER " . $IRC->cNick . " * * :" . $IRC->cNick);
- send("NICK " . $IRC->joinnick);
- send("PRIVMSG NickServ :ID " . $IRC->cNick . " " . $IRC->auth);
- foreach($IRC->joinchan as $c) {
- send("JOIN " . $c);
- }
- }
- if(!$IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword)){
- output("MySQL error in fetchcmdcode: " . mysql_error());
- mysql_close($IRC->con);
- die;
- }
- mysql_select_db($IRC->MySQLDatabase, $IRC->con);
- $IRC->connected = false;
- $lastping = time();
- $pongwait = false;
- $pingsent = microtime(true);
- $IRC->masterNick = fetchmasters();
- while(!$quit) {
- if((($pongwait) && ((time() - $lastping) > 300)) || ((!$IRC->connected) || (feof($fp) && (!($quit))))) {
- if($IRC->connected) {
- send("QUIT :Lost connection");
- fclose($fp);
- }
- $IRC->connected = false;
- output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
- if($fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
- $IRC->firstcon = true;
- output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
- $IRC->connected = true;
- onConnect();
- $lastping = time();
- $pongwait = false;
- }else {
- sleep(30);
- continue;
- }
- }
- if((!$pongwait) && (time() - $lastping) > 30) {
- $pongwait = true;
- $pingsent = microtime(true);
- send("PING :" . $IRC->server, $IRC->pingpong);
- }
- if($rawdata = fgets($fp, 1024)) {
- parseMessage($rawdata);
- }
- }
- fclose($fp);
- mysql_close($IRC->con);
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement