Sfoglia il codice sorgente

more work on user-selectable plugins; properly process system and user plugins

Andrew Dolgov 11 anni fa
parent
commit
d2a421e3cb

+ 14 - 1
classes/plugin.php

@@ -3,9 +3,22 @@ class Plugin {
 	private $link;
 	private $host;
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 	}
+
+	function about() {
+		// version, name, description, author, is_system
+		return array(1.0, "plugin", "No description", "No author", false);
+	}
+
+	function get_js() {
+		return "";
+	}
+
+	function get_prefs_js() {
+		return "";
+	}
 }
 ?>

+ 29 - 13
classes/pluginhost.php

@@ -14,6 +14,10 @@ class PluginHost {
 	const HOOK_FEED_PARSED = 6;
 	const HOOK_UPDATE_TASK = 7;
 
+	const KIND_ALL = 1;
+	const KIND_SYSTEM = 2;
+	const KIND_USER = 3;
+
 	function __construct($link) {
 		$this->link = $link;
 	}
@@ -65,12 +69,12 @@ class PluginHost {
 			return array();
 		}
 	}
-	function load_all() {
+	function load_all($kind) {
 		$plugins = array_map("basename", glob("plugins/*"));
-		$this->load(join(",", $plugins));
+		$this->load(join(",", $plugins), $kind);
 	}
 
-	function load($classlist) {
+	function load($classlist, $kind) {
 		$plugins = explode(",", $classlist);
 
 		foreach ($plugins as $class) {
@@ -84,14 +88,31 @@ class PluginHost {
 				if (class_exists($class) && is_subclass_of($class, "Plugin")) {
 					$plugin = new $class($this);
 
-					$this->register_plugin($class, $plugin);
+					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();
+		$about = $plugin->about();
 
 		return @$about[3];
 	}
@@ -134,22 +155,17 @@ class PluginHost {
 		return false;
 	}
 
-	// only system plugins are allowed to modify commands
 	function add_command($command, $description, $sender) {
 		$command = "-" . str_replace("-", "_", strtolower($command));
 
-		if ($this->is_system($sender)) {
-			$this->commands[$command] = array("description" => $description,
-				"class" => $sender);
-		}
+		$this->commands[$command] = array("description" => $description,
+			"class" => $sender);
 	}
 
 	function del_command($command) {
 		$command = "-" . strtolower($command);
 
-		if ($this->is_system($sender)) {
-			unset($this->commands[$command]);
-		}
+		unset($this->commands[$command]);
 	}
 
 	function lookup_command($command) {

+ 3 - 3
classes/pref/prefs.php

@@ -670,10 +670,10 @@ class Pref_Prefs extends Handler_Protected {
 		$user_enabled = array_map("trim", explode(",", get_pref($this->link, "_ENABLED_PLUGINS")));
 
 		$tmppluginhost = new PluginHost($link);
-		$tmppluginhost->load_all();
+		$tmppluginhost->load_all($tmppluginhost::KIND_ALL);
 
 		foreach ($tmppluginhost->get_plugins() as $name => $plugin) {
-			$about = $plugin->_about();
+			$about = $plugin->about();
 
 			if ($about[3]) {
 				if (in_array($name, $system_enabled)) {
@@ -709,7 +709,7 @@ class Pref_Prefs extends Handler_Protected {
 
 
 		foreach ($tmppluginhost->get_plugins() as $name => $plugin) {
-			$about = $plugin->_about();
+			$about = $plugin->about();
 
 			if (!$about[3]) {
 

+ 2 - 1
config.php-dist

@@ -172,7 +172,8 @@
 	// after login, or content encoding errors, disable it.
 
 	define('PLUGINS', 'note');
-	// Plugins to load. Check plugins/ directory for additional information.
+	// Comma-separated list of plugins to load for all users. System plugins have to be specified
+	// here, user plugins may be loaded per-user using Preferences/Plugins.
 
 	define('FEEDBACK_URL', '');
 	// Displays an URL for users to provide feedback or comments regarding

+ 2 - 2
include/functions.php

@@ -716,7 +716,7 @@
 			$plugins = get_pref($link, "_ENABLED_PLUGINS", $owner_uid);
 
 			global $pluginhost;
-			$pluginhost->load($plugins);
+			$pluginhost->load($plugins, $pluginhost::KIND_USER);
 		}
 	}
 
@@ -3353,7 +3353,7 @@
 			global $pluginhost;
 
 			$pluginhost = new PluginHost($link);
-			$pluginhost->load(PLUGINS);
+			$pluginhost->load(PLUGINS, $pluginhost::KIND_ALL);
 
 			return true;
 		} else {

+ 8 - 2
include/rssfuncs.php

@@ -263,7 +263,14 @@
 
 		if (!$rss->error()) {
 
-			global $pluginhost;
+			// We use local pluginhost here because we need to load different per-user feed plugins
+			$user_plugins = get_pref($link, "_ENABLED_PLUGINS", $owner_uid);
+
+			$pluginhost = new PluginHost($link);
+
+			$pluginhost->load(PLUGINS, $pluginhost::KIND_ALL);
+			$pluginhost->load($plugins, $pluginhost::KIND_USER);
+
 			$pluginhost->run_hooks($pluginhost::HOOK_FEED_PARSED, "hook_feed_parsed", $rss);
 
 			if ($debug_enabled) {
@@ -538,7 +545,6 @@
 					"tags" => $entry_tags,
 					"author" => $entry_author);
 
-				global $pluginhost;
 				foreach ($pluginhost->get_hooks($pluginhost::HOOK_ARTICLE_FILTER) as $plugin) {
 					$article = $plugin->hook_article_filter($article);
 				}

+ 2 - 6
plugins/digest/digest.php

@@ -4,22 +4,18 @@ class Digest extends Plugin implements IHandler {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Digest mode for tt-rss (tablet friendly UI)",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 
 		$host->add_handler("digest", "*", $this);
-
-		//$host->add_handler("rpc", "digestinit", $this);
-		//$host->add_handler("rpc", "digestupdate", $this);
-		//$host->add_handler("rpc", "digestgetcontents", $this);
 	}
 
 	function index() {

+ 2 - 2
plugins/example/example.php

@@ -6,14 +6,14 @@ class Example extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Example plugin #1",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/example_feed/example_feed.php

@@ -7,14 +7,14 @@ class Example_Feed extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Example feed plugin",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/example_routing/example_routing.php

@@ -15,14 +15,14 @@ class Example_Routing extends Plugin implements IHandler {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Example routing plugin",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/flattr/flattr.php

@@ -3,14 +3,14 @@ class Flattr extends Plugin {
 	private $link;
 	private $host;
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 
 		$host->add_hook($host::HOOK_ARTICLE_BUTTON, $this);
 	}
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share on Flattr plugin",
 			"Nic Honing");

+ 2 - 2
plugins/googleplus/googleplus.php

@@ -3,14 +3,14 @@ class GooglePlus extends Plugin {
 	private $link;
 	private $host;
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 
 		$host->add_hook($host::HOOK_ARTICLE_BUTTON, $this);
 	}
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share on Google+ plugin",
 			"homolibere");

+ 2 - 2
plugins/identica/identica.php

@@ -3,14 +3,14 @@ class Identica extends Plugin {
 	private $link;
 	private $host;
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 
 		$host->add_hook($host::HOOK_ARTICLE_BUTTON, $this);
 	}
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share on Identi.ca",
 			"fox");

+ 2 - 2
plugins/import_export/import_export.php

@@ -4,7 +4,7 @@ class Import_Export extends Plugin implements IHandler {
 	private $link;
 	private $host;
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 
@@ -12,7 +12,7 @@ class Import_Export extends Plugin implements IHandler {
 		$host->add_command("xml-import", "USER FILE: import articles from XML", $this);
 	}
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Imports and exports user data using a neutral XML format",
 			"fox");

+ 2 - 2
plugins/instances/instances.php

@@ -10,14 +10,14 @@ class Instances extends Plugin implements IHandler {
 		2 	=> "Invalid object received",
 		16	=> "Access denied" );
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Support for linking tt-rss instances together and sharing popular feeds.",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/mail/mail.php

@@ -4,13 +4,13 @@ class Mail extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Adds a share article via email button",
 			"fox");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/note/note.php

@@ -3,13 +3,13 @@ class Note extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Adds support for setting article notes",
 			"fox");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/pinterest/pinterest.php

@@ -3,13 +3,13 @@ class Pinterest extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share article via Pinterest",
 			"?");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/pocket/pocket.php

@@ -4,13 +4,13 @@ class Pocket extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share article via Pocket (formerly Read It Later)",
 			"?");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/redditimgur/redditimgur.php

@@ -4,13 +4,13 @@ class RedditImgur extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Inline image links in Reddit RSS feeds",
 			"fox");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/share/share.php

@@ -3,13 +3,13 @@ class Share extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Share article by unique URL",
 			"fox");
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
plugins/updater/updater.php

@@ -4,14 +4,14 @@ class Updater extends Plugin {
 	private $link;
 	private $host;
 
-	function _about() {
+	function about() {
 		return array(1.0,
 			"Updates tt-rss installation to latest version.",
 			"fox",
 			true);
 	}
 
-	function __construct($host) {
+	function init($host) {
 		$this->link = $host->get_link();
 		$this->host = $host;
 

+ 2 - 2
update.php

@@ -260,9 +260,9 @@
 
 	if (in_array("-list-plugins", $op)) {
 		$tmppluginhost = new PluginHost($link);
-		$tmppluginhost->load_all();
+		$tmppluginhost->load_all($tmppluginhost::KIND_ALL);
 		foreach ($tmppluginhost->get_plugins() as $name => $plugin) {
-			$about = $plugin->_about();
+			$about = $plugin->about();
 
 			printf("%-60s - v%.2f (by %s)\n%s\n\n",
 				$name, $about[0], $about[2], $about[1]);