X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=classes%2Fpluginhost.php;h=36c3dfbb33079ec2de4c705ebb3aa76f8138fbd0;hb=6322ac79a020ab584d412d782d62b2ee77d7c6cf;hp=d7926fa4e0bf62f5b3cd1224016fedaeed91bc18;hpb=6065f3ad6364943e4d6b160db8a2c78ff52e2373;p=tt-rss.git diff --git a/classes/pluginhost.php b/classes/pluginhost.php index d7926fa4..36c3dfbb 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -1,16 +1,45 @@ link = $link; + const KIND_ALL = 1; + const KIND_SYSTEM = 2; + const KIND_USER = 3; + + function __construct($dbh) { + $this->dbh = $dbh; + $this->storage = $_SESSION["plugin_storage"]; + + if (!$this->storage) $this->storage = array(); } private function register_plugin($name, $plugin) { @@ -18,8 +47,8 @@ class PluginHost { $this->plugins[$name] = $plugin; } - function get_link() { - return $this->link; + function get_dbh() { + return $this->dbh; } function get_plugins() { @@ -54,26 +83,281 @@ class PluginHost { } function get_hooks($type) { - return $this->hooks[$type]; + if (isset($this->hooks[$type])) { + return $this->hooks[$type]; + } else { + return array(); + } + } + function load_all($kind, $owner_uid = false) { + $plugins = array_map("basename", glob("plugins/*")); + $this->load(join(",", $plugins), $kind, $owner_uid); } - function load($classlist) { + function load($classlist, $kind, $owner_uid = false) { $plugins = explode(",", $classlist); + $this->owner_uid = (int) $owner_uid; + foreach ($plugins as $class) { $class = trim($class); - $class_file = str_replace("_", "/", strtolower(basename($class))); - $file = dirname(__FILE__)."/../plugins/$class_file/$class_file.php"; + $class_file = strtolower(basename($class)); + + if (!is_dir(dirname(__FILE__)."/../plugins/$class_file")) continue; + + $file = dirname(__FILE__)."/../plugins/$class_file/init.php"; + + if (!isset($this->plugins[$class])) { + if (file_exists($file)) require_once $file; + + if (class_exists($class) && is_subclass_of($class, "Plugin")) { + $plugin = new $class($this); + + switch ($kind) { + case $this::KIND_SYSTEM: + if ($this->is_system($plugin)) { + $plugin->init($this); + $this->register_plugin($class, $plugin); + } + break; + case $this::KIND_USER: + if (!$this->is_system($plugin)) { + $plugin->init($this); + $this->register_plugin($class, $plugin); + } + break; + case $this::KIND_ALL: + $plugin->init($this); + $this->register_plugin($class, $plugin); + break; + } + } + } + } + } + + function is_system($plugin) { + $about = $plugin->about(); + + return @$about[3]; + } + + // only system plugins are allowed to modify routing + function add_handler($handler, $method, $sender) { + $handler = str_replace("-", "_", strtolower($handler)); + $method = strtolower($method); + + if ($this->is_system($sender)) { + if (!is_array($this->handlers[$handler])) { + $this->handlers[$handler] = array(); + } + + $this->handlers[$handler][$method] = $sender; + } + } + + function del_handler($handler, $method) { + $handler = str_replace("-", "_", strtolower($handler)); + $method = strtolower($method); + + if ($this->is_system($sender)) { + unset($this->handlers[$handler][$method]); + } + } + + function lookup_handler($handler, $method) { + $handler = str_replace("-", "_", strtolower($handler)); + $method = strtolower($method); + + if (is_array($this->handlers[$handler])) { + if (isset($this->handlers[$handler]["*"])) { + return $this->handlers[$handler]["*"]; + } else { + return $this->handlers[$handler][$method]; + } + } + + return false; + } + + function add_command($command, $description, $sender, $suffix = "", $arghelp = "") { + $command = str_replace("-", "_", strtolower($command)); + + $this->commands[$command] = array("description" => $description, + "suffix" => $suffix, + "arghelp" => $arghelp, + "class" => $sender); + } + + function del_command($command) { + $command = "-" . strtolower($command); + + unset($this->commands[$command]); + } + + function lookup_command($command) { + $command = "-" . strtolower($command); + + if (is_array($this->commands[$command])) { + return $this->commands[$command]["class"]; + } else { + return false; + } + + return false; + } + + function get_commands() { + return $this->commands; + } + + function run_commands($args) { + foreach ($this->get_commands() as $command => $data) { + if (isset($args[$command])) { + $command = str_replace("-", "", $command); + $data["class"]->$command($args); + } + } + } + + function load_data($force = false) { + if ($this->owner_uid && (!$_SESSION["plugin_storage"] || $force)) { + $plugin = db_escape_string( $plugin); + + $result = db_query( "SELECT name, content FROM ttrss_plugin_storage + WHERE owner_uid = '".$this->owner_uid."'"); + + while ($line = db_fetch_assoc($result)) { + $this->storage[$line["name"]] = unserialize($line["content"]); + } + + $_SESSION["plugin_storage"] = $this->storage; + } + } + + private function save_data($plugin) { + if ($this->owner_uid) { + $plugin = db_escape_string( $plugin); + + db_query( "BEGIN"); + + $result = db_query("SELECT id FROM ttrss_plugin_storage WHERE + owner_uid= '".$this->owner_uid."' AND name = '$plugin'"); + + if (!isset($this->storage[$plugin])) + $this->storage[$plugin] = array(); + + $content = db_escape_string( serialize($this->storage[$plugin])); + + if (db_num_rows($result) != 0) { + db_query( "UPDATE ttrss_plugin_storage SET content = '$content' + WHERE owner_uid= '".$this->owner_uid."' AND name = '$plugin'"); + + } else { + db_query( "INSERT INTO ttrss_plugin_storage + (name,owner_uid,content) VALUES + ('$plugin','".$this->owner_uid."','$content')"); + } + + db_query( "COMMIT"); + } + } + + function set($sender, $name, $value, $sync = true) { + $idx = get_class($sender); + + if (!isset($this->storage[$idx])) + $this->storage[$idx] = array(); + + $this->storage[$idx][$name] = $value; + + $_SESSION["plugin_storage"] = $this->storage; + + if ($sync) $this->save_data(get_class($sender)); + } + + function get($sender, $name, $default_value = false) { + $idx = get_class($sender); + + if (isset($this->storage[$idx][$name])) { + return $this->storage[$idx][$name]; + } else { + return $default_value; + } + } + + function get_all($sender) { + $idx = get_class($sender); - if (file_exists($file)) require_once $file; + return $this->storage[$idx]; + } + + function clear_data($sender) { + if ($this->owner_uid) { + $idx = get_class($sender); + + unset($this->storage[$idx]); + + db_query( "DELETE FROM ttrss_plugin_storage WHERE name = '$idx' + AND owner_uid = " . $this->owner_uid); + + $_SESSION["plugin_storage"] = $this->storage; + } + } + + function set_debug($debug) { + $this->debug = $debug; + } + + function get_debug() { + return $this->debug; + } + + // Plugin feed functions are *EXPERIMENTAL*! + + // cat_id: only -1 is supported (Special) + function add_feed($cat_id, $title, $icon, $sender) { + if (!$this->feeds[$cat_id]) $this->feeds[$cat_id] = array(); - if (class_exists($class) && is_subclass_of($class, "Plugin")) { - $plugin = new $class($this); + $id = count($this->feeds[$cat_id]); - $this->register_plugin($class, $plugin); + array_push($this->feeds[$cat_id], + array('id' => $id, 'title' => $title, 'sender' => $sender, 'icon' => $icon)); + + return $id; + } + + function get_feeds($cat_id) { + return $this->feeds[$cat_id]; + } + + // convert feed_id (e.g. -129) to pfeed_id first + function get_feed_handler($pfeed_id) { + foreach ($this->feeds as $cat) { + foreach ($cat as $feed) { + if ($feed['id'] == $pfeed_id) { + return $feed['sender']; + } } } } + static function pfeed_to_feed_id($label) { + return PLUGIN_FEED_BASE_INDEX - 1 - abs($label); + } + + static function feed_to_pfeed_id($feed) { + return PLUGIN_FEED_BASE_INDEX - 1 + abs($feed); + } + + function add_api_method($name, $sender) { + if ($this->is_system($sender)) { + $this->api_methods[strtolower($name)] = $sender; + } + } + + function get_api_method($name) { + return $this->api_methods[$name]; + } } ?>