]> git.mxchange.org Git - friendica-addons.git/blobdiff - twitter/twitter.php
[twitter] Return null in the probe_detect hook result key on unsuccessful probe
[friendica-addons.git] / twitter / twitter.php
index 04145d0aeda1c9f44e95804b531902fa0809c5de..aaa378d18098f618693bbe0f8b27eabbe7979586 100644 (file)
@@ -6,6 +6,7 @@
  * Author: Tobias Diekershoff <https://f.diekershoff.de/profile/tobias>
  * Author: Michael Vogel <https://pirati.ca/profile/heluecht>
  * Maintainer: Hypolite Petovan <https://friendica.mrpetovan.com/profile/hypolite>
+ * Status: unsupported
  *
  * Copyright (c) 2011-2013 Tobias Diekershoff, Michael Vogel, Hypolite Petovan
  * All rights reserved.
@@ -86,7 +87,7 @@ use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Model\User;
 use Friendica\Protocol\Activity;
-use Friendica\Core\Config\Util\ConfigFileLoader;
+use Friendica\Core\Config\Util\ConfigFileManager;
 use Friendica\Core\System;
 use Friendica\Model\Photo;
 use Friendica\Util\DateTimeFormat;
@@ -124,12 +125,12 @@ function twitter_install()
 
 // Hook functions
 
-function twitter_load_config(App $a, ConfigFileLoader $loader)
+function twitter_load_config(ConfigFileManager $loader)
 {
-       $a->getConfigCache()->load($loader->loadAddonConfig('twitter'), \Friendica\Core\Config\ValueObject\Cache::SOURCE_STATIC);
+       DI::app()->getConfigCache()->load($loader->loadAddonConfig('twitter'), \Friendica\Core\Config\ValueObject\Cache::SOURCE_STATIC);
 }
 
-function twitter_check_item_notification(App $a, array &$notification_data)
+function twitter_check_item_notification(array &$notification_data)
 {
        $own_id = DI::pConfig()->get($notification_data['uid'], 'twitter', 'own_id');
 
@@ -139,14 +140,14 @@ function twitter_check_item_notification(App $a, array &$notification_data)
        }
 }
 
-function twitter_support_follow(App $a, array &$data)
+function twitter_support_follow(array &$data)
 {
        if ($data['protocol'] == Protocol::TWITTER) {
                $data['result'] = true;
        }
 }
 
-function twitter_follow(App $a, array &$contact)
+function twitter_follow(array &$contact)
 {
        Logger::info('Check if contact is twitter contact', ['url' => $contact['url']]);
 
@@ -158,7 +159,7 @@ function twitter_follow(App $a, array &$contact)
        $nickname = preg_replace("=https?://twitter.com/(.*)=ism", "$1", $contact['url']);
        $nickname = str_replace('@twitter.com', '', $nickname);
 
-       $uid = $a->getLoggedInUserId();
+       $uid = DI::userSession()->getLocalUserId();
 
        if (!twitter_api_contact('friendships/create', ['network' => Protocol::TWITTER, 'nick' => $nickname], $uid)) {
                $contact = null;
@@ -176,12 +177,12 @@ function twitter_follow(App $a, array &$contact)
        }
 }
 
-function twitter_unfollow(App $a, array &$hook_data)
+function twitter_unfollow(array &$hook_data)
 {
        $hook_data['result'] = twitter_api_contact('friendships/destroy', $hook_data['contact'], $hook_data['uid']);
 }
 
-function twitter_block(App $a, array &$hook_data)
+function twitter_block(array &$hook_data)
 {
        $hook_data['result'] = twitter_api_contact('blocks/create', $hook_data['contact'], $hook_data['uid']);
 
@@ -191,7 +192,7 @@ function twitter_block(App $a, array &$hook_data)
        }
 }
 
-function twitter_unblock(App $a, array &$hook_data)
+function twitter_unblock(array &$hook_data)
 {
        $hook_data['result'] = twitter_api_contact('blocks/destroy', $hook_data['contact'], $hook_data['uid']);
 }
@@ -205,7 +206,7 @@ function twitter_api_contact(string $apiPath, array $contact, int $uid): ?bool
        return (bool)twitter_api_call($uid, $apiPath, ['screen_name' => $contact['nick']]);
 }
 
-function twitter_jot_nets(App $a, array &$jotnets_fields)
+function twitter_jot_nets(array &$jotnets_fields)
 {
        if (!DI::userSession()->getLocalUserId()) {
                return;
@@ -224,7 +225,7 @@ function twitter_jot_nets(App $a, array &$jotnets_fields)
 }
 
 
-function twitter_settings_post(App $a)
+function twitter_settings_post()
 {
        if (!DI::userSession()->getLocalUserId()) {
                return;
@@ -295,7 +296,7 @@ function twitter_settings_post(App $a)
        }
 }
 
-function twitter_settings(App $a, array &$data)
+function twitter_settings(array &$data)
 {
        if (!DI::userSession()->getLocalUserId()) {
                return;
@@ -414,7 +415,7 @@ function twitter_settings(App $a, array &$data)
        ];
 }
 
-function twitter_hook_fork(App $a, array &$b)
+function twitter_hook_fork(array &$b)
 {
        DI::logger()->debug('twitter_hook_fork', $b);
 
@@ -466,7 +467,7 @@ function twitter_hook_fork(App $a, array &$b)
     }
 }
 
-function twitter_post_local(App $a, array &$b)
+function twitter_post_local(array &$b)
 {
        if ($b['edit']) {
                return;
@@ -495,7 +496,7 @@ function twitter_post_local(App $a, array &$b)
        $b['postopts'] .= 'twitter';
 }
 
-function twitter_probe_detect(App $a, array &$hookData)
+function twitter_probe_detect(array &$hookData)
 {
        // Don't overwrite an existing result
        if (isset($hookData['result'])) {
@@ -525,11 +526,16 @@ function twitter_probe_detect(App $a, array &$hookData)
        $user = twitter_fetchuser($nick);
 
        if ($user) {
-               $hookData['result'] = twitter_user_to_contact($user);
+               $hookData['result'] = twitter_user_to_contact($user) ?: null;
+       }
+
+       // Authoritative probe should set the result even if the probe was unsuccessful
+       if ($hookData['network'] == Protocol::TWITTER && empty($hookData['result'])) {
+               $hookData['result'] = [];
        }
 }
 
-function twitter_item_by_link(App $a, array &$hookData)
+function twitter_item_by_link(array &$hookData)
 {
        // Don't overwrite an existing result
        if (isset($hookData['item_id'])) {
@@ -569,7 +575,7 @@ function twitter_item_by_link(App $a, array &$hookData)
                return;
        }
 
-       $item = twitter_createpost($a, $hookData['uid'], $status, [], true, false, false);
+       $item = twitter_createpost($hookData['uid'], $status, [], true, false, false);
        if (!empty($item)) {
                $hookData['item_id'] = Item::insert($item);
        }
@@ -635,7 +641,7 @@ function twitter_get_id(string $uri)
        return (int)$id;
 }
 
-function twitter_post_hook(App $a, array &$b)
+function twitter_post_hook(array &$b)
 {
        DI::logger()->debug('Invoke post hook', $b);
 
@@ -736,7 +742,7 @@ function twitter_post_hook(App $a, array &$b)
                Logger::info('We have customer key and oauth stuff, going to send.');
 
                // If it's a repeated message from twitter then do a native retweet and exit
-               if (twitter_is_retweet($a, $b['uid'], $b['body'])) {
+               if (twitter_is_retweet($b['uid'], $b['body'])) {
                        return;
                }
 
@@ -829,7 +835,7 @@ function twitter_post_hook(App $a, array &$b)
                        Logger::info('twitter_post send', ['id' => $b['id'], 'result' => $result]);
 
                        if (!empty($result->source)) {
-                               DI::config()->set('twitter', 'application_name', strip_tags($result->source));
+                               DI::keyValue()->set('twitter_application_name', strip_tags($result->source));
                        }
 
                        if (!empty($result->errors)) {
@@ -875,7 +881,7 @@ function twitter_post_hook(App $a, array &$b)
                        }
 
                        if (!empty($application_name)) {
-                               DI::config()->set('twitter', 'application_name', strip_tags($application_name));
+                               DI::keyValue()->set('twitter_application_name', strip_tags($application_name));
                        }
                }
        }
@@ -979,13 +985,13 @@ function twitter_delete_item(array $item)
        }
 }
 
-function twitter_addon_admin_post(App $a)
+function twitter_addon_admin_post()
 {
        DI::config()->set('twitter', 'consumerkey', trim($_POST['consumerkey'] ?? ''));
        DI::config()->set('twitter', 'consumersecret', trim($_POST['consumersecret'] ?? ''));
 }
 
-function twitter_addon_admin(App $a, string &$o)
+function twitter_addon_admin(string &$o)
 {
        $t = Renderer::getMarkupTemplate('admin.tpl', 'addon/twitter/');
 
@@ -997,9 +1003,9 @@ function twitter_addon_admin(App $a, string &$o)
        ]);
 }
 
-function twitter_cron(App $a)
+function twitter_cron()
 {
-       $last = DI::config()->get('twitter', 'last_poll');
+       $last = DI::keyValue()->get('twitter_last_poll');
 
        $poll_interval = intval(DI::config()->get('twitter', 'poll_interval'));
        if (!$poll_interval) {
@@ -1049,7 +1055,7 @@ function twitter_cron(App $a)
                        $next_contact_check = 0;
 
                        if($next_contact_check <= time()) {
-                       pumpio_getallusers($a, $rr["uid"]);
+                       pumpio_getallusers($rr["uid"]);
                        DI::pConfig()->set($rr['uid'],'pumpio','contact_check',time());
                        }
                        */
@@ -1057,10 +1063,10 @@ function twitter_cron(App $a)
 
        Logger::notice('twitter: cron_end');
 
-       DI::config()->set('twitter', 'last_poll', time());
+       DI::keyValue()->set('twitter_last_poll', time());
 }
 
-function twitter_expire(App $a)
+function twitter_expire()
 {
        $days = DI::config()->get('twitter', 'expire');
 
@@ -1090,7 +1096,7 @@ function twitter_expire(App $a)
        Logger::notice('End expiry');
 }
 
-function twitter_prepare_body(App $a, array &$b)
+function twitter_prepare_body(array &$b)
 {
        if ($b['item']['network'] != Protocol::TWITTER) {
                return;
@@ -1099,7 +1105,7 @@ function twitter_prepare_body(App $a, array &$b)
        if ($b['preview']) {
                $max_char = 280;
                $item = $b['item'];
-               $item['plink'] = DI::baseUrl()->get() . '/display/' . $item['guid'];
+               $item['plink'] = DI::baseUrl() . '/display/' . $item['guid'];
 
                $condition = ['uri' => $item['thr-parent'], 'uid' => DI::userSession()->getLocalUserId()];
                $orig_post = Post::selectFirst(['author-link'], $condition);
@@ -1149,7 +1155,6 @@ function twitter_statuses_show(string $id, TwitterOAuth $twitterOAuth = null)
 /**
  * Parse Twitter status URLs since Twitter removed OEmbed
  *
- * @param App   $a
  * @param array $b Expected format:
  *                 [
  *                      'url' => [URL to parse],
@@ -1158,7 +1163,7 @@ function twitter_statuses_show(string $id, TwitterOAuth $twitterOAuth = null)
  *                 ]
  * @throws \Friendica\Network\HTTPException\InternalServerErrorException
  */
-function twitter_parse_link(App $a, array &$b)
+function twitter_parse_link(array &$b)
 {
        // Only handle Twitter status URLs
        if (!preg_match('#^https?://(?:mobile\.|www\.)?twitter.com/[^/]+/status/(\d+).*#', $b['url'], $matches)) {
@@ -1171,7 +1176,7 @@ function twitter_parse_link(App $a, array &$b)
                return;
        }
 
-       $item = twitter_createpost($a, 0, $status, [], true, false, true);
+       $item = twitter_createpost(0, $status, [], true, false, true);
        if (empty($item)) {
                return;
        }
@@ -1222,13 +1227,12 @@ function twitter_parse_link(App $a, array &$b)
 /**
  * @brief Build the item array for the mirrored post
  *
- * @param App $a Application class
  * @param integer $uid User id
  * @param object $post Twitter object with the post
  *
  * @return array item data to be posted
  */
-function twitter_do_mirrorpost(App $a, int $uid, $post)
+function twitter_do_mirrorpost(int $uid, $post)
 {
        $datarray['uid'] = $uid;
        $datarray['extid'] = 'twitter::' . $post->id;
@@ -1236,7 +1240,7 @@ function twitter_do_mirrorpost(App $a, int $uid, $post)
 
        if (!empty($post->retweeted_status)) {
                // We don't support nested shares, so we mustn't show quotes as shares on retweets
-               $item = twitter_createpost($a, $uid, $post->retweeted_status, ['id' => 0], false, false, true, -1);
+               $item = twitter_createpost($uid, $post->retweeted_status, ['id' => 0], false, false, true, -1);
 
                if (empty($item)) {
                        return [];
@@ -1252,7 +1256,7 @@ function twitter_do_mirrorpost(App $a, int $uid, $post)
 
                $datarray['body'] .= $item['body'] . '[/share]';
        } else {
-               $item = twitter_createpost($a, $uid, $post, ['id' => 0], false, false, false, -1);
+               $item = twitter_createpost($uid, $post, ['id' => 0], false, false, false, -1);
 
                if (empty($item)) {
                        return [];
@@ -1278,12 +1282,11 @@ function twitter_do_mirrorpost(App $a, int $uid, $post)
 /**
  * Fetches the Twitter user's own posts
  *
- * @param App $a
  * @param int $uid
  * @return void
  * @throws Exception
  */
-function twitter_fetchtimeline(App $a, int $uid): void
+function twitter_fetchtimeline(int $uid): void
 {
        $ckey    = DI::config()->get('twitter', 'consumerkey');
        $csecret = DI::config()->get('twitter', 'consumersecret');
@@ -1291,17 +1294,17 @@ function twitter_fetchtimeline(App $a, int $uid): void
        $osecret = DI::pConfig()->get($uid, 'twitter', 'oauthsecret');
        $lastid  = DI::pConfig()->get($uid, 'twitter', 'lastid');
 
-       $application_name = DI::config()->get('twitter', 'application_name');
+       $application_name = DI::keyValue()->get('twitter_application_name') ?? '';
 
        if ($application_name == '') {
-               $application_name = DI::baseUrl()->getHostname();
+               $application_name = DI::baseUrl()->getHost();
        }
 
        $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
        // Ensure to have the own contact
        try {
-               twitter_fetch_own_contact($a, $uid);
+               twitter_fetch_own_contact($uid);
        } catch (TwitterOAuthException $e) {
                Logger::notice('Error fetching own contact', ['uid' => $uid, 'message' => $e->getMessage()]);
                return;
@@ -1356,7 +1359,7 @@ function twitter_fetchtimeline(App $a, int $uid): void
                        }
                        Logger::info('Preparing mirror post', ['twitter-id' => $post->id_str, 'uid' => $uid]);
 
-                       $mirrorpost = twitter_do_mirrorpost($a, $uid, $post);
+                       $mirrorpost = twitter_do_mirrorpost($uid, $post);
 
                        if (empty($mirrorpost['body'])) {
                                Logger::notice('Body is empty', ['post' => $post, 'mirrorpost' => $mirrorpost]);
@@ -1696,7 +1699,7 @@ function twitter_expand_entities($body, stdClass $status)
        $replacementList = [];
 
        foreach ($status->entities->hashtags AS $hashtag) {
-               $replace = '#[url=' . DI::baseUrl()->get() . '/search?tag=' . $hashtag->text . ']' . $hashtag->text . '[/url]';
+               $replace = '#[url=' . DI::baseUrl() . '/search?tag=' . $hashtag->text . ']' . $hashtag->text . '[/url]';
                $taglist['#' . $hashtag->text] = ['#', $hashtag->text, ''];
 
                $replacementList[$hashtag->indices[0]] = [
@@ -1898,7 +1901,6 @@ function twitter_media_entities($post, array &$postarray, int $uriId = -1)
 /**
  * Undocumented function
  *
- * @param App $a
  * @param integer $uid User ID
  * @param object $post Incoming Twitter post
  * @param array $self
@@ -1908,7 +1910,7 @@ function twitter_media_entities($post, array &$postarray, int $uriId = -1)
  * @param integer $uriId URI Id used to store tags. 0 = create a new one; -1 = don't store tags for this post.
  * @return array item array
  */
-function twitter_createpost(App $a, int $uid, $post, array $self, $create_user, bool $only_existing_contact, bool $noquote, int $uriId = 0): array
+function twitter_createpost(int $uid, $post, array $self, $create_user, bool $only_existing_contact, bool $noquote, int $uriId = 0): array
 {
        $postarray = [];
        $postarray['network'] = Protocol::TWITTER;
@@ -2045,7 +2047,7 @@ function twitter_createpost(App $a, int $uid, $post, array $self, $create_user,
                $postarray['coord'] = $post->coordinates->coordinates[1] . ' ' . $post->coordinates->coordinates[0];
        }
        if (!empty($post->retweeted_status)) {
-               $retweet = twitter_createpost($a, $uid, $post->retweeted_status, $self, false, false, $noquote);
+               $retweet = twitter_createpost($uid, $post->retweeted_status, $self, false, false, $noquote);
 
                if (empty($retweet)) {
                        return [];
@@ -2081,7 +2083,7 @@ function twitter_createpost(App $a, int $uid, $post, array $self, $create_user,
                        // To avoid recursive share blocks we just provide the link to avoid removing quote context.
                        $postarray['body'] .= "\n\nhttps://twitter.com/" . $post->quoted_status->user->screen_name . "/status/" . $post->quoted_status->id_str;
                } else {
-                       $quoted = twitter_createpost($a, 0, $post->quoted_status, $self, false, false, true);
+                       $quoted = twitter_createpost(0, $post->quoted_status, $self, false, false, true);
                        if (!empty($quoted)) {
                                Item::insert($quoted);
                                $post = Post::selectFirst(['guid', 'uri-id'], ['uri' => $quoted['uri'], 'uid' => 0]);
@@ -2121,7 +2123,7 @@ function twitter_store_tags(int $uriId, array $taglist)
        }
 }
 
-function twitter_fetchparentposts(App $a, int $uid, $post, TwitterOAuth $connection, array $self)
+function twitter_fetchparentposts(int $uid, $post, TwitterOAuth $connection, array $self)
 {
        Logger::info('Fetching parent posts', ['user' => $uid, 'post' => $post->id_str]);
 
@@ -2158,7 +2160,7 @@ function twitter_fetchparentposts(App $a, int $uid, $post, TwitterOAuth $connect
 
        if (!empty($posts)) {
                foreach ($posts as $post) {
-                       $postarray = twitter_createpost($a, $uid, $post, $self, false, !DI::pConfig()->get($uid, 'twitter', 'create_user'), false);
+                       $postarray = twitter_createpost($uid, $post, $self, false, !DI::pConfig()->get($uid, 'twitter', 'create_user'), false);
 
                        if (empty($postarray)) {
                                continue;
@@ -2176,12 +2178,11 @@ function twitter_fetchparentposts(App $a, int $uid, $post, TwitterOAuth $connect
 /**
  * Fetches the posts received by the Twitter user
  *
- * @param App $a
  * @param int $uid
  * @return void
  * @throws Exception
  */
-function twitter_fetchhometimeline(App $a, int $uid): void
+function twitter_fetchhometimeline(int $uid): void
 {
        $ckey    = DI::config()->get('twitter', 'consumerkey');
        $csecret = DI::config()->get('twitter', 'consumersecret');
@@ -2192,16 +2193,16 @@ function twitter_fetchhometimeline(App $a, int $uid): void
 
        Logger::info('Fetching timeline', ['uid' => $uid]);
 
-       $application_name = DI::config()->get('twitter', 'application_name');
+       $application_name = DI::keyValue()->get('twitter_application_name') ?? '';
 
        if ($application_name == '') {
-               $application_name = DI::baseUrl()->getHostname();
+               $application_name = DI::baseUrl()->getHost();
        }
 
        $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
 
        try {
-               $own_contact = twitter_fetch_own_contact($a, $uid);
+               $own_contact = twitter_fetch_own_contact($uid);
        } catch (TwitterOAuthException $e) {
                Logger::notice('Error fetching own contact', ['uid' => $uid, 'message' => $e->getMessage()]);
                return;
@@ -2283,12 +2284,12 @@ function twitter_fetchhometimeline(App $a, int $uid): void
                        }
 
                        if ($post->in_reply_to_status_id_str != '') {
-                               twitter_fetchparentposts($a, $uid, $post, $connection, $self);
+                               twitter_fetchparentposts($uid, $post, $connection, $self);
                        }
 
                        Logger::info('Preparing post ' . $post->id_str . ' for user ' . $uid);
 
-                       $postarray = twitter_createpost($a, $uid, $post, $self, $create_user, true, false);
+                       $postarray = twitter_createpost($uid, $post, $self, $create_user, true, false);
 
                        if (empty($postarray)) {
                                Logger::info('Empty post ' . $post->id_str . ' and user ' . $uid);
@@ -2304,6 +2305,8 @@ function twitter_fetchhometimeline(App $a, int $uid): void
                                }
                        }
 
+                       $postarray['wall'] = (bool)$notify;
+
                        $item = Item::insert($postarray, $notify);
                        $postarray['id'] = $item;
 
@@ -2350,10 +2353,10 @@ function twitter_fetchhometimeline(App $a, int $uid): void
                        }
 
                        if ($post->in_reply_to_status_id_str != '') {
-                               twitter_fetchparentposts($a, $uid, $post, $connection, $self);
+                               twitter_fetchparentposts($uid, $post, $connection, $self);
                        }
 
-                       $postarray = twitter_createpost($a, $uid, $post, $self, false, !$create_user, false);
+                       $postarray = twitter_createpost($uid, $post, $self, false, !$create_user, false);
 
                        if (empty($postarray)) {
                                continue;
@@ -2370,7 +2373,7 @@ function twitter_fetchhometimeline(App $a, int $uid): void
        Logger::info('Last mentions ID for user ' . $uid . ' is now ' . $lastid);
 }
 
-function twitter_fetch_own_contact(App $a, int $uid)
+function twitter_fetch_own_contact(int $uid)
 {
        $ckey    = DI::config()->get('twitter', 'consumerkey');
        $csecret = DI::config()->get('twitter', 'consumersecret');
@@ -2406,7 +2409,7 @@ function twitter_fetch_own_contact(App $a, int $uid)
        return $contact_id;
 }
 
-function twitter_is_retweet(App $a, int $uid, string $body): bool
+function twitter_is_retweet(int $uid, string $body): bool
 {
        $body = trim($body);