From cfbbb9d714d7b5d59d3fb3e326b80f6cc88fbe23 Mon Sep 17 00:00:00 2001 From: wn_ Date: Sun, 15 Dec 2024 16:09:40 +0000 Subject: Clean up some virtual feed stuff in PluginHost. Among other things, this makes 'PluginHost->add_feed()' return false if the feed was not added. --- classes/PluginHost.php | 57 ++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 25 deletions(-) (limited to 'classes') diff --git a/classes/PluginHost.php b/classes/PluginHost.php index 97d0c45c7..bccf2ecc8 100644 --- a/classes/PluginHost.php +++ b/classes/PluginHost.php @@ -23,8 +23,8 @@ class PluginHost { /** @var array> plugin name -> (potential profile array) -> key -> value */ private array $storage = []; - /** @var array> */ - private array $feeds = []; + /** @var array */ + private array $special_feeds = []; /** @var array API method name, Plugin sender */ private array $api_methods = []; @@ -759,44 +759,51 @@ class PluginHost { } } - // Plugin feed functions are *EXPERIMENTAL*! - - // cat_id: only -1 (Feeds::CATEGORY_SPECIAL) is supported (Special) - function add_feed(int $cat_id, string $title, string $icon, Plugin $sender): int { - - if (empty($this->feeds[$cat_id])) - $this->feeds[$cat_id] = []; + /** + * Add a special (plugin-provided) feed + * + * @param int $cat_id only -1 (Feeds::CATEGORY_SPECIAL) is supported + * @return false|positive-int false if $cat_id was not -1 (Feeds::CATEGORY_SPECIAL), + * otherwise a positive integer ID that might change between executions + */ + function add_feed(int $cat_id, string $title, string $icon, Plugin $sender): false|int { + if ($cat_id !== Feeds::CATEGORY_SPECIAL) + return false; - $id = count($this->feeds[$cat_id]); + $id = count($this->special_feeds); - array_push($this->feeds[$cat_id], - ['id' => $id, 'title' => $title, 'sender' => $sender, 'icon' => $icon]); + $this->special_feeds[] = [ + 'id' => $id, + 'title' => $title, + 'sender' => $sender, + 'icon' => $icon, + ]; return $id; } /** + * Get special (plugin-provided) feeds + * + * @param int $cat_id only -1 (Feeds::CATEGORY_SPECIAL) is supported * @return array */ function get_feeds(int $cat_id) { - return $this->feeds[$cat_id] ?? []; + return $cat_id === Feeds::CATEGORY_SPECIAL ? $this->special_feeds : []; } /** - * convert feed_id (e.g. -129) to pfeed_id first - * @return (Plugin&IVirtualFeed)|null + * Get the Plugin handling a specific virtual feed. + * + * Convert feed_id (e.g. -129) to pfeed_id first. + * + * @return (Plugin&IVirtualFeed)|null a Plugin that implements IVirtualFeed, otherwise null */ function get_feed_handler(int $pfeed_id): ?Plugin { - foreach ($this->feeds as $cat) { - foreach ($cat as $feed) { - if ($feed['id'] == $pfeed_id) { - if (implements_interface($feed['sender'], 'IVirtualFeed')) { - /** @var Plugin&IVirtualFeed $feed['sender'] */ - return $feed['sender']; - } else { - return null; - } - } + foreach ($this->special_feeds as $feed) { + if ($feed['id'] == $pfeed_id) { + /** @var Plugin&IVirtualFeed $feed['sender'] */ + return implements_interface($feed['sender'], 'IVirtualFeed') ? $feed['sender'] : null; } } return null; -- cgit v1.2.3-54-g00ecf