From f2f7963b966076d93f47cfb10a01cde30c4b3131 Mon Sep 17 00:00:00 2001 From: pk910 Date: Sun, 27 Nov 2011 16:03:16 +0100 Subject: [PATCH] added JavaGod Bot ;) --- Bots/JavaGod.class.php | 207 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 Bots/JavaGod.class.php diff --git a/Bots/JavaGod.class.php b/Bots/JavaGod.class.php new file mode 100644 index 0000000..dbe4a46 --- /dev/null +++ b/Bots/JavaGod.class.php @@ -0,0 +1,207 @@ +. * + * * + ************************************************************************ + * + * Bots/JavaGod.class.php + * + * simple Java debugger... + * + */ + +class {$_NAME} extends Bot { + private $uplink; + private $bot, $execcache = array(); + + public function load($uplink, $old = false) { + $this->uplink = $uplink; + if(!$old) { + $nick = "Java"; + $ident = "Java"; + $host = "Services.WebGamesNet.net"; + $ip = "0::0"; + $realname = "Java Java Java Java Java"; + $modes = "ioknISD"; + $this->bot = $this->uplink->addUser($nick,$ident,$host,$ip,$modes,$realname); + if(is_a($this->bot, "P10_User")) { + $this->uplink->join($this->bot, "#java", (P10_Channel::USERPRIV_OPED | P10_Channel::USERPRIV_VOICE)); + $this->uplink->join($this->bot, "#dev", P10_Channel::USERPRIV_VOICE); + } + } else { + $this->bot = $old; + } + + ModCMD::bind($this, BIND_CHANMSG, "recive_privmsg"); + ModCMD::bind($this, BIND_QUIT, "recive_quit"); + } + + public function unload($rehash = false) { + foreach($this->execcache as $id => $entry) { + fclose($entry['pipes'][1]); + fclose($entry['pipes'][2]); + proc_terminate($entry['proc'],9); + } + $this->execcache = array(); + if($rehash) { + return $this->bot; + } else { + $this->uplink->delUser($this->bot, "Bye."); + } + } + + public function loop() { + foreach($this->execcache as $id => $entry) { + if(!$this->checkstate($entry)) { + unlink("tmp/debug_".$entry['id'].".java"); + unlink("tmp/debug_".$entry['id'].".class"); + unset($this->execcache[$id]); + } + } + } + + function recive_privmsg($user, $channel, $message) { + $opOnJavaChannel = false; + $JavaChannel = P10_Channel::getChannelByName("#Java"); + if($JavaChannel) { + $privs = $JavaChannel->getUserPrivs($user); + $opOnJavaChannel = ($privs & P10_Channel::USERPRIV_OPED); + } + if(!$user->getModes()->hasMode('o') && !$opOnJavaChannel) return 0; + $exp=explode(" ", $message, 2); + switch (strtolower($exp[0])) { + case "~java": + if(count($this->execcache) > 5) { + $this->uplink->notice($this->bot, $user, "too many running java processes at the moment!"); + return; + } + $entry=array(); + $entry['channel'] = $channel; + $entry['id'] = rand(1, 999999); + $fp = fopen("tmp/debug_".$entry['id'].".c", "w"); + $javacode = "import java.*; + @SuppressWarnings("unused") + public class Debug_".$entry['id']." { + ".$exp[1]." + } + "; + fwrite($fp, $javacode); + fclose($fp); + $err = shell_exec("javac tmp/debug_".$entry['id'].".java 2>&1"); + if($err) { + $err=str_replace("\r","",$err); + $lines=explode("\n",$err); + $i=0; + foreach($lines as $line) { + if($line == "") continue; + $i++; + if($i>100) { + $this->uplink->privmsg($this->bot, $entry['channel'], "too many lines!"); + break; + } + $this->uplink->privmsg($this->bot, $entry['channel'], $line); + } + } + if(!file_exists("tmp/debug_".$entry['id'].".class")) { + unlink("tmp/debug_".$entry['id'].".java"); + break; + } + $descriptor = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w")); + $entry['proc'] = proc_open('java tmp/debug_'.$entry['id'].'.class', $descriptor, $entry['pipes']); + if(!is_resource($entry['proc'])) { + $this->uplink->notice($this->bot, $user, "error while loading c!"); + return; + } + $entry['time'] = time(); + fclose($entry['pipes'][0]); + $this->execcache[] = $entry; + break; + } + } + + function recive_quit($user, $reason) { + if($user === $this->bot) { + $this->load($this->uplink); + } + } + + function checkstate($entry) { + $data = proc_get_status($entry['proc']); + if(!$data['running']) { + $out=""; + while(!feof($entry['pipes'][1])) { + $out .= fgets($entry['pipes'][1], 128); + } + $eout=""; + while(!feof($entry['pipes'][2])) { + $eout .= fgets($entry['pipes'][2], 128); + } + if($out != "") { + $out=str_replace("\r","",$out); + $lines=explode("\n",$out); + $i=0; + foreach($lines as $line) { + if($line == "") continue; + $i++; + if($i>1000) { + $this->uplink->privmsg($this->bot, $entry['channel'], "too many lines!"); + break; + } + $this->uplink->privmsg($this->bot, $entry['channel'], $line); + } + } + if($eout != "") { + $eout=str_replace("\r","",$eout); + $lines=explode("\n",$eout); + $i=0; + foreach($lines as $line) { + if($line == "") continue; + $i++; + if($i>1000) { + $this->uplink->privmsg($this->bot, $entry['channel'], "too many lines!"); + break; + } + $this->uplink->privmsg($this->bot, $entry['channel'], "4".$line.""); + } + } + fclose($entry['pipes'][1]); + fclose($entry['pipes'][2]); + proc_close($entry['proc']); + return false; + } else { + if($entry['time']+10 > time()) { + return true; + } else { + //TIMEOUT + if($entry['term']) { + fclose($entry['pipes'][1]); + fclose($entry['pipes'][2]); + proc_terminate($entry['proc'],9); + $this->uplink->privmsg($this->bot, $entry['channel'], "Java hard timeout. sending SIGKILL"); + return false; + } else { + proc_terminate($entry['proc']); + $entry['term']=true; + $this->uplink->privmsg($this->bot, $entry['channel'], "Java timeout. (maximum of 10 seconds exceeded) sending SIGTERM"); + return true; + } + } + } + } + +} + +?> \ No newline at end of file -- 2.20.1