From: pk910 Date: Wed, 27 Jul 2011 22:41:06 +0000 (+0200) Subject: added saxdb & continued BotLoader X-Git-Url: http://git.pk910.de/?p=PHP-P10.git;a=commitdiff_plain;h=412e324075de1312fbc5f49b735180b46cdff82c added saxdb & continued BotLoader --- diff --git a/BotLoader/Bot.class.php b/BotLoader/Bot.class.php index 0a3c506..1fdbc41 100644 --- a/BotLoader/Bot.class.php +++ b/BotLoader/Bot.class.php @@ -39,6 +39,14 @@ class Bot { public function loop() { } + + public function writeDB() { + + } + + public function readDB($value) { + + } } diff --git a/BotLoader/BotLoader.class.php b/BotLoader/BotLoader.class.php index 2b89cb3..df06eea 100644 --- a/BotLoader/BotLoader.class.php +++ b/BotLoader/BotLoader.class.php @@ -26,16 +26,37 @@ * */ require_once("Bot.class.php"); +require_once("saxdb.class.php"); class BotLoader { private $uplink; + private $saxdb; + private $botdb; + private $loadedBots = array(); public function __construct($uplink) { $this->uplink = $uplink; + $this->saxdb = new saxdb(); + $this->saxdb->loadDB("php_p10.db"); + $this->botdb = $this->saxdb->getSection("BotLoader"); } public function loadBots() { + if(array_key_exists("bots", $this->botdb) && is_array($this->botdb["bots"])) { + foreach($this->botdb["bots"] as $name => $botfile) { + $this->loadBot($name, $botfile); + } + } else { + $this->botdb["bots"] = array(); + } + } + private function loadBot($name, $botfile) { + if(array_key_exists($name, $this->loadedBots)) return; + //load bot + if(!array_key_exists($name, $this->botdb["bots"])) { + $this->botdb["bots"][$name] = $botfile; + } } } diff --git a/BotLoader/saxdb.class.php b/BotLoader/saxdb.class.php new file mode 100644 index 0000000..15b36c2 --- /dev/null +++ b/BotLoader/saxdb.class.php @@ -0,0 +1,172 @@ +database = $this->parseDB($db); + } + } + + public function writeDB($name) { + $fp = fopen($name, "w"); + $db = $this->serializeDB($this->database); + fwrite($fp, $db); + fclose($fp); + } + + public function getSection($name) { + if(array_key_exists($name, $this->database)) { + return $this->database[$name]; + } else { + return array(); + } + } + + public function setSection($name, $value) { + $this->database[$name] = $value; + } + + private function parseDB($db) { + $parserflags = 0; + $openblocks = 0; + $buffer = ""; + $cache = array(); + $output = array(); + for($i = 0; $i < strlen($db); $i++) { + if(($parserflags & self::PARSER_ISBLOCK) && $db[$i] != "{" && $db[$i] != "}") { + $buffer .= $db[$i]; + continue; + } + if(($parserflags & self::PARSER_ISSTRING) && $db[$i] != "\"") { + $buffer .= $db[$i]; + continue; + } + if($parserflags & self::PARSER_ISESCAPED) { + $buffer .= $db[$i]; + $parserflags &= ~self::PARSER_ISESCAPED; + continue; + } + switch($db[$i]) { + case "\\": + $parserflags |= self::PARSER_ISESCAPED; + break; + case "\"": + if($parserflags & self::PARSER_ISSTRING) { + $parserflags &= ~self::PARSER_ISSTRING; + if($parserflags & self::PARSER_STRING_LIST) { + $cache['list'][] = $buffer; + } else if($parserflags & self::PARSER_EXPECT_VALUE) { + //we've got a full entry + $output[$cache['name']] = $buffer; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } else { + //we've only got the name of the next entry + $cache['name'] = $buffer; + $parserflags |= self::PARSER_EXPECT_VALUE; + } + } else { + $buffer = ""; //clear the buffer + $parserflags |= self::PARSER_ISSTRING; + } + break; + case "{": + //block (it must be a value) + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks++; + $buffer .= $db[$i]; + } else { + $parserflags |= self::PARSER_ISBLOCK; + $buffer = ""; + } + break; + case "}": + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks--; + if($openblocks == -1) { + $parserflags &= ~self::PARSER_ISBLOCK; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $this->parseDB($buffer); + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } else { + $buffer .= $db[$i]; + } + } + break; + case "(": + if(!($parserflags & self::PARSER_STRING_LIST)) { + $cache['list'] = array(); + $parserflags |= self::PARSER_STRING_LIST; + } + break; + case ")": + if(($parserflags & self::PARSER_STRING_LIST)) { + $parserflags &= ~self::PARSER_STRING_LIST; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $cache['list']; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } + break; + default: + $buffer .= $db[$i]; + break; + } + } + return $output; + } + + private function serializeDB($db, $dbstring = "") { + foreach($db as $name => $value) { + if(!is_array($value) && !is_string($value) && !is_numeric($value)) continue; + $dbstring .= "\"".str_replace("\"","\\\"", $name)."\""; + if(is_array($value)) { + $dbstring .= "{"; + $dbstring .= $this->serializeDB($value, $dbstring); + $dbstring .= "}"; + } else { + $dbstring .= "\"".str_replace("\"","\\\"", $value)."\""; + } + } + return $dbstring; + } + +} + +?> \ No newline at end of file diff --git a/BotLoader/saxdb.php b/BotLoader/saxdb.php new file mode 100644 index 0000000..f60d65e --- /dev/null +++ b/BotLoader/saxdb.php @@ -0,0 +1,160 @@ +database = $this->parseDB($db); + } + } + + public function writeDB($name) { + $fp = fopen($name, "w"); + $db = $this->serializeDB($this->database); + fwrite($fp, $db); + fclose($fp); + } + + private function parseDB($db) { + $parserflags = 0; + $openblocks = 0; + $buffer = ""; + $cache = array(); + $output = array(); + for($i = 0; $i < strlen($db); $i++) { + if(($parserflags & self::PARSER_ISBLOCK) && $db[$i] != "{" && $db[$i] != "}") { + $buffer .= $db[$i]; + continue; + } + if(($parserflags & self::PARSER_ISSTRING) && $db[$i] != "\"") { + $buffer .= $db[$i]; + continue; + } + if($parserflags & self::PARSER_ISESCAPED) { + $buffer .= $db[$i]; + $parserflags &= ~self::PARSER_ISESCAPED; + continue; + } + switch($db[$i]) { + case "\\": + $parserflags |= self::PARSER_ISESCAPED; + break; + case "\"": + if($parserflags & self::PARSER_ISSTRING) { + $parserflags &= ~self::PARSER_ISSTRING; + if($parserflags & self::PARSER_STRING_LIST) { + $cache['list'][] = $buffer; + } else if($parserflags & self::PARSER_EXPECT_VALUE) { + //we've got a full entry + $output[$cache['name']] = $buffer; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } else { + //we've only got the name of the next entry + $cache['name'] = $buffer; + $parserflags |= self::PARSER_EXPECT_VALUE; + } + } else { + $buffer = ""; //clear the buffer + $parserflags |= self::PARSER_ISSTRING; + } + break; + case "{": + //block (it must be a value) + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks++; + $buffer .= $db[$i]; + } else { + $parserflags |= self::PARSER_ISBLOCK; + $buffer = ""; + } + break; + case "}": + if($parserflags & self::PARSER_ISBLOCK) { + $openblocks--; + if($openblocks == -1) { + $parserflags &= ~self::PARSER_ISBLOCK; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $this->parseDB($buffer); + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } else { + $buffer .= $db[$i]; + } + } + break; + case "(": + if(!($parserflags & self::PARSER_STRING_LIST)) { + $cache['list'] = array(); + $parserflags |= self::PARSER_STRING_LIST; + } + break; + case ")": + if(($parserflags & self::PARSER_STRING_LIST)) { + $parserflags &= ~self::PARSER_STRING_LIST; + if($parserflags & self::PARSER_EXPECT_VALUE) { + $output[$cache['name']] = $cache['list']; + $parserflags &= ~self::PARSER_EXPECT_VALUE; + } + } + break; + default: + $buffer .= $db[$i]; + break; + } + } + return $output; + } + + private function serializeDB($db, $dbstring = "") { + foreach($db as $name => $value) { + if(!is_array($value) && !is_string($value) && !is_numeric($value)) continue; + $dbstring .= "\"".str_replace("\"","\\\"", $name)."\""; + if(is_array($value)) { + $dbstring .= "{"; + $dbstring .= $this->serializeDB($value, $dbstring); + $dbstring .= "}"; + } else { + $dbstring .= "\"".str_replace("\"","\\\"", $value)."\""; + } + } + return $dbstring; + } + +} + +?> \ No newline at end of file diff --git a/Uplink/Uplink.class.php b/Uplink/Uplink.class.php index 524d392..d7d40fa 100644 --- a/Uplink/Uplink.class.php +++ b/Uplink/Uplink.class.php @@ -443,6 +443,7 @@ class Uplink { $users = explode(",",$userstr); $isop = false; $isvoice = false; foreach($users as $user) { + if($user == "") continue; $uexp = explode(":", $user); if(strlen($uexp[0]) != 5) { trigger_error("burst parse error: '".$uexp[0]."' is not an user numeric.", E_USER_ERROR); diff --git a/tmp/tmpdir.txt b/tmp/tmpdir.txt new file mode 100644 index 0000000..c9a7f7b --- /dev/null +++ b/tmp/tmpdir.txt @@ -0,0 +1 @@ +temp dir for bot classes \ No newline at end of file