Avoid some notices in the statusnet addon
[friendica-addons.git/.git] / statusnet / statusnet.php
index 3fa64ff..bc4ef36 100644 (file)
 define('STATUSNET_DEFAULT_POLL_INTERVAL', 5); // given in minutes
 
 require_once __DIR__ . DIRECTORY_SEPARATOR . 'library' . DIRECTORY_SEPARATOR . 'statusnetoauth.php';
-require_once 'include/enotify.php';
-
 use CodebirdSN\CodebirdSN;
 use Friendica\App;
 use Friendica\Content\OEmbed;
 use Friendica\Content\Text\HTML;
 use Friendica\Content\Text\Plaintext;
-use Friendica\Core\Addon;
 use Friendica\Core\Config;
+use Friendica\Core\Hook;
 use Friendica\Core\L10n;
 use Friendica\Core\Logger;
 use Friendica\Core\PConfig;
 use Friendica\Core\Protocol;
 use Friendica\Core\Renderer;
+use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\GContact;
@@ -65,32 +64,34 @@ use Friendica\Util\Strings;
 function statusnet_install()
 {
        //  we need some hooks, for the configuration and for sending tweets
-       Addon::registerHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       Addon::registerHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-       Addon::registerHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       Addon::registerHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
-       Addon::registerHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
-       Addon::registerHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
-       Addon::registerHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
-       Addon::registerHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+       Hook::register('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Hook::register('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+       Hook::register('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Hook::register('hook_fork', 'addon/statusnet/statusnet.php', 'statusnet_hook_fork');
+       Hook::register('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+       Hook::register('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+       Hook::register('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       Hook::register('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+       Hook::register('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
        Logger::log("installed GNU Social");
 }
 
 function statusnet_uninstall()
 {
-       Addon::unregisterHook('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       Addon::unregisterHook('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
-       Addon::unregisterHook('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       Addon::unregisterHook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
-       Addon::unregisterHook('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
-       Addon::unregisterHook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
-       Addon::unregisterHook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
-       Addon::unregisterHook('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
+       Hook::unregister('connector_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Hook::unregister('connector_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+       Hook::unregister('notifier_normal', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Hook::unregister('hook_fork', 'addon/statusnet/statusnet.php', 'statusnet_hook_fork');
+       Hook::unregister('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
+       Hook::unregister('jot_networks', 'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
+       Hook::unregister('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       Hook::unregister('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
+       Hook::unregister('check_item_notification', 'addon/statusnet/statusnet.php', 'statusnet_check_item_notification');
 
        // old setting - remove only
-       Addon::unregisterHook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
-       Addon::unregisterHook('addon_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
-       Addon::unregisterHook('addon_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
+       Hook::unregister('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
+       Hook::unregister('addon_settings', 'addon/statusnet/statusnet.php', 'statusnet_settings');
+       Hook::unregister('addon_settings_post', 'addon/statusnet/statusnet.php', 'statusnet_settings_post');
 }
 
 function statusnet_check_item_notification(App $a, &$notification_data)
@@ -121,7 +122,7 @@ function statusnet_settings_post(App $a, $post)
                return;
        }
        // don't check GNU Social settings if GNU Social submit button is not clicked
-       if (!x($_POST, 'statusnet-submit')) {
+       if (empty($_POST['statusnet-submit'])) {
                return;
        }
 
@@ -393,6 +394,47 @@ function statusnet_settings(App $a, &$s)
        $s .= '</div><div class="clear"></div>';
 }
 
+function statusnet_hook_fork(App $a, array &$b)
+{
+       if ($b['name'] != 'notifier_normal') {
+               return;
+       }
+
+       $post = $b['data'];
+
+       // Deleting and editing is not supported by the addon
+       if ($post['deleted'] || ($post['created'] !== $post['edited'])) {
+               $b['execute'] = false;
+               return;
+       }
+
+       // if post comes from GNU Social don't send it back
+       if ($post['extid'] == Protocol::STATUSNET) {
+               $b['execute'] = false;
+               return;
+       }
+
+       if ($post['app'] == 'StatusNet') {
+               $b['execute'] = false;
+               return;
+       }
+
+       if (PConfig::get($post['uid'], 'statusnet', 'import')) {
+               // Don't fork if it isn't a reply to a GNU Social post
+               if (($post['parent'] != $post['id']) && !Item::exists(['id' => $post['parent'], 'network' => Protocol::STATUSNET])) {
+                       Logger::log('No GNU Social parent found for item ' . $post['id']);
+                       $b['execute'] = false;
+                       return;
+               }
+       } else {
+               // Comments are never exported when we don't import the GNU Social timeline
+               if (!strstr($post['postopts'], 'statusnet') || ($post['parent'] != $post['id']) || $post['private']) {
+                       $b['execute'] = false;
+                       return;
+               }
+       }
+}
+
 function statusnet_post_local(App $a, &$b)
 {
        if ($b['edit']) {
@@ -404,7 +446,7 @@ function statusnet_post_local(App $a, &$b)
        }
 
        $statusnet_post = PConfig::get(local_user(), 'statusnet', 'post');
-       $statusnet_enable = (($statusnet_post && x($_REQUEST, 'statusnet_enable')) ? intval($_REQUEST['statusnet_enable']) : 0);
+       $statusnet_enable = (($statusnet_post && !empty($_REQUEST['statusnet_enable'])) ? intval($_REQUEST['statusnet_enable']) : 0);
 
        // if API is used, default to the chosen settings
        if ($b['api_source'] && intval(PConfig::get(local_user(), 'statusnet', 'post_by_default'))) {
@@ -624,12 +666,12 @@ function statusnet_addon_admin_post(App $a)
                }
                $secret = trim($_POST['secret'][$id]);
                $key = trim($_POST['key'][$id]);
-               //$applicationname = ((x($_POST, 'applicationname')) ? Strings::removeTags(trim($_POST['applicationname'][$id])):'');
+               //$applicationname = (!empty($_POST['applicationname']) ? Strings::escapeTags(trim($_POST['applicationname'][$id])):'');
                if ($sitename != "" &&
                        $apiurl != "" &&
                        $secret != "" &&
                        $key != "" &&
-                       !x($_POST['delete'][$id])) {
+                       empty($_POST['delete'][$id])) {
 
                        $sites[] = [
                                'sitename' => $sitename,
@@ -784,8 +826,6 @@ function statusnet_fetchtimeline(App $a, $uid)
        $lastid  = PConfig::get($uid, 'statusnet', 'lastid');
 
        require_once 'mod/item.php';
-       require_once 'include/items.php';
-
        //  get the application name for the SN app
        //  1st try personal config, then system config and fallback to the
        //  hostname of the node if neither one is set.
@@ -898,7 +938,7 @@ function statusnet_address($contact)
 
 function statusnet_fetch_contact($uid, $contact, $create_user)
 {
-       if ($contact->statusnet_profile_url == "") {
+       if (empty($contact->statusnet_profile_url)) {
                return -1;
        }
 
@@ -1211,12 +1251,14 @@ function statusnet_fetchhometimeline(App $a, $uid, $mode = 1)
 
        Logger::log("statusnet_fetchhometimeline: Fetching for user " . $uid, Logger::DEBUG);
 
-       require_once 'include/items.php';
-
        $connection = new StatusNetOAuth($api, $ckey, $csecret, $otoken, $osecret);
 
        $own_contact = statusnet_fetch_own_contact($a, $uid);
 
+       if (empty($own_contact)) {
+               return;
+       }
+
        $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
                intval($own_contact),
                intval($uid));
@@ -1398,8 +1440,6 @@ function statusnet_complete_conversation(App $a, $uid, $self, $create_user, $nic
 
 function statusnet_convertmsg(App $a, $body, $no_tags = false)
 {
-       require_once "include/items.php";
-
        $body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism", "$1.$2.$3.$4/$5", $body);
 
        $URLSearchString = "^\[\]";
@@ -1491,7 +1531,7 @@ function statusnet_convertmsg(App $a, $body, $no_tags = false)
                        if ($mtch[1] == "#") {
                                // Replacing the hash tags that are directed to the GNU Social server with internal links
                                $snhash = "#[url=" . $mtch[2] . "]" . $mtch[3] . "[/url]";
-                               $frdchash = '#[url=' . $a->getBaseURL() . '/search?tag=' . rawurlencode($mtch[3]) . ']' . $mtch[3] . '[/url]';
+                               $frdchash = '#[url=' . $a->getBaseURL() . '/search?tag=' . $mtch[3] . ']' . $mtch[3] . '[/url]';
                                $body = str_replace($snhash, $frdchash, $body);
 
                                $str_tags .= $frdchash;
@@ -1524,6 +1564,10 @@ function statusnet_fetch_own_contact(App $a, $uid)
                // Fetching user data
                $user = $connection->get('account/verify_credentials');
 
+               if (empty($user)) {
+                       return false;
+               }
+
                PConfig::set($uid, 'statusnet', 'own_url', Strings::normaliseLink($user->statusnet_profile_url));
 
                $contact_id = statusnet_fetch_contact($uid, $user, true);