mirror of
https://git.tt-rss.org/git/tt-rss.git
synced 2025-12-13 01:46:00 +00:00
pluginhost: rework run_hooks() to be shorter, add callback variant; implement exception handling for both
This commit is contained in:
@@ -22,54 +22,54 @@ class PluginHost {
|
||||
// Hooks marked with *1 are run in global context and available
|
||||
// to plugins loaded in config.php only
|
||||
|
||||
const HOOK_ARTICLE_BUTTON = 1;
|
||||
const HOOK_ARTICLE_FILTER = 2;
|
||||
const HOOK_PREFS_TAB = 3;
|
||||
const HOOK_PREFS_TAB_SECTION = 4;
|
||||
const HOOK_PREFS_TABS = 5;
|
||||
const HOOK_FEED_PARSED = 6;
|
||||
const HOOK_UPDATE_TASK = 7; // *1
|
||||
const HOOK_AUTH_USER = 8;
|
||||
const HOOK_HOTKEY_MAP = 9;
|
||||
const HOOK_RENDER_ARTICLE = 10;
|
||||
const HOOK_RENDER_ARTICLE_CDM = 11;
|
||||
const HOOK_FEED_FETCHED = 12;
|
||||
const HOOK_SANITIZE = 13;
|
||||
const HOOK_RENDER_ARTICLE_API = 14;
|
||||
const HOOK_TOOLBAR_BUTTON = 15;
|
||||
const HOOK_ACTION_ITEM = 16;
|
||||
const HOOK_HEADLINE_TOOLBAR_BUTTON = 17;
|
||||
const HOOK_HOTKEY_INFO = 18;
|
||||
const HOOK_ARTICLE_LEFT_BUTTON = 19;
|
||||
const HOOK_PREFS_EDIT_FEED = 20;
|
||||
const HOOK_PREFS_SAVE_FEED = 21;
|
||||
const HOOK_FETCH_FEED = 22;
|
||||
const HOOK_QUERY_HEADLINES = 23;
|
||||
const HOOK_HOUSE_KEEPING = 24; // *1
|
||||
const HOOK_SEARCH = 25;
|
||||
const HOOK_FORMAT_ENCLOSURES = 26;
|
||||
const HOOK_SUBSCRIBE_FEED = 27;
|
||||
const HOOK_HEADLINES_BEFORE = 28;
|
||||
const HOOK_RENDER_ENCLOSURE = 29;
|
||||
const HOOK_ARTICLE_FILTER_ACTION = 30;
|
||||
const HOOK_ARTICLE_EXPORT_FEED = 31;
|
||||
const HOOK_MAIN_TOOLBAR_BUTTON = 32;
|
||||
const HOOK_ENCLOSURE_ENTRY = 33;
|
||||
const HOOK_FORMAT_ARTICLE = 34;
|
||||
const HOOK_FORMAT_ARTICLE_CDM = 35; /* RIP */
|
||||
const HOOK_FEED_BASIC_INFO = 36;
|
||||
const HOOK_SEND_LOCAL_FILE = 37;
|
||||
const HOOK_UNSUBSCRIBE_FEED = 38;
|
||||
const HOOK_SEND_MAIL = 39;
|
||||
const HOOK_FILTER_TRIGGERED = 40;
|
||||
const HOOK_GET_FULL_TEXT = 41;
|
||||
const HOOK_ARTICLE_IMAGE = 42;
|
||||
const HOOK_FEED_TREE = 43;
|
||||
const HOOK_IFRAME_WHITELISTED = 44;
|
||||
const HOOK_ENCLOSURE_IMPORTED = 45;
|
||||
const HOOK_HEADLINES_CUSTOM_SORT_MAP = 46;
|
||||
const HOOK_HEADLINES_CUSTOM_SORT_OVERRIDE = 47;
|
||||
const HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM = 48;
|
||||
const HOOK_ARTICLE_BUTTON = "hook_article_button";
|
||||
const HOOK_ARTICLE_FILTER = "hook_article_filter";
|
||||
const HOOK_PREFS_TAB = "hook_prefs_tab";
|
||||
const HOOK_PREFS_TAB_SECTION = "hook_prefs_tab_section";
|
||||
const HOOK_PREFS_TABS = "hook_prefs_tabs";
|
||||
const HOOK_FEED_PARSED = "hook_feed_parsed";
|
||||
const HOOK_UPDATE_TASK = "hook_update_task"; //*1
|
||||
const HOOK_AUTH_USER = "hook_auth_user";
|
||||
const HOOK_HOTKEY_MAP = "hook_hotkey_map";
|
||||
const HOOK_RENDER_ARTICLE = "hook_render_article";
|
||||
const HOOK_RENDER_ARTICLE_CDM = "hook_render_article_cdm";
|
||||
const HOOK_FEED_FETCHED = "hook_feed_fetched";
|
||||
const HOOK_SANITIZE = "hook_sanitize";
|
||||
const HOOK_RENDER_ARTICLE_API = "hook_render_article_api";
|
||||
const HOOK_TOOLBAR_BUTTON = "hook_toolbar_button";
|
||||
const HOOK_ACTION_ITEM = "hook_action_item";
|
||||
const HOOK_HEADLINE_TOOLBAR_BUTTON = "hook_headline_toolbar_button";
|
||||
const HOOK_HOTKEY_INFO = "hook_hotkey_info";
|
||||
const HOOK_ARTICLE_LEFT_BUTTON = "hook_article_left_button";
|
||||
const HOOK_PREFS_EDIT_FEED = "hook_prefs_edit_feed";
|
||||
const HOOK_PREFS_SAVE_FEED = "hook_prefs_save_feed";
|
||||
const HOOK_FETCH_FEED = "hook_fetch_feed";
|
||||
const HOOK_QUERY_HEADLINES = "hook_query_headlines";
|
||||
const HOOK_HOUSE_KEEPING = "hook_house_keeping"; //*1
|
||||
const HOOK_SEARCH = "hook_search";
|
||||
const HOOK_FORMAT_ENCLOSURES = "hook_format_enclosures";
|
||||
const HOOK_SUBSCRIBE_FEED = "hook_subscribe_feed";
|
||||
const HOOK_HEADLINES_BEFORE = "hook_headlines_before";
|
||||
const HOOK_RENDER_ENCLOSURE = "hook_render_enclosure";
|
||||
const HOOK_ARTICLE_FILTER_ACTION = "hook_article_filter_action";
|
||||
const HOOK_ARTICLE_EXPORT_FEED = "hook_article_export_feed";
|
||||
const HOOK_MAIN_TOOLBAR_BUTTON = "hook_main_toolbar_button";
|
||||
const HOOK_ENCLOSURE_ENTRY = "hook_enclosure_entry";
|
||||
const HOOK_FORMAT_ARTICLE = "hook_format_article";
|
||||
const HOOK_FORMAT_ARTICLE_CDM = "hook_format_article_cdm"; /* RIP */
|
||||
const HOOK_FEED_BASIC_INFO = "hook_feed_basic_info";
|
||||
const HOOK_SEND_LOCAL_FILE = "hook_send_local_file";
|
||||
const HOOK_UNSUBSCRIBE_FEED = "hook_unsubscribe_feed";
|
||||
const HOOK_SEND_MAIL = "hook_send_mail";
|
||||
const HOOK_FILTER_TRIGGERED = "hook_filter_triggered";
|
||||
const HOOK_GET_FULL_TEXT = "hook_get_full_text";
|
||||
const HOOK_ARTICLE_IMAGE = "hook_article_image";
|
||||
const HOOK_FEED_TREE = "hook_feed_tree";
|
||||
const HOOK_IFRAME_WHITELISTED = "hook_iframe_whitelisted";
|
||||
const HOOK_ENCLOSURE_IMPORTED = "hook_enclosure_imported";
|
||||
const HOOK_HEADLINES_CUSTOM_SORT_MAP = "hook_headlines_custom_sort_map";
|
||||
const HOOK_HEADLINES_CUSTOM_SORT_OVERRIDE = "hook_headlines_custom_sort_override";
|
||||
const HOOK_HEADLINE_TOOLBAR_SELECT_MENU_ITEM = "hook_headline_toolbar_select_menu_item";
|
||||
|
||||
const KIND_ALL = 1;
|
||||
const KIND_SYSTEM = 2;
|
||||
@@ -131,9 +131,35 @@ class PluginHost {
|
||||
return $this->plugins[strtolower($name)] ?? null;
|
||||
}
|
||||
|
||||
function run_hooks($type, $method, $args) {
|
||||
foreach ($this->get_hooks($type) as $hook) {
|
||||
$hook->$method($args);
|
||||
function run_hooks($hook, ...$args) {
|
||||
$method = strtolower($hook);
|
||||
|
||||
foreach ($this->get_hooks($hook) as $plugin) {
|
||||
Debug::log("invoking: " . get_class($plugin) . "->$hook()", Debug::$LOG_VERBOSE);
|
||||
|
||||
try {
|
||||
$plugin->$method(...$args);
|
||||
} catch (Exception $ex) {
|
||||
user_error($ex, E_USER_WARNING);
|
||||
} catch (Error $err) {
|
||||
user_error($err, E_USER_WARNING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function run_hooks_callback($hook, $callback, ...$args) {
|
||||
$method = strtolower($hook);
|
||||
|
||||
foreach ($this->get_hooks($hook) as $plugin) {
|
||||
//Debug::log("invoking: " . get_class($plugin) . "->$hook()", Debug::$LOG_VERBOSE);
|
||||
|
||||
try {
|
||||
$callback($plugin->$method(...$args), $plugin);
|
||||
} catch (Exception $ex) {
|
||||
user_error($ex, E_USER_WARNING);
|
||||
} catch (Error $err) {
|
||||
user_error($err, E_USER_WARNING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user