From: NurPech Date: Mon, 10 Jun 2013 19:17:50 +0000 (+0200) Subject: added ScaleBot X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=commitdiff_plain;h=755baddb8a7ffa78038521d61153d05269c8f4f0 added ScaleBot --- diff --git a/Bots/ScaleGod.class.php b/Bots/ScaleGod.class.php new file mode 100644 index 0000000..b7706bb --- /dev/null +++ b/Bots/ScaleGod.class.php @@ -0,0 +1,197 @@ +. * + * * + ************************************************************************ + * + * Bots/ScalaGod.class.php + * + * simple Scala debugger... + * + */ + +class {$_NAME} extends Bot { + private $uplink; + private $bot, $execcache = array(); + + public function load($uplink, $old = false) { + $this->uplink = $uplink; + if(!$old) { + $nick = "Scala"; + $ident = "Scala"; + $host = "services....."; + $ip = "0::0"; + $realname = "Scala Scala Scala Scala Scala"; + $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, "#dev", P10_Channel::USERPRIV_VOICE); + $this->uplink->join($this->bot, "#opers", P10_Channel::USERPRIV_OPED); + } + + } 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'].".scala"); + unset($this->execcache[$id]); + } + } + } + + function recive_privmsg($user, $channel, $message) { + $opOnScalaChannel = false; + $ScalaChannel = P10_Channel::getChannelByName("#dev"); + if($ScalaChannel) { + $privs = $ScalaChannel->getUserPrivs($user); + $opOnScalaChannel = ($privs & P10_Channel::USERPRIV_OPED); + } + if(!$user->getModes()->hasMode('o') && !$opOnScalaChannel) return 0; + $exp=explode(" ", $message, 2); + switch (strtolower($exp[0])) { + case "~scala": + if(count($this->execcache) > 5) { + $this->uplink->notice($this->bot, $user, "too many running scala processes at the moment!"); + return; + } + $entry=array(); + $entry['channel'] = $channel; + $entry['id'] = rand(1, 999999); + if(preg_match("#pastebin\.com/([a-zA-Z0-9]*)$#i", $exp[1])) { + $pasteid = explode("/", $exp[1]); + $pasteid = $pasteid[count($pasteid)-1]; + $scalacontent = file_get_contents("http://pastebin.com/download.php?i=".$pasteid); + if(preg_match("#Unknown Paste ID!#i", $scalacontent)) { + $this->uplink->notice($this->bot, $user, "Unknown Paste ID!"); + return; + } + $scalacode = "import scala._ + ".$scalacontent." + "; + } else { + $scalacode = "import scala._ + ".$exp[1]." + "; + }; + $fp = fopen("tmp/Debug_".$entry['id'].".scala", "w"); + fwrite($fp, $scalacode); + fclose($fp); + $descriptor = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w")); + $entry['proc'] = proc_open('scala tmp/Debug_'.$entry['id'].'.scala', $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'], "Scala hard timeout. sending SIGKILL"); + return false; + } else { + proc_terminate($entry['proc']); + $entry['term']=true; + $this->uplink->privmsg($this->bot, $entry['channel'], "Scala timeout. (maximum of 10 seconds exceeded) sending SIGTERM"); + return true; + } + } + } + } + +} + +?> \ No newline at end of file