Advertisement
Guest User

Untitled

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