Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- TODO:
- finish working on !master's modules compatibility
- activatemaster() gives mysql errors because you're not connected when you use modules! need to think of a way to save the masters to a file
- add the ability to save the bound commands to modules instead of databases (and it can be changed a runtime; if it is it will get all the commands in the database/modules and put them into the other)
- fetchmaster() and fetchcmd() use nearly the same code; make a smaller proc to fetch blind data from files (or even just fetch the name/row and return it in $row format) and shorten both procs?
- add mode detection (parsed from the 005 numeric's CHANMODES setting) so we can see when someone gets +o etc
- try to make the NAMES list parsing more like irssi's; i don't really like that it just pads 17 spaces to the right...
- add "timer" hooks to loop()
- there is a PHP internal function that has the same functionallity as implodefrom(), find it and use it in place of implodefrom()
- */
- class aMessage {
- var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
- }
- class aIRC {
- var $cM;
- var $lastping, $pongwait, $pingsent, $pingpong, $modules, $logging, $modfolder, $dbbackupfolder;
- var $host, $fp, $port, $logfile, $con, $server, $cmdChar, $sver;
- var $cNick, $joinnick, $username, $realname, $joinchan, $auth, $authnick, $masters, $banned;
- var $channames, $powers;
- var $debug, $firstcon, $locked, $quit, $version, $kickrejoin, $rejoinwait, $invitejoin;
- var $cTableName, $iTableName, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
- }
- $IRC = new aIRC;
- $IRC->cM = new aMessage;
- $IRC->cM->param = array();
- $IRC->host = "localhost";
- $IRC->port = 6667;
- $IRC->joinchan = array("#Tootoot222", "#mixster", "#SRL-School", "#SRL");
- $IRC->joinnick = "Furry";
- $IRC->username = "Furry";
- $IRC->realname = "Furry";
- $IRC->authnick = "Tootoot222";
- $IRC->cNick = $IRC->joinnick;
- $IRC->auth = "";
- $IRC->server = "";
- $IRC->cmdChar = "!";
- $IRC->sver = "4.1";
- $IRC->logfile = "logfile_v" . $IRC->sver . ".txt";
- $IRC->modfolder = "./modules_v" . $IRC->sver . "/";
- $IRC->dbbackupfolder = "./db_backup_v" . $IRC->sver . "/";
- $IRC->rejoinwait = 5;
- $IRC->kickrejoin = true;
- $IRC->invitejoin = false;
- $IRC->locked = false;
- $IRC->logging = true;
- $IRC->modules = false;
- $IRC->debug = false;
- $IRC->pingpong = false;
- $IRC->channames = array();
- $IRC->powers = array(array(), array());
- $IRC->version = "Version " . $IRC->sver;
- set_time_limit(0); //to ensure the script doesn't time out
- date_default_timezone_set("America/Chicago"); //change this to your timezone
- $firstmaster = "Tootoot222";
- $firstpass = "wat";
- $IRC->masters = array(strtolower($firstmaster) => 100);
- $IRC->MySQLServer = "localhost";
- $IRC->MySQLDatabase = "ircbotv4";
- $IRC->MySQLAccountName = "root";
- $IRC->MySQLAccountpassword = "";
- $IRC->iTableName = "imasters3";
- $IRC->cTableName = "cmd4";
- $IRC->hTableName = "hooks2";
- function output($message, $newline = true, $timestamp = true) {
- global $IRC;
- foreach(explode("\r\n", $message) as $m) {
- $out = ($timestamp ? "[" . date("H:i:s") . "] " : "") . $m . ($newline ? "\r\n" : "");
- echo($out);
- if($IRC->logging) {
- fwrite($IRC->logfile, $out);
- }
- }
- }
- function send($data, $out = true) {
- global $IRC;
- $a = explode("\n", $data);
- foreach($a as $aa) {
- fputs($IRC->fp, $aa . "\n");
- if($out) {
- output("-> " . $aa);
- }
- }
- }
- function sendcmd($cmd, $param = false, $mess = false) {
- send($cmd . ($param !== false ? (" " . (is_array($param) ? implode(" ", $param) : $param)) : "") . ((($param !== false) && ($mess !== false)) ? (" :" . $mess) : ""));
- }
- function implodefrom($glue, $pieces, $from = 0) {
- $r = "";
- if(is_array($pieces)) {
- $from = max(0, $from);
- $r = $pieces[$from];
- for($i = ($from + 1); $i < sizeof($pieces); $i++) {
- $r .= $glue . $pieces[$i];
- }
- }
- return($r);
- }
- 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($needle, $haystack, $sensitive = false) {
- if($sensitive) {
- return((false !== strpos($haystack, $needle)) ? true : false);
- }else {
- return((false !== stristr($haystack, $needle)) ? true : false);
- }
- }
- function table_exists($tablename) {
- global $IRC;
- 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);
- }
- function startupbind() {
- global $IRC;
- if(!$IRC->modules && (!$IRC->con)) {
- if(!($IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword))) {
- output("MySQL error in startupMySQL: " . mysql_error());
- output("Error! Failed to connect to MySQL; will not be using databases; will be using modules instead (experemental)! (continuing in 10 seconds)");
- $IRC->modules = true;
- sleep(10);
- }else {
- mysql_query("CREATE DATABASE IF NOT EXISTS " . $IRC->MySQLDatabase, $IRC->con);
- mysql_select_db($IRC->MySQLDatabase, $IRC->con);
- if(!table_exists($IRC->cTableName)) {
- mysql_query("CREATE TABLE " . $IRC->cTableName . "(name VARCHAR(30), code MEDIUMTEXT, privs INT, maker VARCHAR(30))", $IRC->con);
- }
- if(!table_exists($IRC->iTableName)) {
- global $firstmaster, $firstpass;
- mysql_query("CREATE TABLE " . $IRC->iTableName . "(name VARCHAR(30), pass VARCHAR(32), privs INT)", $IRC->con);
- mysql_query("INSERT INTO " . $IRC->iTableName . "(name, pass, privs) VALUES ('$firstmaster', '" . md5($firstpass) . "', 100)", $IRC->con);
- }
- if(!table_exists($IRC->hTableName)) {
- mysql_query("CREATE TABLE " . $IRC->hTableName . "(name VARCHAR(30), code MEDIUMTEXT, active BOOL)", $IRC->con);
- }
- return(true);
- }
- }
- if(!file_exists($IRC->modfolder)) {
- mkdir($IRC->modfolder);
- }
- return(false);
- }
- function fetchcmd($cmd = "", $r = "", $hook = false) {
- global $IRC;
- $r = ($r ? $r : ($cmd ? "code" : "name"));
- if($IRC->modules) {
- if($dh = opendir($IRC->modfolder)) {
- $rrr = array();
- while(($file = readdir($dh)) !== false) {
- if((!is_dir($IRC->modfolder . $file)) && (stripos($file, ($hook ? "hook" : "cmd") . ".$cmd") === 0)) {
- $a = explode(".", $file);
- if($r != "*") {
- switch(strtoupper($r)) {
- case "CODE":
- $rr = file_get_contents($IRC->modfolder . $file);
- break;
- case "NAME":
- $rr = $a[1];
- break;
- case "PRIVS":
- case "ACTIVE":
- $rr = $a[2];
- break;
- case "MAKER":
- $rr = $a[3];
- break;
- }
- }else {
- $rr = array("name" => $a[1], ($hook ? "active" : "privs") => $a[2], "code" => file_get_contents($IRC->modfolder . $file), "maker" => $a[3]);
- }
- if($cmd) {
- closedir($dh);
- return($rr);
- }else {
- $rrr[] = $rr;
- }
- }
- }
- closedir($dh);
- return($rrr);
- }else {
- output("fetchcmd failed to open modfolder! " . $IRC->modfolder);
- }
- }else {
- $q = mysql_query("SELECT $r FROM " . ($hook ? $IRC->hTableName : $IRC->cTableName) . ($cmd ? " WHERE name='$cmd'" : ""), $IRC->con);
- if(!$cmd) {
- $rr = array();
- while($row = mysql_fetch_array($q)) {
- if("*" == $r) {
- $rr[] = $row;
- }else {
- $rr[] = $row[$r];
- }
- }
- return($rr);
- }else {
- $row = mysql_fetch_array($q);
- return((("*" != $r) ? $row[$r] : $row));
- }
- }
- }
- function dumpDB($message = "", $oldcode = "", $newcode = "") {
- global $IRC;
- if(!file_exists($IRC->dbbackupfolder)) {
- mkdir($IRC->dbbackupfolder);
- }
- $basename = "db_backup";
- for($n = 1; file_exists($filename = ($IRC->dbbackupfolder . $basename . str_pad($n, 4, "0", STR_PAD_LEFT) . ".txt")); $n++);
- if(!$fh = fopen($filename, 'w')) {
- output("Failed to open database dumpfile: " . $filename . "\r\n");
- return(false);
- }
- fwrite($fh, "//Dumpfile " . $n . " created on " . date("D M jS H:i:s", time()) . "\r\n\r\n");
- fwrite($fh, "//" . $IRC->cM->sender . "; modules = " . ($IRC->modules ? "true" : "false") . ";" . ($message ? " " . $message : "") . ($oldcode ? "\r\n\r\n//Old code:\r\n" . $oldcode : "") . ($newcode ? "\r\n\r\n//New code:\r\n" . $newcode : ""));
- fwrite($fh, "\r\n\r\n//*** commands: ***");
- $cmds = fetchcmd("", "*");
- foreach($cmds as $row) {
- fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["privs"] . " - " . $row["maker"] . ":\r\n" . $row["code"]);
- }
- fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** hooks: ***");
- $cmds = fetchcmd("", "*", true);
- foreach($cmds as $row) {
- fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["active"] . ":\r\n" . $row["code"]);
- }
- fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** masters: ***");
- $q = mysql_query("SELECT * FROM " . $IRC->mTableName, $IRC->con);
- while($row = mysql_fetch_array($q)) {
- fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["privs"] . ":\r\n" . $row["pass"]);
- }
- fclose($fh);
- return(true);
- }
- function swapbound() {
- global $IRC;
- $IRC->modules = !$IRC->modules;
- startupbind();
- if($IRC->modules && $IRC->con) {
- for($n = 1; file_exists($foldername = ($IRC->modfolder . "backup" . str_pad($n, 4, "0", STR_PAD_LEFT) . "/")); $n++);
- mkdir($foldername);
- if($dh = opendir($IRC->modfolder)) {
- while(($file = readdir($dh)) !== false) {
- if(!is_dir($IRC->modfolder . $file)) {
- rename($IRC->modfolder . $file, $foldername . $file);
- }
- }
- closedir($dh);
- }
- for($i = 0; $i < 2; $i++) {
- $q = mysql_query("SELECT * FROM " . ($i ? $IRC->cTableName : $IRC->hTableName), $IRC->con);
- while($row = mysql_fetch_array($q)) {
- file_put_contents($IRC->modfolder . ($i ? "cmd." : "hook.") . strtoupper($row["name"]) . "." . ($i ? ($row["privs"] . "." . strtolower($row["maker"])) : ($row["active"])) . ".php", $row["code"]);
- }
- }
- }else {
- dumpDB("Backing up database before replacing with modules");
- mysql_query("DELETE FROM " . $IRC->cTableName);
- mysql_query("DELETE FROM " . $IRC->hTableName);
- if($dh = opendir($IRC->modfolder)) {
- while(($file = readdir($dh)) !== false) {
- if(!is_dir($IRC->modfolder . $file)) {
- $n = explode(".", $file);
- if("cmd" == strtoupper($n[0])) {
- $cmd = mysql_real_escape_string(strtoupper($n[1]));
- $privs = min(max((is_numeric($n1) ? $n[2] : 100), -1), 100);
- $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
- $maker = mysql_real_escape_string($n[3]);
- mysql_query("INSERT INTO " . $IRC->cTableName . " (name, privs, code, maker) VALUES ('$cmd', $privs, '$code', '$maker')");
- }elseif("HOOK" == strtoupper($n[0])) {
- $cmd = mysql_real_escape_string(strtoupper($n[1]));
- $active = (($n[2] == true) ? "1" : "0");
- $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
- mysql_query("INSERT INTO " . $IRC->hTableName . " (name, active, code) VALUES ('$cmd', $active, '$code')");
- }
- }
- }
- closedir($dh);
- }
- }
- }
- function fetchmaster($name = "", $r = "privs") {
- global $IRC;
- if($IRC->modules) {
- if($dh = opendir($IRC->modfolder)) {
- $rrr = array();
- while(($file = readdir($dh)) !== false) {
- if((!is_dir($IRC->modfolder . $file)) && (stripos($file, "master.$name") === 0)) {
- $a = explode(".", $file);
- if($r != "*") {
- switch(strtoupper($r)) { //master.tootoot222.100.txt
- case "PASS":
- $rr = file_get_contents($IRC->modfolder . $file);
- break;
- case "NAME":
- $rr = $a[1];
- break;
- case "PRIVS":
- $rr = $a[2];
- break;
- }
- }else {
- $rr = array("name" => $a[1], "privs" => $a[2], "code" => file_get_contents($IRC->modfolder . $file));
- }
- if($name) {
- closedir($dh);
- return($rr);
- }else {
- $rrr[] = $rr;
- }
- }
- }
- closedir($dh);
- return($rrr);
- }else {
- output("fetchmaster failed to open modfolder! " . $IRC->modfolder);
- }
- }else {
- $q = mysql_query("SELECT $r FROM " . $IRC->iTableName . ($name ? " WHERE name='$name'" : ""), $IRC->con);
- if(!$name) {
- $rr = array();
- while($row = mysql_fetch_array($q)) {
- if("*" == $r) {
- $rr[] = $row;
- }else {
- $rr[] = $row[$r];
- }
- }
- return($rr);
- }else {
- $row = mysql_fetch_array($q);
- var_dump($row);
- return((("*" != $r) ? $row[$r] : $row));
- }
- }
- }
- function activatemaster($name, $nick, $pass) {
- global $IRC;
- $row = fetchmaster($name, "*");
- var_dump($row);
- if(md5($pass) == $row["pass"]) {
- echo("good login\r\n");
- }
- /*$n = mysql_real_escape_string($name);
- $r = mysql_fetch_array(mysql_query("SELECT * FROM " . $IRC->iTableName . " WHERE name='" . $n . "'", $IRC->con));
- if($r["privs"] < 1) {
- mysql_query("DELETE FROM " . $IRC->iTableName . " WHERE name='" . mysql_real_escape_string($name) . "'", $IRC->con);
- return(false);
- }
- if(md5($pass) == $r["pass"]) {
- $IRC->masters[strtolower($nick)] = $r["privs"];
- return(true);
- }
- return(false);*/
- }
- function handleBotCommands() {
- global $IRC;
- if((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick))) {
- $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
- if(((!$IRC->locked) || ($userprivs > 49)) && ($userprivs >= 0)) {
- $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
- $r = implodefrom(" ", $a, 1);
- $reqprivs = fetchcmd($a[0], "privs");
- $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
- $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
- eval(fetchcmd($a[0]));
- if($userprivs >= 100) {
- $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
- switch(strtoupper($a[0])) {
- case "BIND":
- switch(strtoupper($a[1])) {
- case "ADD":
- if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 4))) || (!(is_numeric($a[3])))) {
- break;
- }
- $p = min(max($a[3], -1), 100);
- send("PRIVMSG " . $chan . " :Binding command " . strtoupper($a[2]) . " with " . $p . " privs");
- dumpDB("Binding command " . strtoupper($a[2]) . " with " . $p . " privs", fetchcmd(strtoupper($a[2])), $o);
- if(!$IRC->modules) {
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[2]) . "'", $IRC->con);
- mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs, maker) VALUES ('" . mysql_real_escape_string(strtoupper($a[2])) . "', '" . mysql_real_escape_string($o) . "', " . $p . ", '" . mysql_real_escape_string(strtolower($IRC->cM->nick)) . "')", $IRC->con);
- }else {
- file_put_contents($IRC->modfolder . "cmd." . strtoupper($a[2]) . ".$p." . strtolower($IRC->cM->nick) . ".php", $o);
- }
- break;
- case "DEL":
- case "DELETE":
- $co = fetchcmd($a[2]);
- dumpDB("Deleted command " . strtoupper($a[2]), $co);
- if(!$IRC->modules) {
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
- }else {
- $row = fetchcmd($a[2], "*");
- unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
- }
- send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was deleted.");
- break;
- case "REN":
- case "RENAME":
- if((sizeof($a) < 4) ) {
- break;
- }
- $b = fetchcmd($a[3]);
- dumpDB("Renaming command \"" . strtoupper($a[2]) . "\" to \"" . strtoupper($a[3]) . "\"", $b);
- if(!$IRC->modules) {
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
- mysql_query("UPDATE " . $IRC->cTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- }else {
- $row = fetchcmd($a[2], "*");
- rename($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php", $IRC->modfolder . "cmd." . strtoupper($a[3]) . "." . $row["privs"] . "." . strtolower($row["maker"]) . ".php");
- }
- send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
- break;
- case "LNK":
- case "LINK":
- if((sizeof($a) < 4) || (strtoupper($a[2]) == strtoupper($a[3]))) {
- break;
- }
- $b = fetchcmd($a[3]);
- $p = fetchcmd($a[2], "privs");
- send("PRIVMSG " . $chan . " :Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]));
- dumpDB("Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]), $b);
- if(!$IRC->modules) {
- mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
- mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs, maker) VALUES ('" . mysql_real_escape_string(strtoupper($a[3])) . "', " . mysql_real_escape_string('$reqprivs = fetchcmd("' . $a[2] . '", "privs"); eval(fetchcmd("' . $a[2] . '"));') . ", " . ($a[4] ? min(max($a[4], -1), 100) : $p[0]) . ", '" . mysql_real_escape_string(strtolower($IRC->cM->nick)) . "')", $IRC->con);
- }else {
- $row = fetchcmd($a[2], "*");
- unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
- file_put_contents($IRC->modfolder . "cmd." . strtoupper($a[3]) . ".$p." . strtolower($IRC->cM->nick) . ".php", $o);
- }
- break;
- case "APP":
- case "APPEND":
- if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
- break;
- }
- send("PRIVMSG " . $chan . " :Appending command " . strtoupper($a[2]));
- dumpDB("Appending command " . strtoupper($a[2]), $co = fetchcmd(strtoupper($a[2])), $o);
- if(!$IRC->modules) {
- mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string($co . $o) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- }else {
- $row = fetchcmd($a[2], "*");
- }
- break;
- case "PRV":
- case "PRIVS":
- if(sizeof($a) < 4) {
- break;
- }
- $p = min(max($a[3], -1), 100);
- send("PRIVMSG " . $chan . " :Changing privlages of command " . strtoupper($a[2]) . " to " . $p);
- mysql_query("UPDATE " . $IRC->cTableName . " SET privs=" . $p . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- break;
- case "UPD":
- case "UPDATE":
- if((sizeof($a) < 5) || (!($o = implodefrom(" ", $a, 4))) || (!is_numeric($a[3]))) {
- break;
- }
- $car = explode("\r\n", fetchcmd(strtoupper($a[2])));
- send("PRIVMSG " . $chan . " :Updating line " . $a[3] . " of command " . strtoupper($a[2]));
- dumpDB("Updating line " . $a[3] . " of command " . strtoupper($a[2]), $car[$a[3]], $o);
- $car[$a[3]] = $o;
- mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string(implode("\r\n", $car)) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- break;
- }
- break;
- case "HOOK":
- switch(strtoupper($a[1])) {
- case "ADD":
- if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
- break;
- }
- send("PRIVMSG " . $chan . " :Adding hook " . strtoupper($a[2]));
- mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
- mysql_query("INSERT INTO " . $IRC->hTableName . "(name, code, active) VALUES ('" . mysql_real_escape_string(strtoupper($a[2])) . "', '" . mysql_real_escape_string($o) . "', 0)", $IRC->con);
- break;
- case "DEL":
- case "DELETE":
- $co = explode(" ", implodefrom(" ", $a, 2));
- foreach($co as $del) {
- mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($del) . "'", $IRC->con);
- }
- $s = ((sizeof($co) - 1) ? "s" : "");
- send("PRIVMSG " . $chan . " :Hook" . $s . " '" . strtoupper($a[2]) . "' was deleted.");
- break;
- case "REN":
- case "RENAME":
- if((sizeof($a) < 4) ) {
- break;
- }
- if($c = fetchcmd($a[2])) {
- $b = fetchcmd($a[3]);
- mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
- }
- mysql_query("UPDATE " . $IRC->hTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- send("PRIVMSG " . $chan . " :Hook '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
- break;
- case "ACT":
- case "ACTIVATE":
- if(sizeof($a) < 3) {
- break;
- }
- switch(strtoupper($a[3])) {
- case "OFF":
- case "0":
- case "FALSE":
- $nstate = "0";
- break;
- default:
- $nstate = "1";
- }
- send("PRIVMSG " . $chan . " :" . ($nstate ? "A" : "Dea") . "ctivating hook " . strtoupper($a[2]));
- mysql_query("UPDATE " . $IRC->hTableName . " SET active=" . $nstate . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
- break;
- }
- break;
- }
- }
- }
- }
- }
- function handleChatCommands() {
- global $IRC;
- if(!$IRC->cM->nick) {
- return false;
- }
- $chr1 = chr(1);
- if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
- $a = explode(" ", $IRC->cM->mess);
- $tok = implodefrom(" ", $a, 1);
- $tok = trim(substr($tok, 0, strlen($tok) - 1));
- if($tok) {
- $tok2 = strtoupper(substr($a[0], 1));
- if($tok2 != "ACTION") {
- $tokk = ": ";
- }
- }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] . $tokk . $tok);
- }
- switch($tok2) {
- case "ACTION":
- output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
- break;
- case "PING":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . $tok . $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 " . $IRC->version . $chr1);
- break;
- case "FINGER":
- send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER I'm a bot, I don't idle" . $chr1);
- break;
- }
- return true;
- }
- if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
- output("[" . $IRC->cM->param[0] . "] <" . $IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick] . $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;
- $h = true;
- switch(strtoupper(trim($IRC->cM->cmd))) {
- case "KICK":
- unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->param[1]]);
- if(strtolower($IRC->cM->param[1]) == strtolower($IRC->cNick)) {
- $who = "You were";
- unset($IRC->channames[strtolower($IRC->cM->param[0])]);
- }else {
- $who = $IRC->cM->param[1] . " was";
- $stillalive = false;
- foreach($IRC->channames as $c) {
- if(in_array($IRC->cM->param[1], $c)) {
- $stillalive = true;
- break;
- }
- }
- if(!$stillalive) {
- unset($IRC->masters[strtolower($IRC->cM->nick)]);
- }
- }
- output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $IRC->cM->mess . "]");
- if(($IRC->cM->param[1] == $IRC->cNick) && ($IRC->kickrejoin)) {
- sleep($IRC->rejoinwait);
- send("JOIN :" . $IRC->cM->param[0]);
- }
- break;
- case "MODE":
- if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
- $o = $IRC->cM->mess;
- }else {
- $o = implodefrom(" ", $IRC->cM->param, 1);
- }
- output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
- break;
- case "NOTICE":
- output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
- break;
- case "PRIVMSG":
- $h = handleChatCommands();
- break;
- case "PART":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
- unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
- $stillalive = false;
- foreach($IRC->channames as $c) {
- if(in_array($IRC->cM->nick, $c)) {
- echo($IRC->cM->nick . " is still in $c");
- $stillalive = true;
- break;
- }
- }
- if(!$stillalive) {
- unset($IRC->masters[strtolower($IRC->cM->nick)]);
- }
- unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
- if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
- unset($IRC->channames[strtolower($IRC->cM->param[0])]);
- }
- break;
- case "JOIN":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
- $IRC->channames[strtolower($IRC->cM->mess)][$IRC->cM->nick] = " ";
- break;
- case "QUIT":
- output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
- $a = array_keys($IRC->channames);
- for($i = 0; $i < sizeof($a); $i++) {
- unset($IRC->channames[$a[$i]][$IRC->cM->nick]);
- }
- unset($IRC->masters[strtolower($IRC->cM->nick)]);
- break;
- case "NICK":
- if(strtolower($IRC->cM->nick) == 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);
- $aa = array_keys($IRC->channames);
- for($i = 0; $i < sizeof($aa); $i++) {
- $IRC->channames[$aa[$i]][$IRC->cM->mess] = $IRC->channames[$aa[$i]][$IRC->cM->nick];
- unset($IRC->channames[$aa[$i]][$IRC->cM->nick]);
- }
- $IRC->masters[strtolower($IRC->cM->mess)] = $IRC->masters[strtolower($IRC->cM->nick)];
- unset($IRC->masters[strtolower($IRC->cM->nick)]);
- 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->nick . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $IRC->pingsent));
- }
- $IRC->lastping = time();
- $IRC->pongwait = false;
- break;
- case "INVITE":
- output("-!- " . $IRC->cM->nick . " invites you to " . $IRC->cM->mess);
- break;
- default:
- $h = false;
- }
- $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
- $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
- if(!$IRC->modules && ($IRC->con)) {
- $q = mysql_query("SELECT * FROM " . $IRC->hTableName, $IRC->con);
- while($row = mysql_fetch_array($q)) {
- if($row["active"]) {
- eval($row["code"]);
- }
- }
- }
- return($h);
- }
- function handleNumberCommands() {
- global $IRC;
- switch($IRC->cM->cmd) {
- case "001":
- $IRC->server = $IRC->cM->nick;
- output($IRC->cM->mess);
- $IRC->cNick = trim(substr($IRC->cM->mess, strrpos($IRC->cM->mess, " ")));
- send("PRIVMSG NickServ :ID " . $IRC->auth);
- foreach($IRC->joinchan as $c) {
- send("JOIN " . $c);
- }
- $IRC->firstcon = false;
- break;
- case "004":
- $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
- break;
- case "005":
- $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
- if(($p = strpos(strtoupper($IRC->cM->mess), "PREFIX=")) && ($a = substr($IRC->cM->mess, $p = $p + 8, strpos($IRC->cM->mess, " ", $p) - $p))) {
- $aa = explode(")", $a);
- $IRC->powers = array(array(), array());
- for($i = 0; $i < strlen($aa[0]); $i++) {
- $IRC->powers[0][] = $aa[0][$i];
- }
- for($i = 0; $i < strlen($aa[1]); $i++) {
- $IRC->powers[1][] = $aa[1][$i];
- }
- }
- break;
- case "252":
- case "254":
- output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
- 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 "341":
- output("-!- " . $IRC->cM->param[1] . " has been invited to " . $IRC->cM->param[2]);
- break;
- case "353":
- $ndat = $IRC->cM->wline . "\n";
- while(!instr("366 " . $IRC->cNick, $ndat)) {
- if($rd = fgets($IRC->fp, 1024)) {
- $ndat .= $rd;
- }
- }
- $c = strtolower($cc = substr($ndat, $p = (strpos(strtoupper($ndat), "366 " . strtoupper($IRC->cNick)) + strlen("366 " . strtoupper($IRC->cNick))) + 1, strpos($ndat, " ", $p) - $p));
- $e = explode("\n", $ndat);
- foreach($e as $a) {
- parseMessage(trim($a), false);
- if($IRC->cM->cmd != "353") {
- break;
- }
- $tmp = explode(" ", $IRC->cM->mess);
- foreach($tmp as $t) {
- $names[] = $t;
- }
- $IRC->cM->mess = "";
- }
- sort($names);
- output("[Users " . $cc . "]", false);
- output("", false, false);
- for($i = 0; $i < sizeof($names); $i++) {
- if(in_array($names[$i][0], $IRC->powers[1])) {
- $IRC->channames[$c][substr($names[$i], 1)] = $names[$i][0];
- }else {
- $IRC->channames[$c][$names[$i]] = " ";
- }
- if(($i % 5) == 0) {
- output("", true, false);
- output("", false);
- }
- output("[" . str_pad($IRC->channames[$c][$names[$i]] . $names[$i], 17, " ", STR_PAD_RIGHT) . "] ", false, false);
- }
- output("", true, false);
- output("-!- " . $cc . ": Total of " . sizeof($names) . " nicks");
- break;
- case "421":
- output("-!- Unknown command: \"" . $IRC->cM->param[1] . "\"");
- break;
- case "442":
- output("-!- " . $IRC->cM->param[1] . " " . $IRC->cM->mess);
- break;
- case "433":
- output("-!- Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
- 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 parseMessage($buffer, $handle = true) {
- global $IRC;
- $buffer = explode("\n", $buffer);
- $IRC->cM->wline = $buffer = trim($buffer[0], "\r");
- if(!trim($buffer)) {
- return;
- }
- if($IRC->debug) {
- output($buffer);
- }
- switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
- case ":":
- $IRC->cM->sender = substr(strtok($IRC->cM->wline, " "), 1);
- $IRC->cM->cmd = strtok(" ");
- $IRC->cM->param = explode(" ", trim(strtok(" " . strtok(""), ":")));
- $IRC->cM->mess = strtok("");
- $IRC->cM->nick = strtok($IRC->cM->sender, "!");
- $IRC->cM->user = strtok("@");
- $IRC->cM->host = strtok("");
- if($handle) {
- if(is_numeric($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->nick;
- }
- output("!" . $ss . " " . $IRC->cM->mess);
- break;
- case "PING":
- if($IRC->pingpong) {
- output($buffer);
- }
- $IRC->cM->wline[1] = "O";
- send($IRC->cM->wline, $IRC->pingpong);
- break;
- case "ERROR":
- output($IRC->cM->wline);
- break;
- default:
- output("Unknown message: " . $IRC->cM->wline);
- break;
- }
- }
- function loop() {
- global $IRC;
- if((($IRC->pongwait) && ((time() - $IRC->lastping) > 240)) || (((!$IRC->connected) || (feof($IRC->fp)) && (!($IRC->quit))))) {
- if($IRC->connected) {
- $IRC->channames = array(array(), array());
- if(!feof($IRC->fp)) {
- send("QUIT :Lost connection");
- }
- fclose($IRC->fp);
- }
- $IRC->connected = false;
- output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
- if($IRC->fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
- output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
- stream_set_timeout($IRC->fp, 0, 1);
- $IRC->firstcon = true;
- $IRC->connected = true;
- $IRC->pongwait = false;
- $IRC->lastping = time();
- send("USER " . $IRC->username . " * * :" . $IRC->realname);
- send("NICK " . $IRC->joinnick);
- }else {
- sleep(30);
- return;
- }
- }
- if((!$IRC->pongwait) && (time() - $IRC->lastping) > 30) {
- $IRC->pongwait = true;
- $IRC->pingsent = microtime(true);
- send("PING :" . $IRC->server, $IRC->pingpong);
- }
- if($rawdata = fgets($IRC->fp, 1024)) {
- parseMessage($rawdata);
- }
- if($rawdata1 = fgets(STDIN, 1024)) {
- output("<- " . $rawdata1, false);
- $IRC->cM->sender = "root";
- eval($rawdata1);
- }
- return($rawdata);
- }
- $IRC->connected = false;
- $IRC->lastping = time();
- $IRC->pongwait = false;
- $IRC->pingsent = microtime(true);
- stream_set_blocking(STDIN, 0);
- if($IRC->logging) {
- $IRC->logfile = fopen($IRC->logfile, "a");
- fwrite($IRC->logfile, "\r\n*** Log opened on " . date("D M jS H:i:s", time()) . " ***\r\n\r\n");
- }
- startupbind();
- while(!$IRC->quit) {
- usleep(10000);
- loop();
- }
- if(!feof($IRC->fp)) {
- send("QUIT :I couldn't think of a whitty quit message");
- }
- fclose($IRC->fp);
- if($IRC->logging) {
- fclose($IRC->logfile);
- }
- if($IRC->con) {
- mysql_close($IRC->con);
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement