Advertisement
Guest User

Untitled

a guest
May 2nd, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 33.55 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. TODO:
  5. !hook is not module-compliant, also there is 1-2 more actions in !bind that need module help
  6. ^rewriting !bind and !hook to work together with the comon code
  7. add mode detection (parsed from the 005 numeric's CHANMODES setting) so we can see when someone gets +o etc
  8. 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...
  9. add "timer" hooks to loop()
  10. there is a PHP internal function that has the same functionallity as implodefrom(), find it and use it in place of implodefrom()
  11. */
  12.  
  13. class aMessage {
  14. var $nick, $user, $host, $sender, $cmd, $param, $mess, $wline;
  15. }
  16.  
  17. class aIRC {
  18. var $cM;
  19. var $lastping, $pongwait, $pingsent, $pingpong, $modules, $logging, $modfolder, $dbbackupfolder;
  20. var $host, $fp, $port, $logfile, $con, $server, $cmdChar, $sver;
  21. var $cNick, $joinnick, $username, $realname, $joinchan, $auth, $authnick, $masters, $banned;
  22. var $channames, $powers;
  23. var $debug, $firstcon, $locked, $quit, $version, $kickrejoin, $rejoinwait, $invitejoin;
  24. var $cTableName, $iTableName, $MySQLServer, $MySQLDatabase, $MySQLAccountName, $MySQLAccountpassword;
  25. }
  26.  
  27. $IRC = new aIRC;
  28. $IRC->cM = new aMessage;
  29. $IRC->cM->param = array();
  30. $IRC->host = "irc.rizon.net";
  31. $IRC->port = 6667;
  32. $IRC->joinchan = array("#Tootoot222", "#mixster", "#SRL-School", "#SRL");
  33. $IRC->joinnick = "Furry";
  34. $IRC->username = "Furry";
  35. $IRC->realname = "Furry";
  36. $IRC->authnick = "Tootoot222";
  37. $IRC->cNick = $IRC->joinnick;
  38. $IRC->auth = "";
  39. $IRC->server = "";
  40. $IRC->cmdChar = "!";
  41. $IRC->rejoinwait = 5;
  42. $IRC->kickrejoin = true;
  43. $IRC->invitejoin = false;
  44. $IRC->locked = false;
  45. $IRC->logging = true;
  46. $IRC->modules = true;
  47. $IRC->debug = false;
  48. $IRC->pingpong = false;
  49. $IRC->channames = array();
  50. $IRC->powers = array(array(), array());
  51. $IRC->sver = "4.1";
  52. $IRC->version = "Version " . $IRC->sver;
  53. $IRC->logfile = "logfile_v" . $IRC->sver . ".txt";
  54. $IRC->modfolder = "./modules_v" . $IRC->sver . "/";
  55. $IRC->dbbackupfolder = "./db_backup_v" . $IRC->sver . "/";
  56.  
  57. set_time_limit(0); //to ensure the script doesn't time out
  58.  
  59. date_default_timezone_set("America/Chicago"); //change this to your timezone
  60.  
  61. $firstmaster = "Tootoot222";
  62. $firstpass = "wat";
  63. $IRC->masters = array(strtolower($firstmaster) => 100);
  64.  
  65. $IRC->MySQLServer = "localhost";
  66. $IRC->MySQLDatabase = "ircbotv4";
  67. $IRC->MySQLAccountName = "root";
  68. $IRC->MySQLAccountpassword = "";
  69. $IRC->iTableName = "imasters3";
  70. $IRC->cTableName = "cmd4";
  71. $IRC->hTableName = "hooks2";
  72.  
  73. function output($message, $newline = true, $timestamp = true) {
  74. global $IRC;
  75. foreach(explode("\r\n", $message) as $m) {
  76. $out = ($timestamp ? "[" . date("H:i:s") . "] " : "") . $m . ($newline ? "\r\n" : "");
  77. echo($out);
  78. if($IRC->logging) {
  79. fwrite($IRC->logfile, $out);
  80. }
  81. }
  82. }
  83.  
  84. function send($data, $out = true) {
  85. global $IRC;
  86. $a = explode("\n", $data);
  87. foreach($a as $aa) {
  88. fputs($IRC->fp, $aa . "\n");
  89. if($out) {
  90. output("-> " . $aa);
  91. }
  92. }
  93. }
  94.  
  95. function sendcmd($cmd, $param = false, $mess = false) {
  96. send($cmd . ($param !== false ? (" " . (is_array($param) ? implode(" ", $param) : $param)) : "") . ((($param !== false) && ($mess !== false)) ? (" :" . $mess) : ""));
  97. }
  98.  
  99. function implodefrom($glue, $pieces, $from = 0) {
  100. $r = "";
  101. if(is_array($pieces)) {
  102. $from = max(0, $from);
  103. $r = $pieces[$from];
  104. for($i = ($from + 1); $i < sizeof($pieces); $i++) {
  105. $r .= $glue . $pieces[$i];
  106. }
  107. }
  108. return($r);
  109. }
  110.  
  111. function startsWith($haystack, $needle) {
  112. if(is_array($needle)) {
  113. foreach($needle as $n) {
  114. if(strpos($haystack, $n) === 0) {
  115. return($n);
  116. }
  117. }
  118. }
  119. return(strpos($haystack, $needle) === 0);
  120. }
  121.  
  122. function instr($needle, $haystack, $sensitive = false) {
  123. if($sensitive) {
  124. return((false !== strpos($haystack, $needle)) ? true : false);
  125. }else {
  126. return((false !== stristr($haystack, $needle)) ? true : false);
  127. }
  128. }
  129.  
  130. function table_exists($tablename) {
  131. global $IRC;
  132. 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);
  133. }
  134.  
  135. function startupbind() {
  136. global $IRC;
  137. if(!$IRC->modules && (!$IRC->con)) {
  138. if(!($IRC->con = mysql_connect($IRC->MySQLServer, $IRC->MySQLAccountName, $IRC->MySQLAccountpassword))) {
  139. output("MySQL error in startupMySQL: " . mysql_error());
  140. output("Error! Failed to connect to MySQL; will not be using databases; will be using modules instead (experemental)! (continuing in 10 seconds)");
  141. $IRC->modules = true;
  142. sleep(10);
  143. }else {
  144. mysql_query("CREATE DATABASE IF NOT EXISTS " . $IRC->MySQLDatabase, $IRC->con);
  145. mysql_select_db($IRC->MySQLDatabase, $IRC->con);
  146. if(!table_exists($IRC->cTableName)) {
  147. mysql_query("CREATE TABLE " . $IRC->cTableName . "(name VARCHAR(30), code MEDIUMTEXT, privs INT, maker VARCHAR(30))", $IRC->con);
  148. }
  149. if(!table_exists($IRC->iTableName)) {
  150. global $firstmaster, $firstpass;
  151. mysql_query("CREATE TABLE " . $IRC->iTableName . "(name VARCHAR(30), pass VARCHAR(32), privs INT)", $IRC->con);
  152. mysql_query("INSERT INTO " . $IRC->iTableName . "(name, pass, privs) VALUES ('$firstmaster', '" . md5($firstpass) . "', 100)", $IRC->con);
  153. }
  154. if(!table_exists($IRC->hTableName)) {
  155. mysql_query("CREATE TABLE " . $IRC->hTableName . "(name VARCHAR(30), code MEDIUMTEXT, active BOOL)", $IRC->con);
  156. }
  157. return(true);
  158. }
  159. }
  160. if(!file_exists($IRC->modfolder)) {
  161. mkdir($IRC->modfolder);
  162. }
  163. return(false);
  164. }
  165.  
  166. function fetch($name = "", $r = "", $cmd = true, $hook = false) {
  167. global $IRC;
  168. $r = ($r ? $r : ($name ? ($cmd ? "code" : "pass") : "*"));
  169. if($IRC->modules) {
  170. if($dh = opendir($IRC->modfolder)) {
  171. while(($file = readdir($dh)) !== false) {
  172. if((!is_dir($IRC->modfolder . $file)) && (stripos($file, ($cmd ? ($hook ? "hook" : "cmd") : "master") . ".$name") === 0)) {
  173. $a = explode(".", $file);
  174. if($r != "*") {
  175. switch(strtoupper($r)) {
  176. case "CODE":
  177. case "PASS":
  178. $rr = file_get_contents($IRC->modfolder . $file);
  179. break;
  180. case "NAME":
  181. $rr = $a[1];
  182. break;
  183. case "PRIVS":
  184. case "ACTIVE":
  185. $rr = $a[2];
  186. break;
  187. case "MAKER":
  188. $rr = $a[3];
  189. break;
  190. }
  191. }else {
  192. $rr = array("name" => $a[1], ($hook ? "active" : "privs") => $a[2], ($cmd ? "code" : "pass") => file_get_contents($IRC->modfolder . $file));
  193. if($cmd && (!$hook)) {
  194. $rr["maker"] = $a[3];
  195. }
  196. }
  197. if($name) {
  198. closedir($dh);
  199. return($rr);
  200. }else {
  201. $rrr[] = $rr;
  202. }
  203. }
  204. }
  205. closedir($dh);
  206. return($rrr);
  207. }else {
  208. output("fetch failed to open modfolder! " . $IRC->modfolder);
  209. return(false);
  210. }
  211. }else {
  212. $q = mysql_query("SELECT " . mysql_real_escape_string($r) . " FROM " . ($cmd ? ($hook ? $IRC->hTableName : $IRC->cTableName) : $IRC->iTableName) . ($name ? " WHERE name='" . mysql_real_escape_string($name) . "'" : ""), $IRC->con);
  213. if(!$name) {
  214. $rr = array();
  215. while($row = mysql_fetch_array($q)) {
  216. if("*" == $r) {
  217. $rr[] = $row;
  218. }else {
  219. $rr[] = $row[$r];
  220. }
  221. }
  222. return($rr);
  223. }else {
  224. $row = mysql_fetch_array($q);
  225. return((("*" != $r) ? $row[$r] : $row));
  226. }
  227. }
  228. }
  229.  
  230. function dumpDB($message = "", $oldcode = "", $newcode = "") {
  231. global $IRC;
  232. if(!file_exists($IRC->dbbackupfolder)) {
  233. mkdir($IRC->dbbackupfolder);
  234. }
  235. $basename = "db_backup";
  236. for($n = 1; file_exists($filename = ($IRC->dbbackupfolder . $basename . str_pad($n, 4, "0", STR_PAD_LEFT) . ".txt")); $n++);
  237. if(!$fh = fopen($filename, 'w')) {
  238. output("Failed to open database dumpfile: " . $filename . "\r\n");
  239. return(false);
  240. }
  241. fwrite($fh, "//Dumpfile " . $n . " created on " . date("D M jS H:i:s", time()) . "\r\n\r\n");
  242. 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 : ""));
  243. fwrite($fh, "\r\n\r\n//*** commands: ***");
  244. $cmds = fetch();
  245. foreach($cmds as $row) {
  246. fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["privs"] . " - " . $row["maker"] . ":\r\n" . $row["code"]);
  247. }
  248. fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** hooks: ***");
  249. $hooks = fetch("", "*", true, true);
  250. foreach($hooks as $row) {
  251. fwrite($fh, "\r\n\r\n\r\n//" . strtoupper($row["name"]) . " - " . $row["active"] . ":\r\n" . $row["code"]);
  252. }
  253. fwrite($fh, "\r\n\r\n\r\n\r\n\r\n//*** masters: ***");
  254. $masters = fetch("", "*", false);
  255. foreach($masters as $row) {
  256. fwrite($fh, "\r\n\r\n\r\n//" . strtolower($row["name"]) . " - " . $row["privs"] . ":\r\n" . $row["pass"]);
  257. }
  258. fclose($fh);
  259. return(true);
  260. }
  261.  
  262. function cmd_del($name, $cmd = false) {
  263. global $IRC;
  264. dumpDB("Deleting " . ($cmd ? "command" : "hook") . " " . strtoupper($name));
  265. if(!$IRC->modules) {
  266. mysql_query("DELETE FROM " . ($cmd ? $IRC->cTableName : $IRC->hTableName) . " WHERE name='" . mysql_real_escape_string($name) . "'", $IRC->con);
  267. }else {
  268. while($row = fetch($name, "*", true, !$cmd)) {
  269. unlink($IRC->modfolder . ($cmd ? "cmd" : "hook") . "." . $row["name"] . "." . $row[($cmd ? "privs" : "active")] . ($cmd ? ("." . $row["maker"]) : "") . ".php");
  270. }
  271. }
  272. }
  273.  
  274. function cmd_add($code, $name, $privs, $maker = "", $cmd = false) { //cmd.LIST.0.Tootoot222.php hook.LIST.0.php
  275. global $IRC;
  276. $privs = (is_numeric($privs) ? (min(max($privs, -1), 100)) : 0);
  277. cmd_del($name, $cmd);
  278. dumpDB("Adding " . ($cmd ? "command" : "hook") . " " . strtoupper($name), "", $code);
  279. if(!$IRC->modules) {
  280. mysql_query("INSERT INTO " . ($cmd ? $IRC->cTableName : $IRC->hTableName) . mysql_real_escape_string("(name, code, " . ($cmd ? "privs" : "active") . ($cmd ? ", maker" : "") . ") VALUES ('" . strtoupper($name) . "', '$code', $privs" . ($cmd ? (", '" . strtolower($IRC->cM->nick) . "'") : "") . "')"), $IRC->con);
  281. }else {
  282. file_put_contents($IRC->modfolder . ($cmd ? "cmd" : "hook") . "." . strtoupper($name) . ".$privs" . ($cmd ? ("." . strtolower($maker)) : "") . ".php", $code);
  283. }
  284. }
  285.  
  286. function cmd_mod($name, $newval, $prop = "name", $cmd = false) {
  287. global $IRC;
  288. $row = fetch($name, "*", true, !$cmd);
  289. cmd_del($name, $cmd);
  290. $row[$prop] = $newval;
  291. cmd_add($row["code"], $row["name"], $row[($cmd ? "privs" : "active")], $row["maker"], $cmd);
  292. }
  293.  
  294. function swapbound() {
  295. global $IRC;
  296. $IRC->modules = !$IRC->modules;
  297. startupbind();
  298. if($IRC->modules && $IRC->con) {
  299. for($n = 1; file_exists($foldername = ($IRC->modfolder . "backup" . str_pad($n, 4, "0", STR_PAD_LEFT) . "/")); $n++);
  300. mkdir($foldername);
  301. if($dh = opendir($IRC->modfolder)) {
  302. while(($file = readdir($dh)) !== false) {
  303. if(!is_dir($IRC->modfolder . $file)) {
  304. rename($IRC->modfolder . $file, $foldername . $file);
  305. }
  306. }
  307. closedir($dh);
  308. }
  309. for($i = 0; $i < 3; $i++) {
  310. $q = mysql_query("SELECT * FROM " . ($i ? (($i == 2) ? $IRC->iTableName : $IRC->cTableName) : $IRC->hTableName), $IRC->con);
  311. while($row = mysql_fetch_array($q)) {
  312. file_put_contents($IRC->modfolder . ($i ? (($i == 2) ? "master." : "cmd.") : "hook.") . (($i == 2) ? strtolower($row["name"]) : strtoupper($row["name"])) . "." . ($i ? ($row["privs"] . (($i != 2) ? ("." . strtolower($row["maker"])) : "")) : ($row["active"])) . ".php", (($i == 2) ? $row["pass"] : $row["code"]));
  313. }
  314. }
  315. }else {
  316. dumpDB("Backing up database before replacing with modules");
  317. mysql_query("DELETE FROM " . $IRC->hTableName);
  318. mysql_query("DELETE FROM " . $IRC->iTableName);
  319. mysql_query("DELETE FROM " . $IRC->cTableName);
  320. if($dh = opendir($IRC->modfolder)) {
  321. while(($file = readdir($dh)) !== false) {
  322. $n = explode(".", $file);
  323. if(is_dir($IRC->modfolder . $file) && (!is_numeric($n[2]))) {
  324. continue;
  325. }
  326. if("cmd" == strtolower($n[0])) {
  327. $cmd = mysql_real_escape_string(strtoupper($n[1]));
  328. $privs = min(max($n[2], -1), 100);
  329. $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
  330. $maker = mysql_real_escape_string($n[3]);
  331. mysql_query("INSERT INTO " . $IRC->cTableName . " (name, privs, code, maker) VALUES ('$cmd', $privs, '$code', '$maker')");
  332. }elseif("hook" == strtolower($n[0])) {
  333. $cmd = mysql_real_escape_string(strtoupper($n[1]));
  334. $active = (($n[2] == true) ? "1" : "0");
  335. $code = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
  336. mysql_query("INSERT INTO " . $IRC->hTableName . " (name, active, code) VALUES ('$cmd', $active, '$code')");
  337. }elseif("master" == strtolower($n[0])) {
  338. $name = mysql_real_escape_string(strtolower($n[1]));
  339. $privs = min(max($n[2], -1), 100);
  340. $pass = mysql_real_escape_string(file_get_contents($IRC->modfolder . $file));
  341. mysql_query("INSERT INTO " . $IRC->iTableName . " (name, privs, pass) VALUES ('$name', $privs, '$pass')");
  342. }
  343. }
  344. closedir($dh);
  345. }
  346. }
  347. }
  348.  
  349. function activatemaster($name, $nick, $pass) {
  350. global $IRC;
  351. $row = fetch($name, "*", false);
  352. if(md5($pass) == $row["pass"]) {
  353. $IRC->masters[strtolower($nick)] = $row["privs"];
  354. return(true);
  355. }
  356. return(false);
  357. }
  358.  
  359. function handleBotCommands() {
  360. global $IRC;
  361. if(!((startsWith($IRC->cM->mess, $IRC->cmdChar)) && (strlen($IRC->cM->mess) > strlen($IRC->cmdChar)) && (strtolower($IRC->cM->nick) != strtolower($IRC->cNick)))) {
  362. return;
  363. }
  364. $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
  365. if((($IRC->locked) && ($userprivs < 50)) || ($userprivs < 0)) {
  366. return;
  367. }
  368. $a = explode(" ", substr($IRC->cM->mess, strlen($IRC->cmdChar)));
  369. $r = implodefrom(" ", $a, 1);
  370. $reqprivs = fetch($a[0], "privs");
  371. $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
  372. $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
  373. eval(fetch($a[0]));
  374. if($userprivs < 100) {
  375. return;
  376. }
  377. $cmd = (("BIND" == strtoupper($a[0])) ? true : ((strtoupper($a[0]) == "HOOK") ? false : ($d = true)));
  378. if($d) {
  379. return;
  380. }
  381. switch(strtoupper($a[1])) {
  382. case "ADD":
  383. if((sizeof($a) < ($s = ($cmd ? 4 : 3))) || (!($o = implodefrom(" ", $a, $s)))) {
  384. break;
  385. }
  386. $p = ($cmd ? min(max((is_numeric($a[3]) ? $a[3] : 0), -1), 100) : 0);
  387. send("PRIVMSG " . $chan . " :Binding " . ($cmd ? "command" : "hook") . " " . strtoupper($a[2]) . "; $p");
  388. cmd_add($o, $a[2], $p, $IRC->cM->nick, $cmd);
  389. break;
  390. case "DEL":
  391. case "DELETE":
  392. $co = fetch($a[2]);
  393. send("PRIVMSG " . $chan . " :Deleting " . ($cmd ? "command" : "hook") . " " . strtoupper($a[2]));
  394. cmd_del($a[2], $cmd);
  395. break;
  396. }
  397. }
  398. /*case "DEL":
  399. case "DELETE":
  400. $co = fetch($a[2]);
  401. dumpDB("Deleted command " . strtoupper($a[2]), $co);
  402. if(!$IRC->modules) {
  403. mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  404. }else {
  405. $row = fetch($a[2], "*");
  406. unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
  407. }
  408. send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was deleted.");
  409. break;
  410. case "REN":
  411. case "RENAME":
  412. if((sizeof($a) < 4)) {
  413. break;
  414. }
  415. $b = fetch($a[3]);
  416. dumpDB("Renaming command \"" . strtoupper($a[2]) . "\" to \"" . strtoupper($a[3]) . "\"", $b);
  417. if(!$IRC->modules) {
  418. mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  419. mysql_query("UPDATE " . $IRC->cTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  420. }else {
  421. $row = fetch($a[2], "*");
  422. rename($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php", $IRC->modfolder . "cmd." . strtoupper($a[3]) . "." . $row["privs"] . "." . strtolower($row["maker"]) . ".php");
  423. }
  424. send("PRIVMSG " . $chan . " :Command '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
  425. break;
  426. case "LNK":
  427. case "LINK":
  428. if((sizeof($a) < 4) || (strtoupper($a[2]) == strtoupper($a[3])) || (strtoupper($a[0]) == "HOOK")) {
  429. break;
  430. }
  431. $b = fetch($a[3]);
  432. $p = fetch($a[2], "privs");
  433. send("PRIVMSG " . $chan . " :Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]));
  434. dumpDB("Linking command " . strtoupper($a[2]) . " to " . strtoupper($a[3]), $b);
  435. if(!$IRC->modules) {
  436. mysql_query("DELETE FROM " . $IRC->cTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  437. mysql_query("INSERT INTO " . $IRC->cTableName . "(name, code, privs, maker) VALUES ('" . mysql_real_escape_string(strtoupper($a[3])) . "', " . mysql_real_escape_string('$reqprivs = fetch("' . $a[2] . '", "privs"); eval(fetch("' . $a[2] . '"));') . ", " . ($a[4] ? min(max($a[4], -1), 100) : $p[0]) . ", '" . mysql_real_escape_string(strtolower($IRC->cM->nick)) . "')", $IRC->con);
  438. }else {
  439. $row = fetch($a[2], "*");
  440. unlink($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php");
  441. file_put_contents($IRC->modfolder . "cmd." . strtoupper($a[3]) . ".$p." . strtolower($IRC->cM->nick) . ".php", $o);
  442. }
  443. break;
  444. case "APP":
  445. case "APPEND":
  446. if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
  447. break;
  448. }
  449. send("PRIVMSG " . $chan . " :Appending command " . strtoupper($a[2]));
  450. dumpDB("Appending command " . strtoupper($a[2]), $co = fetch($a[2]), $o);
  451. if(!$IRC->modules) {
  452. mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string($co . $o) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  453. }else {
  454. $row = fetch($a[2], "*");
  455. file_put_contents($IRC->modfolder . "cmd." . mysql_real_escape_string($row["name"]) . "." . $row["privs"] . "." . mysql_real_escape_string($row["maker"]) . ".php", $co . $o);
  456. }
  457. break;
  458. case "PRV":
  459. case "PRIVS":
  460. case "ACT":
  461. case "ACTIVATE":
  462. if(sizeof($a) < 4) {
  463. break;
  464. }
  465. $p = min(max($a[3], -1), 100);
  466. send("PRIVMSG " . $chan . " :Changing privlages of command " . strtoupper($a[2]) . " to " . $p);
  467. if(!$IRC->modules) {
  468. mysql_query("UPDATE " . $IRC->cTableName . " SET privs=" . $p . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  469. }else {
  470. $row = fetch($a[2], "*");
  471. rename($IRC->modfolder . "cmd." . $row["name"] . "." . $row["privs"] . "." . $row["maker"] . ".php", $IRC->modfolder . "cmd." . strtoupper($row["name"]) . ".$p." . strtolower($row["maker"]) . ".php");
  472. }
  473. break;
  474. case "UPD":
  475. case "UPDATE":
  476. if((sizeof($a) < 5) || (!($o = implodefrom(" ", $a, 4))) || (!is_numeric($a[3]))) {
  477. break;
  478. }
  479. $car = explode("\r\n", fetch($a[2]));
  480. send("PRIVMSG " . $chan . " :Updating line " . $a[3] . " of command " . strtoupper($a[2]));
  481. dumpDB("Updating line " . $a[3] . " of command " . strtoupper($a[2]), $car[$a[3]], $o);
  482. $car[$a[3]] = $o;
  483. mysql_query("UPDATE " . $IRC->cTableName . " SET code='" . mysql_real_escape_string(implode("\r\n", $car)) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  484. break;
  485. }
  486. break;
  487. case "HOOK":
  488. switch(strtoupper($a[1])) {
  489. case "ADD":
  490. if((sizeof($a) < 4) || (!($o = implodefrom(" ", $a, 3)))) {
  491. break;
  492. }
  493. send("PRIVMSG " . $chan . " :Adding hook " . strtoupper($a[2]));
  494. mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . $a[2] . "'", $IRC->con);
  495. 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);
  496. break;
  497. case "DEL":
  498. case "DELETE":
  499. $co = explode(" ", implodefrom(" ", $a, 2));
  500. foreach($co as $del) {
  501. mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($del) . "'", $IRC->con);
  502. }
  503. $s = ((sizeof($co) - 1) ? "s" : "");
  504. send("PRIVMSG " . $chan . " :Hook" . $s . " '" . strtoupper($a[2]) . "' was deleted.");
  505. break;
  506. case "REN":
  507. case "RENAME":
  508. if((sizeof($a) < 4) ) {
  509. break;
  510. }
  511. if($c = fetch($a[2])) {
  512. $b = fetch($a[3]);
  513. mysql_query("DELETE FROM " . $IRC->hTableName . " WHERE name='" . mysql_real_escape_string($a[3]) . "'", $IRC->con);
  514. }
  515. mysql_query("UPDATE " . $IRC->hTableName . " SET name='" . mysql_real_escape_string(strtoupper($a[3])) . "' WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  516. send("PRIVMSG " . $chan . " :Hook '" . strtoupper($a[2]) . "' was renamed to '" . strtoupper($a[3]) . "'.");
  517. break;
  518. case "ACT":
  519. case "ACTIVATE":
  520. if(sizeof($a) < 3) {
  521. break;
  522. }
  523. switch(strtoupper($a[3])) {
  524. case "OFF":
  525. case "0":
  526. case "FALSE":
  527. $nstate = "0";
  528. break;
  529. default:
  530. $nstate = "1";
  531. }
  532. send("PRIVMSG " . $chan . " :" . ($nstate ? "A" : "Dea") . "ctivating hook " . strtoupper($a[2]));
  533. mysql_query("UPDATE " . $IRC->hTableName . " SET active=" . $nstate . " WHERE name='" . mysql_real_escape_string($a[2]) . "'");
  534. break;
  535. }
  536. }*/
  537.  
  538. function handleChatCommands() {
  539. global $IRC;
  540. if(!$IRC->cM->nick) {
  541. return false;
  542. }
  543. $chr1 = chr(1);
  544. if((startsWith($IRC->cM->mess[0], $chr1)) && ($IRC->cM->mess[strlen($IRC->cM->mess) - 1] == $chr1)) {
  545. $a = explode(" ", $IRC->cM->mess);
  546. $tok = implodefrom(" ", $a, 1);
  547. $tok = trim(substr($tok, 0, strlen($tok) - 1));
  548. if($tok) {
  549. $tok2 = strtoupper(substr($a[0], 1));
  550. if($tok2 != "ACTION") {
  551. $tokk = ": ";
  552. }
  553. }else {
  554. $tok2 = strtoupper(substr($a[0], 1, strlen($tok2) - 1));
  555. }
  556. if($tok2 != "ACTION") {
  557. output($IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] requested CTCP " . $tok2 . " from " . $IRC->cM->param[0] . $tokk . $tok);
  558. }
  559. switch($tok2) {
  560. case "ACTION":
  561. output("[" . $IRC->cM->param[0] . "] * " . $IRC->cM->nick . " " . $tok);
  562. break;
  563. case "PING":
  564. send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "PING " . $tok . $chr1);
  565. break;
  566. case "TIME":
  567. send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "TIME " . date("D M jS H:i:s") . $chr1);
  568. break;
  569. case "VERSION":
  570. send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "VERSION Toot PHP Bot " . $IRC->version . $chr1);
  571. break;
  572. case "FINGER":
  573. send("NOTICE " . $IRC->cM->nick . " :" . $chr1 . "FINGER I'm a bot, I don't idle" . $chr1);
  574. break;
  575. }
  576. return true;
  577. }
  578. if(strtolower($IRC->cM->param[0]) != strtolower($IRC->cNick)) {
  579. output("[" . $IRC->cM->param[0] . "] <" . $IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick] . $IRC->cM->nick . "> " . $IRC->cM->mess);
  580. }else {
  581. output("-*" . $IRC->cM->nick . "*- " . $IRC->cM->mess);
  582. }
  583. if(startsWith($IRC->cM->mess, $IRC->cmdChar)) {
  584. handleBotCommands();
  585. }
  586. return true;
  587. }
  588.  
  589. function handleNormalCommands() {
  590. global $IRC;
  591. $h = true;
  592. switch(strtoupper(trim($IRC->cM->cmd))) {
  593. case "KICK":
  594. unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->param[1]]);
  595. if(strtolower($IRC->cM->param[1]) == strtolower($IRC->cNick)) {
  596. $who = "You were";
  597. unset($IRC->channames[strtolower($IRC->cM->param[0])]);
  598. }else {
  599. $who = $IRC->cM->param[1] . " was";
  600. $stillalive = false;
  601. foreach($IRC->channames as $c) {
  602. if(in_array($IRC->cM->param[1], $c)) {
  603. $stillalive = true;
  604. break;
  605. }
  606. }
  607. if(!$stillalive) {
  608. unset($IRC->masters[strtolower($IRC->cM->nick)]);
  609. }
  610. }
  611. output("-!- " . $who . " kicked from " . $IRC->cM->param[0] . " by " . $IRC->cM->nick . " [" . $IRC->cM->mess . "]");
  612. if(($IRC->cM->param[1] == $IRC->cNick) && ($IRC->kickrejoin)) {
  613. sleep($IRC->rejoinwait);
  614. send("JOIN :" . $IRC->cM->param[0]);
  615. }
  616. break;
  617. case "MODE":
  618. if(strtolower($IRC->cNick) == strtolower($IRC->cM->param[0])) {
  619. $o = $IRC->cM->mess;
  620. }else {
  621. $o = implodefrom(" ", $IRC->cM->param, 1);
  622. }
  623. output("-!- mode/" . $IRC->cM->param[0] . " [" . $o . "] by " . $IRC->cM->nick);
  624. break;
  625. case "NOTICE":
  626. output("-" . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "]- " . $IRC->cM->mess);
  627. break;
  628. case "PRIVMSG":
  629. $h = handleChatCommands();
  630. break;
  631. case "PART":
  632. output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has left " . $IRC->cM->param[0] . " [" . $IRC->cM->mess . "]");
  633. unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
  634. $stillalive = false;
  635. foreach($IRC->channames as $c) {
  636. if(in_array($IRC->cM->nick, $c)) {
  637. echo($IRC->cM->nick . " is still in $c");
  638. $stillalive = true;
  639. break;
  640. }
  641. }
  642. if(!$stillalive) {
  643. unset($IRC->masters[strtolower($IRC->cM->nick)]);
  644. }
  645. unset($IRC->channames[strtolower($IRC->cM->param[0])][$IRC->cM->nick]);
  646. if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  647. unset($IRC->channames[strtolower($IRC->cM->param[0])]);
  648. }
  649. break;
  650. case "JOIN":
  651. output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has joined " . $IRC->cM->mess);
  652. $IRC->channames[strtolower($IRC->cM->mess)][$IRC->cM->nick] = " ";
  653. break;
  654. case "QUIT":
  655. output("-!- " . $IRC->cM->nick . " [" . $IRC->cM->user . "@" . $IRC->cM->host . "] has quit [" . $IRC->cM->mess . "]");
  656. $a = array_keys($IRC->channames);
  657. for($i = 0; $i < sizeof($a); $i++) {
  658. unset($IRC->channames[$a[$i]][$IRC->cM->nick]);
  659. }
  660. unset($IRC->masters[strtolower($IRC->cM->nick)]);
  661. break;
  662. case "NICK":
  663. if(strtolower($IRC->cM->nick) == strtolower($IRC->cNick)) {
  664. $who = "You are";
  665. $IRC->cNick = $IRC->cM->mess;
  666. }else {
  667. $who = $IRC->cM->nick . " is";
  668. }
  669. output("-!- " . $who . " now known as " . $IRC->cM->mess);
  670. $aa = array_keys($IRC->channames);
  671. for($i = 0; $i < sizeof($aa); $i++) {
  672. $IRC->channames[$aa[$i]][$IRC->cM->mess] = $IRC->channames[$aa[$i]][$IRC->cM->nick];
  673. unset($IRC->channames[$aa[$i]][$IRC->cM->nick]);
  674. }
  675. if(in_array(strtolower($IRC->cM->mess), array_keys($IRC->masters))) {
  676. $IRC->masters[strtolower($IRC->cM->mess)] = $IRC->masters[strtolower($IRC->cM->nick)];
  677. }
  678. unset($IRC->masters[strtolower($IRC->cM->nick)]);
  679. break;
  680. case "TOPIC":
  681. output("-!- " . $IRC->cM->nick . " changed the topic of " . $IRC->cM->param[0] . " to: " . $IRC->cM->mess);
  682. break;
  683. case "PONG":
  684. if($IRC->pingpong) {
  685. output("-!- Server PONG reply from " . $IRC->cM->nick . ": " . $IRC->cM->param[0] . "; Time since PING request sent: " . (microtime(true) - $IRC->pingsent));
  686. }
  687. $IRC->lastping = time();
  688. $IRC->pongwait = false;
  689. break;
  690. case "INVITE":
  691. output("-!- " . $IRC->cM->nick . " invites you to " . $IRC->cM->mess);
  692. break;
  693. default:
  694. $h = false;
  695. }
  696. $ispm = (strtolower($IRC->cM->param[0]) == strtolower($IRC->cNick));
  697. $userprivs = $IRC->masters[strtolower($IRC->cM->nick)];
  698. $chan = ($ispm ? $IRC->cM->nick : $IRC->cM->param[0]);
  699. $cmds = fetch("", "*", true, true);
  700. foreach($cmds as $row) {
  701. if($row["active"]) {
  702. eval($row["code"]);
  703. }
  704. }
  705. return($h);
  706. }
  707.  
  708. function handleNumberCommands() {
  709. global $IRC;
  710. switch($IRC->cM->cmd) {
  711. case "001":
  712. $IRC->server = $IRC->cM->nick;
  713. output($IRC->cM->mess);
  714. $IRC->cNick = trim(substr($IRC->cM->mess, strrpos($IRC->cM->mess, " ")));
  715. send("PRIVMSG NickServ :ID " . $IRC->auth);
  716. foreach($IRC->joinchan as $c) {
  717. send("JOIN " . $c);
  718. }
  719. global $ghost;
  720. if($ghost) {
  721. send("PRIVMSG NickServ :GHOST " . $IRC->joinnick . " " . $IRC->auth);
  722. unset($ghost);
  723. }
  724. $IRC->firstcon = false;
  725. break;
  726. case "004":
  727. $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  728. break;
  729. case "005":
  730. $IRC->cM->mess = implodefrom(" ", $IRC->cM->param, 1) . $IRC->cM->mess;
  731. if(($p = strpos(strtoupper($IRC->cM->mess), "PREFIX=")) && ($a = substr($IRC->cM->mess, $p = $p + 8, strpos($IRC->cM->mess, " ", $p) - $p))) {
  732. $aa = explode(")", $a);
  733. $IRC->powers = array(array(), array());
  734. for($i = 0; $i < strlen($aa[0]); $i++) {
  735. $IRC->powers[0][] = $aa[0][$i];
  736. }
  737. for($i = 0; $i < strlen($aa[1]); $i++) {
  738. $IRC->powers[1][] = $aa[1][$i];
  739. }
  740. }
  741. break;
  742. case "252":
  743. case "254":
  744. output(trim($IRC->cM->param[0], $IRC->cNick . " ") . " " . $IRC->cM->mess);
  745. break;
  746. case "332":
  747. output("-!- Topic for " . $IRC->cM->param[1] . " is: " . $IRC->cM->mess);
  748. break;
  749. case "333":
  750. 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]));
  751. break;
  752. case "341":
  753. output("-!- " . $IRC->cM->param[1] . " has been invited to " . $IRC->cM->param[2]);
  754. break;
  755. case "353":
  756. $ndat = $IRC->cM->wline . "\n";
  757. while(!instr("366 " . $IRC->cNick, $ndat)) {
  758. if($rd = fgets($IRC->fp, 1024)) {
  759. $ndat .= $rd;
  760. }
  761. }
  762. $c = strtolower($cc = substr($ndat, $p = (strpos(strtoupper($ndat), "366 " . strtoupper($IRC->cNick)) + strlen("366 " . strtoupper($IRC->cNick))) + 1, strpos($ndat, " ", $p) - $p));
  763. $e = explode("\n", $ndat);
  764. foreach($e as $a) {
  765. parseMessage(trim($a), false);
  766. if($IRC->cM->cmd != "353") {
  767. break;
  768. }
  769. $tmp = explode(" ", $IRC->cM->mess);
  770. foreach($tmp as $t) {
  771. $names[] = $t;
  772. }
  773. $IRC->cM->mess = "";
  774. }
  775. sort($names);
  776. output("[Users " . $cc . "]", false);
  777. output("", false, false);
  778. for($i = 0; $i < sizeof($names); $i++) {
  779. if(in_array($names[$i][0], $IRC->powers[1])) {
  780. $IRC->channames[$c][substr($names[$i], 1)] = $names[$i][0];
  781. }else {
  782. $IRC->channames[$c][$names[$i]] = " ";
  783. }
  784. if(($i % 5) == 0) {
  785. output("", true, false);
  786. output("", false);
  787. }
  788. output("[" . str_pad($IRC->channames[$c][$names[$i]] . $names[$i], 17, " ", STR_PAD_RIGHT) . "] ", false, false);
  789. }
  790. output("", true, false);
  791. output("-!- " . $cc . ": Total of " . sizeof($names) . " nicks");
  792. break;
  793. case "421":
  794. output("-!- Unknown command: \"" . $IRC->cM->param[1] . "\"");
  795. break;
  796. case "442":
  797. output("-!- " . $IRC->cM->param[1] . " " . $IRC->cM->mess);
  798. break;
  799. case "433":
  800. output("-!- Nickname \"" . $IRC->cM->param[1] . "\" is already in use.");
  801. if($IRC->firstcon) {
  802. send("NICK " . $IRC->joinnick . rand(100, 999));
  803. global $ghost;
  804. $ghost = true;
  805. }
  806. break;
  807. case "474":
  808. output("-!- Unable to join channel " . $IRC->cM->param[1] . ": " . $IRC->cM->mess);
  809. break;
  810. default:
  811. output("-!- " . $IRC->cM->mess);
  812. break;
  813. }
  814. return true;
  815. }
  816.  
  817. function parseMessage($buffer, $handle = true) {
  818. global $IRC;
  819. $buffer = explode("\n", $buffer);
  820. $IRC->cM->wline = $buffer = trim($buffer[0], "\r");
  821. if(!trim($buffer)) {
  822. return;
  823. }
  824. if($IRC->debug) {
  825. output($buffer);
  826. }
  827. switch($s = startsWith(strtoupper($IRC->cM->wline), array(":", "NOTICE", "PING", "ERROR"))) {
  828. case ":":
  829. $IRC->cM->sender = substr(strtok($IRC->cM->wline, " "), 1);
  830. $IRC->cM->cmd = strtok(" ");
  831. $IRC->cM->param = explode(" ", trim(strtok(" " . strtok(""), ":")));
  832. $IRC->cM->mess = strtok("");
  833. $IRC->cM->nick = strtok($IRC->cM->sender, "!");
  834. $IRC->cM->user = strtok("@");
  835. $IRC->cM->host = strtok("");
  836. if($handle) {
  837. if(is_numeric($IRC->cM->cmd)) {
  838. if(handleNumberCommands()) {
  839. break;
  840. }
  841. }
  842. if(handleNormalCommands()) {
  843. break;
  844. }
  845. output("Unknown message: " . $IRC->cM->wline);
  846. }
  847. break;
  848. case "NOTICE":
  849. $IRC->cM->mess = substr($IRC->cM->wline, strpos($IRC->cM->wline, ":") + 1);
  850. $ss = $IRC->server;
  851. if(startsWith(strtoupper($IRC->cM->wline), "NOTICE AUTH")) {
  852. $ss = $IRC->nick;
  853. }
  854. output("!" . $ss . " " . $IRC->cM->mess);
  855. break;
  856. case "PING":
  857. if($IRC->pingpong) {
  858. output($buffer);
  859. }
  860. $IRC->cM->wline[1] = "O";
  861. send($IRC->cM->wline, $IRC->pingpong);
  862. break;
  863. case "ERROR":
  864. output($IRC->cM->wline);
  865. break;
  866. default:
  867. output("Unknown message: " . $IRC->cM->wline);
  868. break;
  869. }
  870. }
  871.  
  872. function loop() {
  873. global $IRC;
  874. if((($IRC->pongwait) && ((time() - $IRC->lastping) > 240)) || (((!$IRC->connected) || (feof($IRC->fp)) && (!($IRC->quit))))) {
  875. if($IRC->connected) {
  876. $IRC->channames = array(array(), array());
  877. if(!feof($IRC->fp)) {
  878. send("QUIT :Lost connection");
  879. }
  880. fclose($IRC->fp);
  881. }
  882. $IRC->connected = false;
  883. output("-!- Attempting to open connection to " . $IRC->host . ":" . $IRC->port);
  884. if($IRC->fp = fsockopen($IRC->host, $IRC->port, $errno, $errdesc)) {
  885. output("-!- Connection established to " . $IRC->host . ":" . $IRC->port);
  886. stream_set_timeout($IRC->fp, 0, 1);
  887. $IRC->firstcon = true;
  888. $IRC->connected = true;
  889. $IRC->pongwait = false;
  890. $IRC->lastping = time();
  891. send("USER " . $IRC->username . " * * :" . $IRC->realname);
  892. send("NICK " . $IRC->joinnick);
  893. }else {
  894. sleep(30);
  895. return;
  896. }
  897. }
  898. if((!$IRC->pongwait) && (time() - $IRC->lastping) > 30) {
  899. $IRC->pongwait = true;
  900. $IRC->pingsent = microtime(true);
  901. send("PING :" . $IRC->server, $IRC->pingpong);
  902. }
  903. if($rawdata = fgets($IRC->fp, 1024)) {
  904. parseMessage($rawdata);
  905. }
  906. if($rawdata1 = fgets(STDIN, 1024)) {
  907. output("<- " . $rawdata1, false);
  908. $IRC->cM->sender = "root";
  909. eval($rawdata1);
  910. }
  911. return($rawdata);
  912. }
  913.  
  914. $IRC->connected = false;
  915. $IRC->lastping = time();
  916. $IRC->pongwait = false;
  917. $IRC->pingsent = microtime(true);
  918. stream_set_blocking(STDIN, 0);
  919. if($IRC->logging) {
  920. $IRC->logfile = fopen($IRC->logfile, "a");
  921. fwrite($IRC->logfile, "\r\n*** Log opened on " . date("D M jS H:i:s", time()) . " ***\r\n\r\n");
  922. }
  923. startupbind();
  924. while(!$IRC->quit) {
  925. usleep(10000);
  926. loop();
  927. }
  928. if(!feof($IRC->fp)) {
  929. send("QUIT :I couldn't think of a whitty quit message");
  930. }
  931. fclose($IRC->fp);
  932. if($IRC->logging) {
  933. fclose($IRC->logfile);
  934. }
  935. if($IRC->con) {
  936. mysql_close($IRC->con);
  937. }
  938. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement