Merge pull request #4288 from zeroadam/Addon

Move plugins to Addon
This commit is contained in:
Hypolite Petovan 2018-01-20 14:36:23 -05:00 committed by GitHub
commit 610f017b28
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
116 changed files with 1335 additions and 1247 deletions

View file

@ -299,7 +299,7 @@ Version 3.4.3 (2015-12-22)
Contact's posts are shown in a dedicated page (annando) Contact's posts are shown in a dedicated page (annando)
Module name is shown in page title to ease browser history navigation (issue #2079) (tobiasd) Module name is shown in page title to ease browser history navigation (issue #2079) (tobiasd)
What's new for admins: What's new for admins:
Forumlist functionality moved from plugin to core (rabuzarus, annando) Forumlist functionality moved from addon to core (rabuzarus, annando)
Changes on poller/workers limits management (annando) Changes on poller/workers limits management (annando)
Diaspora and OStatus can be enabled only if requirements are satisfied (annando) Diaspora and OStatus can be enabled only if requirements are satisfied (annando)
Support for additional passwords for ejabberd (annando) Support for additional passwords for ejabberd (annando)
@ -380,7 +380,7 @@ Version 3.4.2 (2015-09-29)
Support for inline [code] tag usage (fabrixxm) Support for inline [code] tag usage (fabrixxm)
Fix login form in aside (issue #1348) (annando) Fix login form in aside (issue #1348) (annando)
Show both url-style and webfinger-style identity address in profile (issue #1621) (tobiasd) Show both url-style and webfinger-style identity address in profile (issue #1621) (tobiasd)
Add button to reload all active plugins in admin plugins page to ensure new hooks are used (fabrixxm) Add button to reload all active addons in admin addons page to ensure new hooks are used (fabrixxm)
Make the hardcoded path to global directory configurable (annando) Make the hardcoded path to global directory configurable (annando)
Change default directory to dir.friendi.ca (annando) Change default directory to dir.friendi.ca (annando)
Improve cache system with granular expire time (annando) Improve cache system with granular expire time (annando)

View file

@ -131,17 +131,17 @@ look like (changing it to the correct PHP location)
$a->config['php_path'] = '/usr/local/php53/bin/php' $a->config['php_path'] = '/usr/local/php53/bin/php'
Alternative: You may be able to use the 'poormancron' plugin to perform this Alternative: You may be able to use the 'poormancron' addon to perform this
step if you are using a recent Friendica release. 'poormancron' may result in step if you are using a recent Friendica release. 'poormancron' may result in
perfomance and memory issues and is only suitable for small sites with one or perfomance and memory issues and is only suitable for small sites with one or
two users and a handful of contacts. To do this, edit the file two users and a handful of contacts. To do this, edit the file
".htconfig.php" and look for a line describing your plugins. On a fresh ".htconfig.php" and look for a line describing your addons. On a fresh
installation, it will look like installation, it will look like
$a->config['system']['addon'] = 'js_upload'; $a->config['system']['addon'] = 'js_upload';
This indicates the "js_upload" addon module is enabled. You may add additional This indicates the "js_upload" addon module is enabled. You may add additional
addons/plugins using this same line in the configuration file. Change it to addons using this same line in the configuration file. Change it to
read read
$a->config['system']['addon'] = 'js_upload,poormancron'; $a->config['system']['addon'] = 'js_upload,poormancron';

View file

@ -9,7 +9,7 @@ Our mission is to free friends, family and colleagues from data-harvesting corpo
Friendica connects you effortlessly to a federated communications network of several thousand servers, with more than half a million user registrations. You can directly connect to anyone on [Friendica]( https://friendi.ca), [Mastodon](https://joinmastodon.org/), [Diaspora](https://diasporafoundation.org/), [GnuSocial](https://gnu.io/social/), [Pleroma](https://pleroma.social/), or [Hubzilla](https://hubzilla.org/), regardless where each user profile is hosted. Friendica connects you effortlessly to a federated communications network of several thousand servers, with more than half a million user registrations. You can directly connect to anyone on [Friendica]( https://friendi.ca), [Mastodon](https://joinmastodon.org/), [Diaspora](https://diasporafoundation.org/), [GnuSocial](https://gnu.io/social/), [Pleroma](https://pleroma.social/), or [Hubzilla](https://hubzilla.org/), regardless where each user profile is hosted.
With Friendica, you can also fully interact with anyone on Twitter, post on Facebook and receive any content on Tumblr, Wordpress or RSS. Friendica allows you to integrate most things on the web via a range of plugins such as ITTT, Buffer; you will be able to easily control your own data as you decide. With Friendica, you can also fully interact with anyone on Twitter, post on Facebook and receive any content on Tumblr, Wordpress or RSS. Friendica allows you to integrate most things on the web via a range of addons such as ITTT, Buffer; you will be able to easily control your own data as you decide.
Join today and [get your Friendica profile!](https://dir.friendica.social/servers 'Join Friendica today!') Join today and [get your Friendica profile!](https://dir.friendica.social/servers 'Join Friendica today!')

View file

@ -21,6 +21,7 @@
require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\Config; use Friendica\Core\Config;
@ -32,7 +33,6 @@ use Friendica\Database\DBStructure;
use Friendica\Module\Login; use Friendica\Module\Login;
require_once 'include/network.php'; require_once 'include/network.php';
require_once 'include/plugin.php';
require_once 'include/text.php'; require_once 'include/text.php';
require_once 'include/datetime.php'; require_once 'include/datetime.php';
require_once 'include/pgettext.php'; require_once 'include/pgettext.php';
@ -798,19 +798,19 @@ function run_update_function($x)
} }
/** /**
* @brief Synchronise plugins: * @brief Synchronise addons:
* *
* $a->config['system']['addon'] contains a comma-separated list of names * $a->config['system']['addon'] contains a comma-separated list of names
* of plugins/addons which are used on this system. * of addons which are used on this system.
* Go through the database list of already installed addons, and if we have * Go through the database list of already installed addons, and if we have
* an entry, but it isn't in the config list, call the uninstall procedure * an entry, but it isn't in the config list, call the uninstall procedure
* and mark it uninstalled in the database (for now we'll remove it). * and mark it uninstalled in the database (for now we'll remove it).
* Then go through the config list and if we have a plugin that isn't installed, * Then go through the config list and if we have a addon that isn't installed,
* call the install procedure and add it to the database. * call the install procedure and add it to the database.
* *
* @param object $a App * @param object $a App
*/ */
function check_plugins(App $a) function check_addons(App $a)
{ {
$r = q("SELECT * FROM `addon` WHERE `installed` = 1"); $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
@ -819,36 +819,36 @@ function check_plugins(App $a)
$installed = []; $installed = [];
} }
$plugins = Config::get('system', 'addon'); $addons = Config::get('system', 'addon');
$plugins_arr = []; $addons_arr = [];
if ($plugins) { if ($addons) {
$plugins_arr = explode(',', str_replace(' ', '', $plugins)); $addons_arr = explode(',', str_replace(' ', '', $addons));
} }
$a->plugins = $plugins_arr; $a->addons = $addons_arr;
$installed_arr = []; $installed_arr = [];
if (count($installed)) { if (count($installed)) {
foreach ($installed as $i) { foreach ($installed as $i) {
if (!in_array($i['name'], $plugins_arr)) { if (!in_array($i['name'], $addons_arr)) {
uninstall_plugin($i['name']); Addon::uninstall($i['name']);
} else { } else {
$installed_arr[] = $i['name']; $installed_arr[] = $i['name'];
} }
} }
} }
if (count($plugins_arr)) { if (count($addons_arr)) {
foreach ($plugins_arr as $p) { foreach ($addons_arr as $p) {
if (!in_array($p, $installed_arr)) { if (!in_array($p, $installed_arr)) {
install_plugin($p); Addon::install($p);
} }
} }
} }
load_hooks(); Addon::loadHooks();
return; return;
} }

View file

@ -69,7 +69,7 @@ General
* o: Account * o: Account
* t: Additional features * t: Additional features
* w: Social Networks * w: Social Networks
* l: Plugins * l: Addons
* d: Delegations * d: Delegations
* b: Connected apps * b: Connected apps
* e: Export personal data * e: Export personal data

View file

@ -1,4 +1,4 @@
Friendica Addon/Plugin development Friendica Addon development
============== ==============
* [Home](help) * [Home](help)
@ -7,32 +7,32 @@ Please see the sample addon 'randplace' for a working example of using some of t
Addons work by intercepting event hooks - which must be registered. Addons work by intercepting event hooks - which must be registered.
Modules work by intercepting specific page requests (by URL path). Modules work by intercepting specific page requests (by URL path).
Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. Addon names cannot contain spaces or other punctuation and are used as filenames and function names.
You may supply a "friendly" name within the comment block. You may supply a "friendly" name within the comment block.
Each addon must contain both an install and an uninstall function based on the addon/plugin name. Each addon must contain both an install and an uninstall function based on the addon name.
For instance "plugin1name_install()". For instance "addon1name_install()".
These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your addon will require.
The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation. The install and uninstall functions will also be called (i.e. re-installed) if the addon changes after installation.
Therefore your uninstall should not destroy data and install should consider that data may already exist. Therefore your uninstall should not destroy data and install should consider that data may already exist.
Future extensions may provide for "setup" amd "remove". Future extensions may provide for "setup" amd "remove".
Plugins should contain a comment block with the four following parameters: Addons should contain a comment block with the four following parameters:
/* /*
* Name: My Great Plugin * Name: My Great Addon
* Description: This is what my plugin does. It's really cool. * Description: This is what my addon does. It's really cool.
* Version: 1.0 * Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com> * Author: John Q. Public <john@myfriendicasite.com>
*/ */
Register your plugin hooks during installation. Register your addon hooks during installation.
register_hook($hookname, $file, $function); Addon::registerHook($hookname, $file, $function);
$hookname is a string and corresponds to a known Friendica hook. $hookname is a string and corresponds to a known Friendica hook.
$file is a pathname relative to the top-level Friendica directory. $file is a pathname relative to the top-level Friendica directory.
This *should* be 'addon/plugin_name/plugin_name.php' in most cases. This *should* be 'addon/addon_name/addon_name.php' in most cases.
$function is a string and is the name of the function which will be executed when the hook is called. $function is a string and is the name of the function which will be executed when the hook is called.
@ -69,39 +69,39 @@ Remember to declare it with '&' if you wish to alter it.
Modules Modules
--- ---
Plugins/addons may also act as "modules" and intercept all page requests for a given URL path. Addons may also act as "modules" and intercept all page requests for a given URL path.
In order for a plugin to act as a module it needs to define a function "plugin_name_module()" which takes no arguments and needs not do anything. In order for a addon to act as a module it needs to define a function "addon_name_module()" which takes no arguments and needs not do anything.
If this function exists, you will now receive all page requests for "http://my.web.site/plugin_name" - with any number of URL components as additional arguments. If this function exists, you will now receive all page requests for "http://my.web.site/addon_name" - with any number of URL components as additional arguments.
These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components. These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components.
So http://my.web.site/plugin/arg1/arg2 would look for a module named "plugin" and pass its module functions the $a App structure (which is available to many components). So http://my.web.site/addon/arg1/arg2 would look for a module named "addon" and pass its module functions the $a App structure (which is available to many components).
This will include: This will include:
$a->argc = 3 $a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2'); $a->argv = array(0 => 'addon', 1 => 'arg1', 2 => 'arg2');
Your module functions will often contain the function plugin_name_content(App $a), which defines and returns the page body content. Your module functions will often contain the function addon_name_content(App $a), which defines and returns the page body content.
They may also contain plugin_name_post(App $a) which is called before the _content function and typically handles the results of POST forms. They may also contain addon_name_post(App $a) which is called before the _content function and typically handles the results of POST forms.
You may also have plugin_name_init(App $a) which is called very early on and often does module initialisation. You may also have addon_name_init(App $a) which is called very early on and often does module initialisation.
Templates Templates
--- ---
If your plugin needs some template, you can use the Friendica template system. If your addon needs some template, you can use the Friendica template system.
Friendica uses [smarty3](http://www.smarty.net/) as a template engine. Friendica uses [smarty3](http://www.smarty.net/) as a template engine.
Put your tpl files in the *templates/* subfolder of your plugin. Put your tpl files in the *templates/* subfolder of your addon.
In your code, like in the function plugin_name_content(), load the template file and execute it passing needed values: In your code, like in the function addon_name_content(), load the template file and execute it passing needed values:
# load template file. first argument is the template name, # load template file. first argument is the template name,
# second is the plugin path relative to friendica top folder # second is the addon path relative to friendica top folder
$tpl = get_markup_template('mytemplate.tpl', 'addon/plugin_name/'); $tpl = get_markup_template('mytemplate.tpl', 'addon/addon_name/');
# apply template. first argument is the loaded template, # apply template. first argument is the loaded template,
# second an array of 'name'=>'values' to pass to template # second an array of 'name'=>'values' to pass to template
$output = replace_macros($tpl,array( $output = replace_macros($tpl,array(
'title' => 'My beautiful plugin', 'title' => 'My beautiful addon',
)); ));
See also the wiki page [Quick Template Guide](https://github.com/friendica/friendica/wiki/Quick-Template-Guide). See also the wiki page [Quick Template Guide](https://github.com/friendica/friendica/wiki/Quick-Template-Guide).
@ -151,11 +151,11 @@ $b is an array:
* called when the Settings pages are submitted * called when the Settings pages are submitted
* $b is the $_POST array * $b is the $_POST array
### 'plugin_settings' ### 'addon_settings'
* called when generating the HTML for the addon settings page * called when generating the HTML for the addon settings page
* $b is the (string) HTML of the addon settings page before the final '</form>' tag. * $b is the (string) HTML of the addon settings page before the final '</form>' tag.
### 'plugin_settings_post' ### 'addon_settings_post'
* called when the Addon Settings pages are submitted * called when the Addon Settings pages are submitted
* $b is the $_POST array * $b is the $_POST array
@ -296,182 +296,178 @@ Complete list of hook callbacks
Here is a complete list of all hook callbacks with file locations (as of 14-Feb-2012). Please see the source for details of any hooks not documented above. Here is a complete list of all hook callbacks with file locations (as of 14-Feb-2012). Please see the source for details of any hooks not documented above.
boot.php: call_hooks('login_hook',$o); boot.php: Addon::callHooks('login_hook',$o);
boot.php: call_hooks('profile_sidebar_enter', $profile); boot.php: Addon::callHooks('profile_sidebar_enter', $profile);
boot.php: call_hooks('profile_sidebar', $arr); boot.php: Addon::callHooks('profile_sidebar', $arr);
boot.php: call_hooks("proc_run", $arr); boot.php: Addon::callHooks("proc_run", $arr);
include/contact_selectors.php: call_hooks('network_to_name', $nets); include/contact_selectors.php: Addon::callHooks('network_to_name', $nets);
include/api.php: call_hooks('logged_in', $a->user); include/api.php: Addon::callHooks('logged_in', $a->user);
include/api.php: call_hooks('logged_in', $a->user); include/api.php: Addon::callHooks('logged_in', $a->user);
include/queue.php: call_hooks('queue_predeliver', $a, $r); include/queue.php: Addon::callHooks('queue_predeliver', $a, $r);
include/queue.php: call_hooks('queue_deliver', $a, $params); include/queue.php: Addon::callHooks('queue_deliver', $a, $params);
include/text.php: call_hooks('contact_block_end', $arr); include/text.php: Addon::callHooks('contact_block_end', $arr);
include/text.php: call_hooks('smilie', $s); include/text.php: Addon::callHooks('smilie', $s);
include/text.php: call_hooks('prepare_body_init', $item); include/text.php: Addon::callHooks('prepare_body_init', $item);
include/text.php: call_hooks('prepare_body', $prep_arr); include/text.php: Addon::callHooks('prepare_body', $prep_arr);
include/text.php: call_hooks('prepare_body_final', $prep_arr); include/text.php: Addon::callHooks('prepare_body_final', $prep_arr);
include/nav.php: call_hooks('page_header', $a->page['nav']); include/nav.php: Addon::callHooks('page_header', $a->page['nav']);
include/auth.php: call_hooks('authenticate', $addon_auth); include/auth.php: Addon::callHooks('authenticate', $addon_auth);
include/bbcode.php: call_hooks('bbcode',$Text); include/bbcode.php: Addon::callHooks('bbcode',$Text);
include/oauth.php: call_hooks('logged_in', $a->user); include/oauth.php: Addon::callHooks('logged_in', $a->user);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks('contact_select_options', $x); include/acl_selectors.php: Addon::callHooks('contact_select_options', $x);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php call_hooks('acl_lookup_end', $results); include/acl_selectors.php Addon::callHooks('acl_lookup_end', $results);
include/notifier.php: call_hooks('notifier_normal',$target_item); include/notifier.php: Addon::callHooks('notifier_normal',$target_item);
include/notifier.php: call_hooks('notifier_end',$target_item); include/notifier.php: Addon::callHooks('notifier_end',$target_item);
include/items.php: call_hooks('atom_feed', $atom); include/items.php: Addon::callHooks('atom_feed', $atom);
include/items.php: call_hooks('atom_feed_end', $atom); include/items.php: Addon::callHooks('atom_feed_end', $atom);
include/items.php: call_hooks('atom_feed_end', $atom); include/items.php: Addon::callHooks('atom_feed_end', $atom);
include/items.php: call_hooks('parse_atom', $arr); include/items.php: Addon::callHooks('parse_atom', $arr);
include/items.php: call_hooks('post_remote',$arr); include/items.php: Addon::callHooks('post_remote',$arr);
include/items.php: call_hooks('atom_author', $o); include/items.php: Addon::callHooks('atom_author', $o);
include/items.php: call_hooks('atom_entry', $o); include/items.php: Addon::callHooks('atom_entry', $o);
include/bb2diaspora.php: call_hooks('bb2diaspora',$Text); include/bb2diaspora.php: Addon::callHooks('bb2diaspora',$Text);
include/cronhooks.php: call_hooks('cron', $d); include/cronhooks.php: Addon::callHooks('cron', $d);
include/security.php: call_hooks('logged_in', $a->user); include/security.php: Addon::callHooks('logged_in', $a->user);
include/html2bbcode.php: call_hooks('html2bbcode', $text); include/html2bbcode.php: Addon::callHooks('html2bbcode', $text);
include/Contact.php: call_hooks('remove_user',$r[0]); include/Contact.php: Addon::callHooks('remove_user',$r[0]);
include/Contact.php: call_hooks('contact_photo_menu', $args); include/Contact.php: Addon::callHooks('contact_photo_menu', $args);
include/conversation.php: call_hooks('conversation_start',$cb); include/conversation.php: Addon::callHooks('conversation_start',$cb);
include/conversation.php: call_hooks('render_location',$locate); include/conversation.php: Addon::callHooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr); include/conversation.php: Addon::callHooks('display_item', $arr);
include/conversation.php: call_hooks('render_location',$locate); include/conversation.php: Addon::callHooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr); include/conversation.php: Addon::callHooks('display_item', $arr);
include/conversation.php: call_hooks('item_photo_menu', $args); include/conversation.php: Addon::callHooks('item_photo_menu', $args);
include/conversation.php: call_hooks('jot_tool', $jotplugins); include/conversation.php: Addon::callHooks('jot_tool', $jotplugins);
include/conversation.php: call_hooks('jot_networks', $jotnets); include/conversation.php: Addon::callHooks('jot_networks', $jotnets);
include/plugin.php:if(! function_exists('call_hooks')) { index.php: Addon::callHooks('init_1');
include/plugin.php:function call_hooks($name, &$data = null) { index.php:Addon::callHooks('app_menu', $arr);
index.php: call_hooks('init_1'); index.php:Addon::callHooks('page_end', $a->page['content']);
index.php:call_hooks('app_menu', $arr); mod/photos.php: Addon::callHooks('photo_post_init', $_POST);
index.php:call_hooks('page_end', $a->page['content']); mod/photos.php: Addon::callHooks('photo_post_file',$ret);
mod/photos.php: call_hooks('photo_post_init', $_POST); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_file',$ret); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_post_end',intval($item_id));
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_upload_form',$ret);
mod/photos.php: call_hooks('photo_post_end',intval($item_id)); mod/friendica.php: Addon::callHooks('about_hook', $o);
mod/photos.php: call_hooks('photo_upload_form',$ret); mod/editpost.php: Addon::callHooks('jot_tool', $jotplugins);
mod/friendica.php: call_hooks('about_hook', $o); mod/editpost.php: Addon::callHooks('jot_networks', $jotnets);
mod/editpost.php: call_hooks('jot_tool', $jotplugins); mod/parse_url.php: Addon::callHooks('parse_link', $arr);
mod/editpost.php: call_hooks('jot_networks', $jotnets); mod/home.php: Addon::callHooks('home_init',$ret);
mod/parse_url.php: call_hooks('parse_link', $arr); mod/home.php: Addon::callHooks("home_content",$o);
mod/home.php: call_hooks('home_init',$ret); mod/contacts.php: Addon::callHooks('contact_edit_post', $_POST);
mod/home.php: call_hooks("home_content",$o); mod/contacts.php: Addon::callHooks('contact_edit', $arr);
mod/contacts.php: call_hooks('contact_edit_post', $_POST); mod/settings.php: Addon::callHooks('addon_settings_post', $_POST);
mod/contacts.php: call_hooks('contact_edit', $arr); mod/settings.php: Addon::callHooks('connector_settings_post', $_POST);
mod/settings.php: call_hooks('plugin_settings_post', $_POST); mod/settings.php: Addon::callHooks('settings_post', $_POST);
mod/settings.php: call_hooks('connector_settings_post', $_POST); mod/settings.php: Addon::callHooks('addon_settings', $settings_addons);
mod/settings.php: call_hooks('settings_post', $_POST); mod/settings.php: Addon::callHooks('connector_settings', $settings_connectors);
mod/settings.php: call_hooks('plugin_settings', $settings_addons); mod/settings.php: Addon::callHooks('settings_form',$o);
mod/settings.php: call_hooks('connector_settings', $settings_connectors); mod/register.php: Addon::callHooks('register_account', $newuid);
mod/settings.php: call_hooks('settings_form',$o); mod/like.php: Addon::callHooks('post_local_end', $arr);
mod/register.php: call_hooks('register_account', $newuid); mod/xrd.php: Addon::callHooks('personal_xrd', $arr);
mod/like.php: call_hooks('post_local_end', $arr); mod/item.php: Addon::callHooks('post_local_start', $_REQUEST);
mod/xrd.php: call_hooks('personal_xrd', $arr); mod/item.php: Addon::callHooks('post_local',$datarray);
mod/item.php: call_hooks('post_local_start', $_REQUEST); mod/item.php: Addon::callHooks('post_local_end', $datarray);
mod/item.php: call_hooks('post_local',$datarray); mod/profile.php: Addon::callHooks('profile_advanced',$o);
mod/item.php: call_hooks('post_local_end', $datarray); mod/profiles.php: Addon::callHooks('profile_post', $_POST);
mod/profile.php: call_hooks('profile_advanced',$o); mod/profiles.php: Addon::callHooks('profile_edit', $arr);
mod/profiles.php: call_hooks('profile_post', $_POST); mod/tagger.php: Addon::callHooks('post_local_end', $arr);
mod/profiles.php: call_hooks('profile_edit', $arr); mod/cb.php: Addon::callHooks('cb_init');
mod/tagger.php: call_hooks('post_local_end', $arr); mod/cb.php: Addon::callHooks('cb_post', $_POST);
mod/cb.php: call_hooks('cb_init'); mod/cb.php: Addon::callHooks('cb_afterpost');
mod/cb.php: call_hooks('cb_post', $_POST); mod/cb.php: Addon::callHooks('cb_content', $o);
mod/cb.php: call_hooks('cb_afterpost'); mod/directory.php: Addon::callHooks('directory_item', $arr);
mod/cb.php: call_hooks('cb_content', $o);
mod/directory.php: call_hooks('directory_item', $arr);

View file

@ -8,10 +8,10 @@ There are two possibilities to use chat on your friendica site
* IRC Chat * IRC Chat
* Jappix * Jappix
IRC-Chat Plugin IRC-Chat Addon
--- ---
After activating the plugin, you can find the chat at [yoursite.com/irc](../irc). After activating the addon, you can find the chat at [yoursite.com/irc](../irc).
Note: you can use this chat without any login at your site so that everyone could use it. Note: you can use this chat without any login at your site so that everyone could use it.
If you follow the link, you will see the login page of the IRC chat. If you follow the link, you will see the login page of the IRC chat.
@ -28,8 +28,8 @@ The lower part of the window contains an input field.
Jappix Mini Jappix Mini
--- ---
The Jappix Mini Plugin creates a chatbox for jabber- and XMPP-contacts. The Jappix Mini Addon creates a chatbox for jabber- and XMPP-contacts.
You should already have a jabber/XMPP-account before setting up the plugin. You should already have a jabber/XMPP-account before setting up the addon.
You can find more information at [jabber.org](http://www.jabber.org/). You can find more information at [jabber.org](http://www.jabber.org/).
You can use several servers to create an account: You can use several servers to create an account:
@ -48,15 +48,15 @@ Or you can download a tar archive here: [jappixmini.tgz](https://github.com/frie
Just unpack the file and rename the directory to „jappixmini“. Just unpack the file and rename the directory to „jappixmini“.
Next, upload this directory and the .tgz-file into your addon directory of your friendica installation. Next, upload this directory and the .tgz-file into your addon directory of your friendica installation.
Now you can activate the plugin globally on the admin pages. Now you can activate the addon globally on the admin pages.
In the plugin sidebar, you will find an entry of jappix now (where you can also find twitter, GNU Social and others). In the addon sidebar, you will find an entry of jappix now (where you can also find twitter, GNU Social and others).
The following page shows the settings of this plugin. The following page shows the settings of this addon.
Activate the BOSH proxy. Activate the BOSH proxy.
###2. Settings ###2. Settings
Go to your user account settings next and choose the plugin page. Go to your user account settings next and choose the addon page.
Scroll down until you find the Jappix Mini addon settings. Scroll down until you find the Jappix Mini addon settings.
At first you have to activate the addon. At first you have to activate the addon.

View file

@ -55,7 +55,7 @@ If you don't need to use any third-party library, then you don't need to use Com
#### Adding a third-party library to Friendica #### Adding a third-party library to Friendica
Does your shiny new [Plugin](help/Plugins) need to rely on a third-party library not required by Friendica yet? Does your shiny new [Addon](help/Addons) need to rely on a third-party library not required by Friendica yet?
First of all, this library should be available on [Packagist](https://packagist.org) so that Composer knows how to fetch it directly just by mentioning its name in `composer.json`. First of all, this library should be available on [Packagist](https://packagist.org) so that Composer knows how to fetch it directly just by mentioning its name in `composer.json`.
This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version. This file is the configuration of Friendica for Composer. It lists details about the Friendica project, but also a list of required dependencies and their target version.

View file

@ -87,7 +87,7 @@ Blocked contacts cannot do this. They cannot communicate with you directly, only
However we do not import their posts or private messages to you. However we do not import their posts or private messages to you.
Like blocking, you will still see this person's comments to posts made by your friends. Like blocking, you will still see this person's comments to posts made by your friends.
A plugin called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including his/her conversations with your other friends. An addon called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including his/her conversations with your other friends.
An **archived contact** means that communication is not possible and will not be attempted. An **archived contact** means that communication is not possible and will not be attempted.
(Perhaps the person moved to a new site and removed the old profile.) (Perhaps the person moved to a new site and removed the old profile.)

View file

@ -43,7 +43,7 @@ Friendica Documentation and Resources
* [Help on Vagrant](help/Vagrant) * [Help on Vagrant](help/Vagrant)
* [Bugs and Issues](help/Bugs-and-Issues) * [Bugs and Issues](help/Bugs-and-Issues)
* Code structure * Code structure
* [Plugin Development](help/Plugins) * [Addon Development](help/Addons)
* [Theme Development](help/themes) * [Theme Development](help/themes)
* [Smarty 3 Templates](help/smarty3-templates) * [Smarty 3 Templates](help/smarty3-templates)
* How To * How To

View file

@ -22,16 +22,16 @@ If you have many OStatus contacts then completing of conversations can take some
When using MyISAM (default) or InnoDB on MariaDB 10 this speeds up search. When using MyISAM (default) or InnoDB on MariaDB 10 this speeds up search.
Plugins Addons
-------- --------
Active the following plugins: Active the following addons:
rendertime rendertime
###rendertime ###rendertime
This plugin doesn't speed up your system. This addon doesn't speed up your system.
It helps to analyze your bottlenecks. It helps to analyze your bottlenecks.
When enabled you see some values at the bottom of every page. When enabled you see some values at the bottom of every page.

View file

@ -4,28 +4,28 @@ Installing Connectors (Twitter/GNU Social)
* [Home](help) * [Home](help)
Friendica uses plugins to provide connectivity to some networks, such as Twitter or App.net. Friendica uses addons to provide connectivity to some networks, such as Twitter or App.net.
There is also a plugin to post through to an existing account on a GNU Social service. There is also a addon to post through to an existing account on a GNU Social service.
You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general. You only need this to post to an already existing GNU Social account, but not to communicate with GNU Social members in general.
All three plugins require an account on the target network. All three addons require an account on the target network.
In addition you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server. In addition you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.
Site Configuration Site Configuration
--- ---
Plugins must be installed by the site administrator before they can be used. Addons must be installed by the site administrator before they can be used.
This is accomplished through the site administration panel. This is accomplished through the site administration panel.
Each of the connectors also requires an "API key" from the service you wish to connect with. Each of the connectors also requires an "API key" from the service you wish to connect with.
Some plugins allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (.htconfig.php). Some addons allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (.htconfig.php).
The ways to obtain these keys vary between the services, but they all require an existing account on the target service. The ways to obtain these keys vary between the services, but they all require an existing account on the target service.
Once installed, these API keys can usually be shared by all site members. Once installed, these API keys can usually be shared by all site members.
The details of configuring each service follow (much of this information comes directly from the plugin source files): The details of configuring each service follow (much of this information comes directly from the addon source files):
Twitter Plugin for Friendica Twitter Addon for Friendica
--- ---
* Author: Tobias Diekershoff * Author: Tobias Diekershoff
@ -33,7 +33,7 @@ Twitter Plugin for Friendica
* License: 3-clause BSD license * License: 3-clause BSD license
###Configuration ###Configuration
To use this plugin you need a OAuth Consumer key pair (key & secret). To use this addon you need a OAuth Consumer key pair (key & secret).
You can get it from [Twitter](https://twitter.com/apps). You can get it from [Twitter](https://twitter.com/apps).
Register your Friendica site as "Client" application with "Read & Write" access. Register your Friendica site as "Client" application with "Read & Write" access.
@ -51,7 +51,7 @@ After this, your users can configure their Twitter account settings from "Settin
Find the author's documentation here: [http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin](http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin) Find the author's documentation here: [http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin](http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin)
GNU Social Plugin for Friendica GNU Social Addon for Friendica
--- ---
* Author: Tobias Diekershoff * Author: Tobias Diekershoff

View file

@ -14,7 +14,7 @@ These worker tasks are prioritised and are done accordingly.
Then you get an overview of the accounts on your node, which can be moderated in the "Users" section of the panel. Then you get an overview of the accounts on your node, which can be moderated in the "Users" section of the panel.
As well as an overview of the currently active addons As well as an overview of the currently active addons
The list is linked, so you can have quick access to the plugin settings. The list is linked, so you can have quick access to the Addon settings.
And finally you are informed about the version of Friendica you have installed. And finally you are informed about the version of Friendica you have installed.
If you contact the devs with a bug or problem, please also mention the version of your node. If you contact the devs with a bug or problem, please also mention the version of your node.
@ -205,7 +205,7 @@ Here the admin can also block/unblock users from accessing the node or delete th
In the last section of the page admins can create new accounts on the node. In the last section of the page admins can create new accounts on the node.
The password for the new account will be send by email to the choosen email address. The password for the new account will be send by email to the choosen email address.
## Plugins ## Addons
This page is for selecting and configuration of extensions for Friendica which have to be placed into the `/addon` subdirectory of your Friendica installation. This page is for selecting and configuration of extensions for Friendica which have to be placed into the `/addon` subdirectory of your Friendica installation.
You are presented with a long list of available addons. You are presented with a long list of available addons.
@ -213,11 +213,11 @@ The name of each addon is linked to a separate page for that addon which offers
Also shown is the version of the addon and an indicator if the addon is currently active or not. Also shown is the version of the addon and an indicator if the addon is currently active or not.
When you update your node and the addons they may have to be reloaded. When you update your node and the addons they may have to be reloaded.
To simplify this process there is a button at the top of the page to reload all active plugins. To simplify this process there is a button at the top of the page to reload all active Addons.
## Themes ## Themes
The Themes section of the admin panel works similar to the Plugins section but let you control the themes on your Friendica node. The Themes section of the admin panel works similar to the Addons section but let you control the themes on your Friendica node.
Each theme has a dedicated subpage showing the current status, some information about the theme and a screen-shot of the Friendica interface using the theme. Each theme has a dedicated subpage showing the current status, some information about the theme and a screen-shot of the Friendica interface using the theme.
Should the theme offer special settings, admins can set a global default value here. Should the theme offer special settings, admins can set a global default value here.
@ -266,7 +266,7 @@ To do so, they need to know the GUID of the posting.
This can be found on the `/display` page of the posting, it is the last part of the URL displayed in the browsers navigation bar. This can be found on the `/display` page of the posting, it is the last part of the URL displayed in the browsers navigation bar.
You can get to the `/display` page by following the *Link to source*. You can get to the `/display` page by following the *Link to source*.
## Plugin Features ## Addon Features
Some of the addons you can install for your Friendica node have settings which have to be set by the admin. Some of the addons you can install for your Friendica node have settings which have to be set by the admin.
All those addons will be listed in this area of the admin panels side bar with their names. All those addons will be listed in this area of the admin panels side bar with their names.

View file

@ -5,7 +5,7 @@ Database Tables
| Table | Description | | Table | Description |
|------------------------------------------------------|--------------------------------------------------| |------------------------------------------------------|--------------------------------------------------|
| [addon](help/database/db_addon) | registered plugins | | [addon](help/database/db_addon) | registered addons |
| [attach](help/database/db_attach) | file attachments | | [attach](help/database/db_attach) | file attachments |
| [auth_codes](help/database/db_auth_codes) | OAuth usage | | [auth_codes](help/database/db_auth_codes) | OAuth usage |
| [cache](help/database/db_cache) | OEmbed cache | | [cache](help/database/db_cache) | OEmbed cache |
@ -24,7 +24,7 @@ Database Tables
| [group](help/database/db_group) | privacy groups, group info | | [group](help/database/db_group) | privacy groups, group info |
| [group_member](help/database/db_group_member) | privacy groups, member info | | [group_member](help/database/db_group_member) | privacy groups, member info |
| [gserver](help/database/db_gserver) | | | [gserver](help/database/db_gserver) | |
| [hook](help/database/db_hook) | plugin hook registry | | [hook](help/database/db_hook) | addon hook registry |
| [intro](help/database/db_intro) | | | [intro](help/database/db_intro) | |
| [item](help/database/db_item) | all posts | | [item](help/database/db_item) | all posts |
| [locks](help/database/db_locks) | | | [locks](help/database/db_locks) | |

View file

@ -4,7 +4,7 @@ Table addon
| Field | Description | Type | Null | Key | Default | Extra | | Field | Description | Type | Null | Key | Default | Extra |
| ------------- | --------------------------------------------- | ---------- | ---- | --- | ------- | --------------- | | ------------- | --------------------------------------------- | ---------- | ---- | --- | ------- | --------------- |
| id | | int(11) | NO | PRI | NULL | auto_increment | | id | | int(11) | NO | PRI | NULL | auto_increment |
| name | plugin base (file)name | char(255) | NO | | | | | name | addon base (file)name | char(255) | NO | | | |
| version | currently unused | char(255) | NO | | | | | version | currently unused | char(255) | NO | | | |
| installed | currently always 1 | tinyint(1) | NO | | 0 | | | installed | currently always 1 | tinyint(1) | NO | | 0 | |
| hidden | currently unused | tinyint(1) | NO | | 0 | | | hidden | currently unused | tinyint(1) | NO | | 0 | |
@ -12,6 +12,6 @@ Table addon
| plugin_admin | 1 = has admin config, 0 = has no admin config | tinyint(1) | NO | | 0 | | | plugin_admin | 1 = has admin config, 0 = has no admin config | tinyint(1) | NO | | 0 | |
Notes: Notes:
These are addons which have been enabled by the site administrator on the admin/plugin page These are addons which have been enabled by the site administrator on the addon page
Return to [database documentation](help/database) Return to [database documentation](help/database)

View file

@ -1,4 +1,4 @@
Friendica Addon/Plugin-Entwicklung Friendica Addon/Entwicklung
============== ==============
* [Zur Startseite der Hilfe](help) * [Zur Startseite der Hilfe](help)
@ -8,30 +8,30 @@ Das Facebook-Addon bietet ein Beispiel dafür, die "addon"- und "module"-Funktio
Addons arbeiten, indem sie Event Hooks abfangen. Addons arbeiten, indem sie Event Hooks abfangen.
Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden. Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden.
Plugin-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt. Addon-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt.
Du kannst einen lesbaren Namen im Kommentarblock eintragen. Du kannst einen lesbaren Namen im Kommentarblock eintragen.
Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-/Plugin-Namen basieren; z.B. "plugin1name_install()". Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-Namen basieren; z.B. "addon1name_install()".
Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Plugin benötigt. Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Addon benötigt.
Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Plugin nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen. Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Addon nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen.
Zukünftige Extensions werden möglicherweise "Setup" und "Entfernen" anbieten. Zukünftige Extensions werden möglicherweise "Setup" und "Entfernen" anbieten.
Plugins sollten einen Kommentarblock mit den folgenden vier Parametern enthalten: Addons sollten einen Kommentarblock mit den folgenden vier Parametern enthalten:
/* /*
* Name: My Great Plugin * Name: My Great Addon
* Description: This is what my plugin does. It's really cool. * Description: This is what my addon does. It's really cool.
* Version: 1.0 * Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com> * Author: John Q. Public <john@myfriendicasite.com>
*/ */
Registriere deine Plugin-Hooks während der Installation. Registriere deine Addon-Hooks während der Installation.
register_hook($hookname, $file, $function); Addon::registerHook($hookname, $file, $function);
$hookname ist ein String und entspricht einem bekannten Friendica-Hook. $hookname ist ein String und entspricht einem bekannten Friendica-Hook.
$file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt. $file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt.
Das *sollte* "addon/plugin_name/plugin_name.php' sein. Das *sollte* "addon/addon_name/addon_name.php' sein.
$function ist ein String und der Name der Funktion, die ausgeführt wird, wenn der Hook aufgerufen wird. $function ist ein String und der Name der Funktion, die ausgeführt wird, wenn der Hook aufgerufen wird.
@ -57,19 +57,19 @@ Achte darauf, diese mit "&" zu deklarieren, wenn du sie bearbeiten willst.
Module Module
--- ---
Plugins/Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen. Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen.
Um ein Plugin als Modul zu nutzen, ist es nötig, die Funktion "plugin_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss. Um ein Addon als Modul zu nutzen, ist es nötig, die Funktion "addon_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss.
Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://example.com/plugin_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente. Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://example.com/addon_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente.
Diese werden in ein Array $a->argv geparst und stimmen mit $a->argc überein, wobei sie die Anzahl der URL-Komponenten abbilden. Diese werden in ein Array $a->argv geparst und stimmen mit $a->argc überein, wobei sie die Anzahl der URL-Komponenten abbilden.
So würde http://example.com/plugin/arg1/arg2 nach einem Modul "plugin" suchen und seiner Modulfunktion die $a-App-Strukur übergeben (dies ist für viele Komponenten verfügbar). Das umfasst: So würde http://example.com/addon/arg1/arg2 nach einem Modul "addon" suchen und seiner Modulfunktion die $a-App-Strukur übergeben (dies ist für viele Komponenten verfügbar). Das umfasst:
$a->argc = 3 $a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2'); $a->argv = array(0 => 'addon', 1 => 'arg1', 2 => 'arg2');
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(App $a), welche den Seiteninhalt definiert und zurückgibt. Deine Modulfunktionen umfassen oft die Funktion addon_name_content(App $a), welche den Seiteninhalt definiert und zurückgibt.
Sie können auch plugin_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt. Sie können auch addon_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
Du kannst ebenso plugin_name_init(App $a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert. Du kannst ebenso addon_name_init(App $a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
Derzeitige Hooks Derzeitige Hooks
@ -109,10 +109,10 @@ Derzeitige Hooks
**'settings_post'** - wird aufgerufen, wenn die Einstellungsseiten geladen werden. **'settings_post'** - wird aufgerufen, wenn die Einstellungsseiten geladen werden.
$b ist der $_POST-Array $b ist der $_POST-Array
**'plugin_settings'** - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird. **'addon_settings'** - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird.
$b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen "</form>"-Tag. $b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen "</form>"-Tag.
**'plugin_settings_post'** - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird. **'addon_settings_post'** - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird.
$b ist der $_POST-Array $b ist der $_POST-Array
**'profile_post'** - wird aufgerufen, wenn die Profilseite angezeigt wird. **'profile_post'** - wird aufgerufen, wenn die Profilseite angezeigt wird.
@ -191,180 +191,176 @@ Komplette Liste der Hook-Callbacks
Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 14-Feb-2012 generiert): Bitte schau in die Quellcodes für Details zu Hooks, die oben nicht dokumentiert sind. Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 14-Feb-2012 generiert): Bitte schau in die Quellcodes für Details zu Hooks, die oben nicht dokumentiert sind.
boot.php: call_hooks('login_hook',$o); boot.php: Addon::callHooks('login_hook',$o);
boot.php: call_hooks('profile_sidebar_enter', $profile); boot.php: Addon::callHooks('profile_sidebar_enter', $profile);
boot.php: call_hooks('profile_sidebar', $arr); boot.php: Addon::callHooks('profile_sidebar', $arr);
boot.php: call_hooks("proc_run", $arr); boot.php: Addon::callHooks("proc_run", $arr);
include/contact_selectors.php: call_hooks('network_to_name', $nets); include/contact_selectors.php: Addon::callHooks('network_to_name', $nets);
include/api.php: call_hooks('logged_in', $a->user); include/api.php: Addon::callHooks('logged_in', $a->user);
include/api.php: call_hooks('logged_in', $a->user); include/api.php: Addon::callHooks('logged_in', $a->user);
include/queue.php: call_hooks('queue_predeliver', $a, $r); include/queue.php: Addon::callHooks('queue_predeliver', $a, $r);
include/queue.php: call_hooks('queue_deliver', $a, $params); include/queue.php: Addon::callHooks('queue_deliver', $a, $params);
include/text.php: call_hooks('contact_block_end', $arr); include/text.php: Addon::callHooks('contact_block_end', $arr);
include/text.php: call_hooks('smilie', $s); include/text.php: Addon::callHooks('smilie', $s);
include/text.php: call_hooks('prepare_body_init', $item); include/text.php: Addon::callHooks('prepare_body_init', $item);
include/text.php: call_hooks('prepare_body', $prep_arr); include/text.php: Addon::callHooks('prepare_body', $prep_arr);
include/text.php: call_hooks('prepare_body_final', $prep_arr); include/text.php: Addon::callHooks('prepare_body_final', $prep_arr);
include/nav.php: call_hooks('page_header', $a->page['nav']); include/nav.php: Addon::callHooks('page_header', $a->page['nav']);
include/auth.php: call_hooks('authenticate', $addon_auth); include/auth.php: Addon::callHooks('authenticate', $addon_auth);
include/bbcode.php: call_hooks('bbcode',$Text); include/bbcode.php: Addon::callHooks('bbcode',$Text);
include/oauth.php: call_hooks('logged_in', $a->user); include/oauth.php: Addon::callHooks('logged_in', $a->user);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks('contact_select_options', $x); include/acl_selectors.php: Addon::callHooks('contact_select_options', $x);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr); include/acl_selectors.php: Addon::callHooks($a->module . '_pre_' . $selname, $arr);
include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o); include/acl_selectors.php: Addon::callHooks($a->module . '_post_' . $selname, $o);
include/notifier.php: call_hooks('notifier_normal',$target_item); include/notifier.php: Addon::callHooks('notifier_normal',$target_item);
include/notifier.php: call_hooks('notifier_end',$target_item); include/notifier.php: Addon::callHooks('notifier_end',$target_item);
include/items.php: call_hooks('atom_feed', $atom); include/items.php: Addon::callHooks('atom_feed', $atom);
include/items.php: call_hooks('atom_feed_end', $atom); include/items.php: Addon::callHooks('atom_feed_end', $atom);
include/items.php: call_hooks('atom_feed_end', $atom); include/items.php: Addon::callHooks('atom_feed_end', $atom);
include/items.php: call_hooks('parse_atom', $arr); include/items.php: Addon::callHooks('parse_atom', $arr);
include/items.php: call_hooks('post_remote',$arr); include/items.php: Addon::callHooks('post_remote',$arr);
include/items.php: call_hooks('atom_author', $o); include/items.php: Addon::callHooks('atom_author', $o);
include/items.php: call_hooks('atom_entry', $o); include/items.php: Addon::callHooks('atom_entry', $o);
include/bb2diaspora.php: call_hooks('bb2diaspora',$Text); include/bb2diaspora.php: Addon::callHooks('bb2diaspora',$Text);
include/cronhooks.php: call_hooks('cron', $d); include/cronhooks.php: Addon::callHooks('cron', $d);
include/security.php: call_hooks('logged_in', $a->user); include/security.php: Addon::callHooks('logged_in', $a->user);
include/html2bbcode.php: call_hooks('html2bbcode', $text); include/html2bbcode.php: Addon::callHooks('html2bbcode', $text);
include/Contact.php: call_hooks('remove_user',$r[0]); include/Contact.php: Addon::callHooks('remove_user',$r[0]);
include/Contact.php: call_hooks('contact_photo_menu', $args); include/Contact.php: Addon::callHooks('contact_photo_menu', $args);
include/conversation.php: call_hooks('conversation_start',$cb); include/conversation.php: Addon::callHooks('conversation_start',$cb);
include/conversation.php: call_hooks('render_location',$locate); include/conversation.php: Addon::callHooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr); include/conversation.php: Addon::callHooks('display_item', $arr);
include/conversation.php: call_hooks('render_location',$locate); include/conversation.php: Addon::callHooks('render_location',$locate);
include/conversation.php: call_hooks('display_item', $arr); include/conversation.php: Addon::callHooks('display_item', $arr);
include/conversation.php: call_hooks('item_photo_menu', $args); include/conversation.php: Addon::callHooks('item_photo_menu', $args);
include/conversation.php: call_hooks('jot_tool', $jotplugins); include/conversation.php: Addon::callHooks('jot_tool', $jotplugins);
include/conversation.php: call_hooks('jot_networks', $jotnets); include/conversation.php: Addon::callHooks('jot_networks', $jotnets);
include/plugin.php: if(! function_exists('call_hooks')) { index.php: Addon::callHooks('init_1');
include/plugin.php:function call_hooks($name, &$data = null) { index.php: Addon::callHooks('app_menu', $arr);
index.php: call_hooks('init_1'); index.php: Addon::callHooks('page_end', $a->page['content']);
index.php: call_hooks('app_menu', $arr); mod/photos.php: Addon::callHooks('photo_post_init', $_POST);
index.php: call_hooks('page_end', $a->page['content']); mod/photos.php: Addon::callHooks('photo_post_file',$ret);
mod/photos.php: call_hooks('photo_post_init', $_POST); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_file',$ret); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_post_end',$foo);
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_post_end',intval($item_id));
mod/photos.php: call_hooks('photo_post_end',$foo); mod/photos.php: Addon::callHooks('photo_upload_form',$ret);
mod/photos.php: call_hooks('photo_post_end',intval($item_id)); mod/friendica.php: Addon::callHooks('about_hook', $o);
mod/photos.php: call_hooks('photo_upload_form',$ret); mod/editpost.php: Addon::callHooks('jot_tool', $jotplugins);
mod/friendica.php: call_hooks('about_hook', $o); mod/editpost.php: Addon::callHooks('jot_networks', $jotnets);
mod/editpost.php: call_hooks('jot_tool', $jotplugins); mod/parse_url.php: Addon::callHooks('parse_link', $arr);
mod/editpost.php: call_hooks('jot_networks', $jotnets); mod/home.php: Addon::callHooks('home_init',$ret);
mod/parse_url.php: call_hooks('parse_link', $arr); mod/home.php: Addon::callHooks("home_content",$o);
mod/home.php: call_hooks('home_init',$ret); mod/contacts.php: Addon::callHooks('contact_edit_post', $_POST);
mod/home.php: call_hooks("home_content",$o); mod/contacts.php: Addon::callHooks('contact_edit', $arr);
mod/contacts.php: call_hooks('contact_edit_post', $_POST); mod/settings.php: Addon::callHooks('addon_settings_post', $_POST);
mod/contacts.php: call_hooks('contact_edit', $arr); mod/settings.php: Addon::callHooks('connector_settings_post', $_POST);
mod/settings.php: call_hooks('plugin_settings_post', $_POST); mod/settings.php: Addon::callHooks('settings_post', $_POST);
mod/settings.php: call_hooks('connector_settings_post', $_POST); mod/settings.php: Addon::callHooks('addon_settings', $settings_addons);
mod/settings.php: call_hooks('settings_post', $_POST); mod/settings.php: Addon::callHooks('connector_settings', $settings_connectors);
mod/settings.php: call_hooks('plugin_settings', $settings_addons); mod/settings.php: Addon::callHooks('settings_form',$o);
mod/settings.php: call_hooks('connector_settings', $settings_connectors); mod/register.php: Addon::callHooks('register_account', $newuid);
mod/settings.php: call_hooks('settings_form',$o); mod/like.php: Addon::callHooks('post_local_end', $arr);
mod/register.php: call_hooks('register_account', $newuid); mod/xrd.php: Addon::callHooks('personal_xrd', $arr);
mod/like.php: call_hooks('post_local_end', $arr); mod/item.php: Addon::callHooks('post_local_start', $_REQUEST);
mod/xrd.php: call_hooks('personal_xrd', $arr); mod/item.php: Addon::callHooks('post_local',$datarray);
mod/item.php: call_hooks('post_local_start', $_REQUEST); mod/item.php: Addon::callHooks('post_local_end', $datarray);
mod/item.php: call_hooks('post_local',$datarray); mod/profile.php: Addon::callHooks('profile_advanced',$o);
mod/item.php: call_hooks('post_local_end', $datarray); mod/profiles.php: Addon::callHooks('profile_post', $_POST);
mod/profile.php: call_hooks('profile_advanced',$o); mod/profiles.php: Addon::callHooks('profile_edit', $arr);
mod/profiles.php: call_hooks('profile_post', $_POST); mod/tagger.php: Addon::callHooks('post_local_end', $arr);
mod/profiles.php: call_hooks('profile_edit', $arr); mod/cb.php: Addon::callHooks('cb_init');
mod/tagger.php: call_hooks('post_local_end', $arr); mod/cb.php: Addon::callHooks('cb_post', $_POST);
mod/cb.php: call_hooks('cb_init'); mod/cb.php: Addon::callHooks('cb_afterpost');
mod/cb.php: call_hooks('cb_post', $_POST); mod/cb.php: Addon::callHooks('cb_content', $o);
mod/cb.php: call_hooks('cb_afterpost'); mod/directory.php: Addon::callHooks('directory_item', $arr);
mod/cb.php: call_hooks('cb_content', $o);
mod/directory.php: call_hooks('directory_item', $arr);

View file

@ -8,9 +8,9 @@ Du hast derzeit zwei Möglichkeiten, einen Chat auf Deiner Friendica-Seite zu be
* IRC - Internet Relay Chat * IRC - Internet Relay Chat
* Jappix * Jappix
##IRC Plugin ##IRC Addon
Sobald das Plugin aktiviert ist, kannst Du den Chat unter [deineSeite.de/irc](../irc) finden. Sobald das Addon aktiviert ist, kannst Du den Chat unter [deineSeite.de/irc](../irc) finden.
Beachte aber, dass dieser Chat auch ohne Anmeldung auf Deiner Seite zugänglich ist und somit auch Fremde diesen Chat mitnutzen können. Beachte aber, dass dieser Chat auch ohne Anmeldung auf Deiner Seite zugänglich ist und somit auch Fremde diesen Chat mitnutzen können.
Wenn Du dem Link folgst, dann kommst Du zum Anmeldefenster des IR-Chats. Wenn Du dem Link folgst, dann kommst Du zum Anmeldefenster des IR-Chats.
@ -29,7 +29,7 @@ Weiter Informationen zu IRC findest Du zum Beispiel auf <a href="http://wiki.ubu
##Jappix Mini ##Jappix Mini
Das Jappix Mini Plugin erlaubt das Erstellen einer Chatbox für Jabber/XMPP-Kontakte. Das Jappix Mini Addon erlaubt das Erstellen einer Chatbox für Jabber/XMPP-Kontakte.
Ein Jabber/XMPP Account sollte vor der Installation bereits vorhanden sein. Ein Jabber/XMPP Account sollte vor der Installation bereits vorhanden sein.
Die ausführliche Anleitung dazu und eine Kontrolle, ob Du nicht sogar schon über Deinen E-Mail Anbieter einen Jabber-Account hast, findest Du unter <a href="http://einfachjabber.de" target="_blank">einfachjabber.de</a>. Die ausführliche Anleitung dazu und eine Kontrolle, ob Du nicht sogar schon über Deinen E-Mail Anbieter einen Jabber-Account hast, findest Du unter <a href="http://einfachjabber.de" target="_blank">einfachjabber.de</a>.
@ -53,15 +53,15 @@ oder als normaler Download von hier: https://github.com/friendica/friendica-addo
Entpacke diese Datei (ggf. den entpackten Ordner in „jappixmini“ umbenennen) und lade sowohl den entpackten Ordner komplett als auch die .tgz Datei in den Addon Ordner Deiner Friendica Installation hoch. Entpacke diese Datei (ggf. den entpackten Ordner in „jappixmini“ umbenennen) und lade sowohl den entpackten Ordner komplett als auch die .tgz Datei in den Addon Ordner Deiner Friendica Installation hoch.
Nach dem Upload gehts in den Friendica Adminbereich und dort zu den Plugins. Nach dem Upload gehts in den Friendica Adminbereich und dort zu den Addons.
Aktiviere das Jappixmini Addon und gehe anschließend über die Plugins Seitenleiste (dort wo auch die Twitter-, Impressums-, GNU Social-, usw. Einstellungen gemacht werden) zu den Jappix Grundeinstellungen. Aktiviere das Jappixmini Addon und gehe anschließend über die Addons Seitenleiste (dort wo auch die Twitter-, Impressums-, GNU Social-, usw. Einstellungen gemacht werden) zu den Jappix Grundeinstellungen.
Setze hier den Haken zur Aktivierung des BOSH Proxys. Setze hier den Haken zur Aktivierung des BOSH Proxys.
Weiter gehts in den Einstellungen Deines Friendica Accounts. Weiter gehts in den Einstellungen Deines Friendica Accounts.
2. Einstellungen 2. Einstellungen
Gehe bitte zu den Plugin-Einstellungen in Deinen Konto-Einstellungen (Account Settings). Gehe bitte zu den Addon-Einstellungen in Deinen Konto-Einstellungen (Account Settings).
Scrolle ein Stück hinunter bis zu den Jappix Mini Addon settings. Scrolle ein Stück hinunter bis zu den Jappix Mini Addon settings.
Aktiviere hier zuerst das Addon. Aktiviere hier zuerst das Addon.

View file

@ -104,7 +104,7 @@ Ignorierte Kontakte können weiterhin Beiträge und private Nachrichten von Dir
Deren Beiträge und private Nachrichten werden allerdings nicht importiert. Deren Beiträge und private Nachrichten werden allerdings nicht importiert.
Wie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde. Wie bei blockierten Beiträgen siehst Du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen Deiner Freunde.
[Ein Plugin namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen. [Ein Erweiterung namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in Deinem Stream zu verstecken bzw. zu verkürzen.
Dabei werden auch Kommentare dieser Person in Beiträgen Deiner Freunde blockiert.] Dabei werden auch Kommentare dieser Person in Beiträgen Deiner Freunde blockiert.]
Ein archivierter Kontakt bedeutet, dass Kommunikation nicht möglich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gelöscht hat). Ein archivierter Kontakt bedeutet, dass Kommunikation nicht möglich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einem neuen Server gewechselt ist und das alte Profil gelöscht hat).

View file

@ -30,7 +30,7 @@ Friendica - Dokumentation und Ressourcen
* [Installation](help/Install) * [Installation](help/Install)
* [Update](help/Update) (EN) * [Update](help/Update) (EN)
* [Konfigurationen & Admin-Panel](help/Settings) * [Konfigurationen & Admin-Panel](help/Settings)
* [Plugins](help/Plugins) * [Addons](help/Addons)
* [Konnektoren (Connectors) installieren (Twitter/GNU Social)](help/Installing-Connectors) * [Konnektoren (Connectors) installieren (Twitter/GNU Social)](help/Installing-Connectors)
* [Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten](help/install-ejabberd) (EN) * [Installation eines ejabberd Servers (XMPP-Chat) mit synchronisierten Anmeldedaten](help/install-ejabberd) (EN)
* [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL) * [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL)
@ -45,7 +45,7 @@ Friendica - Dokumentation und Ressourcen
* [Help on Vagrant](help/Vagrant) * [Help on Vagrant](help/Vagrant)
* [How to translate Friendica](help/translations) (EN) * [How to translate Friendica](help/translations) (EN)
* [Bugs and Issues](help/Bugs-and-Issues) * [Bugs and Issues](help/Bugs-and-Issues)
* [Plugin Development](help/Plugins) * [Addon Development](help/Addons)
* [Theme Development](help/themes) * [Theme Development](help/themes)
* [Smarty 3 Templates](help/smarty3-templates) * [Smarty 3 Templates](help/smarty3-templates)
* [Protokoll Dokumentation](help/Protocol) (EN) * [Protokoll Dokumentation](help/Protocol) (EN)

View file

@ -28,10 +28,10 @@ Der Nachteil: Du siehst nicht jede Antwort einer OStatus-Unterhaltung. Aus diese
Wenn du MyISAM (Standardeinstellung) oder InnoDB mit MariaDB 10 nutzt, dann beschleunigt dies die Suche. Wenn du MyISAM (Standardeinstellung) oder InnoDB mit MariaDB 10 nutzt, dann beschleunigt dies die Suche.
Plugins Addons
-------- --------
Aktiviere die folgenden Plugins: Aktiviere die folgenden Addons:
rendertime rendertime
@ -39,7 +39,7 @@ Aktiviere die folgenden Plugins:
**Beschreibung** **Beschreibung**
Dieses Plugin beschleunigt dein System nicht, aber es hilft dabei, die Flaschenhälse zu ermitteln. Dieses Addon beschleunigt dein System nicht, aber es hilft dabei, die Flaschenhälse zu ermitteln.
Wenn es aktiviert ist, dann siehst du Werte wie die folgenden auf jeder deiner Seiten: Wenn es aktiviert ist, dann siehst du Werte wie die folgenden auf jeder deiner Seiten:

View file

@ -3,29 +3,29 @@ Konnektoren installieren (Twitter/GNU Social)
* [Zur Startseite der Hilfe](help) * [Zur Startseite der Hilfe](help)
Friendica nutzt Plugins, um die Verbindung zu anderen Netzwerken wie Twitter oder App.net zu gewährleisten. Friendica nutzt Erweiterung, um die Verbindung zu anderen Netzwerken wie Twitter oder App.net zu gewährleisten.
Es gibt außerdem ein Plugin, um über einen bestehenden GNU Social-Account diesen Service zu nutzen. Es gibt außerdem ein Erweiterung, um über einen bestehenden GNU Social-Account diesen Service zu nutzen.
Du brauchst dieses Plugin aber nicht, um mit GNU Social-Mitgliedern von Friendica aus zu kommunizieren - es sei denn, du wünschst es, über einen existierenden Account einen Beitrag zu schreiben. Du brauchst dieses Erweiterung aber nicht, um mit GNU Social-Mitgliedern von Friendica aus zu kommunizieren - es sei denn, du wünschst es, über einen existierenden Account einen Beitrag zu schreiben.
Alle drei Plugins benötigen einen Account im gewünschten Netzwerk. Alle drei Erweiterung benötigen einen Account im gewünschten Netzwerk.
Zusätzlich musst du (bzw. der Administrator der Seite) einen API-Schlüssel holen, um einen authentifizierten Zugriff zu deinem Friendica-Server herstellen zu lassen. Zusätzlich musst du (bzw. der Administrator der Seite) einen API-Schlüssel holen, um einen authentifizierten Zugriff zu deinem Friendica-Server herstellen zu lassen.
**Seitenkonfiguration** **Seitenkonfiguration**
Plugins müssen vom Administrator installiert werden, bevor sie genutzt werden können. Erweiterung müssen vom Administrator installiert werden, bevor sie genutzt werden können.
Dieses kann über das Administrationsmenü erstellt werden. Dieses kann über das Administrationsmenü erstellt werden.
Jeder der Konnektoren benötigt zudem einen API-Schlüssel vom Service, der verbunden werden soll. Jeder der Konnektoren benötigt zudem einen API-Schlüssel vom Service, der verbunden werden soll.
Einige Plugins erlaube es, diese Informationen auf den Administrationsseiten einzustellen, wohingegen andere eine direkte Bearbeitung der Konfigurationsdatei ".htconfig.php" erfordern. Einige Erweiterung erlaube es, diese Informationen auf den Administrationsseiten einzustellen, wohingegen andere eine direkte Bearbeitung der Konfigurationsdatei ".htconfig.php" erfordern.
Der Weg, um diese Schlüssel zu erhalten, variiert stark, jedoch brauchen fast alle einen bestehenden Account im gewünschten Service. Der Weg, um diese Schlüssel zu erhalten, variiert stark, jedoch brauchen fast alle einen bestehenden Account im gewünschten Service.
Einmal installiert, können diese Schlüssel von allen Seitennutzern genutzt werden. Einmal installiert, können diese Schlüssel von allen Seitennutzern genutzt werden.
Im Folgenden findest du die Einstellungen für die verschiedenen Services (viele dieser Informationen kommen direkt aus den Quelldateien der Plugins): Im Folgenden findest du die Einstellungen für die verschiedenen Services (viele dieser Informationen kommen direkt aus den Quelldateien der Erweiterung):
**Twitter Plugin für Friendica** **Twitter Erweiterung für Friendica**
* Author: Tobias Diekershoff * Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net * tobias.diekershoff@gmx.net
@ -33,7 +33,7 @@ Im Folgenden findest du die Einstellungen für die verschiedenen Services (viele
* License:3-clause BSD license * License:3-clause BSD license
Konfiguration: Konfiguration:
Um dieses Plugin zu nutzen, benötigst du einen OAuth Consumer-Schlüsselpaar (Schlüssel und Geheimnis), das du auf der Seite [https://twitter.com/apps](https://twitter.com/apps) erhalten kannst Um dieses Erweiterung zu nutzen, benötigst du einen OAuth Consumer-Schlüsselpaar (Schlüssel und Geheimnis), das du auf der Seite [https://twitter.com/apps](https://twitter.com/apps) erhalten kannst
Registriere deine Friendica-Seite als "Client"-Anwendung mit "Read&Write"-Zugriff. Wir benötigen "Twitter als Login" nicht. Sobald du deine Anwendung installiert hast, erhältst du das Schlüsselpaar für deine Seite. Registriere deine Friendica-Seite als "Client"-Anwendung mit "Read&Write"-Zugriff. Wir benötigen "Twitter als Login" nicht. Sobald du deine Anwendung installiert hast, erhältst du das Schlüsselpaar für deine Seite.
@ -47,7 +47,7 @@ $a->config['twitter']['consumersecret'] = 'your consumer_secret here';
Anschließend kann der Nutzer deiner Seite die Twitter-Einstellungen selbst eintragen: "Einstellungen -> Connector Einstellungen". Anschließend kann der Nutzer deiner Seite die Twitter-Einstellungen selbst eintragen: "Einstellungen -> Connector Einstellungen".
**GNU Social Plugin für Friendica** **GNU Social Erweiterung für Friendica**
* Author: Tobias Diekershoff * Author: Tobias Diekershoff
* tobias.diekershoff@gmx.net * tobias.diekershoff@gmx.net

View file

@ -195,7 +195,7 @@ An dieser Stelle kannst du existierende Accounts vom Zugriff auf die Instanz blo
Im letzten Bereich auf der Seite kannst du als Administrator neue Accounts anlegen. Im letzten Bereich auf der Seite kannst du als Administrator neue Accounts anlegen.
Das Passwort für so eingerichtete Accounts werden per E-Mail an die Nutzer geschickt. Das Passwort für so eingerichtete Accounts werden per E-Mail an die Nutzer geschickt.
## Plugins ## Addons
Dieser Bereich des Admin Panels dient der Auswahl und Konfiguration der Erweiterungen von Friendica. Dieser Bereich des Admin Panels dient der Auswahl und Konfiguration der Erweiterungen von Friendica.
Sie müssen in das `/addon` Verzeichnis kopiert werden. Sie müssen in das `/addon` Verzeichnis kopiert werden.
@ -203,11 +203,11 @@ Auf der Seite wird eine Liste der verfügbaren Erweiterungen angezeigt.
Neben den Namen der Erweiterungen wird ein Indikator angezeigt, der anzeigt ob das Addon gerade aktiviert ist oder nicht. Neben den Namen der Erweiterungen wird ein Indikator angezeigt, der anzeigt ob das Addon gerade aktiviert ist oder nicht.
Wenn du die Erweiterungen aktualisiert die du auf deiner Friendica-Instanz nutzt könnte es sein, dass sie neu geladen werden müssen, damit die Änderungen aktiviert werden. Wenn du die Erweiterungen aktualisiert die du auf deiner Friendica-Instanz nutzt könnte es sein, dass sie neu geladen werden müssen, damit die Änderungen aktiviert werden.
Um diesen Prozess zu vereinfachen gibt es am Anfang der Seite einen Button um alle aktiven Plugins neu zu laden. Um diesen Prozess zu vereinfachen gibt es am Anfang der Seite einen Button um alle aktiven Addons neu zu laden.
## Themen ## Themen
Der Bereich zur Kontrolle der auf der Friendica-Instanz verfügbaren Themen funktioniert analog zum Plugins Bereich. Der Bereich zur Kontrolle der auf der Friendica-Instanz verfügbaren Themen funktioniert analog zum Addons Bereich.
Jedes Theme hat eine extra Seite auf der der aktuelle Status, ein Bildschirmfoto des Themes, zusätzliche Informationen und eventuelle Einstellungen des Themes zu finden sind. Jedes Theme hat eine extra Seite auf der der aktuelle Status, ein Bildschirmfoto des Themes, zusätzliche Informationen und eventuelle Einstellungen des Themes zu finden sind.
Genau wie Erweiterungen können Themes in der Übersichtsliste oder der Theme-Seite aktiviert bzw. deaktiviert werden. Genau wie Erweiterungen können Themes in der Übersichtsliste oder der Theme-Seite aktiviert bzw. deaktiviert werden.
Um ein Standardtheme für die Instanz zu wählen, benutze bitte die *Seiten* Bereich des Admin Panels. Um ein Standardtheme für die Instanz zu wählen, benutze bitte die *Seiten* Bereich des Admin Panels.
@ -256,7 +256,7 @@ Dazu muss man nur die GUID des Beitrags kennen.
Diese kann u.a. in der Adresse der `/display`-Seite gefunden werden, wenn man dem *Link zum Originalbeitrag* folgt. Diese kann u.a. in der Adresse der `/display`-Seite gefunden werden, wenn man dem *Link zum Originalbeitrag* folgt.
Hier ist die GUID der letzte Teil der URL in der Adresszeile des Browsers. Hier ist die GUID der letzte Teil der URL in der Adresszeile des Browsers.
## Plugin Features ## Addon Features
Einige der Erweiterungen von Friendica benötigen global gültige Einstellungen, die der Administrator vornehmen muss. Einige der Erweiterungen von Friendica benötigen global gültige Einstellungen, die der Administrator vornehmen muss.
Diese Erweiterungen sind hier aufgelistet, damit du die Einstellungen schneller findest. Diese Erweiterungen sind hier aufgelistet, damit du die Einstellungen schneller findest.

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Widget; use Friendica\Content\Widget;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Model\Contact; use Friendica\Model\Contact;
@ -32,7 +33,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
// e.g. 'network_pre_group_deny', 'profile_pre_group_allow' // e.g. 'network_pre_group_deny', 'profile_pre_group_allow'
call_hooks($a->module . '_pre_' . $selname, $arr); Addon::callHooks($a->module . '_pre_' . $selname, $arr);
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
foreach ($r as $rr) { foreach ($r as $rr) {
@ -50,7 +51,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
} }
$o .= "</select>\r\n"; $o .= "</select>\r\n";
call_hooks($a->module . '_post_' . $selname, $o); Addon::callHooks($a->module . '_post_' . $selname, $o);
return $o; return $o;
@ -111,7 +112,7 @@ function contact_selector($selname, $selclass, $options, $preselected = false)
$x = ['options' => $options, 'size' => $size, 'single' => $single, 'mutual' => $mutual, 'exclude' => $exclude, 'networks' => $networks]; $x = ['options' => $options, 'size' => $size, 'single' => $single, 'mutual' => $mutual, 'exclude' => $exclude, 'networks' => $networks];
call_hooks('contact_select_options', $x); Addon::callHooks('contact_select_options', $x);
$o = ''; $o = '';
@ -154,7 +155,7 @@ function contact_selector($selname, $selclass, $options, $preselected = false)
// e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow' // e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow'
call_hooks($a->module . '_pre_' . $selname, $arr); Addon::callHooks($a->module . '_pre_' . $selname, $arr);
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
foreach ($r as $rr) { foreach ($r as $rr) {
@ -173,7 +174,7 @@ function contact_selector($selname, $selclass, $options, $preselected = false)
$o .= "</select>\r\n"; $o .= "</select>\r\n";
call_hooks($a->module . '_post_' . $selname, $o); Addon::callHooks($a->module . '_post_' . $selname, $o);
return $o; return $o;
} }
@ -232,7 +233,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
// e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow' // e.g. 'network_pre_contact_deny', 'profile_pre_contact_allow'
call_hooks($a->module . '_pre_' . $selname, $arr); Addon::callHooks($a->module . '_pre_' . $selname, $arr);
$receiverlist = []; $receiverlist = [];
@ -263,7 +264,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$o .= implode(", ", $receiverlist); $o .= implode(", ", $receiverlist);
} }
call_hooks($a->module . '_post_' . $selname, $o); Addon::callHooks($a->module . '_post_' . $selname, $o);
return $o; return $o;
} }
@ -353,7 +354,7 @@ function populate_acl($user = null, $show_jotnets = false) {
$jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>'; $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>';
} }
call_hooks('jot_networks', $jotnets); Addon::callHooks('jot_networks', $jotnets);
} else { } else {
$jotnets .= sprintf(t('Connectors disabled, since "%s" is enabled.'), $jotnets .= sprintf(t('Connectors disabled, since "%s" is enabled.'),
t('Hide your profile details from unknown viewers?')); t('Hide your profile details from unknown viewers?'));
@ -671,7 +672,7 @@ function acl_lookup(App $a, $out_type = 'json')
'search' => $search, 'search' => $search,
]; ];
call_hooks('acl_lookup_end', $results); Addon::callHooks('acl_lookup_end', $results);
if ($out_type === 'html') { if ($out_type === 'html') {
$o = [ $o = [

View file

@ -8,6 +8,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\NotificationsManager; use Friendica\Core\NotificationsManager;
@ -166,7 +167,7 @@ function api_login(App $a)
list($consumer, $token) = $oauth1->verify_request(OAuthRequest::from_request()); list($consumer, $token) = $oauth1->verify_request(OAuthRequest::from_request());
if (!is_null($token)) { if (!is_null($token)) {
$oauth1->loginUser($token->uid); $oauth1->loginUser($token->uid);
call_hooks('logged_in', $a->user); Addon::callHooks('logged_in', $a->user);
return; return;
} }
echo __FILE__.__LINE__.__FUNCTION__ . "<pre>"; echo __FILE__.__LINE__.__FUNCTION__ . "<pre>";
@ -212,11 +213,11 @@ function api_login(App $a)
]; ];
/* /*
* A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record * An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record
* Plugins should never set 'authenticated' except to indicate success - as hooks may be chained * Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later plugins should not interfere with an earlier one that succeeded. * and later addons should not interfere with an earlier one that succeeded.
*/ */
call_hooks('authenticate', $addon_auth); Addon::callHooks('authenticate', $addon_auth);
if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) { if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {
$record = $addon_auth['user_record']; $record = $addon_auth['user_record'];
@ -239,7 +240,7 @@ function api_login(App $a)
$_SESSION["allow_api"] = true; $_SESSION["allow_api"] = true;
call_hooks('logged_in', $a->user); Addon::callHooks('logged_in', $a->user);
} }
/** /**

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\Content\Text\Markdown; use Friendica\Content\Text\Markdown;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Network\Probe; use Friendica\Network\Probe;
@ -218,7 +219,7 @@ function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
} }
, $Text); , $Text);
call_hooks('bb2diaspora',$Text); Addon::callHooks('bb2diaspora',$Text);
return $Text; return $Text;
} }

View file

@ -3,6 +3,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Smilies; use Friendica\Content\Smilies;
use Friendica\Content\OEmbed; use Friendica\Content\OEmbed;
use Friendica\Core\Addon;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
@ -1401,7 +1402,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
//$Text = str_replace('<br /><li>', '<li>', $Text); //$Text = str_replace('<br /><li>', '<li>', $Text);
//$Text = str_replace('<br /><ul', '<ul ', $Text); //$Text = str_replace('<br /><ul', '<ul ', $Text);
call_hooks('bbcode', $Text); Addon::callHooks('bbcode', $Text);
return trim($Text); return trim($Text);
} }

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -595,7 +596,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
} }
$cb = ['items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview]; $cb = ['items' => $items, 'mode' => $mode, 'update' => $update, 'preview' => $preview];
call_hooks('conversation_start',$cb); Addon::callHooks('conversation_start',$cb);
$items = $cb['items']; $items = $cb['items'];
@ -731,7 +732,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
} }
$locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => '']; $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
call_hooks('render_location',$locate); Addon::callHooks('render_location',$locate);
$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate)); $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
@ -820,7 +821,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
]; ];
$arr = ['item' => $item, 'output' => $tmp_item]; $arr = ['item' => $item, 'output' => $tmp_item];
call_hooks('display_item', $arr); Addon::callHooks('display_item', $arr);
$threads[$threadsid]['id'] = $item['item_id']; $threads[$threadsid]['id'] = $item['item_id'];
$threads[$threadsid]['network'] = $item['item_network']; $threads[$threadsid]['network'] = $item['item_network'];
@ -864,7 +865,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
continue; continue;
} }
call_hooks('display_item', $arr); Addon::callHooks('display_item', $arr);
$item['pagedrop'] = $page_dropping; $item['pagedrop'] = $page_dropping;
@ -1075,7 +1076,7 @@ function item_photo_menu($item) {
$args = ['item' => $item, 'menu' => $menu]; $args = ['item' => $item, 'menu' => $menu];
call_hooks('item_photo_menu', $args); Addon::callHooks('item_photo_menu', $args);
$menu = $args['menu']; $menu = $args['menu'];
@ -1297,7 +1298,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
]); ]);
$jotplugins = ''; $jotplugins = '';
call_hooks('jot_tool', $jotplugins); Addon::callHooks('jot_tool', $jotplugins);
// Private/public post links for the non-JS ACL form // Private/public post links for the non-JS ACL form
$private_post = 1; $private_post = 1;

View file

@ -3,6 +3,7 @@
* @file include/enotify.php * @file include/enotify.php
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -398,7 +399,7 @@ function notification($params)
'itemlink' => $itemlink 'itemlink' => $itemlink
]; ];
call_hooks('enotify', $h); Addon::callHooks('enotify', $h);
$subject = $h['subject']; $subject = $h['subject'];
@ -440,7 +441,7 @@ function notification($params)
$datarray['otype'] = $params['otype']; $datarray['otype'] = $params['otype'];
$datarray['abort'] = false; $datarray['abort'] = false;
call_hooks('enotify_store', $datarray); Addon::callHooks('enotify_store', $datarray);
if ($datarray['abort']) { if ($datarray['abort']) {
pop_lang(); pop_lang();
@ -576,7 +577,7 @@ function notification($params)
$datarray['subject'] = $subject; $datarray['subject'] = $subject;
$datarray['headers'] = $additional_mail_header; $datarray['headers'] = $additional_mail_header;
call_hooks('enotify_mail', $datarray); Addon::callHooks('enotify_mail', $datarray);
// check whether sending post content in email notifications is allowed // check whether sending post content in email notifications is allowed
// always true for SYSTEM_EMAIL // always true for SYSTEM_EMAIL
@ -667,7 +668,7 @@ function check_user_notification($itemid) {
*/ */
function check_item_notification($itemid, $uid, $defaulttype = "") { function check_item_notification($itemid, $uid, $defaulttype = "") {
$notification_data = ["uid" => $uid, "profiles" => []]; $notification_data = ["uid" => $uid, "profiles" => []];
call_hooks('check_item_notification', $notification_data); Addon::callHooks('check_item_notification', $notification_data);
$profiles = $notification_data["profiles"]; $profiles = $notification_data["profiles"];

View file

@ -6,6 +6,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -328,7 +329,7 @@ function event_store($arr) {
$item_id = 0; $item_id = 0;
} }
call_hooks("event_updated", $arr['id']); Addon::callHooks("event_updated", $arr['id']);
return $item_id; return $item_id;
} else { } else {
@ -406,7 +407,7 @@ function event_store($arr) {
); );
} }
call_hooks("event_created", $event['id']); Addon::callHooks("event_created", $event['id']);
return $item_id; return $item_id;
} }

View file

@ -1,9 +1,8 @@
<?php <?php
use Friendica\Core\Addon;
use Friendica\Render\ITemplateEngine; use Friendica\Render\ITemplateEngine;
require_once "include/plugin.php";
define('SMARTY3_TEMPLATE_FOLDER', 'templates'); define('SMARTY3_TEMPLATE_FOLDER', 'templates');
class FriendicaSmarty extends Smarty class FriendicaSmarty extends Smarty
@ -74,7 +73,7 @@ class FriendicaSmartyEngine implements ITemplateEngine
"template" => basename($s->filename), "template" => basename($s->filename),
"vars" => $r "vars" => $r
]; ];
call_hooks("template_vars", $arr); Addon::callHooks("template_vars", $arr);
$r = $arr['vars']; $r = $arr['vars'];
foreach ($r as $key => $value) { foreach ($r as $key => $value) {

View file

@ -8,6 +8,7 @@
* https://github.com/annando/Syncom * https://github.com/annando/Syncom
*/ */
use Friendica\Core\Addon;
use Friendica\Util\XML; use Friendica\Util\XML;
function node2bbcode(&$doc, $oldnode, $attributes, $startbb, $endbb) function node2bbcode(&$doc, $oldnode, $attributes, $startbb, $endbb)
@ -261,7 +262,7 @@ function html2bbcode($message, $basepath = '')
$message = preg_replace('=\r *\r=i', "\n", $message); $message = preg_replace('=\r *\r=i', "\n", $message);
$message = str_replace("\r", "\n", $message); $message = str_replace("\r", "\n", $message);
call_hooks('html2bbcode', $message); Addon::callHooks('html2bbcode', $message);
$message = strip_tags($message); $message = strip_tags($message);

View file

@ -4,6 +4,7 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -157,7 +158,7 @@ function title_is_body($title, $body) {
} }
function add_page_info_data($data) { function add_page_info_data($data) {
call_hooks('page_info_data', $data); Addon::callHooks('page_info_data', $data);
// It maybe is a rich content, but if it does have everything that a link has, // It maybe is a rich content, but if it does have everything that a link has,
// then treat it that way // then treat it that way
@ -600,7 +601,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} }
/// @TODO old-lost code? /// @TODO old-lost code?
// Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin. // Shouldn't happen but we want to make absolutely sure it doesn't leak from an addon.
// Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<" // Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<"
//if ((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) //if ((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
// $arr['body'] = strip_tags($arr['body']); // $arr['body'] = strip_tags($arr['body']);
@ -943,9 +944,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
put_item_in_cache($arr); put_item_in_cache($arr);
if ($notify) { if ($notify) {
call_hooks('post_local', $arr); Addon::callHooks('post_local', $arr);
} else { } else {
call_hooks('post_remote', $arr); Addon::callHooks('post_remote', $arr);
} }
// This array field is used to trigger some automatic reactions // This array field is used to trigger some automatic reactions
@ -953,7 +954,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
unset($arr['api_source']); unset($arr['api_source']);
if (x($arr, 'cancel')) { if (x($arr, 'cancel')) {
logger('item_store: post cancelled by plugin.'); logger('item_store: post cancelled by addon.');
return 0; return 0;
} }
@ -1086,9 +1087,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post)); $r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post));
if ((DBM::is_result($r)) && (count($r) == 1)) { if ((DBM::is_result($r)) && (count($r) == 1)) {
if ($notify) { if ($notify) {
call_hooks('post_local_end', $r[0]); Addon::callHooks('post_local_end', $r[0]);
} else { } else {
call_hooks('post_remote_end', $r[0]); Addon::callHooks('post_remote_end', $r[0]);
} }
} else { } else {
logger('item_store: new item not found in DB, id ' . $current_post); logger('item_store: new item not found in DB, id ' . $current_post);
@ -1364,7 +1365,7 @@ function tag_deliver($uid, $item_id)
$arr = ['item' => $item, 'user' => $u[0], 'contact' => $r[0]]; $arr = ['item' => $item, 'user' => $u[0], 'contact' => $r[0]];
call_hooks('tagged', $arr); Addon::callHooks('tagged', $arr);
if ((! $community_page) && (! $prvgroup)) { if ((! $community_page) && (! $prvgroup)) {
return; return;

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -254,7 +255,7 @@ EOT;
$new_item['id'] = $new_item_id; $new_item['id'] = $new_item_id;
call_hooks('post_local_end', $new_item); Addon::callHooks('post_local_end', $new_item);
Worker::add(PRIORITY_HIGH, "Notifier", "like", $new_item_id); Worker::add(PRIORITY_HIGH, "Notifier", "like", $new_item_id);

View file

@ -3,6 +3,7 @@
* @file include/network.php * @file include/network.php
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Network\Probe; use Friendica\Network\Probe;
@ -653,7 +654,7 @@ function avatar_img($email)
$avatar['url'] = ''; $avatar['url'] = '';
$avatar['success'] = false; $avatar['success'] = false;
call_hooks('avatar_lookup', $avatar); Addon::callHooks('avatar_lookup', $avatar);
if (! $avatar['success']) { if (! $avatar['success']) {
$avatar['url'] = System::baseUrl() . '/images/person-175.jpg'; $avatar['url'] = System::baseUrl() . '/images/person-175.jpg';

View file

@ -94,7 +94,7 @@ function pop_lang() {
/** /**
* load string translation table for alternate language * load string translation table for alternate language
* *
* first plugin strings are loaded, then globals * first addon strings are loaded, then globals
* *
* @param string $lang language code to load * @param string $lang language code to load
*/ */
@ -102,9 +102,9 @@ function load_translation_table($lang) {
$a = get_app(); $a = get_app();
$a->strings = []; $a->strings = [];
// load enabled plugins strings // load enabled addons strings
$plugins = dba::select('addon', ['name'], ['installed' => true]); $addons = dba::select('addon', ['name'], ['installed' => true]);
while ($p = dba::fetch($plugins)) { while ($p = dba::fetch($addons)) {
$name = $p['name']; $name = $p['name'];
if (file_exists("addon/$name/lang/$lang/strings.php")) { if (file_exists("addon/$name/lang/$lang/strings.php")) {
include("addon/$name/lang/$lang/strings.php"); include("addon/$name/lang/$lang/strings.php");

View file

@ -1,467 +0,0 @@
<?php
/**
* @file include/plugin.php
*
* @brief Some functions to handle addons and themes.
*/
use Friendica\App;
use Friendica\Core\Config;
use Friendica\Core\System;
use Friendica\Database\DBM;
/**
* @brief uninstalls an addon.
*
* @param string $plugin name of the addon
* @return boolean
*/
function uninstall_plugin($plugin) {
logger("Addons: uninstalling " . $plugin);
dba::delete('addon', ['name' => $plugin]);
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
if (function_exists($plugin . '_uninstall')) {
$func = $plugin . '_uninstall';
$func();
}
}
/**
* @brief installs an addon.
*
* @param string $plugin name of the addon
* @return bool
*/
function install_plugin($plugin) {
// silently fail if plugin was removed
if (!file_exists('addon/' . $plugin . '/' . $plugin . '.php')) {
return false;
}
logger("Addons: installing " . $plugin);
$t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php');
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
if (function_exists($plugin . '_install')) {
$func = $plugin . '_install';
$func();
$plugin_admin = (function_exists($plugin."_plugin_admin") ? 1 : 0);
dba::insert('addon', ['name' => $plugin, 'installed' => true,
'timestamp' => $t, 'plugin_admin' => $plugin_admin]);
// we can add the following with the previous SQL
// once most site tables have been updated.
// This way the system won't fall over dead during the update.
if (file_exists('addon/' . $plugin . '/.hidden')) {
dba::update('addon', ['hidden' => true], ['name' => $plugin]);
}
return true;
} else {
logger("Addons: FAILED installing " . $plugin);
return false;
}
}
// reload all updated plugins
function reload_plugins() {
$plugins = Config::get('system', 'addon');
if (strlen($plugins)) {
$r = q("SELECT * FROM `addon` WHERE `installed` = 1");
if (DBM::is_result($r)) {
$installed = $r;
} else {
$installed = [];
}
$parr = explode(',',$plugins);
if (count($parr)) {
foreach ($parr as $pl) {
$pl = trim($pl);
$fname = 'addon/' . $pl . '/' . $pl . '.php';
if (file_exists($fname)) {
$t = @filemtime($fname);
foreach ($installed as $i) {
if (($i['name'] == $pl) && ($i['timestamp'] != $t)) {
logger('Reloading plugin: ' . $i['name']);
@include_once($fname);
if (function_exists($pl . '_uninstall')) {
$func = $pl . '_uninstall';
$func();
}
if (function_exists($pl . '_install')) {
$func = $pl . '_install';
$func();
}
dba::update('addon', ['timestamp' => $t], ['id' => $i['id']]);
}
}
}
}
}
}
}
/**
* @brief check if addon is enabled
*
* @param string $plugin
* @return boolean
*/
function plugin_enabled($plugin) {
return dba::exists('addon', ['installed' => true, 'name' => $plugin]);
}
/**
* @brief registers a hook.
*
* @param string $hook the name of the hook
* @param string $file the name of the file that hooks into
* @param string $function the name of the function that the hook will call
* @param int $priority A priority (defaults to 0)
* @return mixed|bool
*/
function register_hook($hook, $file, $function, $priority=0) {
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$exists = dba::exists('hook', $condition);
if ($exists) {
return true;
}
$r = dba::insert('hook', ['hook' => $hook, 'file' => $file, 'function' => $function, 'priority' => $priority]);
return $r;
}
/**
* @brief unregisters a hook.
*
* @param string $hook the name of the hook
* @param string $file the name of the file that hooks into
* @param string $function the name of the function that the hook called
* @return array
*/
function unregister_hook($hook, $file, $function) {
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$r = dba::delete('hook', $condition);
return $r;
}
function load_hooks() {
$a = get_app();
$a->hooks = [];
$r = dba::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]);
while ($rr = dba::fetch($r)) {
if (! array_key_exists($rr['hook'],$a->hooks)) {
$a->hooks[$rr['hook']] = [];
}
$a->hooks[$rr['hook']][] = [$rr['file'],$rr['function']];
}
dba::close($r);
}
/**
* @brief Calls a hook.
*
* Use this function when you want to be able to allow a hook to manipulate
* the provided data.
*
* @param string $name of the hook to call
* @param string|array &$data to transmit to the callback handler
*/
function call_hooks($name, &$data = null)
{
$a = get_app();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) {
call_single_hook($a, $name, $hook, $data);
}
}
}
/**
* @brief Calls a single hook.
*
* @param string $name of the hook to call
* @param array $hook Hook data
* @param string|array &$data to transmit to the callback handler
*/
function call_single_hook($a, $name, $hook, &$data = null) {
// Don't run a theme's hook if the user isn't using the theme
if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/'.current_theme()) === false)
return;
@include_once($hook[0]);
if (function_exists($hook[1])) {
$func = $hook[1];
$func($a, $data);
} else {
// remove orphan hooks
$condition = ['hook' => $name, 'file' => $hook[0], 'function' => $hook[1]];
dba::delete('hook', $condition);
}
}
//check if an app_menu hook exist for plugin $name.
//Return true if the plugin is an app
function plugin_is_app($name) {
$a = get_app();
if (is_array($a->hooks) && (array_key_exists('app_menu',$a->hooks))) {
foreach ($a->hooks['app_menu'] as $hook) {
if ($hook[0] == 'addon/'.$name.'/'.$name.'.php')
return true;
}
}
return false;
}
/**
* @brief Parse plugin comment in search of plugin infos.
*
* like
* \code
*...* Name: Plugin
* * Description: A plugin which plugs in
* . * Version: 1.2.3
* * Author: John <profile url>
* * Author: Jane <email>
* *
* *\endcode
* @param string $plugin the name of the plugin
* @return array with the plugin information
*/
function get_plugin_info($plugin) {
$a = get_app();
$info=[
'name' => $plugin,
'description' => "",
'author' => [],
'version' => "",
'status' => ""
];
if (!is_file("addon/$plugin/$plugin.php")) return $info;
$stamp1 = microtime(true);
$f = file_get_contents("addon/$plugin/$plugin.php");
$a->save_timestamp($stamp1, "file");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r) {
$ll = explode("\n", $m[0]);
foreach ( $ll as $l ) {
$l = trim($l,"\t\n\r */");
if ($l != "") {
list($k,$v) = array_map("trim", explode(":",$l,2));
$k= strtolower($k);
if ($k == "author") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['author'][] = ['name'=>$v];
}
} else {
if (array_key_exists($k,$info)) {
$info[$k]=$v;
}
}
}
}
}
return $info;
}
/**
* @brief Parse theme comment in search of theme infos.
*
* like
* \code
* ..* Name: My Theme
* * Description: My Cool Theme
* . * Version: 1.2.3
* * Author: John <profile url>
* * Maintainer: Jane <profile url>
* *
* \endcode
* @param string $theme the name of the theme
* @return array
*/
function get_theme_info($theme) {
$info=[
'name' => $theme,
'description' => "",
'author' => [],
'maintainer' => [],
'version' => "",
'credits' => "",
'experimental' => false,
'unsupported' => false
];
if (file_exists("view/theme/$theme/experimental"))
$info['experimental'] = true;
if (file_exists("view/theme/$theme/unsupported"))
$info['unsupported'] = true;
if (!is_file("view/theme/$theme/theme.php")) return $info;
$a = get_app();
$stamp1 = microtime(true);
$f = file_get_contents("view/theme/$theme/theme.php");
$a->save_timestamp($stamp1, "file");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r) {
$ll = explode("\n", $m[0]);
foreach ( $ll as $l ) {
$l = trim($l,"\t\n\r */");
if ($l != "") {
list($k,$v) = array_map("trim", explode(":",$l,2));
$k= strtolower($k);
if ($k == "author") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['author'][] = ['name'=>$v];
}
} elseif ($k == "maintainer") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['maintainer'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['maintainer'][] = ['name'=>$v];
}
} else {
if (array_key_exists($k,$info)) {
$info[$k]=$v;
}
}
}
}
}
return $info;
}
/**
* @brief Returns the theme's screenshot.
*
* The screenshot is expected as view/theme/$theme/screenshot.[png|jpg].
*
* @param sring $theme The name of the theme
* @return string
*/
function get_theme_screenshot($theme) {
$exts = ['.png','.jpg'];
foreach ($exts as $ext) {
if (file_exists('view/theme/' . $theme . '/screenshot' . $ext)) {
return(System::baseUrl() . '/view/theme/' . $theme . '/screenshot' . $ext);
}
}
return(System::baseUrl() . '/images/blank.png');
}
// install and uninstall theme
function uninstall_theme($theme) {
logger("Addons: uninstalling theme " . $theme);
include_once("view/theme/$theme/theme.php");
if (function_exists("{$theme}_uninstall")) {
$func = "{$theme}_uninstall";
$func();
}
}
function install_theme($theme) {
// silently fail if theme was removed
if (! file_exists("view/theme/$theme/theme.php")) {
return false;
}
logger("Addons: installing theme $theme");
include_once("view/theme/$theme/theme.php");
if (function_exists("{$theme}_install")) {
$func = "{$theme}_install";
$func();
return true;
} else {
logger("Addons: FAILED installing theme $theme");
return false;
}
}
/**
* @brief Get the full path to relevant theme files by filename
*
* This function search in the theme directory (and if not present in global theme directory)
* if there is a directory with the file extension and for a file with the given
* filename.
*
* @param string $file Filename
* @param string $root Full root path
* @return string Path to the file or empty string if the file isn't found
*/
function theme_include($file, $root = '') {
$file = basename($file);
// Make sure $root ends with a slash / if it's not blank
if ($root !== '' && $root[strlen($root)-1] !== '/') {
$root = $root . '/';
}
$theme_info = get_app()->theme_info;
if (is_array($theme_info) && array_key_exists('extends',$theme_info)) {
$parent = $theme_info['extends'];
} else {
$parent = 'NOPATH';
}
$theme = current_theme();
$thname = $theme;
$ext = substr($file,strrpos($file,'.')+1);
$paths = [
"{$root}view/theme/$thname/$ext/$file",
"{$root}view/theme/$parent/$ext/$file",
"{$root}view/$ext/$file",
];
foreach ($paths as $p) {
// strpos() is faster than strstr when checking if one string is in another (http://php.net/manual/en/function.strstr.php)
if (strpos($p,'NOPATH') !== false) {
continue;
} elseif (file_exists($p)) {
return $p;
}
}
return '';
}

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -157,7 +158,7 @@ function authenticate_success($user_record, $login_initial = false, $interactive
} }
if ($login_initial) { if ($login_initial) {
call_hooks('logged_in', $a->user); Addon::callHooks('logged_in', $a->user);
if (($a->module !== 'home') && isset($_SESSION['return_url'])) { if (($a->module !== 'home') && isset($_SESSION['return_url'])) {
goaway(System::baseUrl() . '/' . $_SESSION['return_url']); goaway(System::baseUrl() . '/' . $_SESSION['return_url']);

View file

@ -6,6 +6,7 @@ use Friendica\App;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Smilies; use Friendica\Content\Smilies;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -969,7 +970,7 @@ function contact_block() {
$arr = ['contacts' => $r, 'output' => $o]; $arr = ['contacts' => $r, 'output' => $o];
call_hooks('contact_block_end', $arr); Addon::callHooks('contact_block_end', $arr);
return $o; return $o;
} }
@ -1123,7 +1124,7 @@ function get_poke_verbs() {
'finger' => ['fingered', t('finger'), t('fingered')], 'finger' => ['fingered', t('finger'), t('fingered')],
'rebuff' => ['rebuffed', t('rebuff'), t('rebuffed')], 'rebuff' => ['rebuffed', t('rebuff'), t('rebuffed')],
]; ];
call_hooks('poke_verbs', $arr); Addon::callHooks('poke_verbs', $arr);
return $arr; return $arr;
} }
@ -1255,7 +1256,7 @@ function put_item_in_cache(&$item, $update = false)
function prepare_body(&$item, $attach = false, $preview = false) { function prepare_body(&$item, $attach = false, $preview = false) {
$a = get_app(); $a = get_app();
call_hooks('prepare_body_init', $item); Addon::callHooks('prepare_body_init', $item);
$searchpath = System::baseUrl() . "/search?tag="; $searchpath = System::baseUrl() . "/search?tag=";
@ -1314,7 +1315,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
$s = $item["rendered-html"]; $s = $item["rendered-html"];
$prep_arr = ['item' => $item, 'html' => $s, 'preview' => $preview]; $prep_arr = ['item' => $item, 'html' => $s, 'preview' => $preview];
call_hooks('prepare_body', $prep_arr); Addon::callHooks('prepare_body', $prep_arr);
$s = $prep_arr['html']; $s = $prep_arr['html'];
if (! $attach) { if (! $attach) {
@ -1432,7 +1433,7 @@ function prepare_body(&$item, $attach = false, $preview = false) {
} }
$prep_arr = ['item' => $item, 'html' => $s]; $prep_arr = ['item' => $item, 'html' => $s];
call_hooks('prepare_body_final', $prep_arr); Addon::callHooks('prepare_body_final', $prep_arr);
return $prep_arr['html']; return $prep_arr['html'];
} }

View file

@ -11,7 +11,9 @@
use Friendica\App; use Friendica\App;
use Friendica\BaseObject; use Friendica\BaseObject;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Theme;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -75,8 +77,8 @@ if (!$install) {
} }
require_once 'include/session.php'; require_once 'include/session.php';
load_hooks(); Addon::loadHooks();
call_hooks('init_1'); Addon::callHooks('init_1');
$maintenance = Config::get('system', 'maintenance'); $maintenance = Config::get('system', 'maintenance');
} }
@ -178,7 +180,7 @@ if (! x($_SESSION, 'last_updated')) {
/* /*
* check_config() is responsible for running update scripts. These automatically * check_config() is responsible for running update scripts. These automatically
* update the DB schema whenever we push a new one out. It also checks to see if * update the DB schema whenever we push a new one out. It also checks to see if
* any plugins have been added or removed and reacts accordingly. * any addons have been added or removed and reacts accordingly.
*/ */
// in install mode, any url loads install module // in install mode, any url loads install module
@ -190,7 +192,7 @@ if ($install && $a->module!="view") {
} else { } else {
check_url($a); check_url($a);
check_db(false); check_db(false);
check_plugins($a); check_addons($a);
} }
Nav::setSelected('nothing'); Nav::setSelected('nothing');
@ -200,7 +202,7 @@ $privateapps = Config::get('config', 'private_addons');
if ((local_user()) || (! $privateapps === "1")) { if ((local_user()) || (! $privateapps === "1")) {
$arr = ['app_menu' => $a->apps]; $arr = ['app_menu' => $a->apps];
call_hooks('app_menu', $arr); Addon::callHooks('app_menu', $arr);
$a->apps = $arr['app_menu']; $a->apps = $arr['app_menu'];
} }
@ -226,7 +228,7 @@ if (strlen($a->module)) {
/** /**
* We will always have a module name. * We will always have a module name.
* First see if we have a plugin which is masquerading as a module. * First see if we have an addon which is masquerading as a module.
*/ */
// Compatibility with the Android Diaspora client // Compatibility with the Android Diaspora client
@ -241,9 +243,9 @@ if (strlen($a->module)) {
$privateapps = Config::get('config', 'private_addons'); $privateapps = Config::get('config', 'private_addons');
if (is_array($a->plugins) && in_array($a->module, $a->plugins) && file_exists("addon/{$a->module}/{$a->module}.php")) { if (is_array($a->addons) && in_array($a->module, $a->addons) && file_exists("addon/{$a->module}/{$a->module}.php")) {
//Check if module is an app and if public access to apps is allowed or not //Check if module is an app and if public access to apps is allowed or not
if ((!local_user()) && plugin_is_app($a->module) && $privateapps === "1") { if ((!local_user()) && Addon::isApp($a->module) && $privateapps === "1") {
info(t("You must be logged in to use addons. ")); info(t("You must be logged in to use addons. "));
} else { } else {
include_once "addon/{$a->module}/{$a->module}.php"; include_once "addon/{$a->module}/{$a->module}.php";
@ -317,7 +319,7 @@ if (! x($a->page, 'content')) {
} }
if (!$install && !$maintenance) { if (!$install && !$maintenance) {
call_hooks('page_content_top', $a->page['content']); Addon::callHooks('page_content_top', $a->page['content']);
} }
/** /**
@ -329,10 +331,10 @@ if ($a->module_loaded) {
$placeholder = ''; $placeholder = '';
if ($a->module_class) { if ($a->module_class) {
call_hooks($a->module . '_mod_init', $placeholder); Addon::callHooks($a->module . '_mod_init', $placeholder);
call_user_func([$a->module_class, 'init']); call_user_func([$a->module_class, 'init']);
} else if (function_exists($a->module . '_init')) { } else if (function_exists($a->module . '_init')) {
call_hooks($a->module . '_mod_init', $placeholder); Addon::callHooks($a->module . '_mod_init', $placeholder);
$func = $a->module . '_init'; $func = $a->module . '_init';
$func($a); $func($a);
} }
@ -343,7 +345,7 @@ if ($a->module_loaded) {
} }
if (! $a->error && $_SERVER['REQUEST_METHOD'] === 'POST') { if (! $a->error && $_SERVER['REQUEST_METHOD'] === 'POST') {
call_hooks($a->module . '_mod_post', $_POST); Addon::callHooks($a->module . '_mod_post', $_POST);
if ($a->module_class) { if ($a->module_class) {
call_user_func([$a->module_class, 'post']); call_user_func([$a->module_class, 'post']);
} else if (function_exists($a->module . '_post')) { } else if (function_exists($a->module . '_post')) {
@ -353,7 +355,7 @@ if ($a->module_loaded) {
} }
if (! $a->error) { if (! $a->error) {
call_hooks($a->module . '_mod_afterpost', $placeholder); Addon::callHooks($a->module . '_mod_afterpost', $placeholder);
if ($a->module_class) { if ($a->module_class) {
call_user_func([$a->module_class, 'afterpost']); call_user_func([$a->module_class, 'afterpost']);
} else if (function_exists($a->module . '_afterpost')) { } else if (function_exists($a->module . '_afterpost')) {
@ -364,7 +366,7 @@ if ($a->module_loaded) {
if (! $a->error) { if (! $a->error) {
$arr = ['content' => $a->page['content']]; $arr = ['content' => $a->page['content']];
call_hooks($a->module . '_mod_content', $arr); Addon::callHooks($a->module . '_mod_content', $arr);
$a->page['content'] = $arr['content']; $a->page['content'] = $arr['content'];
if ($a->module_class) { if ($a->module_class) {
$arr = ['content' => call_user_func([$a->module_class, 'content'])]; $arr = ['content' => call_user_func([$a->module_class, 'content'])];
@ -372,7 +374,7 @@ if ($a->module_loaded) {
$func = $a->module . '_content'; $func = $a->module . '_content';
$arr = ['content' => $func($a)]; $arr = ['content' => $func($a)];
} }
call_hooks($a->module . '_mod_aftercontent', $arr); Addon::callHooks($a->module . '_mod_aftercontent', $arr);
$a->page['content'] .= $arr['content']; $a->page['content'] .= $arr['content'];
} }
@ -421,7 +423,7 @@ if (stristr(implode("", $_SESSION['sysmsg']), t('Permission denied'))) {
/* /*
* Report anything which needs to be communicated in the notification area (before the main body) * Report anything which needs to be communicated in the notification area (before the main body)
*/ */
call_hooks('page_end', $a->page['content']); Addon::callHooks('page_end', $a->page['content']);
/* /*
* Add the navigation (menu) template * Add the navigation (menu) template
@ -516,15 +518,15 @@ header('X-Frame-Options: sameorigin');
* The page templates are located in /view/php/ or in the theme directory. * The page templates are located in /view/php/ or in the theme directory.
*/ */
if (isset($_GET["mode"])) { if (isset($_GET["mode"])) {
$template = theme_include($_GET["mode"] . '.php'); $template = Theme::getPathForFile($_GET["mode"] . '.php');
} }
// If there is no page template use the default page template // If there is no page template use the default page template
if (empty($template)) { if (empty($template)) {
$template = theme_include("default.php"); $template = Theme::getPathForFile("default.php");
} }
/// @TODO Looks unsafe (remote-inclusion), is maybe not but theme_include() uses file_exists() but does not escape anything /// @TODO Looks unsafe (remote-inclusion), is maybe not but Theme::getPathForFile() uses file_exists() but does not escape anything
require_once $template; require_once $template;
killme(); killme();

View file

@ -8,8 +8,10 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Text\Markdown; use Friendica\Content\Text\Markdown;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Theme;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Database\DBStructure; use Friendica\Database\DBStructure;
@ -56,16 +58,16 @@ function admin_post(App $a)
case 'users': case 'users':
admin_page_users_post($a); admin_page_users_post($a);
break; break;
case 'plugins': case 'addons':
if ($a->argc > 2 && if ($a->argc > 2 &&
is_file("addon/" . $a->argv[2] . "/" . $a->argv[2] . ".php")) { is_file("addon/" . $a->argv[2] . "/" . $a->argv[2] . ".php")) {
@include_once("addon/" . $a->argv[2] . "/" . $a->argv[2] . ".php"); @include_once("addon/" . $a->argv[2] . "/" . $a->argv[2] . ".php");
if (function_exists($a->argv[2] . '_plugin_admin_post')) { if (function_exists($a->argv[2] . '_addon_admin_post')) {
$func = $a->argv[2] . '_plugin_admin_post'; $func = $a->argv[2] . '_addon_admin_post';
$func($a); $func($a);
} }
} }
$return_path = 'admin/plugins/' . $a->argv[2]; $return_path = 'admin/addons/' . $a->argv[2];
break; break;
case 'themes': case 'themes':
if ($a->argc < 2) { if ($a->argc < 2) {
@ -170,7 +172,7 @@ function admin_content(App $a)
$aside_sub = [ $aside_sub = [
'site' => ["admin/site/" , t("Site") , "site"], 'site' => ["admin/site/" , t("Site") , "site"],
'users' => ["admin/users/" , t("Users") , "users"], 'users' => ["admin/users/" , t("Users") , "users"],
'plugins' => ["admin/plugins/" , t("Plugins") , "plugins"], 'addons' => ["admin/addons/" , t("Addons") , "addons"],
'themes' => ["admin/themes/" , t("Themes") , "themes"], 'themes' => ["admin/themes/" , t("Themes") , "themes"],
'features' => ["admin/features/" , t("Additional features") , "features"], 'features' => ["admin/features/" , t("Additional features") , "features"],
'dbsync' => ["admin/dbsync/" , t('DB updates') , "dbsync"], 'dbsync' => ["admin/dbsync/" , t('DB updates') , "dbsync"],
@ -181,15 +183,15 @@ function admin_content(App $a)
'deleteitem' => ["admin/deleteitem/" , t('Delete Item') , 'deleteitem'], 'deleteitem' => ["admin/deleteitem/" , t('Delete Item') , 'deleteitem'],
]; ];
/* get plugins admin page */ /* get addons admin page */
$r = q("SELECT `name` FROM `addon` WHERE `plugin_admin` = 1 ORDER BY `name`"); $r = q("SELECT `name` FROM `addon` WHERE `plugin_admin` = 1 ORDER BY `name`");
$aside_tools['plugins_admin'] = []; $aside_tools['addons_admin'] = [];
foreach ($r as $h) { foreach ($r as $h) {
$plugin = $h['name']; $addon = $h['name'];
$aside_tools['plugins_admin'][] = ["admin/plugins/" . $plugin, $plugin, "plugin"]; $aside_tools['addons_admin'][] = ["admin/addons/" . $addon, $addon, "addon"];
// temp plugins with admin // temp addons with admin
$a->plugins_admin[] = $plugin; $a->addons_admin[] = $addon;
} }
$aside_tools['logs'] = ["admin/logs/", t("Logs"), "logs"]; $aside_tools['logs'] = ["admin/logs/", t("Logs"), "logs"];
@ -202,7 +204,7 @@ function admin_content(App $a)
'$admin' => $aside_tools, '$admin' => $aside_tools,
'$subpages' => $aside_sub, '$subpages' => $aside_sub,
'$admtxt' => t('Admin'), '$admtxt' => t('Admin'),
'$plugadmtxt' => t('Plugin Features'), '$plugadmtxt' => t('Addon Features'),
'$logtxt' => t('Logs'), '$logtxt' => t('Logs'),
'$diagnosticstxt' => t('diagnostics'), '$diagnosticstxt' => t('diagnostics'),
'$h_pending' => t('User registrations waiting for confirmation'), '$h_pending' => t('User registrations waiting for confirmation'),
@ -220,8 +222,8 @@ function admin_content(App $a)
case 'users': case 'users':
$o = admin_page_users($a); $o = admin_page_users($a);
break; break;
case 'plugins': case 'addons':
$o = admin_page_plugins($a); $o = admin_page_addons($a);
break; break;
case 'themes': case 'themes':
$o = admin_page_themes($a); $o = admin_page_themes($a);
@ -779,7 +781,7 @@ function admin_page_summary(App $a)
'$platform' => FRIENDICA_PLATFORM, '$platform' => FRIENDICA_PLATFORM,
'$codename' => FRIENDICA_CODENAME, '$codename' => FRIENDICA_CODENAME,
'$build' => Config::get('system', 'build'), '$build' => Config::get('system', 'build'),
'$plugins' => [t('Active plugins'), $a->plugins], '$addons' => [t('Active addons'), $a->addons],
'$showwarning' => $showwarning, '$showwarning' => $showwarning,
'$warningtext' => $warningtext '$warningtext' => $warningtext
]); ]);
@ -1723,54 +1725,54 @@ function admin_page_users(App $a)
} }
/** /**
* @brief Plugins admin page * @brief Addons admin page
* *
* This function generates the admin panel page for managing plugins on the * This function generates the admin panel page for managing addons on the
* friendica node. If a plugin name is given a single page showing the details * friendica node. If an addon name is given a single page showing the details
* for this addon is generated. If no name is given, a list of available * for this addon is generated. If no name is given, a list of available
* plugins is shown. * addons is shown.
* *
* The template used for displaying the list of plugins and the details of the * The template used for displaying the list of addons and the details of the
* plugin are the same as used for the templates. * addon are the same as used for the templates.
* *
* The returned string returned hulds the HTML code of the page. * The returned string returned hulds the HTML code of the page.
* *
* @param App $a * @param App $a
* @return string * @return string
*/ */
function admin_page_plugins(App $a) function admin_page_addons(App $a)
{ {
/* /*
* Single plugin * Single addon
*/ */
if ($a->argc == 3) { if ($a->argc == 3) {
$plugin = $a->argv[2]; $addon = $a->argv[2];
if (!is_file("addon/$plugin/$plugin.php")) { if (!is_file("addon/$addon/$addon.php")) {
notice(t("Item not found.")); notice(t("Item not found."));
return ''; return '';
} }
if (x($_GET, "a") && $_GET['a'] == "t") { if (x($_GET, "a") && $_GET['a'] == "t") {
check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't'); check_form_security_token_redirectOnErr('/admin/addons', 'admin_themes', 't');
// Toggle plugin status // Toggle addon status
$idx = array_search($plugin, $a->plugins); $idx = array_search($addon, $a->addons);
if ($idx !== false) { if ($idx !== false) {
unset($a->plugins[$idx]); unset($a->addons[$idx]);
uninstall_plugin($plugin); Addon::uninstall($addon);
info(t("Plugin %s disabled.", $plugin)); info(t("Addon %s disabled.", $addon));
} else { } else {
$a->plugins[] = $plugin; $a->addons[] = $addon;
install_plugin($plugin); Addon::install($addon);
info(t("Plugin %s enabled.", $plugin)); info(t("Addon %s enabled.", $addon));
} }
Config::set("system", "addon", implode(", ", $a->plugins)); Config::set("system", "addon", implode(", ", $a->addons));
goaway('admin/plugins'); goaway('admin/addons');
return ''; // NOTREACHED return ''; // NOTREACHED
} }
// display plugin details // display addon details
if (in_array($plugin, $a->plugins)) { if (in_array($addon, $a->addons)) {
$status = "on"; $status = "on";
$action = t("Disable"); $action = t("Disable");
} else { } else {
@ -1779,16 +1781,16 @@ function admin_page_plugins(App $a)
} }
$readme = Null; $readme = Null;
if (is_file("addon/$plugin/README.md")) { if (is_file("addon/$addon/README.md")) {
$readme = Markdown::convert(file_get_contents("addon/$plugin/README.md"), false); $readme = Markdown::convert(file_get_contents("addon/$addon/README.md"), false);
} elseif (is_file("addon/$plugin/README")) { } elseif (is_file("addon/$addon/README")) {
$readme = "<pre>" . file_get_contents("addon/$plugin/README") . "</pre>"; $readme = "<pre>" . file_get_contents("addon/$addon/README") . "</pre>";
} }
$admin_form = ""; $admin_form = "";
if (in_array($plugin, $a->plugins_admin)) { if (in_array($addon, $a->addons_admin)) {
@require_once("addon/$plugin/$plugin.php"); @require_once("addon/$addon/$addon.php");
$func = $plugin . '_plugin_admin'; $func = $addon . '_addon_admin';
$func($a, $admin_form); $func($a, $admin_form);
} }
@ -1796,20 +1798,20 @@ function admin_page_plugins(App $a)
return replace_macros($t, [ return replace_macros($t, [
'$title' => t('Administration'), '$title' => t('Administration'),
'$page' => t('Plugins'), '$page' => t('Addons'),
'$toggle' => t('Toggle'), '$toggle' => t('Toggle'),
'$settings' => t('Settings'), '$settings' => t('Settings'),
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$plugin' => $plugin, '$addon' => $addon,
'$status' => $status, '$status' => $status,
'$action' => $action, '$action' => $action,
'$info' => get_plugin_info($plugin), '$info' => Addon::getInfo($addon),
'$str_author' => t('Author: '), '$str_author' => t('Author: '),
'$str_maintainer' => t('Maintainer: '), '$str_maintainer' => t('Maintainer: '),
'$admin_form' => $admin_form, '$admin_form' => $admin_form,
'$function' => 'plugins', '$function' => 'addons',
'$screenshot' => '', '$screenshot' => '',
'$readme' => $readme, '$readme' => $readme,
@ -1818,52 +1820,52 @@ function admin_page_plugins(App $a)
} }
/* /*
* List plugins * List addons
*/ */
if (x($_GET, "a") && $_GET['a'] == "r") { if (x($_GET, "a") && $_GET['a'] == "r") {
check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/plugins', 'admin_themes', 't'); check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/addons', 'admin_themes', 't');
reload_plugins(); Addon::reload();
info("Plugins reloaded"); info("Addons reloaded");
goaway(System::baseUrl() . '/admin/plugins'); goaway(System::baseUrl() . '/admin/addons');
} }
$plugins = []; $addons = [];
$files = glob("addon/*/"); $files = glob("addon/*/");
if (is_array($files)) { if (is_array($files)) {
foreach ($files as $file) { foreach ($files as $file) {
if (is_dir($file)) { if (is_dir($file)) {
list($tmp, $id) = array_map("trim", explode("/", $file)); list($tmp, $id) = array_map("trim", explode("/", $file));
$info = get_plugin_info($id); $info = Addon::getInfo($id);
$show_plugin = true; $show_addon = true;
// If the addon is unsupported, then only show it, when it is enabled // If the addon is unsupported, then only show it, when it is enabled
if ((strtolower($info["status"]) == "unsupported") && !in_array($id, $a->plugins)) { if ((strtolower($info["status"]) == "unsupported") && !in_array($id, $a->addons)) {
$show_plugin = false; $show_addon = false;
} }
// Override the above szenario, when the admin really wants to see outdated stuff // Override the above szenario, when the admin really wants to see outdated stuff
if (Config::get("system", "show_unsupported_addons")) { if (Config::get("system", "show_unsupported_addons")) {
$show_plugin = true; $show_addon = true;
} }
if ($show_plugin) { if ($show_addon) {
$plugins[] = [$id, (in_array($id, $a->plugins) ? "on" : "off"), $info]; $addons[] = [$id, (in_array($id, $a->addons) ? "on" : "off"), $info];
} }
} }
} }
} }
$t = get_markup_template('admin/plugins.tpl'); $t = get_markup_template('admin/addons.tpl');
return replace_macros($t, [ return replace_macros($t, [
'$title' => t('Administration'), '$title' => t('Administration'),
'$page' => t('Plugins'), '$page' => t('Addons'),
'$submit' => t('Save Settings'), '$submit' => t('Save Settings'),
'$reload' => t('Reload active plugins'), '$reload' => t('Reload active addons'),
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$function' => 'plugins', '$function' => 'addons',
'$plugins' => $plugins, '$addons' => $addons,
'$pcount' => count($plugins), '$pcount' => count($addons),
'$noplugshint' => t('There are currently no plugins available on your node. You can find the official plugin repository at %1$s and might find other interesting plugins in the open plugin registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'), '$noplugshint' => t('There are currently no addons available on your node. You can find the official addon repository at %1$s and might find other interesting addons in the open addon registry at %2$s', 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'),
'$form_security_token' => get_form_security_token("admin_themes"), '$form_security_token' => get_form_security_token("admin_themes"),
]); ]);
} }
@ -1938,7 +1940,7 @@ function rebuild_theme_table($themes)
* themes is generated. * themes is generated.
* *
* The template used for displaying the list of themes and the details of the * The template used for displaying the list of themes and the details of the
* themes are the same as used for the plugins. * themes are the same as used for the addons.
* *
* The returned string contains the HTML code of the admin panel page. * The returned string contains the HTML code of the admin panel page.
* *
@ -2006,10 +2008,10 @@ function admin_page_themes(App $a)
toggle_theme($themes, $theme, $result); toggle_theme($themes, $theme, $result);
$s = rebuild_theme_table($themes); $s = rebuild_theme_table($themes);
if ($result) { if ($result) {
install_theme($theme); Theme::install($theme);
info(sprintf('Theme %s enabled.', $theme)); info(sprintf('Theme %s enabled.', $theme));
} else { } else {
uninstall_theme($theme); Theme::uninstall($theme);
info(sprintf('Theme %s disabled.', $theme)); info(sprintf('Theme %s disabled.', $theme));
} }
@ -2057,7 +2059,7 @@ function admin_page_themes(App $a)
$a->page = $orig_page; $a->page = $orig_page;
} }
$screenshot = [get_theme_screenshot($theme), t('Screenshot')]; $screenshot = [Theme::getScreenshot($theme), t('Screenshot')];
if (!stristr($screenshot[0], $theme)) { if (!stristr($screenshot[0], $theme)) {
$screenshot = null; $screenshot = null;
} }
@ -2069,10 +2071,10 @@ function admin_page_themes(App $a)
'$toggle' => t('Toggle'), '$toggle' => t('Toggle'),
'$settings' => t('Settings'), '$settings' => t('Settings'),
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$plugin' => $theme, '$addon' => $theme,
'$status' => $status, '$status' => $status,
'$action' => $action, '$action' => $action,
'$info' => get_theme_info($theme), '$info' => Theme::getInfo($theme),
'$function' => 'themes', '$function' => 'themes',
'$admin_form' => $admin_form, '$admin_form' => $admin_form,
'$str_author' => t('Author: '), '$str_author' => t('Author: '),
@ -2084,14 +2086,13 @@ function admin_page_themes(App $a)
]); ]);
} }
// reload active themes // reload active themes
if (x($_GET, "a") && $_GET['a'] == "r") { if (x($_GET, "a") && $_GET['a'] == "r") {
check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/themes', 'admin_themes', 't'); check_form_security_token_redirectOnErr(System::baseUrl() . '/admin/themes', 'admin_themes', 't');
foreach ($themes as $th) { foreach ($themes as $th) {
if ($th['allowed']) { if ($th['allowed']) {
uninstall_theme($th['name']); Theme::uninstall($th['name']);
install_theme($th['name']); Theme::install($th['name']);
} }
} }
info("Themes reloaded"); info("Themes reloaded");
@ -2102,12 +2103,12 @@ function admin_page_themes(App $a)
* List themes * List themes
*/ */
$plugins = []; $addons = [];
foreach ($themes as $th) { foreach ($themes as $th) {
$plugins[] = [$th['name'], (($th['allowed']) ? "on" : "off"), get_theme_info($th['name'])]; $addons[] = [$th['name'], (($th['allowed']) ? "on" : "off"), Theme::getInfo($th['name'])];
} }
$t = get_markup_template('admin/plugins.tpl'); $t = get_markup_template('admin/addons.tpl');
return replace_macros($t, [ return replace_macros($t, [
'$title' => t('Administration'), '$title' => t('Administration'),
'$page' => t('Themes'), '$page' => t('Themes'),
@ -2115,7 +2116,7 @@ function admin_page_themes(App $a)
'$reload' => t('Reload active themes'), '$reload' => t('Reload active themes'),
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$function' => 'themes', '$function' => 'themes',
'$plugins' => $plugins, '$addons' => $addons,
'$pcount' => count($themes), '$pcount' => count($themes),
'$noplugshint' => t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'), '$noplugshint' => t('No themes found on the system. They should be placed in %1$s', '<code>/view/themes</code>'),
'$experimental' => t('[Experimental]'), '$experimental' => t('[Experimental]'),

View file

@ -6,6 +6,7 @@ use Friendica\App;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Content\Widget; use Friendica\Content\Widget;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -173,7 +174,7 @@ function contacts_post(App $a)
return; // NOTREACHED return; // NOTREACHED
} }
call_hooks('contact_edit_post', $_POST); Addon::callHooks('contact_edit_post', $_POST);
$profile_id = intval($_POST['profile-assign']); $profile_id = intval($_POST['profile-assign']);
if ($profile_id) { if ($profile_id) {
@ -662,7 +663,7 @@ function contacts_content(App $a)
$arr = ['contact' => $contact, 'output' => $o]; $arr = ['contact' => $contact, 'output' => $o];
call_hooks('contact_edit', $arr); Addon::callHooks('contact_edit', $arr);
return $arr['output']; return $arr['output'];
} }

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Content\Widget; use Friendica\Content\Widget;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Model\Contact; use Friendica\Model\Contact;
@ -174,7 +175,7 @@ function directory_content(App $a) {
$arr = ['contact' => $rr, 'entry' => $entry]; $arr = ['contact' => $rr, 'entry' => $entry];
call_hooks('directory_item', $arr); Addon::callHooks('directory_item', $arr);
unset($profile); unset($profile);
unset($location); unset($location);

View file

@ -4,6 +4,7 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -94,8 +95,8 @@ function editpost_content(App $a) {
call_hooks('jot_tool', $jotplugins); Addon::callHooks('jot_tool', $jotplugins);
//call_hooks('jot_networks', $jotnets); //Addon::callHooks('jot_networks', $jotnets);
//$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins)); //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -25,12 +26,12 @@ function friendica_init(App $a) {
$admin = false; $admin = false;
} }
$visible_plugins = []; $visible_addons = [];
if (is_array($a->plugins) && count($a->plugins)) { if (is_array($a->addons) && count($a->addons)) {
$r = q("SELECT * FROM `addon` WHERE `hidden` = 0"); $r = q("SELECT * FROM `addon` WHERE `hidden` = 0");
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
foreach($r as $rr) { foreach($r as $rr) {
$visible_plugins[] = $rr['name']; $visible_addons[] = $rr['name'];
} }
} }
} }
@ -50,7 +51,7 @@ function friendica_init(App $a) {
$data = [ $data = [
'version' => FRIENDICA_VERSION, 'version' => FRIENDICA_VERSION,
'url' => System::baseUrl(), 'url' => System::baseUrl(),
'plugins' => $visible_plugins, 'addons' => $visible_addons,
'locked_features' => $locked_features, 'locked_features' => $locked_features,
'register_policy' => $register_policy[$a->config['register_policy']], 'register_policy' => $register_policy[$a->config['register_policy']],
'admin' => $admin, 'admin' => $admin,
@ -83,19 +84,19 @@ function friendica_content(App $a) {
$o .= t('Suggestions, praise, donations, etc. - please email "Info" at Friendica - dot com'); $o .= t('Suggestions, praise, donations, etc. - please email "Info" at Friendica - dot com');
$o .= '</p>' . PHP_EOL; $o .= '</p>' . PHP_EOL;
$visible_plugins = []; $visible_addons = [];
if (is_array($a->plugins) && count($a->plugins)) { if (is_array($a->addons) && count($a->addons)) {
$r = q("SELECT * FROM `addon` WHERE `hidden` = 0"); $r = q("SELECT * FROM `addon` WHERE `hidden` = 0");
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
foreach($r as $rr) { foreach($r as $rr) {
$visible_plugins[] = $rr['name']; $visible_addons[] = $rr['name'];
} }
} }
} }
if (count($visible_plugins)) { if (count($visible_addons)) {
$o .= '<p>' . t('Installed plugins/addons/apps:') . '</p>' . PHP_EOL; $o .= '<p>' . t('Installed addons/addons/apps:') . '</p>' . PHP_EOL;
$sorted = $visible_plugins; $sorted = $visible_addons;
$s = ''; $s = '';
sort($sorted); sort($sorted);
foreach ($sorted as $p) { foreach ($sorted as $p) {
@ -108,7 +109,7 @@ function friendica_content(App $a) {
} }
$o .= '<div style="margin-left: 25px; margin-right: 25px;">' . $s . '</div>' . PHP_EOL; $o .= '<div style="margin-left: 25px; margin-right: 25px;">' . $s . '</div>' . PHP_EOL;
} else { } else {
$o .= '<p>' . t('No installed plugins/addons/apps') . '</p>' . PHP_EOL; $o .= '<p>' . t('No installed addons/addons/apps') . '</p>' . PHP_EOL;
} }
$blocklist = Config::get('system', 'blocklist'); $blocklist = Config::get('system', 'blocklist');
@ -121,7 +122,7 @@ function friendica_content(App $a) {
$o .= '</tbody></table></div>' . PHP_EOL; $o .= '</tbody></table></div>' . PHP_EOL;
} }
call_hooks('about_hook', $o); Addon::callHooks('about_hook', $o);
return $o; return $o;
} }

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Module\Login; use Friendica\Module\Login;
@ -9,7 +10,7 @@ if(! function_exists('home_init')) {
function home_init(App $a) { function home_init(App $a) {
$ret = []; $ret = [];
call_hooks('home_init',$ret); Addon::callHooks('home_init',$ret);
if (local_user() && ($a->user['nickname'])) { if (local_user() && ($a->user['nickname'])) {
goaway(System::baseUrl()."/network"); goaway(System::baseUrl()."/network");
@ -46,7 +47,7 @@ function home_content(App $a) {
$login = Login::form($a->query_string, $a->config['register_policy'] == REGISTER_CLOSED ? 0 : 1); $login = Login::form($a->query_string, $a->config['register_policy'] == REGISTER_CLOSED ? 0 : 1);
$content = ''; $content = '';
call_hooks("home_content",$content); Addon::callHooks("home_content",$content);
$tpl = get_markup_template('home.tpl'); $tpl = get_markup_template('home.tpl');

View file

@ -15,6 +15,7 @@
* information. * information.
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -50,7 +51,7 @@ function item_post(App $a) {
killme(); killme();
} }
call_hooks('post_local_start', $_REQUEST); Addon::callHooks('post_local_start', $_REQUEST);
// logger('postinput ' . file_get_contents('php://input')); // logger('postinput ' . file_get_contents('php://input'));
logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA); logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
@ -730,7 +731,7 @@ function item_post(App $a) {
$datarray['object'] = $object; $datarray['object'] = $object;
/* /*
* These fields are for the convenience of plugins... * These fields are for the convenience of addons...
* 'self' if true indicates the owner is posting on their own wall * 'self' if true indicates the owner is posting on their own wall
* If parent is 0 it is a top-level post. * If parent is 0 it is a top-level post.
*/ */
@ -772,10 +773,10 @@ function item_post(App $a) {
killme(); killme();
} }
call_hooks('post_local',$datarray); Addon::callHooks('post_local',$datarray);
if (x($datarray, 'cancel')) { if (x($datarray, 'cancel')) {
logger('mod_item: post cancelled by plugin.'); logger('mod_item: post cancelled by addon.');
if ($return_path) { if ($return_path) {
goaway($return_path); goaway($return_path);
} }
@ -885,7 +886,7 @@ function item_post(App $a) {
} }
} }
call_hooks('post_local_end', $datarray); Addon::callHooks('post_local_end', $datarray);
if (strlen($emailcc) && $profile_uid == local_user()) { if (strlen($emailcc) && $profile_uid == local_user()) {
$erecips = explode(',', $emailcc); $erecips = explode(',', $emailcc);

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Database\DBM; use Friendica\Database\DBM;
function lockview_content(App $a) { function lockview_content(App $a) {
@ -28,7 +29,7 @@ function lockview_content(App $a) {
} }
$item = $r[0]; $item = $r[0];
call_hooks('lockview_content', $item); Addon::callHooks('lockview_content', $item);
if($item['uid'] != local_user()) { if($item['uid'] != local_user()) {
echo t('Remote privacy information not available.') . '<br />'; echo t('Remote privacy information not available.') . '<br />';

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -91,7 +92,7 @@ function manage_post(App $a) {
} }
$ret = []; $ret = [];
call_hooks('home_init',$ret); Addon::callHooks('home_init',$ret);
goaway( System::baseUrl() . "/profile/" . $a->user['nickname'] ); goaway( System::baseUrl() . "/profile/" . $a->user['nickname'] );
// NOTREACHED // NOTREACHED

View file

@ -7,6 +7,7 @@ use Friendica\Content\Feature;
use Friendica\Content\ForumManager; use Friendica\Content\ForumManager;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Content\Widget; use Friendica\Content\Widget;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
@ -388,7 +389,7 @@ function network_content(App $a, $update = 0) {
/// @TODO Is this really necessary? $a is already available to hooks /// @TODO Is this really necessary? $a is already available to hooks
$arr = ['query' => $a->query_string]; $arr = ['query' => $a->query_string];
call_hooks('network_content_init', $arr); Addon::callHooks('network_content_init', $arr);
$nouveau = false; $nouveau = false;
@ -1006,7 +1007,7 @@ function network_tabs(App $a)
} }
$arr = ['tabs' => $tabs]; $arr = ['tabs' => $tabs];
call_hooks('network_tabs', $arr); Addon::callHooks('network_tabs', $arr);
$tpl = get_markup_template('common_tabs.tpl'); $tpl = get_markup_template('common_tabs.tpl');

View file

@ -6,11 +6,10 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
require_once 'include/plugin.php';
function nodeinfo_wellknown(App $a) { function nodeinfo_wellknown(App $a) {
$nodeinfo = ['links' => [['rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0', $nodeinfo = ['links' => [['rel' => 'http://nodeinfo.diaspora.software/ns/schema/1.0',
'href' => System::baseUrl().'/nodeinfo/1.0']]]; 'href' => System::baseUrl().'/nodeinfo/1.0']]];
@ -72,48 +71,48 @@ function nodeinfo_init(App $a) {
$nodeinfo['usage']['localPosts'] = (int)Config::get('nodeinfo', 'local_posts'); $nodeinfo['usage']['localPosts'] = (int)Config::get('nodeinfo', 'local_posts');
$nodeinfo['usage']['localComments'] = (int)Config::get('nodeinfo', 'local_comments'); $nodeinfo['usage']['localComments'] = (int)Config::get('nodeinfo', 'local_comments');
if (plugin_enabled('appnet')) { if (Addon::isEnabled('appnet')) {
$nodeinfo['services']['inbound'][] = 'appnet'; $nodeinfo['services']['inbound'][] = 'appnet';
} }
if (plugin_enabled('appnet') || plugin_enabled('buffer')) { if (Addon::isEnabled('appnet') || Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'appnet'; $nodeinfo['services']['outbound'][] = 'appnet';
} }
if (plugin_enabled('blogger')) { if (Addon::isEnabled('blogger')) {
$nodeinfo['services']['outbound'][] = 'blogger'; $nodeinfo['services']['outbound'][] = 'blogger';
} }
if (plugin_enabled('dwpost')) { if (Addon::isEnabled('dwpost')) {
$nodeinfo['services']['outbound'][] = 'dreamwidth'; $nodeinfo['services']['outbound'][] = 'dreamwidth';
} }
if (plugin_enabled('fbpost') || plugin_enabled('buffer')) { if (Addon::isEnabled('fbpost') || Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'facebook'; $nodeinfo['services']['outbound'][] = 'facebook';
} }
if (plugin_enabled('statusnet')) { if (Addon::isEnabled('statusnet')) {
$nodeinfo['services']['inbound'][] = 'gnusocial'; $nodeinfo['services']['inbound'][] = 'gnusocial';
$nodeinfo['services']['outbound'][] = 'gnusocial'; $nodeinfo['services']['outbound'][] = 'gnusocial';
} }
if (plugin_enabled('gpluspost') || plugin_enabled('buffer')) { if (Addon::isEnabled('gpluspost') || Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'google'; $nodeinfo['services']['outbound'][] = 'google';
} }
if (plugin_enabled('ijpost')) { if (Addon::isEnabled('ijpost')) {
$nodeinfo['services']['outbound'][] = 'insanejournal'; $nodeinfo['services']['outbound'][] = 'insanejournal';
} }
if (plugin_enabled('libertree')) { if (Addon::isEnabled('libertree')) {
$nodeinfo['services']['outbound'][] = 'libertree'; $nodeinfo['services']['outbound'][] = 'libertree';
} }
if (plugin_enabled('buffer')) { if (Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'linkedin'; $nodeinfo['services']['outbound'][] = 'linkedin';
} }
if (plugin_enabled('ljpost')) { if (Addon::isEnabled('ljpost')) {
$nodeinfo['services']['outbound'][] = 'livejournal'; $nodeinfo['services']['outbound'][] = 'livejournal';
} }
if (plugin_enabled('buffer')) { if (Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'pinterest'; $nodeinfo['services']['outbound'][] = 'pinterest';
} }
if (plugin_enabled('posterous')) { if (Addon::isEnabled('posterous')) {
$nodeinfo['services']['outbound'][] = 'posterous'; $nodeinfo['services']['outbound'][] = 'posterous';
} }
if (plugin_enabled('pumpio')) { if (Addon::isEnabled('pumpio')) {
$nodeinfo['services']['inbound'][] = 'pumpio'; $nodeinfo['services']['inbound'][] = 'pumpio';
$nodeinfo['services']['outbound'][] = 'pumpio'; $nodeinfo['services']['outbound'][] = 'pumpio';
} }
@ -121,13 +120,13 @@ function nodeinfo_init(App $a) {
if ($smtp) { if ($smtp) {
$nodeinfo['services']['outbound'][] = 'smtp'; $nodeinfo['services']['outbound'][] = 'smtp';
} }
if (plugin_enabled('tumblr')) { if (Addon::isEnabled('tumblr')) {
$nodeinfo['services']['outbound'][] = 'tumblr'; $nodeinfo['services']['outbound'][] = 'tumblr';
} }
if (plugin_enabled('twitter') || plugin_enabled('buffer')) { if (Addon::isEnabled('twitter') || Addon::isEnabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'twitter'; $nodeinfo['services']['outbound'][] = 'twitter';
} }
if (plugin_enabled('wppost')) { if (Addon::isEnabled('wppost')) {
$nodeinfo['services']['outbound'][] = 'wordpress'; $nodeinfo['services']['outbound'][] = 'wordpress';
} }
$nodeinfo['metadata']['protocols'] = $nodeinfo['protocols']; $nodeinfo['metadata']['protocols'] = $nodeinfo['protocols'];
@ -137,7 +136,7 @@ function nodeinfo_init(App $a) {
$nodeinfo['metadata']['services'] = $nodeinfo['services']; $nodeinfo['metadata']['services'] = $nodeinfo['services'];
if (plugin_enabled('twitter')) { if (Addon::isEnabled('twitter')) {
$nodeinfo['metadata']['services']['inbound'][] = 'twitter'; $nodeinfo['metadata']['services']['inbound'][] = 'twitter';
} }
} }
@ -153,22 +152,22 @@ function nodeinfo_cron() {
$a = get_app(); $a = get_app();
// If the plugin 'statistics_json' is enabled then disable it and actrivate nodeinfo. // If the addon 'statistics_json' is enabled then disable it and actrivate nodeinfo.
if (plugin_enabled('statistics_json')) { if (Addon::isEnabled('statistics_json')) {
Config::set('system', 'nodeinfo', true); Config::set('system', 'nodeinfo', true);
$plugin = 'statistics_json'; $addon = 'statistics_json';
$plugins = Config::get('system', 'addon'); $addons = Config::get('system', 'addon');
$plugins_arr = []; $addons_arr = [];
if ($plugins) { if ($addons) {
$plugins_arr = explode(',',str_replace(' ', '',$plugins)); $addons_arr = explode(',',str_replace(' ', '',$addons));
$idx = array_search($plugin, $plugins_arr); $idx = array_search($addon, $addons_arr);
if ($idx !== false) { if ($idx !== false) {
unset($plugins_arr[$idx]); unset($addons_arr[$idx]);
uninstall_plugin($plugin); Addon::uninstall($addon);
Config::set('system', 'addon', implode(', ',$plugins_arr)); Config::set('system', 'addon', implode(', ',$addons_arr));
} }
} }
} }

View file

@ -11,6 +11,7 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Util\ParseUrl; use Friendica\Util\ParseUrl;
require_once("include/items.php"); require_once("include/items.php");
@ -91,7 +92,7 @@ function parse_url_content(App $a) {
$arr = ["url" => $url, "text" => ""]; $arr = ["url" => $url, "text" => ""];
call_hooks("parse_link", $arr); Addon::callHooks("parse_link", $arr);
if (strlen($arr["text"])) { if (strlen($arr["text"])) {
echo $arr["text"]; echo $arr["text"];

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -720,7 +721,7 @@ function photos_post(App $a)
// default post action - upload a photo // default post action - upload a photo
call_hooks('photo_post_init', $_POST); Addon::callHooks('photo_post_init', $_POST);
// Determine the album to use // Determine the album to use
$album = x($_REQUEST, 'album') ? notags(trim($_REQUEST['album'])) : ''; $album = x($_REQUEST, 'album') ? notags(trim($_REQUEST['album'])) : '';
@ -770,7 +771,7 @@ function photos_post(App $a)
$ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => '']; $ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''];
call_hooks('photo_post_file', $ret); Addon::callHooks('photo_post_file', $ret);
if (x($ret, 'src') && x($ret, 'filesize')) { if (x($ret, 'src') && x($ret, 'filesize')) {
$src = $ret['src']; $src = $ret['src'];
@ -808,7 +809,7 @@ function photos_post(App $a)
} }
@unlink($src); @unlink($src);
$foo = 0; $foo = 0;
call_hooks('photo_post_end', $foo); Addon::callHooks('photo_post_end', $foo);
return; return;
} }
@ -824,7 +825,7 @@ function photos_post(App $a)
notice(t('Image exceeds size limit of %s', formatBytes($maximagesize)) . EOL); notice(t('Image exceeds size limit of %s', formatBytes($maximagesize)) . EOL);
@unlink($src); @unlink($src);
$foo = 0; $foo = 0;
call_hooks('photo_post_end', $foo); Addon::callHooks('photo_post_end', $foo);
return; return;
} }
@ -832,7 +833,7 @@ function photos_post(App $a)
notice(t('Image file is empty.') . EOL); notice(t('Image file is empty.') . EOL);
@unlink($src); @unlink($src);
$foo = 0; $foo = 0;
call_hooks('photo_post_end', $foo); Addon::callHooks('photo_post_end', $foo);
return; return;
} }
@ -847,7 +848,7 @@ function photos_post(App $a)
notice(t('Unable to process image.') . EOL); notice(t('Unable to process image.') . EOL);
@unlink($src); @unlink($src);
$foo = 0; $foo = 0;
call_hooks('photo_post_end',$foo); Addon::callHooks('photo_post_end',$foo);
killme(); killme();
} }
@ -937,7 +938,7 @@ function photos_post(App $a)
Worker::add(PRIORITY_HIGH, "Notifier", 'wall-new', $item_id); Worker::add(PRIORITY_HIGH, "Notifier", 'wall-new', $item_id);
} }
call_hooks('photo_post_end', intval($item_id)); Addon::callHooks('photo_post_end', intval($item_id));
// addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook // addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook
// if they do not wish to be redirected // if they do not wish to be redirected
@ -1103,7 +1104,7 @@ function photos_content(App $a)
'addon_text' => $uploader, 'addon_text' => $uploader,
'default_upload' => true]; 'default_upload' => true];
call_hooks('photo_upload_form',$ret); Addon::callHooks('photo_upload_form',$ret);
$default_upload_box = replace_macros(get_markup_template('photos_default_uploader_box.tpl'), []); $default_upload_box = replace_macros(get_markup_template('photos_default_uploader_box.tpl'), []);
$default_upload_submit = replace_macros(get_markup_template('photos_default_uploader_submit.tpl'), [ $default_upload_submit = replace_macros(get_markup_template('photos_default_uploader_submit.tpl'), [

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\ForumManager; use Friendica\Content\ForumManager;
use Friendica\Core\Addon;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
@ -138,7 +139,7 @@ function ping_init(App $a)
if (DBM::is_result($items_unseen)) { if (DBM::is_result($items_unseen)) {
$arr = ['items' => $items_unseen]; $arr = ['items' => $items_unseen];
call_hooks('network_ping', $arr); Addon::callHooks('network_ping', $arr);
foreach ($items_unseen as $item) { foreach ($items_unseen as $item) {
if ($item['wall']) { if ($item['wall']) {

View file

@ -7,7 +7,7 @@
* If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb. * If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
* parent is a special argument which let's you attach this activity as a comment to an existing conversation, which * parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
* may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the more pokes * may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the more pokes
* plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc. * addon version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
* *
* private creates a private conversation with the recipient. Otherwise your profile's default post privacy is used. * private creates a private conversation with the recipient. Otherwise your profile's default post privacy is used.
* *
@ -15,6 +15,7 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -142,7 +143,7 @@ function poke_init(App $a) {
} }
call_hooks('post_local_end', $arr); Addon::callHooks('post_local_end', $arr);
Worker::add(PRIORITY_HIGH, "Notifier", "like", $post_id); Worker::add(PRIORITY_HIGH, "Notifier", "like", $post_id);

View file

@ -1,12 +1,13 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Theme;
function pretheme_init(App $a) { function pretheme_init(App $a) {
if ($_REQUEST['theme']) { if ($_REQUEST['theme']) {
$theme = $_REQUEST['theme']; $theme = $_REQUEST['theme'];
$info = get_theme_info($theme); $info = Theme::getInfo($theme);
if ($info) { if ($info) {
// unfortunately there will be no translation for this string // unfortunately there will be no translation for this string
$desc = $info['description']; $desc = $info['description'];
@ -17,7 +18,7 @@ function pretheme_init(App $a) {
$version = ''; $version = '';
$credits = ''; $credits = '';
} }
echo json_encode(['img' => get_theme_screenshot($theme), 'desc' => $desc, 'version' => $version, 'credits' => $credits]); echo json_encode(['img' => Theme::getScreenshot($theme), 'desc' => $desc, 'version' => $version, 'credits' => $credits]);
} }
killme(); killme();

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Widget; use Friendica\Content\Widget;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -180,7 +181,7 @@ function profile_content(App $a, $update = 0)
if ($tab === 'profile') { if ($tab === 'profile') {
$o .= Profile::getAdvanced($a); $o .= Profile::getAdvanced($a);
call_hooks('profile_advanced', $o); Addon::callHooks('profile_advanced', $o);
return $o; return $o;
} }

View file

@ -6,6 +6,7 @@ use Friendica\App;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -178,7 +179,7 @@ function profiles_post(App $a) {
$namechanged = false; $namechanged = false;
call_hooks('profile_post', $_POST); Addon::callHooks('profile_post', $_POST);
if (($a->argc > 1) && ($a->argv[1] !== "new") && intval($a->argv[1])) { if (($a->argc > 1) && ($a->argv[1] !== "new") && intval($a->argv[1])) {
$orig = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1", $orig = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@ -743,7 +744,7 @@ function profiles_content(App $a) {
]); ]);
$arr = ['profile' => $r[0], 'entry' => $o]; $arr = ['profile' => $r[0], 'entry' => $o];
call_hooks('profile_edit', $arr); Addon::callHooks('profile_edit', $arr);
return $o; return $o;
} else { } else {

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -20,7 +21,7 @@ function register_post(App $a)
$blocked = 1; $blocked = 1;
$arr = ['post' => $_POST]; $arr = ['post' => $_POST];
call_hooks('register_post', $arr); Addon::callHooks('register_post', $arr);
$max_dailies = intval(Config::get('system', 'max_daily_registrations')); $max_dailies = intval(Config::get('system', 'max_daily_registrations'));
if ($max_dailies) { if ($max_dailies) {
@ -241,7 +242,7 @@ function register_content(App $a)
$arr = ['template' => $tpl]; $arr = ['template' => $tpl];
call_hooks('register_form', $arr); Addon::callHooks('register_form', $arr);
$tpl = $arr['template']; $tpl = $arr['template'];

View file

@ -5,6 +5,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\Nav; use Friendica\Content\Nav;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Core\Config; use Friendica\Core\Config;
@ -76,7 +77,7 @@ function settings_init(App $a)
]; ];
$tabs[] = [ $tabs[] = [
'label' => t('Plugins'), 'label' => t('Addons'),
'url' => 'settings/addon', 'url' => 'settings/addon',
'selected' => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''), 'selected' => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''),
'accesskey' => 'l', 'accesskey' => 'l',
@ -175,7 +176,8 @@ function settings_post(App $a)
dbesc($redirect), dbesc($redirect),
dbesc($icon), dbesc($icon),
local_user(), local_user(),
dbesc($key)); dbesc($key)
);
} else { } else {
q("INSERT INTO clients q("INSERT INTO clients
(client_id, pw, name, redirect_uri, icon, uid) (client_id, pw, name, redirect_uri, icon, uid)
@ -185,7 +187,8 @@ function settings_post(App $a)
dbesc($name), dbesc($name),
dbesc($redirect), dbesc($redirect),
dbesc($icon), dbesc($icon),
local_user()); local_user()
);
} }
} }
goaway(System::baseUrl(true)."/settings/oauth/"); goaway(System::baseUrl(true)."/settings/oauth/");
@ -195,12 +198,12 @@ function settings_post(App $a)
if (($a->argc > 1) && ($a->argv[1] == 'addon')) { if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon'); check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
call_hooks('plugin_settings_post', $_POST); Addon::callHooks('addon_settings_post', $_POST);
return; return;
} }
if (($a->argc > 1) && ($a->argv[1] == 'connectors')) { if (($a->argc > 1) && ($a->argv[1] == 'connectors'))
{
check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors'); check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
if (x($_POST, 'general-submit')) { if (x($_POST, 'general-submit')) {
@ -277,7 +280,7 @@ function settings_post(App $a)
} }
} }
call_hooks('connector_settings_post', $_POST); Addon::callHooks('connector_settings_post', $_POST);
return; return;
} }
@ -351,7 +354,7 @@ function settings_post(App $a)
intval(local_user()) intval(local_user())
); );
call_hooks('display_settings_post', $_POST); Addon::callHooks('display_settings_post', $_POST);
goaway('settings/display'); goaway('settings/display');
return; // NOTREACHED return; // NOTREACHED
} }
@ -364,7 +367,7 @@ function settings_post(App $a)
goaway('settings'); goaway('settings');
} }
call_hooks('settings_post', $_POST); Addon::callHooks('settings_post', $_POST);
if (x($_POST, 'password') || x($_POST, 'confirm')) { if (x($_POST, 'password') || x($_POST, 'confirm')) {
$newpass = $_POST['password']; $newpass = $_POST['password'];
@ -748,18 +751,18 @@ function settings_content(App $a)
if (($a->argc > 1) && ($a->argv[1] === 'addon')) { if (($a->argc > 1) && ($a->argv[1] === 'addon')) {
$settings_addons = ""; $settings_addons = "";
$r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' "); $r = q("SELECT * FROM `hook` WHERE `hook` = 'addon_settings' ");
if (!DBM::is_result($r)) { if (!DBM::is_result($r)) {
$settings_addons = t('No Plugin settings configured'); $settings_addons = t('No Addon settings configured');
} }
call_hooks('plugin_settings', $settings_addons); Addon::callHooks('addon_settings', $settings_addons);
$tpl = get_markup_template('settings/addons.tpl'); $tpl = get_markup_template('settings/addons.tpl');
$o .= replace_macros($tpl, [ $o .= replace_macros($tpl, [
'$form_security_token' => get_form_security_token("settings_addon"), '$form_security_token' => get_form_security_token("settings_addon"),
'$title' => t('Plugin Settings'), '$title' => t('Addon Settings'),
'$settings_addons' => $settings_addons '$settings_addons' => $settings_addons
]); ]);
return $o; return $o;
@ -799,7 +802,7 @@ function settings_content(App $a)
} }
$settings_connectors = ''; $settings_connectors = '';
call_hooks('connector_settings', $settings_connectors); Addon::callHooks('connector_settings', $settings_connectors);
if (is_site_admin()) { if (is_site_admin()) {
$diasp_enabled = t('Built-in support for %s connectivity is %s', t('Diaspora'), ((Config::get('system', 'diaspora_enabled')) ? t('enabled') : t('disabled'))); $diasp_enabled = t('Built-in support for %s connectivity is %s', t('Diaspora'), ((Config::get('system', 'diaspora_enabled')) ? t('enabled') : t('disabled')));
@ -871,7 +874,7 @@ function settings_content(App $a)
'$submit' => t('Save Settings'), '$submit' => t('Save Settings'),
]); ]);
call_hooks('display_settings', $o); Addon::callHooks('display_settings', $o);
return $o; return $o;
} }
@ -1284,7 +1287,7 @@ function settings_content(App $a)
]); ]);
call_hooks('settings_form', $o); Addon::callHooks('settings_form', $o);
$o .= '</form>' . "\r\n"; $o .= '</form>' . "\r\n";

View file

@ -5,10 +5,9 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
require_once("include/plugin.php");
function statistics_json_init(App $a) { function statistics_json_init(App $a) {
if (!Config::get("system", "nodeinfo")) { if (!Config::get("system", "nodeinfo")) {
@ -28,19 +27,19 @@ function statistics_json_init(App $a) {
]; ];
$statistics["services"] = []; $statistics["services"] = [];
$statistics["services"]["appnet"] = plugin_enabled("appnet"); $statistics["services"]["appnet"] = Addon::isEnabled("appnet");
$statistics["services"]["blogger"] = plugin_enabled("blogger"); $statistics["services"]["blogger"] = Addon::isEnabled("blogger");
$statistics["services"]["buffer"] = plugin_enabled("buffer"); $statistics["services"]["buffer"] = Addon::isEnabled("buffer");
$statistics["services"]["dreamwidth"] = plugin_enabled("dwpost"); $statistics["services"]["dreamwidth"] = Addon::isEnabled("dwpost");
$statistics["services"]["facebook"] = plugin_enabled("fbpost"); $statistics["services"]["facebook"] = Addon::isEnabled("fbpost");
$statistics["services"]["gnusocial"] = plugin_enabled("statusnet"); $statistics["services"]["gnusocial"] = Addon::isEnabled("statusnet");
$statistics["services"]["googleplus"] = plugin_enabled("gpluspost"); $statistics["services"]["googleplus"] = Addon::isEnabled("gpluspost");
$statistics["services"]["libertree"] = plugin_enabled("libertree"); $statistics["services"]["libertree"] = Addon::isEnabled("libertree");
$statistics["services"]["livejournal"] = plugin_enabled("ljpost"); $statistics["services"]["livejournal"] = Addon::isEnabled("ljpost");
$statistics["services"]["pumpio"] = plugin_enabled("pumpio"); $statistics["services"]["pumpio"] = Addon::isEnabled("pumpio");
$statistics["services"]["twitter"] = plugin_enabled("twitter"); $statistics["services"]["twitter"] = Addon::isEnabled("twitter");
$statistics["services"]["tumblr"] = plugin_enabled("tumblr"); $statistics["services"]["tumblr"] = Addon::isEnabled("tumblr");
$statistics["services"]["wordpress"] = plugin_enabled("wppost"); $statistics["services"]["wordpress"] = Addon::isEnabled("wppost");
$statistics["appnet"] = $statistics["services"]["appnet"]; $statistics["appnet"] = $statistics["services"]["appnet"];
$statistics["blogger"] = $statistics["services"]["blogger"]; $statistics["blogger"] = $statistics["services"]["blogger"];

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -156,7 +157,7 @@ EOT;
$arr['id'] = $post_id; $arr['id'] = $post_id;
call_hooks('post_local_end', $arr); Addon::callHooks('post_local_end', $arr);
killme(); killme();

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -213,7 +214,7 @@ EOT;
$arr['id'] = $post_id; $arr['id'] = $post_id;
call_hooks('post_local_end', $arr); Addon::callHooks('post_local_end', $arr);
Worker::add(PRIORITY_HIGH, "Notifier", "tag", $post_id); Worker::add(PRIORITY_HIGH, "Notifier", "tag", $post_id);

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -40,7 +41,7 @@ function uexport_content(App $a) {
['uexport/account', t('Export account'), t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')], ['uexport/account', t('Export account'), t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')],
['uexport/backup', t('Export all'), t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')], ['uexport/backup', t('Export all'), t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')],
]; ];
call_hooks('uexport_options', $options); Addon::callHooks('uexport_options', $options);
$tpl = get_markup_template("uexport.tpl"); $tpl = get_markup_template("uexport.tpl");
return replace_macros($tpl, [ return replace_macros($tpl, [

View file

@ -3,6 +3,7 @@
* @file mod/xrd.php * @file mod/xrd.php
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Protocol\Salmon; use Friendica\Protocol\Salmon;
@ -109,7 +110,7 @@ function xrd_xml($a, $uri, $alias, $profile_url, $r)
); );
$arr = ['user' => $r, 'xml' => $o]; $arr = ['user' => $r, 'xml' => $o];
call_hooks('personal_xrd', $arr); Addon::callHooks('personal_xrd', $arr);
echo $arr['xml']; echo $arr['xml'];
killme(); killme();

View file

@ -6,6 +6,7 @@
*/ */
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -42,7 +43,7 @@ if (Config::get('system', 'maintenance', true)) {
$a->set_baseurl(Config::get('system', 'url')); $a->set_baseurl(Config::get('system', 'url'));
load_hooks(); Addon::loadHooks();
$spawn = (($_SERVER["argc"] == 2) && ($_SERVER["argv"][1] == "spawn")); $spawn = (($_SERVER["argc"] == 2) && ($_SERVER["argv"][1] == "spawn"));

View file

@ -56,8 +56,8 @@ class App
public $hooks; public $hooks;
public $timezone; public $timezone;
public $interactive = true; public $interactive = true;
public $plugins; public $addons;
public $plugins_admin = []; public $addons_admin = [];
public $apps = []; public $apps = [];
public $identities; public $identities;
public $is_mobile = false; public $is_mobile = false;

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Content; namespace Friendica\Content;
use Friendica\Core\Addon;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Protocol\Diaspora; use Friendica\Protocol\Diaspora;
use dba; use dba;
@ -93,7 +94,7 @@ class ContactSelector
NETWORK_APPNET => t('App.net') NETWORK_APPNET => t('App.net')
]; ];
call_hooks('network_to_name', $nets); Addon::callHooks('network_to_name', $nets);
$search = array_keys($nets); $search = array_keys($nets);
$replace = array_values($nets); $replace = array_values($nets);
@ -122,7 +123,7 @@ class ContactSelector
$o = ''; $o = '';
$select = ['', t('Male'), t('Female'), t('Currently Male'), t('Currently Female'), t('Mostly Male'), t('Mostly Female'), t('Transgender'), t('Intersex'), t('Transsexual'), t('Hermaphrodite'), t('Neuter'), t('Non-specific'), t('Other'), t('Undecided')]; $select = ['', t('Male'), t('Female'), t('Currently Male'), t('Currently Female'), t('Mostly Male'), t('Mostly Female'), t('Transgender'), t('Intersex'), t('Transsexual'), t('Hermaphrodite'), t('Neuter'), t('Non-specific'), t('Other'), t('Undecided')];
call_hooks('gender_selector', $select); Addon::callHooks('gender_selector', $select);
$o .= "<select name=\"gender$suffix\" id=\"gender-select$suffix\" size=\"1\" >"; $o .= "<select name=\"gender$suffix\" id=\"gender-select$suffix\" size=\"1\" >";
foreach ($select as $selection) { foreach ($select as $selection) {
@ -145,7 +146,7 @@ class ContactSelector
$select = ['', t('Males'), t('Females'), t('Gay'), t('Lesbian'), t('No Preference'), t('Bisexual'), t('Autosexual'), t('Abstinent'), t('Virgin'), t('Deviant'), t('Fetish'), t('Oodles'), t('Nonsexual')]; $select = ['', t('Males'), t('Females'), t('Gay'), t('Lesbian'), t('No Preference'), t('Bisexual'), t('Autosexual'), t('Abstinent'), t('Virgin'), t('Deviant'), t('Fetish'), t('Oodles'), t('Nonsexual')];
call_hooks('sexpref_selector', $select); Addon::callHooks('sexpref_selector', $select);
$o .= "<select name=\"sexual$suffix\" id=\"sexual-select$suffix\" size=\"1\" >"; $o .= "<select name=\"sexual$suffix\" id=\"sexual-select$suffix\" size=\"1\" >";
foreach ($select as $selection) { foreach ($select as $selection) {
@ -166,7 +167,7 @@ class ContactSelector
$o = ''; $o = '';
$select = ['', t('Single'), t('Lonely'), t('Available'), t('Unavailable'), t('Has crush'), t('Infatuated'), t('Dating'), t('Unfaithful'), t('Sex Addict'), t('Friends'), t('Friends/Benefits'), t('Casual'), t('Engaged'), t('Married'), t('Imaginarily married'), t('Partners'), t('Cohabiting'), t('Common law'), t('Happy'), t('Not looking'), t('Swinger'), t('Betrayed'), t('Separated'), t('Unstable'), t('Divorced'), t('Imaginarily divorced'), t('Widowed'), t('Uncertain'), t('It\'s complicated'), t('Don\'t care'), t('Ask me')]; $select = ['', t('Single'), t('Lonely'), t('Available'), t('Unavailable'), t('Has crush'), t('Infatuated'), t('Dating'), t('Unfaithful'), t('Sex Addict'), t('Friends'), t('Friends/Benefits'), t('Casual'), t('Engaged'), t('Married'), t('Imaginarily married'), t('Partners'), t('Cohabiting'), t('Common law'), t('Happy'), t('Not looking'), t('Swinger'), t('Betrayed'), t('Separated'), t('Unstable'), t('Divorced'), t('Imaginarily divorced'), t('Widowed'), t('Uncertain'), t('It\'s complicated'), t('Don\'t care'), t('Ask me')];
call_hooks('marital_selector', $select); Addon::callHooks('marital_selector', $select);
$o .= '<select name="marital" id="marital-select" size="1" >'; $o .= '<select name="marital" id="marital-select" size="1" >';
foreach ($select as $selection) { foreach ($select as $selection) {

View file

@ -5,11 +5,10 @@
*/ */
namespace Friendica\Content; namespace Friendica\Content;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
require_once 'include/plugin.php';
class Feature class Feature
{ {
/** /**
@ -36,7 +35,7 @@ class Feature
} }
$arr = ['uid' => $uid, 'feature' => $feature, 'enabled' => $x]; $arr = ['uid' => $uid, 'feature' => $feature, 'enabled' => $x];
call_hooks('isEnabled', $arr); Addon::callHooks('isEnabled', $arr);
return($arr['enabled']); return($arr['enabled']);
} }
@ -150,7 +149,7 @@ class Feature
} }
} }
call_hooks('get', $arr); Addon::callHooks('get', $arr);
return $arr; return $arr;
} }
} }

View file

@ -6,6 +6,7 @@ namespace Friendica\Content;
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -57,7 +58,7 @@ class Nav
'$search_hint' => t('@name, !forum, #tags, content') '$search_hint' => t('@name, !forum, #tags, content')
]); ]);
call_hooks('page_header', $a->page['nav']); Addon::callHooks('page_header', $a->page['nav']);
} }
/** /**
@ -224,7 +225,7 @@ class Nav
$banner = '<a href="https://friendi.ca"><img id="logo-img" src="images/friendica-32.png" alt="logo" /></a><span id="logo-text"><a href="https://friendi.ca">Friendica</a></span>'; $banner = '<a href="https://friendi.ca"><img id="logo-img" src="images/friendica-32.png" alt="logo" /></a><span id="logo-text"><a href="https://friendi.ca">Friendica</a></span>';
} }
call_hooks('nav_info', $nav); Addon::callHooks('nav_info', $nav);
return [ return [
'sitelocation' => $sitelocation, 'sitelocation' => $sitelocation,

View file

@ -6,6 +6,7 @@
namespace Friendica\Content; namespace Friendica\Content;
use Friendica\Core\Addon;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
@ -154,7 +155,7 @@ class OEmbed
} }
} }
call_hooks('oembed_fetch_url', $embedurl, $j); Addon::callHooks('oembed_fetch_url', $embedurl, $j);
return $j; return $j;
} }

View file

@ -15,6 +15,7 @@
namespace Friendica\Content; namespace Friendica\Content;
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -139,7 +140,7 @@ class Smilies
]; ];
$params = ['texts' => $texts, 'icons' => $icons]; $params = ['texts' => $texts, 'icons' => $icons];
call_hooks('smilie', $params); Addon::callHooks('smilie', $params);
return $params; return $params;
} }

View file

@ -6,6 +6,7 @@ namespace Friendica\Content;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -74,23 +75,23 @@ class Widget
{ {
$networks = array(); $networks = array();
if (!plugin_enabled("appnet")) { if (!Addon::isEnabled("appnet")) {
$networks[] = NETWORK_APPNET; $networks[] = NETWORK_APPNET;
} }
if (!plugin_enabled("fbpost") && !plugin_enabled("facebook")) { if (!Addon::isEnabled("fbpost") && !Addon::isEnabled("facebook")) {
$networks[] = NETWORK_FACEBOOK; $networks[] = NETWORK_FACEBOOK;
} }
if (!plugin_enabled("statusnet")) { if (!Addon::isEnabled("statusnet")) {
$networks[] = NETWORK_STATUSNET; $networks[] = NETWORK_STATUSNET;
} }
if (!plugin_enabled("pumpio")) { if (!Addon::isEnabled("pumpio")) {
$networks[] = NETWORK_PUMPIO; $networks[] = NETWORK_PUMPIO;
} }
if (!plugin_enabled("twitter")) { if (!Addon::isEnabled("twitter")) {
$networks[] = NETWORK_TWITTER; $networks[] = NETWORK_TWITTER;
} }
@ -102,7 +103,7 @@ class Widget
$networks[] = NETWORK_DIASPORA; $networks[] = NETWORK_DIASPORA;
} }
if (!plugin_enabled("pnut")) { if (!Addon::isEnabled("pnut")) {
$networks[] = NETWORK_PNUT; $networks[] = NETWORK_PNUT;
} }

315
src/Core/Addon.php Normal file
View file

@ -0,0 +1,315 @@
<?php
/**
* @file src/Core/Addon.php
*/
namespace Friendica\Core;
use Friendica\App;
use Friendica\Core\Config;
use Friendica\Core\System;
use Friendica\Database\DBM;
use dba;
require_once 'include/dba.php';
/**
* Some functions to handle addons
*/
class Addon
{
/**
* @brief uninstalls an addon.
*
* @param string $addon name of the addon
* @return boolean
*/
public static function uninstall($addon)
{
logger("Addons: uninstalling " . $addon);
dba::delete('addon', ['name' => $addon]);
@include_once('addon/' . $addon . '/' . $addon . '.php');
if (function_exists($addon . '_uninstall')) {
$func = $addon . '_uninstall';
$func();
}
}
/**
* @brief installs an addon.
*
* @param string $addon name of the addon
* @return bool
*/
public static function install($addon)
{
// silently fail if addon was removed
if (!file_exists('addon/' . $addon . '/' . $addon . '.php')) {
return false;
}
logger("Addons: installing " . $addon);
$t = @filemtime('addon/' . $addon . '/' . $addon . '.php');
@include_once('addon/' . $addon . '/' . $addon . '.php');
if (function_exists($addon . '_install')) {
$func = $addon . '_install';
$func();
$addon_admin = (function_exists($addon."_addon_admin") ? 1 : 0);
dba::insert('addon', ['name' => $addon, 'installed' => true,
'timestamp' => $t, 'plugin_admin' => $addon_admin]);
// we can add the following with the previous SQL
// once most site tables have been updated.
// This way the system won't fall over dead during the update.
if (file_exists('addon/' . $addon . '/.hidden')) {
dba::update('addon', ['hidden' => true], ['name' => $addon]);
}
return true;
} else {
logger("Addons: FAILED installing " . $addon);
return false;
}
}
/**
* reload all updated addons
*/
public static function reload()
{
$addons = Config::get('system', 'addon');
if (strlen($addons)) {
$r = dba::select('addon', [], ['installed' => 1]);
if (DBM::is_result($r)) {
$installed = $r;
} else {
$installed = [];
}
$addon_list = explode(',', $addons);
if (count($addon_list)) {
foreach ($addon_list as $addon) {
$addon = trim($addon);
$fname = 'addon/' . $addon . '/' . $addon . '.php';
if (file_exists($fname)) {
$t = @filemtime($fname);
foreach ($installed as $i) {
if (($i['name'] == $addon) && ($i['timestamp'] != $t)) {
logger('Reloading addon: ' . $i['name']);
@include_once($fname);
if (function_exists($addon . '_uninstall')) {
$func = $addon . '_uninstall';
$func();
}
if (function_exists($addon . '_install')) {
$func = $addon . '_install';
$func();
}
dba::update('addon', ['timestamp' => $t], ['id' => $i['id']]);
}
}
}
}
}
}
}
/**
* @brief check if addon is enabled
*
* @param string $addon
* @return boolean
*/
public static function isEnabled($addon)
{
return dba::exists('addon', ['installed' => true, 'name' => $addon]);
}
/**
* @brief registers a hook.
*
* @param string $hook the name of the hook
* @param string $file the name of the file that hooks into
* @param string $function the name of the function that the hook will call
* @param int $priority A priority (defaults to 0)
* @return mixed|bool
*/
public static function registerHook($hook, $file, $function, $priority = 0)
{
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$exists = dba::exists('hook', $condition);
if ($exists) {
return true;
}
$r = dba::insert('hook', ['hook' => $hook, 'file' => $file, 'function' => $function, 'priority' => $priority]);
return $r;
}
/**
* @brief unregisters a hook.
*
* @param string $hook the name of the hook
* @param string $file the name of the file that hooks into
* @param string $function the name of the function that the hook called
* @return array
*/
public static function unregisterHook($hook, $file, $function)
{
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$r = dba::delete('hook', $condition);
return $r;
}
/**
* Load hooks
*/
public static function loadHooks()
{
$a = get_app();
$a->hooks = [];
$r = dba::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]);
while ($rr = dba::fetch($r)) {
if (! array_key_exists($rr['hook'], $a->hooks)) {
$a->hooks[$rr['hook']] = [];
}
$a->hooks[$rr['hook']][] = [$rr['file'],$rr['function']];
}
dba::close($r);
}
/**
* @brief Calls a hook.
*
* Use this function when you want to be able to allow a hook to manipulate
* the provided data.
*
* @param string $name of the hook to call
* @param string|array &$data to transmit to the callback handler
*/
public static function callHooks($name, &$data = null)
{
$a = get_app();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) {
self::callSingleHook($a, $name, $hook, $data);
}
}
}
/**
* @brief Calls a single hook.
*
* @param string $name of the hook to call
* @param array $hook Hook data
* @param string|array &$data to transmit to the callback handler
*/
public static function callSingleHook($a, $name, $hook, &$data = null)
{
// Don't run a theme's hook if the user isn't using the theme
if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/'.current_theme()) === false) {
return;
}
@include_once($hook[0]);
if (function_exists($hook[1])) {
$func = $hook[1];
$func($a, $data);
} else {
// remove orphan hooks
$condition = ['hook' => $name, 'file' => $hook[0], 'function' => $hook[1]];
dba::delete('hook', $condition);
}
}
/**
* check if an app_menu hook exist for addon $name.
* Return true if the addon is an app
*/
public static function isApp($name)
{
$a = get_app();
if (is_array($a->hooks) && (array_key_exists('app_menu', $a->hooks))) {
foreach ($a->hooks['app_menu'] as $hook) {
if ($hook[0] == 'addon/'.$name.'/'.$name.'.php') {
return true;
}
}
}
return false;
}
/**
* @brief Parse addon comment in search of addon infos.
*
* like
* \code
*...* Name: addon
* * Description: An addon which plugs in
* . * Version: 1.2.3
* * Author: John <profile url>
* * Author: Jane <email>
* *
* *\endcode
* @param string $addon the name of the addon
* @return array with the addon information
*/
public static function getInfo($addon)
{
$a = get_app();
$info=[
'name' => $addon,
'description' => "",
'author' => [],
'version' => "",
'status' => ""
];
if (!is_file("addon/$addon/$addon.php")) {
return $info;
}
$stamp1 = microtime(true);
$f = file_get_contents("addon/$addon/$addon.php");
$a->save_timestamp($stamp1, "file");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r) {
$ll = explode("\n", $m[0]);
foreach ($ll as $l) {
$l = trim($l, "\t\n\r */");
if ($l != "") {
list($k,$v) = array_map("trim", explode(":", $l, 2));
$k= strtolower($k);
if ($k == "author") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['author'][] = ['name'=>$v];
}
} else {
if (array_key_exists($k, $info)) {
$info[$k]=$v;
}
}
}
}
}
return $info;
}
}

189
src/Core/Theme.php Normal file
View file

@ -0,0 +1,189 @@
<?php
/**
* @file src/Core/Theme.php
*/
namespace Friendica\Core;
use Friendica\Core\System;
require_once 'boot.php';
/**
* Some functions to handle themes
*/
class Theme
{
/**
* @brief Parse theme comment in search of theme infos.
*
* like
* \code
* ..* Name: My Theme
* * Description: My Cool Theme
* . * Version: 1.2.3
* * Author: John <profile url>
* * Maintainer: Jane <profile url>
* *
* \endcode
* @param string $theme the name of the theme
* @return array
*/
public static function getInfo($theme)
{
$info=[
'name' => $theme,
'description' => "",
'author' => [],
'maintainer' => [],
'version' => "",
'credits' => "",
'experimental' => false,
'unsupported' => false
];
if (file_exists("view/theme/$theme/experimental"))
$info['experimental'] = true;
if (file_exists("view/theme/$theme/unsupported"))
$info['unsupported'] = true;
if (!is_file("view/theme/$theme/theme.php")) return $info;
$a = get_app();
$stamp1 = microtime(true);
$f = file_get_contents("view/theme/$theme/theme.php");
$a->save_timestamp($stamp1, "file");
$r = preg_match("|/\*.*\*/|msU", $f, $m);
if ($r) {
$ll = explode("\n", $m[0]);
foreach ( $ll as $l ) {
$l = trim($l,"\t\n\r */");
if ($l != "") {
list($k, $v) = array_map("trim", explode(":", $l, 2));
$k= strtolower($k);
if ($k == "author") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['author'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['author'][] = ['name'=>$v];
}
} elseif ($k == "maintainer") {
$r=preg_match("|([^<]+)<([^>]+)>|", $v, $m);
if ($r) {
$info['maintainer'][] = ['name'=>$m[1], 'link'=>$m[2]];
} else {
$info['maintainer'][] = ['name'=>$v];
}
} else {
if (array_key_exists($k, $info)) {
$info[$k] = $v;
}
}
}
}
}
return $info;
}
/**
* @brief Returns the theme's screenshot.
*
* The screenshot is expected as view/theme/$theme/screenshot.[png|jpg].
*
* @param sring $theme The name of the theme
* @return string
*/
public static function getScreenshot($theme)
{
$exts = ['.png','.jpg'];
foreach ($exts as $ext) {
if (file_exists('view/theme/' . $theme . '/screenshot' . $ext)) {
return(System::baseUrl() . '/view/theme/' . $theme . '/screenshot' . $ext);
}
}
return(System::baseUrl() . '/images/blank.png');
}
// install and uninstall theme
public static function uninstall($theme)
{
logger("Addons: uninstalling theme " . $theme);
include_once("view/theme/$theme/theme.php");
if (function_exists("{$theme}_uninstall")) {
$func = "{$theme}_uninstall";
$func();
}
}
public static function install($theme)
{
// silently fail if theme was removed
if (! file_exists("view/theme/$theme/theme.php")) {
return false;
}
logger("Addons: installing theme $theme");
include_once("view/theme/$theme/theme.php");
if (function_exists("{$theme}_install")) {
$func = "{$theme}_install";
$func();
return true;
} else {
logger("Addons: FAILED installing theme $theme");
return false;
}
}
/**
* @brief Get the full path to relevant theme files by filename
*
* This function search in the theme directory (and if not present in global theme directory)
* if there is a directory with the file extension and for a file with the given
* filename.
*
* @param string $file Filename
* @param string $root Full root path
* @return string Path to the file or empty string if the file isn't found
*/
public static function getPathForFile($file, $root = '')
{
$file = basename($file);
// Make sure $root ends with a slash / if it's not blank
if ($root !== '' && $root[strlen($root)-1] !== '/') {
$root = $root . '/';
}
$theme_info = get_app()->theme_info;
if (is_array($theme_info) && array_key_exists('extends',$theme_info)) {
$parent = $theme_info['extends'];
} else {
$parent = 'NOPATH';
}
$theme = current_theme();
$thname = $theme;
$ext = substr($file,strrpos($file,'.')+1);
$paths = [
"{$root}view/theme/$thname/$ext/$file",
"{$root}view/theme/$parent/$ext/$file",
"{$root}view/$ext/$file",
];
foreach ($paths as $p) {
// strpos() is faster than strstr when checking if one string is in another (http://php.net/manual/en/function.strstr.php)
if (strpos($p,'NOPATH') !== false) {
continue;
} elseif (file_exists($p)) {
return $p;
}
}
return '';
}
}

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Core; namespace Friendica\Core;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -1030,7 +1031,7 @@ class Worker
$arr = ['args' => $args, 'run_cmd' => true]; $arr = ['args' => $args, 'run_cmd' => true];
call_hooks("proc_run", $arr); Addon::callHooks("proc_run", $arr);
if (!$arr['run_cmd'] || !count($args)) { if (!$arr['run_cmd'] || !count($args)) {
return true; return true;
} }

View file

@ -661,7 +661,7 @@ class DBStructure {
$database = []; $database = [];
$database["addon"] = [ $database["addon"] = [
"comment" => "registered plugins", "comment" => "registered addons",
"fields" => [ "fields" => [
"id" => ["type" => "int", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""], "id" => ["type" => "int", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
"name" => ["type" => "varchar(190)", "not null" => "1", "default" => "", "comment" => ""], "name" => ["type" => "varchar(190)", "not null" => "1", "default" => "", "comment" => ""],
@ -1081,7 +1081,7 @@ class DBStructure {
] ]
]; ];
$database["hook"] = [ $database["hook"] = [
"comment" => "plugin hook registry", "comment" => "addon hook registry",
"fields" => [ "fields" => [
"id" => ["type" => "int", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""], "id" => ["type" => "int", "not null" => "1", "extra" => "auto_increment", "primary" => "1", "comment" => ""],
"hook" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""], "hook" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],

View file

@ -5,6 +5,7 @@
namespace Friendica\Model; namespace Friendica\Model;
use Friendica\BaseObject; use Friendica\BaseObject;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -559,7 +560,7 @@ class Contact extends BaseObject
$args = ['contact' => $contact, 'menu' => &$menu]; $args = ['contact' => $contact, 'menu' => &$menu];
call_hooks('contact_photo_menu', $args); Addon::callHooks('contact_photo_menu', $args);
$menucondensed = []; $menucondensed = [];
@ -1146,7 +1147,7 @@ class Contact extends BaseObject
$arr = ['url' => $url, 'contact' => []]; $arr = ['url' => $url, 'contact' => []];
call_hooks('follow', $arr); Addon::callHooks('follow', $arr);
if (x($arr['contact'], 'name')) { if (x($arr['contact'], 'name')) {
$ret = $arr['contact']; $ret = $arr['contact'];

View file

@ -969,7 +969,7 @@ class GContact
/** /**
* @brief Fetches users of given GNU Social server * @brief Fetches users of given GNU Social server
* *
* If the "Statistics" plugin is enabled (See http://gstools.org/ for details) we query user data with this. * If the "Statistics" addon is enabled (See http://gstools.org/ for details) we query user data with this.
* *
* @param string $server Server address * @param string $server Server address
* @return void * @return void

View file

@ -8,6 +8,7 @@ namespace Friendica\Model;
use Friendica\App; use Friendica\App;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Content\ForumManager; use Friendica\Content\ForumManager;
use Friendica\Core\Addon;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
@ -286,7 +287,7 @@ class Profile
$profile['network_name'] = ''; $profile['network_name'] = '';
} }
call_hooks('profile_sidebar_enter', $profile); Addon::callHooks('profile_sidebar_enter', $profile);
// don't show connect link to yourself // don't show connect link to yourself
@ -520,7 +521,7 @@ class Profile
$arr = ['profile' => &$profile, 'entry' => &$o]; $arr = ['profile' => &$profile, 'entry' => &$o];
call_hooks('profile_sidebar', $arr); Addon::callHooks('profile_sidebar', $arr);
return $o; return $o;
} }
@ -939,7 +940,7 @@ class Profile
} }
$arr = ['is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs]; $arr = ['is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs];
call_hooks('profile_tabs', $arr); Addon::callHooks('profile_tabs', $arr);
$tpl = get_markup_template('common_tabs.tpl'); $tpl = get_markup_template('common_tabs.tpl');
@ -976,7 +977,7 @@ class Profile
Worker::add(PRIORITY_LOW, 'GProbe', $my_url); Worker::add(PRIORITY_LOW, 'GProbe', $my_url);
$arr = ['zrl' => $my_url, 'url' => $a->cmd]; $arr = ['zrl' => $my_url, 'url' => $a->cmd];
call_hooks('zrl_init', $arr); Addon::callHooks('zrl_init', $arr);
} }
} }

View file

@ -7,6 +7,7 @@
namespace Friendica\Model; namespace Friendica\Model;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
@ -26,7 +27,6 @@ require_once 'include/enotify.php';
require_once 'include/network.php'; require_once 'include/network.php';
require_once 'library/openid.php'; require_once 'library/openid.php';
require_once 'include/pgettext.php'; require_once 'include/pgettext.php';
require_once 'include/plugin.php';
require_once 'include/text.php'; require_once 'include/text.php';
/** /**
* @brief This class handles User related functions * @brief This class handles User related functions
@ -390,7 +390,7 @@ class User
$photo = avatar_img($email); $photo = avatar_img($email);
} }
// unless there is no avatar-plugin loaded // unless there is no avatar-addon loaded
if (strlen($photo)) { if (strlen($photo)) {
$photo_failure = false; $photo_failure = false;
@ -433,7 +433,7 @@ class User
} }
} }
call_hooks('register_account', $uid); Addon::callHooks('register_account', $uid);
$return['user'] = $user; $return['user'] = $user;
return $return; return $return;
@ -532,7 +532,7 @@ class User
$user = dba::selectFirst('user', [], ['uid' => $uid]); $user = dba::selectFirst('user', [], ['uid' => $uid]);
call_hooks('remove_user', $user); Addon::callHooks('remove_user', $user);
// save username (actually the nickname as it is guaranteed // save username (actually the nickname as it is guaranteed
// unique), so it cannot be re-registered in the future. // unique), so it cannot be re-registered in the future.

View file

@ -3,6 +3,7 @@
namespace Friendica\Module; namespace Friendica\Module;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Model\User; use Friendica\Model\User;
@ -88,11 +89,11 @@ class Login extends BaseModule
]; ];
/* /*
* A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record * An addon indicates successful login by setting 'authenticated' to non-zero value and returning a user record
* Plugins should never set 'authenticated' except to indicate success - as hooks may be chained * Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later plugins should not interfere with an earlier one that succeeded. * and later addons should not interfere with an earlier one that succeeded.
*/ */
call_hooks('authenticate', $addon_auth); Addon::callHooks('authenticate', $addon_auth);
if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) { if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {
$record = $addon_auth['user_record']; $record = $addon_auth['user_record'];
@ -299,7 +300,7 @@ class Login extends BaseModule
] ]
); );
call_hooks('login_hook', $o); Addon::callHooks('login_hook', $o);
return $o; return $o;
} }

View file

@ -3,10 +3,10 @@
namespace Friendica\Module; namespace Friendica\Module;
use Friendica\BaseModule; use Friendica\BaseModule;
use Friendica\Core\Addon;
require_once 'boot.php'; require_once 'boot.php';
require_once 'include/pgettext.php'; require_once 'include/pgettext.php';
require_once 'include/plugin.php';
require_once 'include/security.php'; require_once 'include/security.php';
/** /**
@ -21,7 +21,7 @@ class Logout extends BaseModule
*/ */
public static function init() public static function init()
{ {
call_hooks("logging_out"); Addon::callHooks("logging_out");
nuke_session(); nuke_session();
info(t('Logged out.') . EOL); info(t('Logged out.') . EOL);
goaway(self::getApp()->get_baseurl()); goaway(self::getApp()->get_baseurl());

View file

@ -5,6 +5,7 @@
namespace Friendica\Network; namespace Friendica\Network;
use Friendica\App; use Friendica\App;
use Friendica\Core\Addon;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -15,7 +16,6 @@ use OAuthSignatureMethod_PLAINTEXT;
use OAuthSignatureMethod_HMAC_SHA1; use OAuthSignatureMethod_HMAC_SHA1;
require_once "library/OAuth1.php"; require_once "library/OAuth1.php";
require_once "include/plugin.php";
/** /**
* @brief OAuth protocol * @brief OAuth protocol
@ -72,6 +72,6 @@ class FKOAuth1 extends OAuthServer
dba::update('user', ['login_date' => datetime_convert()], ['uid' => $_SESSION['uid']]); dba::update('user', ['login_date' => datetime_convert()], ['uid' => $_SESSION['uid']]);
call_hooks('logged_in', $a->user); Addon::callHooks('logged_in', $a->user);
} }
} }

View file

@ -7,6 +7,7 @@ namespace Friendica\Object;
use Friendica\BaseObject; use Friendica\BaseObject;
use Friendica\Content\ContactSelector; use Friendica\Content\ContactSelector;
use Friendica\Content\Feature; use Friendica\Content\Feature;
use Friendica\Core\Addon;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Model\Contact; use Friendica\Model\Contact;
@ -214,7 +215,7 @@ class Post extends BaseObject
} }
$locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => '']; $locate = ['location' => $item['location'], 'coord' => $item['coord'], 'html' => ''];
call_hooks('render_location', $locate); Addon::callHooks('render_location', $locate);
$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate)); $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
// process action responses - e.g. like/dislike/attend/agree/whatever // process action responses - e.g. like/dislike/attend/agree/whatever
@ -405,7 +406,7 @@ class Post extends BaseObject
]; ];
$arr = ['item' => $item, 'output' => $tmp_item]; $arr = ['item' => $item, 'output' => $tmp_item];
call_hooks('display_item', $arr); Addon::callHooks('display_item', $arr);
$result = $arr['output']; $result = $arr['output'];
@ -758,10 +759,10 @@ class Post extends BaseObject
$qc = $qcomment = null; $qc = $qcomment = null;
/* /*
* Hmmm, code depending on the presence of a particular plugin? * Hmmm, code depending on the presence of a particular addon?
* This should be better if done by a hook * This should be better if done by a hook
*/ */
if (in_array('qcomment', $a->plugins)) { if (in_array('qcomment', $a->addons)) {
$qc = ((local_user()) ? PConfig::get(local_user(), 'qcomment', 'words') : null); $qc = ((local_user()) ? PConfig::get(local_user(), 'qcomment', 'words') : null);
$qcomment = (($qc) ? explode("\n", $qc) : null); $qcomment = (($qc) ? explode("\n", $qc) : null);
} }

View file

@ -10,6 +10,7 @@ namespace Friendica\Protocol;
use Friendica\App; use Friendica\App;
use Friendica\Content\OEmbed; use Friendica\Content\OEmbed;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -269,12 +270,12 @@ class DFRN
$root = self::addHeader($doc, $owner, $author, $alternatelink, true); $root = self::addHeader($doc, $owner, $author, $alternatelink, true);
/// @TODO This hook can't work anymore /// @TODO This hook can't work anymore
// call_hooks('atom_feed', $atom); // Addon::callHooks('atom_feed', $atom);
if (!DBM::is_result($items) || $onlyheader) { if (!DBM::is_result($items) || $onlyheader) {
$atom = trim($doc->saveXML()); $atom = trim($doc->saveXML());
call_hooks('atom_feed_end', $atom); Addon::callHooks('atom_feed_end', $atom);
return $atom; return $atom;
} }
@ -303,7 +304,7 @@ class DFRN
$atom = trim($doc->saveXML()); $atom = trim($doc->saveXML());
call_hooks('atom_feed_end', $atom); Addon::callHooks('atom_feed_end', $atom);
return $atom; return $atom;
} }

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Util; namespace Friendica\Util;
use Friendica\Core\Addon;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Protocol\Email; use Friendica\Protocol\Email;
@ -30,7 +31,7 @@ class Emailer
*/ */
public static function send($params) public static function send($params)
{ {
call_hooks('emailer_send_prepare', $params); Addon::callHooks('emailer_send_prepare', $params);
$email_textonly = false; $email_textonly = false;
if (x($params, "uid")) { if (x($params, "uid")) {
@ -79,7 +80,7 @@ class Emailer
'headers' => $messageHeader 'headers' => $messageHeader
]; ];
//echo "<pre>"; var_dump($hookdata); killme(); //echo "<pre>"; var_dump($hookdata); killme();
call_hooks("emailer_send", $hookdata); Addon::callHooks("emailer_send", $hookdata);
$res = mail( $res = mail(
$hookdata['to'], // send to address $hookdata['to'], // send to address
$hookdata['subject'], // subject $hookdata['subject'], // subject

View file

@ -4,6 +4,8 @@
*/ */
namespace Friendica\Util; namespace Friendica\Util;
use Friendica\Core\Addon;
/** /**
* Leaflet Map related functions * Leaflet Map related functions
*/ */
@ -12,13 +14,13 @@ class Map {
$coord = trim($coord); $coord = trim($coord);
$coord = str_replace([',','/',' '],[' ',' ',' '],$coord); $coord = str_replace([',','/',' '],[' ',' ',' '],$coord);
$arr = ['lat' => trim(substr($coord,0,strpos($coord,' '))), 'lon' => trim(substr($coord,strpos($coord,' ')+1)), 'html' => '']; $arr = ['lat' => trim(substr($coord,0,strpos($coord,' '))), 'lon' => trim(substr($coord,strpos($coord,' ')+1)), 'html' => ''];
call_hooks('generate_map',$arr); Addon::callHooks('generate_map',$arr);
return ($arr['html']) ? $arr['html'] : $coord; return ($arr['html']) ? $arr['html'] : $coord;
} }
public static function byLocation($location) { public static function byLocation($location) {
$arr = ['location' => $location, 'html' => '']; $arr = ['location' => $location, 'html' => ''];
call_hooks('generate_named_map',$arr); Addon::callHooks('generate_named_map',$arr);
return ($arr['html']) ? $arr['html'] : $location; return ($arr['html']) ? $arr['html'] : $location;
} }
} }

View file

@ -6,6 +6,7 @@
namespace Friendica\Util; namespace Friendica\Util;
use Friendica\Content\OEmbed; use Friendica\Content\OEmbed;
use Friendica\Core\Addon;
use Friendica\Object\Image; use Friendica\Object\Image;
use Friendica\Util\XML; use Friendica\Util\XML;
@ -425,7 +426,7 @@ class ParseUrl
logger("parseurl_getsiteinfo: Siteinfo for ".$url." ".print_r($siteinfo, true), LOGGER_DEBUG); logger("parseurl_getsiteinfo: Siteinfo for ".$url." ".print_r($siteinfo, true), LOGGER_DEBUG);
call_hooks("getsiteinfo", $siteinfo); Addon::callHooks("getsiteinfo", $siteinfo);
return($siteinfo); return($siteinfo);
} }

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -138,7 +139,7 @@ Class Cron {
$sql_extra = (($manual_id) ? " AND `id` = $manual_id " : ""); $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
reload_plugins(); Addon::reload();
$d = datetime_convert(); $d = datetime_convert();

View file

@ -5,6 +5,7 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -18,7 +19,7 @@ Class CronHooks {
foreach ($a->hooks["cron"] as $single_hook) { foreach ($a->hooks["cron"] as $single_hook) {
if ($single_hook[1] == $hook) { if ($single_hook[1] == $hook) {
logger("Calling cron hook '" . $hook . "'", LOGGER_DEBUG); logger("Calling cron hook '" . $hook . "'", LOGGER_DEBUG);
call_single_hook($a, $hook, $single_hook); Addon::callSingleHook($a, $hook, $single_hook);
} }
} }
return; return;

View file

@ -6,6 +6,7 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -27,7 +28,7 @@ class Directory {
$arr = ['url' => $url]; $arr = ['url' => $url];
call_hooks('globaldir_update', $arr); Addon::callHooks('globaldir_update', $arr);
logger('Updating directory: ' . $arr['url'], LOGGER_DEBUG); logger('Updating directory: ' . $arr['url'], LOGGER_DEBUG);
if (strlen($arr['url'])) { if (strlen($arr['url'])) {

View file

@ -6,6 +6,7 @@
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -20,7 +21,7 @@ class Expire {
require_once 'include/datetime.php'; require_once 'include/datetime.php';
require_once 'include/items.php'; require_once 'include/items.php';
load_hooks(); Addon::loadHooks();
if ($param == 'delete') { if ($param == 'delete') {
logger('Delete expired items', LOGGER_DEBUG); logger('Delete expired items', LOGGER_DEBUG);
@ -50,7 +51,7 @@ class Expire {
foreach ($a->hooks["expire"] as $hook) { foreach ($a->hooks["expire"] as $hook) {
if ($hook[1] == $hook_name) { if ($hook[1] == $hook_name) {
logger("Calling expire hook '" . $hook[1] . "'", LOGGER_DEBUG); logger("Calling expire hook '" . $hook[1] . "'", LOGGER_DEBUG);
call_single_hook($a, $hook_name, $hook, $data); Addon::callSingleHook($a, $hook_name, $hook, $data);
} }
} }
return; return;

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
@ -553,10 +554,10 @@ class Notifier {
logger('notifier: calling hooks', LOGGER_DEBUG); logger('notifier: calling hooks', LOGGER_DEBUG);
if ($normal_mode) { if ($normal_mode) {
call_hooks('notifier_normal',$target_item); Addon::callHooks('notifier_normal',$target_item);
} }
call_hooks('notifier_end',$target_item); Addon::callHooks('notifier_end',$target_item);
return; return;
} }

View file

@ -4,6 +4,7 @@
*/ */
namespace Friendica\Worker; namespace Friendica\Worker;
use Friendica\Core\Addon;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -55,7 +56,7 @@ class Queue
*/ */
$r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`"); $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
call_hooks('queue_predeliver', $r); Addon::callHooks('queue_predeliver', $r);
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
foreach ($r as $q_item) { foreach ($r as $q_item) {
@ -159,7 +160,7 @@ class Queue
default: default:
$params = ['owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false]; $params = ['owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false];
call_hooks('queue_deliver', $params); Addon::callHooks('queue_deliver', $params);
if ($params['result']) { if ($params['result']) {
QueueModel::removeItem($q_item['id']); QueueModel::removeItem($q_item['id']);

View file

@ -1,5 +1,6 @@
<?php <?php
use Friendica\Core\Addon;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig; use Friendica\Core\PConfig;
use Friendica\Core\Worker; use Friendica\Core\Worker;
@ -81,26 +82,24 @@ function update_1189() {
function update_1191() { function update_1191() {
require_once 'include/plugin.php';
Config::set('system', 'maintenance', 1); Config::set('system', 'maintenance', 1);
if (plugin_enabled('forumlist')) { if (Addon::isEnabled('forumlist')) {
$plugin = 'forumlist'; $addon = 'forumlist';
$plugins = Config::get('system','addon'); $addons = Config::get('system', 'addon');
$plugins_arr = []; $addons_arr = [];
if ($plugins) { if ($addons) {
$plugins_arr = explode(",",str_replace(" ", "",$plugins)); $addons_arr = explode(",",str_replace(" ", "", $addons));
$idx = array_search($plugin, $plugins_arr); $idx = array_search($addon, $addons_arr);
if ($idx !== false){ if ($idx !== false){
unset($plugins_arr[$idx]); unset($addons_arr[$idx]);
//delete forumlist manually from addon and hook table //delete forumlist manually from addon and hook table
// since uninstall_plugin() don't work here // since Addon::uninstall() don't work here
q("DELETE FROM `addon` WHERE `name` = 'forumlist' "); q("DELETE FROM `addon` WHERE `name` = 'forumlist' ");
q("DELETE FROM `hook` WHERE `file` = 'addon/forumlist/forumlist.php' "); q("DELETE FROM `hook` WHERE `file` = 'addon/forumlist/forumlist.php' ");
Config::set('system','addon', implode(", ",$plugins_arr)); Config::set('system','addon', implode(", ", $addons_arr));
} }
} }
} }

View file

@ -386,12 +386,12 @@ $a->strings["Contacts who are not members of a group"] = "";
$a->strings["Theme settings updated."] = ""; $a->strings["Theme settings updated."] = "";
$a->strings["Site"] = ""; $a->strings["Site"] = "";
$a->strings["Users"] = ""; $a->strings["Users"] = "";
$a->strings["Plugins"] = ""; $a->strings["Addons"] = "";
$a->strings["Themes"] = ""; $a->strings["Themes"] = "";
$a->strings["DB updates"] = ""; $a->strings["DB updates"] = "";
$a->strings["Logs"] = ""; $a->strings["Logs"] = "";
$a->strings["Admin"] = ""; $a->strings["Admin"] = "";
$a->strings["Plugin Features"] = ""; $a->strings["Addon Features"] = "";
$a->strings["User registrations waiting for confirmation"] = ""; $a->strings["User registrations waiting for confirmation"] = "";
$a->strings["Normal Account"] = ""; $a->strings["Normal Account"] = "";
$a->strings["Soapbox Account"] = ""; $a->strings["Soapbox Account"] = "";
@ -405,7 +405,7 @@ $a->strings["Summary"] = "";
$a->strings["Registered users"] = ""; $a->strings["Registered users"] = "";
$a->strings["Pending registrations"] = ""; $a->strings["Pending registrations"] = "";
$a->strings["Version"] = ""; $a->strings["Version"] = "";
$a->strings["Active plugins"] = ""; $a->strings["Active addons"] = "";
$a->strings["Can not parse base url. Must have at least <scheme>://<domain>"] = ""; $a->strings["Can not parse base url. Must have at least <scheme>://<domain>"] = "";
$a->strings["Site settings updated."] = ""; $a->strings["Site settings updated."] = "";
$a->strings["No special theme for mobile devices"] = ""; $a->strings["No special theme for mobile devices"] = "";
@ -579,8 +579,8 @@ $a->strings["Name of the new user."] = "";
$a->strings["Nickname"] = ""; $a->strings["Nickname"] = "";
$a->strings["Nickname of the new user."] = ""; $a->strings["Nickname of the new user."] = "";
$a->strings["Email address of the new user."] = ""; $a->strings["Email address of the new user."] = "";
$a->strings["Plugin %s disabled."] = ""; $a->strings["Addon %s disabled."] = "";
$a->strings["Plugin %s enabled."] = ""; $a->strings["Addon %s enabled."] = "";
$a->strings["Disable"] = ""; $a->strings["Disable"] = "";
$a->strings["Enable"] = ""; $a->strings["Enable"] = "";
$a->strings["Toggle"] = ""; $a->strings["Toggle"] = "";
@ -812,8 +812,8 @@ $a->strings["Connected Apps"] = "";
$a->strings["Client key starts with"] = ""; $a->strings["Client key starts with"] = "";
$a->strings["No name"] = ""; $a->strings["No name"] = "";
$a->strings["Remove authorization"] = ""; $a->strings["Remove authorization"] = "";
$a->strings["No Plugin settings configured"] = ""; $a->strings["No Addon settings configured"] = "";
$a->strings["Plugin Settings"] = ""; $a->strings["Addon Settings"] = "";
$a->strings["Off"] = ""; $a->strings["Off"] = "";
$a->strings["On"] = ""; $a->strings["On"] = "";
$a->strings["Additional Features"] = ""; $a->strings["Additional Features"] = "";
@ -1128,8 +1128,8 @@ $a->strings["running at web location"] = "";
$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = ""; $a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "";
$a->strings["Bug reports and issues: please visit"] = ""; $a->strings["Bug reports and issues: please visit"] = "";
$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = ""; $a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
$a->strings["Installed plugins/addons/apps:"] = ""; $a->strings["Installed addons/addons/apps:"] = "";
$a->strings["No installed plugins/addons/apps"] = ""; $a->strings["No installed addons/addons/apps"] = "";
$a->strings["Authorize application connection"] = ""; $a->strings["Authorize application connection"] = "";
$a->strings["Return to your app and insert this Securty Code:"] = ""; $a->strings["Return to your app and insert this Securty Code:"] = "";
$a->strings["Please login to continue."] = ""; $a->strings["Please login to continue."] = "";

View file

@ -8,7 +8,7 @@
{{else}} {{else}}
<a class="btn" href="{{$baseurl}}/admin/{{$function}}?a=r&amp;t={{$form_security_token}}">{{$reload}}</a> <a class="btn" href="{{$baseurl}}/admin/{{$function}}?a=r&amp;t={{$form_security_token}}">{{$reload}}</a>
<ul id='pluginslist'> <ul id='pluginslist'>
{{foreach $plugins as $p}} {{foreach $addons as $p}}
<li class='plugin {{$p.1}}'> <li class='plugin {{$p.1}}'>
<a class='toggleplugin' href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}?a=t&amp;t={{$form_security_token}}' title="{{if $p.1==on}}Disable{{else}}Enable{{/if}}" ><span class='icon {{$p.1}}'></span></a> <a class='toggleplugin' href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}?a=t&amp;t={{$form_security_token}}' title="{{if $p.1==on}}Disable{{else}}Enable{{/if}}" ><span class='icon {{$p.1}}'></span></a>
<a href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}'><span class='name'>{{$p.2.name}}</span></a> - <span class="version">{{$p.2.version}}</span> <a href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}'><span class='name'>{{$p.2.name}}</span></a> - <span class="version">{{$p.2.version}}</span>

View file

@ -26,9 +26,9 @@
{{/if}} {{/if}}
{{if $admin.plugins_admin}}<h4>{{$plugadmtxt}}</h4>{{/if}} {{if $admin.addons_admin}}<h4>{{$plugadmtxt}}</h4>{{/if}}
<ul class='admin linklist'> <ul class='admin linklist'>
{{foreach $admin.plugins_admin as $l}} {{foreach $admin.addons_admin as $l}}
<li class='admin link button {{$l.2}}'><a href='{{$l.0}}'>{{$l.1}}</a></li> <li class='admin link button {{$l.2}}'><a href='{{$l.0}}'>{{$l.1}}</a></li>
{{/foreach}} {{/foreach}}
</ul> </ul>

View file

@ -2,7 +2,7 @@
<div id='adminpage'> <div id='adminpage'>
<h1>{{$title}} - {{$page}}</h1> <h1>{{$title}} - {{$page}}</h1>
<p><span class='toggleplugin icon {{$status}}'></span> {{$info.name}} - {{$info.version}} : <a href="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/?a=t&amp;t={{$form_security_token}}">{{$action}}</a></p> <p><span class='toggleplugin icon {{$status}}'></span> {{$info.name}} - {{$info.version}} : <a href="{{$baseurl}}/admin/{{$function}}/{{$addon}}/?a=t&amp;t={{$form_security_token}}">{{$action}}</a></p>
<p>{{$info.description}}</p> <p>{{$info.description}}</p>
<p class="author">{{$str_author}} <p class="author">{{$str_author}}
@ -23,7 +23,7 @@
{{if $admin_form}} {{if $admin_form}}
<h3>{{$settings}}</h3> <h3>{{$settings}}</h3>
<form method="post" action="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/"> <form method="post" action="{{$baseurl}}/admin/{{$function}}/{{$addon}}/">
{{$admin_form}} {{$admin_form}}
</form> </form>
{{/if}} {{/if}}

View file

@ -31,10 +31,10 @@
<dl> <dl>
<dt>{{$plugins.0}}</dt> <dt>{{$addons.0}}</dt>
{{foreach $plugins.1 as $p}} {{foreach $addons.1 as $p}}
<dd><a href="/admin/plugins/{{$p}}/">{{$p}}</a></dd> <dd><a href="/admin/addons/{{$p}}/">{{$p}}</a></dd>
{{/foreach}} {{/foreach}}
</dl> </dl>

Some files were not shown because too many files have changed in this diff Show more