[twitter] Add probe_detect hook function
authorHypolite Petovan <hypolite@mrpetovan.com>
Sat, 6 Jun 2020 19:00:17 +0000 (15:00 -0400)
committerHypolite Petovan <hypolite@mrpetovan.com>
Sat, 6 Jun 2020 19:05:55 +0000 (15:05 -0400)
twitter/twitter.php

index 7500b90..2f08b45 100644 (file)
@@ -79,7 +79,6 @@ use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Model\Conversation;
 use Friendica\Model\Group;
-use Friendica\Model\GServer;
 use Friendica\Model\Item;
 use Friendica\Model\ItemContent;
 use Friendica\Model\ItemURI;
@@ -112,29 +111,11 @@ function twitter_install()
        Hook::register('expire'                 , __FILE__, 'twitter_expire');
        Hook::register('prepare_body'           , __FILE__, 'twitter_prepare_body');
        Hook::register('check_item_notification', __FILE__, 'twitter_check_item_notification');
+       Hook::register('probe_detect'           , __FILE__, 'twitter_probe_detect');
        Logger::info("installed twitter");
 }
 
-function twitter_uninstall()
-{
-       Hook::unregister('load_config'            , __FILE__, 'twitter_load_config');
-       Hook::unregister('connector_settings'     , __FILE__, 'twitter_settings');
-       Hook::unregister('connector_settings_post', __FILE__, 'twitter_settings_post');
-       Hook::unregister('hook_fork'              , __FILE__, 'twitter_hook_fork');
-       Hook::unregister('post_local'             , __FILE__, 'twitter_post_local');
-       Hook::unregister('notifier_normal'        , __FILE__, 'twitter_post_hook');
-       Hook::unregister('jot_networks'           , __FILE__, 'twitter_jot_nets');
-       Hook::unregister('cron'                   , __FILE__, 'twitter_cron');
-       Hook::unregister('follow'                 , __FILE__, 'twitter_follow');
-       Hook::unregister('expire'                 , __FILE__, 'twitter_expire');
-       Hook::unregister('prepare_body'           , __FILE__, 'twitter_prepare_body');
-       Hook::unregister('check_item_notification', __FILE__, 'twitter_check_item_notification');
-
-       // old setting - remove only
-       Hook::unregister('post_local_end'     , __FILE__, 'twitter_post_hook');
-       Hook::unregister('addon_settings'     , __FILE__, 'twitter_settings');
-       Hook::unregister('addon_settings_post', __FILE__, 'twitter_settings_post');
-}
+// Hook functions
 
 function twitter_load_config(App $a, ConfigFileLoader $loader)
 {
@@ -183,14 +164,14 @@ function twitter_follow(App $a, array &$contact)
        $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
        $connection->post('friendships/create', ['screen_name' => $nickname]);
 
-       twitter_fetchuser($a, $uid, $nickname);
+       $user = twitter_fetchuser($nickname);
 
-       $r = q("SELECT name,nick,url,addr,batch,notify,poll,request,confirm,poco,photo,priority,network,alias,pubkey
-               FROM `contact` WHERE `uid` = %d AND `nick` = '%s'",
-                               intval($uid),
-                               DBA::escape($nickname));
-       if (DBA::isResult($r)) {
-               $contact["contact"] = $r[0];
+       $contact_id = twitter_fetch_contact($uid, $user, true);
+
+       $contact = Contact::getById($contact_id, ['name', 'nick', 'url', 'addr', 'batch', 'notify', 'poll', 'request', 'confirm', 'poco', 'photo', 'priority', 'network', 'alias', 'pubkey']);
+
+       if (DBA::isResult($contact)) {
+               $contact["contact"] = $contact;
        }
 }
 
@@ -473,6 +454,33 @@ function twitter_post_local(App $a, array &$b)
        $b['postopts'] .= 'twitter';
 }
 
+function twitter_probe_detect(App $a, array &$hookData)
+{
+       // Don't overwrite an existing result
+       if ($hookData['result']) {
+               return;
+       }
+
+       // Avoid a lookup for the wrong network
+       if (!in_array($hookData['network'], ['', Protocol::TWITTER])) {
+               return;
+       }
+
+       if (preg_match('=(.*)@twitter.com=i', $hookData['uri'], $matches)) {
+               $nick = $matches[1];
+       } elseif (preg_match('=https?://(?:mobile\.)?twitter.com/(.*)=i', $hookData['uri'], $matches)) {
+               $nick = $matches[1];
+       } else {
+               return;
+       }
+
+       $user = twitter_fetchuser($nick);
+
+       if ($user) {
+               $hookData['result'] = twitter_user_to_contact($user);
+       }
+}
+
 function twitter_action(App $a, $uid, $pid, $action)
 {
        $ckey = DI::config()->get('twitter', 'consumerkey');
@@ -1063,34 +1071,52 @@ function twitter_get_relation($uid, $target, $contact = [])
        return $relation;
 }
 
-function twitter_fetch_contact($uid, $data, $create_user)
+function twitter_user_to_contact($data)
 {
        if (empty($data->id_str)) {
                return -1;
        }
 
        $avatar = twitter_fix_avatar($data->profile_image_url_https);
-       $baseurl = "https://twitter.com";
-       $url = $baseurl . "/" . $data->screen_name;
-       $addr = $data->screen_name . "@twitter.com";
+       $baseurl = 'https://twitter.com';
+       $url = $baseurl . '/' . $data->screen_name;
+       $addr = $data->screen_name . '@twitter.com';
+
+       $fields = [
+               'url'      => $url,
+               'network'  => Protocol::TWITTER,
+               'alias'    => 'twitter::' . $data->id_str,
+               'baseurl'  => $baseurl,
+               'name'     => $data->name,
+               'nick'     => $data->screen_name,
+               'addr'     => $addr,
+               'location' => $data->location,
+               'about'    => $data->description,
+               'photo'    => $avatar,
+       ];
+
+       return $fields;
+}
 
-       $fields = ['url' => $url, 'network' => Protocol::TWITTER,
-               'alias' => 'twitter::' . $data->id_str,
-               'baseurl' => $baseurl, 'gsid' => GServer::getID($baseurl),
-               'name' => $data->name, 'nick' => $data->screen_name, 'addr' => $addr,
-               'location' => $data->location, 'about' => $data->description];
+function twitter_fetch_contact($uid, $data, $create_user)
+{
+       $fields = twitter_user_to_contact($data);
+
+       if (empty($fields)) {
+               return -1;
+       }
 
        // Update the public contact
        $pcontact = DBA::selectFirst('contact', ['id'], ['uid' => 0, 'alias' => "twitter::" . $data->id_str]);
        if (DBA::isResult($pcontact)) {
                $cid = $pcontact['id'];
        } else {
-               $cid = Contact::getIdForURL($url, 0, true, $fields);
+               $cid = Contact::getIdForURL($fields['url'], 0, true, $fields);
        }
 
        if (!empty($cid)) {
                DBA::update('contact', $fields, ['id' => $cid]);
-               Contact::updateAvatar($avatar, 0, $cid);
+               Contact::updateAvatar($fields['photo'], 0, $cid);
        }
 
        $contact = DBA::selectFirst('contact', [], ['uid' => $uid, 'alias' => "twitter::" . $data->id_str]);
@@ -1105,7 +1131,7 @@ function twitter_fetch_contact($uid, $data, $create_user)
                // create contact record
                $fields['uid'] = $uid;
                $fields['created'] = DateTimeFormat::utcNow();
-               $fields['nurl'] = Strings::normaliseLink($url);
+               $fields['nurl'] = Strings::normaliseLink($fields['url']);
                $fields['poll'] = 'twitter::' . $data->id_str;
                $fields['rel'] = $relation;
                $fields['priority'] = 1;
@@ -1122,7 +1148,7 @@ function twitter_fetch_contact($uid, $data, $create_user)
 
                Group::addMember(User::getDefaultGroup($uid), $contact_id);
 
-               Contact::updateAvatar($avatar, $uid, $contact_id);
+               Contact::updateAvatar($fields['photo'], $uid, $contact_id);
        } else {
                if ($contact["readonly"] || $contact["blocked"]) {
                        Logger::log("twitter_fetch_contact: Contact '" . $contact["nick"] . "' is blocked or readonly.", Logger::DEBUG);
@@ -1138,7 +1164,7 @@ function twitter_fetch_contact($uid, $data, $create_user)
                        $update = true;
                }
 
-               Contact::updateAvatar($avatar, $uid, $contact['id']);
+               Contact::updateAvatar($fields['photo'], $uid, $contact['id']);
 
                if ($contact['name'] != $data->name) {
                        $fields['name-date'] = $fields['uri-date'] = DateTimeFormat::utcNow();
@@ -1164,48 +1190,31 @@ function twitter_fetch_contact($uid, $data, $create_user)
        return $contact_id;
 }
 
-function twitter_fetchuser(App $a, $uid, $screen_name = "", $user_id = "")
+/**
+ * @param string $screen_name
+ * @return stdClass|null
+ * @throws Exception
+ */
+function twitter_fetchuser($screen_name)
 {
        $ckey = DI::config()->get('twitter', 'consumerkey');
        $csecret = DI::config()->get('twitter', 'consumersecret');
-       $otoken = DI::pConfig()->get($uid, 'twitter', 'oauthtoken');
-       $osecret = DI::pConfig()->get($uid, 'twitter', 'oauthsecret');
-
-       $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
-               intval($uid));
-
-       if (DBA::isResult($r)) {
-               $self = $r[0];
-       } else {
-               return;
-       }
 
-       $parameters = [];
-
-       if ($screen_name != "") {
-               $parameters["screen_name"] = $screen_name;
-       }
-
-       if ($user_id != "") {
-               $parameters["user_id"] = $user_id;
-       }
-
-       // Fetching user data
-       $connection = new TwitterOAuth($ckey, $csecret, $otoken, $osecret);
        try {
+               // Fetching user data
+               $connection = new TwitterOAuth($ckey, $csecret);
+               $parameters = ['screen_name' => $screen_name];
                $user = $connection->get('users/show', $parameters);
        } catch (TwitterOAuthException $e) {
-               Logger::log('twitter_fetchuser: Error fetching user ' . $uid . ': ' . $e->getMessage());
-               return;
+               Logger::log('twitter_fetchuser: Error fetching user ' . $screen_name . ': ' . $e->getMessage());
+               return null;
        }
 
        if (!is_object($user)) {
-               return;
+               return null;
        }
 
-       $contact_id = twitter_fetch_contact($uid, $user, true);
-
-       return $contact_id;
+       return $user;
 }
 
 /**