]> git.mxchange.org Git - friendica.git/commitdiff
Rename Model\GlobalContact to Model\GContact
authorHypolite Petovan <mrpetovan@gmail.com>
Thu, 7 Dec 2017 14:09:28 +0000 (09:09 -0500)
committerHypolite Petovan <mrpetovan@gmail.com>
Thu, 7 Dec 2017 14:09:28 +0000 (09:09 -0500)
24 files changed:
include/acl_selectors.php
include/contact_widgets.php
include/items.php
include/post_update.php
mod/allfriends.php
mod/common.php
mod/contacts.php
mod/dirfind.php
mod/hovercard.php
mod/item.php
mod/profiles.php
mod/randprof.php
mod/settings.php
mod/suggest.php
src/Model/GContact.php [new file with mode: 0644]
src/Model/GlobalContact.php [deleted file]
src/Protocol/DFRN.php
src/Protocol/Diaspora.php
src/Protocol/OStatus.php
src/Protocol/PortableContact.php
src/Worker/CronJobs.php
src/Worker/DiscoverPoCo.php
src/Worker/GProbe.php
view/theme/vier/theme.php

index 4ef6733035a64e091abcfa3b0393b1c1b026ea07..d1b791136f6aec05c84d7d0d3a51b6be7e4cb209 100644 (file)
@@ -7,7 +7,7 @@ use Friendica\Content\Feature;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once "include/contact_selectors.php";
 require_once "include/contact_widgets.php";
@@ -774,7 +774,7 @@ function navbar_complete(App $a) {
        }
 
        if ($localsearch) {
-               $x = GlobalContact::searchByName($search, $mode);
+               $x = GContact::searchByName($search, $mode);
                return $x;
        }
 
index 31e57ea839e56f9b95bbbfd868a33089eb3a99ef..9c44f4d15695027027a5f756f8cfb93a1f62d92f 100644 (file)
@@ -7,7 +7,7 @@ use Friendica\Core\System;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once 'include/contact_selectors.php';
 
@@ -250,18 +250,18 @@ function common_friends_visitor_widget($profile_uid) {
        }
 
        if ($cid) {
-               $t = GlobalContact::countCommonFriends($profile_uid, $cid);
+               $t = GContact::countCommonFriends($profile_uid, $cid);
        } else {
-               $t = GlobalContact::countCommonFriendsZcid($profile_uid, $zcid);
+               $t = GContact::countCommonFriendsZcid($profile_uid, $zcid);
        }
        if (! $t) {
                return;
        }
 
        if ($cid) {
-               $r = GlobalContact::commonFriends($profile_uid, $cid, 0, 5, true);
+               $r = GContact::commonFriends($profile_uid, $cid, 0, 5, true);
        } else {
-               $r = GlobalContact::commonFriendsZcid($profile_uid, $zcid, 0, 5, true);
+               $r = GContact::commonFriendsZcid($profile_uid, $zcid, 0, 5, true);
        }
 
        return replace_macros(get_markup_template('remote_friends_common.tpl'), array(
index 44fca51d8f9713648b06bf42157f38c44bb2548d..0779ed91e19da00bf3f4eec2ac984f57cf37a3db 100644 (file)
@@ -11,7 +11,7 @@ use Friendica\Core\Worker;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Object\Image;
 use Friendica\Protocol\DFRN;
 use Friendica\Protocol\OStatus;
@@ -742,10 +742,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
                 * On comments the author is the better choice.
                 */
                if ($arr['parent-uri'] === $arr['uri']) {
-                       $arr["gcontact-id"] = GlobalContact::getId(array("url" => $arr['owner-link'], "network" => $arr['network'],
+                       $arr["gcontact-id"] = GContact::getId(array("url" => $arr['owner-link'], "network" => $arr['network'],
                                                                 "photo" => $arr['owner-avatar'], "name" => $arr['owner-name']));
                } else {
-                       $arr["gcontact-id"] = GlobalContact::getId(array("url" => $arr['author-link'], "network" => $arr['network'],
+                       $arr["gcontact-id"] = GContact::getId(array("url" => $arr['author-link'], "network" => $arr['network'],
                                                                 "photo" => $arr['author-avatar'], "name" => $arr['author-name']));
                }
        }
index 7cbc6ece0db3fead0789f22a3049f9cda96d896f..0d223709e2d506acdc743752d727510837cdd622 100644 (file)
@@ -6,7 +6,7 @@
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 /**
  * @brief Calls the post update functions
@@ -74,7 +74,7 @@ function post_update_1192() {
 
        // Set the "gcontact-id" in the item table and add a new gcontact entry if needed
        foreach ($item_arr AS $item) {
-               $gcontact_id = GlobalContact::getId(array("url" => $item['author-link'], "network" => $item['network'],
+               $gcontact_id = GContact::getId(array("url" => $item['author-link'], "network" => $item['network'],
                                                "photo" => $item['author-avatar'], "name" => $item['author-name']));
                q("UPDATE `item` SET `gcontact-id` = %d WHERE `uid` = %d AND `author-link` = '%s' AND `gcontact-id` = 0",
                        intval($gcontact_id), intval($item["uid"]), dbesc($item["author-link"]));
index 1eb4b0e1c4fd3de82f863e59ce53e7755cf2a82a..1456661253ff25bfb44f2e94e45fb2f0474a618a 100644 (file)
@@ -6,7 +6,7 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once 'include/contact_selectors.php';
 require_once 'mod/contacts.php';
@@ -41,12 +41,12 @@ function allfriends_content(App $a) {
        $a->page['aside'] = "";
        profile_load($a, "", 0, Contact::getDetailsByURL($c[0]["url"]));
 
-       $total = GlobalContact::countAllFriends(local_user(), $cid);
+       $total = GContact::countAllFriends(local_user(), $cid);
 
        if(count($total))
                $a->set_pager_total($total);
 
-       $r = GlobalContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']);
+       $r = GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']);
 
        if (! DBM::is_result($r)) {
                $o .= t('No friends to display.');
index d50dfcba783ccc0a3ff07bb66ac295f1e5434f02..74b4dec7c6e8253bd11e2dbae7cb6e1a3c9f780a 100644 (file)
@@ -5,7 +5,7 @@
 use Friendica\App;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once 'include/contact_selectors.php';
 require_once 'mod/contacts.php';
@@ -85,9 +85,9 @@ function common_content(App $a) {
        }
 
        if ($cid) {
-               $t = GlobalContact::countCommonFriends($uid, $cid);
+               $t = GContact::countCommonFriends($uid, $cid);
        } else {
-               $t = GlobalContact::countCommonFriendsZcid($uid, $zcid);
+               $t = GContact::countCommonFriendsZcid($uid, $zcid);
        }
 
        if (count($t)) {
@@ -99,9 +99,9 @@ function common_content(App $a) {
 
 
        if ($cid) {
-               $r = GlobalContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']);
+               $r = GContact::commonFriends($uid, $cid, $a->pager['start'], $a->pager['itemspage']);
        } else {
-               $r = GlobalContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']);
+               $r = GContact::commonFriendsZcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']);
        }
 
 
index e9e55570dfe774be0ff18e26d6f5d660340701f5..71ffcc2d664745b36fd1e128a5c16fd514e88b0e 100644 (file)
@@ -7,7 +7,7 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 
 require_once 'include/contact_selectors.php';
@@ -313,7 +313,7 @@ function _contact_update_profile($contact_id) {
        Contact::updateAvatar($data['photo'], local_user(), $contact_id, true);
 
        // Update the entry in the gcontact table
-       GlobalContact::updateFromProbe($data["url"]);
+       GContact::updateFromProbe($data["url"]);
 }
 
 function _contact_block($contact_id, $orig_record) {
@@ -887,7 +887,7 @@ function contacts_tab($a, $contact_id, $active_tab) {
        );
 
        // Show this tab only if there is visible friend list
-       $x = GlobalContact::countAllFriends(local_user(), $contact_id);
+       $x = GContact::countAllFriends(local_user(), $contact_id);
        if ($x)
                $tabs[] = array('label'=>t('Contacts'),
                                'url' => "allfriends/".$contact_id,
@@ -897,7 +897,7 @@ function contacts_tab($a, $contact_id, $active_tab) {
                                'accesskey' => 't');
 
        // Show this tab only if there is visible common friend list
-       $common = GlobalContact::countCommonFriends(local_user(), $contact_id);
+       $common = GContact::countCommonFriends(local_user(), $contact_id);
        if ($common)
                $tabs[] = array('label'=>t('Common Friends'),
                                'url' => "common/loc/".local_user()."/".$contact_id,
index 52dbf7512e136341af75c2eb0fb7e058bfd30242..bef89a4794ce1f74b0bf7da01cdd3b74244a9792 100644 (file)
@@ -7,7 +7,7 @@ use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Protocol\PortableContact;
 
@@ -82,7 +82,7 @@ function dirfind_content(App $a, $prefix = "") {
 
                        // Add the contact to the global contacts if it isn't already in our system
                        if (($contact["cid"] == 0) && ($contact["zid"] == 0) && ($contact["gid"] == 0)) {
-                               GlobalContact::update($user_data);
+                               GContact::update($user_data);
                        }
                } elseif ($local) {
 
index 496c5e02907345ed0388226aea116d2c0584de81..8ad5cd0ebe14b404cede665a96b96db0c059f246 100644 (file)
@@ -11,7 +11,7 @@
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 function hovercard_init(App $a) {
        // Just for testing purposes
@@ -47,7 +47,7 @@ function hovercard_content() {
        }
 
        // if it's the url containing https it should be converted to http
-       $nurl = normalise_link(GlobalContact::cleanContactUrl($profileurl));
+       $nurl = normalise_link(GContact::cleanContactUrl($profileurl));
        if($nurl) {
                // Search for contact data
                $contact = Contact::getDetailsByURL($nurl);
index c6478d99a0e6b501bfd1f20d7add211fe5bb3e45..c35a48b7e71173ddb6ab56b0df04974294052955 100644 (file)
@@ -23,7 +23,7 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Protocol\Diaspora;
 use Friendica\Protocol\Email;
@@ -743,7 +743,7 @@ function item_post(App $a) {
        $datarray['postopts']      = $postopts;
        $datarray['origin']        = $origin;
        $datarray['moderated']     = $allow_moderated;
-       $datarray['gcontact-id']   = GlobalContact::getId(array("url" => $datarray['author-link'], "network" => $datarray['network'],
+       $datarray['gcontact-id']   = GContact::getId(array("url" => $datarray['author-link'], "network" => $datarray['network'],
                                                        "photo" => $datarray['author-avatar'], "name" => $datarray['author-name']));
        $datarray['object']        = $object;
 
@@ -1244,7 +1244,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
                        if (!DBM::is_result($r)) {
                                $probed = Probe::uri($name);
                                if ($result['network'] != NETWORK_PHANTOM) {
-                                       GlobalContact::update($probed);
+                                       GContact::update($probed);
                                        $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
                                                dbesc(normalise_link($probed["url"])));
                                }
index 2ed0daff1ce5e8c1a726674f48dd2f77499811bb..893f0d51e34ba35cdd2e2271a93df29fffb383fc 100644 (file)
@@ -9,7 +9,7 @@ use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Model\Profile;
 use Friendica\Network\Probe;
 
@@ -509,7 +509,7 @@ function profiles_post(App $a) {
                        Worker::add(PRIORITY_LOW, 'ProfileUpdate', local_user());
 
                        // Update the global contact for the user
-                       GlobalContact::updateForUser(local_user());
+                       GContact::updateForUser(local_user());
                }
        }
 }
index 38d05c53e4308814b1a85ea28f468afe4dd93646..40ad09271d67b25811c3c1ffff10ba250b83ca38 100644 (file)
@@ -2,10 +2,10 @@
 
 use Friendica\App;
 use Friendica\Core\System;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 function randprof_init(App $a) {
-       $x = GlobalContact::getRandomUrl();
+       $x = GContact::getRandomUrl();
 
        if ($x) {
                goaway(zrl($x));
index 778a1d8a772dcc01900b9bcae7762f64a31077b1..5f14c82835889a7a56a2819cb6923ea5b65be3cf 100644 (file)
@@ -9,7 +9,7 @@ use Friendica\Core\Worker;
 use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Model\User;
 use Friendica\Protocol\Email;
 
@@ -650,7 +650,7 @@ function settings_post(App $a) {
        Worker::add(PRIORITY_LOW, 'ProfileUpdate', local_user());
 
        // Update the global contact for the user
-       GlobalContact::updateForUser(local_user());
+       GContact::updateForUser(local_user());
 
        //$_SESSION['theme'] = $theme;
        if ($email_changed && $a->config['register_policy'] == REGISTER_VERIFY) {
index 716f7962485c9d2775963e745cecd873c87e4233..deda2b2c6c93bbfdb5738c6807ac2d5b4ddad0a3 100644 (file)
@@ -6,7 +6,7 @@ use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once 'include/contact_widgets.php';
 
@@ -69,7 +69,7 @@ function suggest_content(App $a) {
        $a->page['aside'] .= follow_widget();
 
 
-       $r = GlobalContact::suggestionQuery(local_user());
+       $r = GContact::suggestionQuery(local_user());
 
        if (! DBM::is_result($r)) {
                $o .= t('No suggestions available. If this is a new site, please try again in 24 hours.');
diff --git a/src/Model/GContact.php b/src/Model/GContact.php
new file mode 100644 (file)
index 0000000..1b846b3
--- /dev/null
@@ -0,0 +1,1076 @@
+<?php
+/**
+ * @file src/Model/GlobalContact.php
+ * @brief This file includes the GlobalContact class with directory related functions
+ */
+namespace Friendica\Model;
+
+use Friendica\Core\Config;
+use Friendica\Core\System;
+use Friendica\Core\Worker;
+use Friendica\Database\DBM;
+use Friendica\Model\Contact;
+use Friendica\Model\Profile;
+use Friendica\Network\Probe;
+use Friendica\Protocol\PortableContact;
+use dba;
+use Exception;
+
+require_once 'include/datetime.php';
+require_once 'include/network.php';
+require_once 'include/html2bbcode.php';
+
+/**
+ * @brief This class handles GlobalContact related functions
+ */
+class GContact
+{
+       /**
+        * @brief Search global contact table by nick or name
+        *
+        * @param string $search Name or nick
+        * @param string $mode   Search mode (e.g. "community")
+        *
+        * @return array with search results
+        */
+       public static function searchByName($search, $mode = '')
+       {
+               if ($search) {
+                       // check supported networks
+                       if (Config::get('system', 'diaspora_enabled')) {
+                               $diaspora = NETWORK_DIASPORA;
+                       } else {
+                               $diaspora = NETWORK_DFRN;
+                       }
+
+                       if (!Config::get('system', 'ostatus_disabled')) {
+                               $ostatus = NETWORK_OSTATUS;
+                       } else {
+                               $ostatus = NETWORK_DFRN;
+                       }
+
+                       // check if we search only communities or every contact
+                       if ($mode === "community") {
+                               $extra_sql = " AND `community`";
+                       } else {
+                               $extra_sql = "";
+                       }
+
+                       $search .= "%";
+
+                       $results = q(
+                               "SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`nick`, `gcontact`.`photo`,
+                                               `gcontact`.`network`, `gcontact`.`keywords`, `gcontact`.`addr`, `gcontact`.`community`
+                               FROM `gcontact`
+                               LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
+                                       AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
+                                       AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
+                               WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
+                               ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR
+                               (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
+                               (`gcontact`.`addr` LIKE '%s' OR `gcontact`.`name` LIKE '%s' OR `gcontact`.`nick` LIKE '%s') $extra_sql
+                                       GROUP BY `gcontact`.`nurl`
+                                       ORDER BY `gcontact`.`nurl` DESC
+                                       LIMIT 1000",
+                               intval(local_user()),
+                               dbesc(CONTACT_IS_SHARING),
+                               dbesc(CONTACT_IS_FRIEND),
+                               dbesc(NETWORK_DFRN),
+                               dbesc($ostatus),
+                               dbesc($diaspora),
+                               dbesc(escape_tags($search)),
+                               dbesc(escape_tags($search)),
+                               dbesc(escape_tags($search))
+                       );
+
+                       return $results;
+               }
+       }
+
+       /**
+        * @brief Link the gcontact entry with user, contact and global contact
+        *
+        * @param integer $gcid Global contact ID
+        * @param integer $uid  User ID
+        * @param integer $cid  Contact ID
+        * @param integer $zcid Global Contact ID
+        * @return void
+        */
+       public static function link($gcid, $uid = 0, $cid = 0, $zcid = 0)
+       {
+               if ($gcid <= 0) {
+                       return;
+               }
+
+               $r = q(
+                       "SELECT * FROM `glink` WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d LIMIT 1",
+                       intval($cid),
+                       intval($uid),
+                       intval($gcid),
+                       intval($zcid)
+               );
+
+               if (!DBM::is_result($r)) {
+                       q(
+                               "INSERT INTO `glink` (`cid`, `uid`, `gcid`, `zcid`, `updated`) VALUES (%d, %d, %d, %d, '%s') ",
+                               intval($cid),
+                               intval($uid),
+                               intval($gcid),
+                               intval($zcid),
+                               dbesc(datetime_convert())
+                       );
+               } else {
+                       q(
+                               "UPDATE `glink` SET `updated` = '%s' WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d",
+                               dbesc(datetime_convert()),
+                               intval($cid),
+                               intval($uid),
+                               intval($gcid),
+                               intval($zcid)
+                       );
+               }
+       }
+
+       /**
+        * @brief Sanitize the given gcontact data
+        *
+        * @param array $gcontact array with gcontact data
+        * @throw Exception
+        *
+        * Generation:
+        *  0: No definition
+        *  1: Profiles on this server
+        *  2: Contacts of profiles on this server
+        *  3: Contacts of contacts of profiles on this server
+        *  4: ...
+        * @return array $gcontact
+        */
+       public static function sanitize($gcontact)
+       {
+               if ($gcontact['url'] == "") {
+                       throw new Exception('URL is empty');
+               }
+
+               $urlparts = parse_url($gcontact['url']);
+               if (!isset($urlparts["scheme"])) {
+                       throw new Exception("This (".$gcontact['url'].") doesn't seem to be an url.");
+               }
+
+               if (in_array($urlparts["host"], array("www.facebook.com", "facebook.com", "twitter.com", "identi.ca", "alpha.app.net"))) {
+                       throw new Exception('Contact from a non federated network ignored. ('.$gcontact['url'].')');
+               }
+
+               // Don't store the statusnet connector as network
+               // We can't simply set this to NETWORK_OSTATUS since the connector could have fetched posts from friendica as well
+               if ($gcontact['network'] == NETWORK_STATUSNET) {
+                       $gcontact['network'] = "";
+               }
+
+               // Assure that there are no parameter fragments in the profile url
+               if (in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
+                       $gcontact['url'] = self::cleanContactUrl($gcontact['url']);
+               }
+
+               $alternate = PortableContact::alternateOStatusUrl($gcontact['url']);
+
+               // The global contacts should contain the original picture, not the cached one
+               if (($gcontact['generation'] != 1) && stristr(normalise_link($gcontact['photo']), normalise_link(System::baseUrl()."/photo/"))) {
+                       $gcontact['photo'] = "";
+               }
+
+               if (!isset($gcontact['network'])) {
+                       $r = q(
+                               "SELECT `network` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s' AND `network` != '' AND `network` != '%s' LIMIT 1",
+                               dbesc(normalise_link($gcontact['url'])),
+                               dbesc(NETWORK_STATUSNET)
+                       );
+                       if (DBM::is_result($r)) {
+                               $gcontact['network'] = $r[0]["network"];
+                       }
+
+                       if (($gcontact['network'] == "") || ($gcontact['network'] == NETWORK_OSTATUS)) {
+                               $r = q(
+                                       "SELECT `network`, `url` FROM `contact` WHERE `uid` = 0 AND `alias` IN ('%s', '%s') AND `network` != '' AND `network` != '%s' LIMIT 1",
+                                       dbesc($gcontact['url']),
+                                       dbesc(normalise_link($gcontact['url'])),
+                                       dbesc(NETWORK_STATUSNET)
+                               );
+                               if (DBM::is_result($r)) {
+                                       $gcontact['network'] = $r[0]["network"];
+                               }
+                       }
+               }
+
+               $gcontact['server_url'] = '';
+               $gcontact['network'] = '';
+
+               $x = q(
+                       "SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
+                       dbesc(normalise_link($gcontact['url']))
+               );
+
+               if (DBM::is_result($x)) {
+                       if (!isset($gcontact['network']) && ($x[0]["network"] != NETWORK_STATUSNET)) {
+                               $gcontact['network'] = $x[0]["network"];
+                       }
+                       if ($gcontact['updated'] <= NULL_DATE) {
+                               $gcontact['updated'] = $x[0]["updated"];
+                       }
+                       if (!isset($gcontact['server_url']) && (normalise_link($x[0]["server_url"]) != normalise_link($x[0]["url"]))) {
+                               $gcontact['server_url'] = $x[0]["server_url"];
+                       }
+                       if (!isset($gcontact['addr'])) {
+                               $gcontact['addr'] = $x[0]["addr"];
+                       }
+               }
+
+               if ((!isset($gcontact['network']) || !isset($gcontact['name']) || !isset($gcontact['addr']) || !isset($gcontact['photo']) || !isset($gcontact['server_url']) || $alternate)
+                       && PortableContact::reachable($gcontact['url'], $gcontact['server_url'], $gcontact['network'], false)
+               ) {
+                       $data = Probe::uri($gcontact['url']);
+
+                       if ($data["network"] == NETWORK_PHANTOM) {
+                               throw new Exception('Probing for URL '.$gcontact['url'].' failed');
+                       }
+
+                       $orig_profile = $gcontact['url'];
+
+                       $gcontact["server_url"] = $data["baseurl"];
+
+                       $gcontact = array_merge($gcontact, $data);
+
+                       if ($alternate && ($gcontact['network'] == NETWORK_OSTATUS)) {
+                               // Delete the old entry - if it exists
+                               $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
+                               if (DBM::is_result($r)) {
+                                       q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
+                                       q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"]));
+                               }
+                       }
+               }
+
+               if (!isset($gcontact['name']) || !isset($gcontact['photo'])) {
+                       throw new Exception('No name and photo for URL '.$gcontact['url']);
+               }
+
+               if (!in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
+                       throw new Exception('No federated network ('.$gcontact['network'].') detected for URL '.$gcontact['url']);
+               }
+
+               if (!isset($gcontact['server_url'])) {
+                       // We check the server url to be sure that it is a real one
+                       $server_url = PortableContact::detectServer($gcontact['url']);
+
+                       // We are now sure that it is a correct URL. So we use it in the future
+                       if ($server_url != "") {
+                               $gcontact['server_url'] = $server_url;
+                       }
+               }
+
+               // The server URL doesn't seem to be valid, so we don't store it.
+               if (!PortableContact::checkServer($gcontact['server_url'], $gcontact['network'])) {
+                       $gcontact['server_url'] = "";
+               }
+
+               return $gcontact;
+       }
+
+       /**
+        * @param integer $uid id
+        * @param integer $cid id
+        * @return integer
+        */
+       public static function countCommonFriends($uid, $cid)
+       {
+               $r = q(
+                       "SELECT count(*) as `total`
+                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
+                       WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
+                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR
+                       (`gcontact`.`updated` >= `gcontact`.`last_failure`))
+                       AND `gcontact`.`nurl` IN (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
+                       intval($cid),
+                       intval($uid),
+                       intval($uid),
+                       intval($cid)
+               );
+
+               // logger("countCommonFriends: $uid $cid {$r[0]['total']}");
+               if (DBM::is_result($r)) {
+                       return $r[0]['total'];
+               }
+               return 0;
+       }
+
+       /**
+        * @param integer $uid  id
+        * @param integer $zcid zcid
+        * @return integer
+        */
+       public static function countCommonFriendsZcid($uid, $zcid)
+       {
+               $r = q(
+                       "SELECT count(*) as `total`
+                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
+                       where `glink`.`zcid` = %d
+                       and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
+                       intval($zcid),
+                       intval($uid)
+               );
+
+               if (DBM::is_result($r)) {
+                       return $r[0]['total'];
+               }
+
+               return 0;
+       }
+
+       /**
+        * @param object  $uid     user
+        * @param object  $cid     cid
+        * @param integer $start   optional, default 0
+        * @param integer $limit   optional, default 9999
+        * @param boolean $shuffle optional, default false
+        * @return object
+        */
+       public static function commonFriends($uid, $cid, $start = 0, $limit = 9999, $shuffle = false)
+       {
+               if ($shuffle) {
+                       $sql_extra = " order by rand() ";
+               } else {
+                       $sql_extra = " order by `gcontact`.`name` asc ";
+               }
+
+               $r = q(
+                       "SELECT `gcontact`.*, `contact`.`id` AS `cid`
+                       FROM `glink`
+                       INNER JOIN `gcontact` ON `glink`.`gcid` = `gcontact`.`id`
+                       INNER JOIN `contact` ON `gcontact`.`nurl` = `contact`.`nurl`
+                       WHERE `glink`.`cid` = %d and `glink`.`uid` = %d
+                               AND `contact`.`uid` = %d AND `contact`.`self` = 0 AND `contact`.`blocked` = 0
+                               AND `contact`.`hidden` = 0 AND `contact`.`id` != %d
+                               AND ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
+                               $sql_extra LIMIT %d, %d",
+                       intval($cid),
+                       intval($uid),
+                       intval($uid),
+                       intval($cid),
+                       intval($start),
+                       intval($limit)
+               );
+
+               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
+               return $r;
+       }
+
+       /**
+        * @param object  $uid     user
+        * @param object  $zcid    zcid
+        * @param integer $start   optional, default 0
+        * @param integer $limit   optional, default 9999
+        * @param boolean $shuffle optional, default false
+        * @return object
+        */
+       public static function commonFriendsZcid($uid, $zcid, $start = 0, $limit = 9999, $shuffle = false)
+       {
+               if ($shuffle) {
+                       $sql_extra = " order by rand() ";
+               } else {
+                       $sql_extra = " order by `gcontact`.`name` asc ";
+               }
+
+               $r = q(
+                       "SELECT `gcontact`.*
+                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
+                       where `glink`.`zcid` = %d
+                       and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
+                       $sql_extra limit %d, %d",
+                       intval($zcid),
+                       intval($uid),
+                       intval($start),
+                       intval($limit)
+               );
+
+               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
+               return $r;
+       }
+
+       /**
+        * @param object $uid user
+        * @param object $cid cid
+        * @return integer
+        */
+       public static function countAllFriends($uid, $cid)
+       {
+               $r = q(
+                       "SELECT count(*) as `total`
+                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
+                       where `glink`.`cid` = %d and `glink`.`uid` = %d AND
+                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))",
+                       intval($cid),
+                       intval($uid)
+               );
+
+               if (DBM::is_result($r)) {
+                       return $r[0]['total'];
+               }
+
+               return 0;
+       }
+
+       /**
+        * @param object  $uid   user
+        * @param object  $cid   cid
+        * @param integer $start optional, default 0
+        * @param integer $limit optional, default 80
+        * @return object
+        */
+       public static function allFriends($uid, $cid, $start = 0, $limit = 80)
+       {
+               $r = q(
+                       "SELECT `gcontact`.*, `contact`.`id` AS `cid`
+                       FROM `glink`
+                       INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
+                       LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` AND `contact`.`uid` = %d
+                       WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
+                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
+                       ORDER BY `gcontact`.`name` ASC LIMIT %d, %d ",
+                       intval($uid),
+                       intval($cid),
+                       intval($uid),
+                       intval($start),
+                       intval($limit)
+               );
+
+               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
+               return $r;
+       }
+
+       /**
+        * @param object  $uid   user
+        * @param integer $start optional, default 0
+        * @param integer $limit optional, default 80
+        * @return array
+        */
+       public static function suggestionQuery($uid, $start = 0, $limit = 80)
+       {
+               if (!$uid) {
+                       return array();
+               }
+
+               /*
+               * Uncommented because the result of the queries are to big to store it in the cache.
+               * We need to decide if we want to change the db column type or if we want to delete it.
+               */
+               //$list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit);
+               //if (!is_null($list)) {
+               //      return $list;
+               //}
+
+               $network = array(NETWORK_DFRN);
+
+               if (Config::get('system', 'diaspora_enabled')) {
+                       $network[] = NETWORK_DIASPORA;
+               }
+
+               if (!Config::get('system', 'ostatus_disabled')) {
+                       $network[] = NETWORK_OSTATUS;
+               }
+
+               $sql_network = implode("', '", $network);
+               $sql_network = "'".$sql_network."'";
+
+               /// @todo This query is really slow
+               // By now we cache the data for five minutes
+               $r = q(
+                       "SELECT count(glink.gcid) as `total`, gcontact.* from gcontact
+                       INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id`
+                       where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d )
+                       AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
+                       AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
+                       AND `gcontact`.`updated` >= '%s'
+                       AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
+                       AND `gcontact`.`network` IN (%s)
+                       GROUP BY `glink`.`gcid` ORDER BY `gcontact`.`updated` DESC,`total` DESC LIMIT %d, %d",
+                       intval($uid),
+                       intval($uid),
+                       intval($uid),
+                       intval($uid),
+                       dbesc(NULL_DATE),
+                       $sql_network,
+                       intval($start),
+                       intval($limit)
+               );
+
+               if (DBM::is_result($r) && count($r) >= ($limit -1)) {
+                       /*
+                       * Uncommented because the result of the queries are to big to store it in the cache.
+                       * We need to decide if we want to change the db column type or if we want to delete it.
+                       */
+                       //Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES);
+
+                       return $r;
+               }
+
+               $r2 = q(
+                       "SELECT gcontact.* FROM gcontact
+                       INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id`
+                       WHERE `glink`.`uid` = 0 AND `glink`.`cid` = 0 AND `glink`.`zcid` = 0 AND NOT `gcontact`.`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = %d)
+                       AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
+                       AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
+                       AND `gcontact`.`updated` >= '%s'
+                       AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
+                       AND `gcontact`.`network` IN (%s)
+                       ORDER BY rand() LIMIT %d, %d",
+                       intval($uid),
+                       intval($uid),
+                       intval($uid),
+                       dbesc(NULL_DATE),
+                       $sql_network,
+                       intval($start),
+                       intval($limit)
+               );
+
+               $list = array();
+               foreach ($r2 as $suggestion) {
+                       $list[$suggestion["nurl"]] = $suggestion;
+               }
+
+               foreach ($r as $suggestion) {
+                       $list[$suggestion["nurl"]] = $suggestion;
+               }
+
+               while (sizeof($list) > ($limit)) {
+                       array_pop($list);
+               }
+
+               /*
+               * Uncommented because the result of the queries are to big to store it in the cache.
+               * We need to decide if we want to change the db column type or if we want to delete it.
+               */
+               //Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES);
+               return $list;
+       }
+
+       /**
+        * @return void
+        */
+       public static function updateSuggestions()
+       {
+               $a = get_app();
+
+               $done = array();
+
+               /// @TODO Check if it is really neccessary to poll the own server
+               PortableContact::loadWorker(0, 0, 0, System::baseUrl() . '/poco');
+
+               $done[] = System::baseUrl() . '/poco';
+
+               if (strlen(Config::get('system', 'directory'))) {
+                       $x = fetch_url(get_server()."/pubsites");
+                       if ($x) {
+                               $j = json_decode($x);
+                               if ($j->entries) {
+                                       foreach ($j->entries as $entry) {
+                                               PortableContact::checkServer($entry->url);
+
+                                               $url = $entry->url . '/poco';
+                                               if (! in_array($url, $done)) {
+                                                       PortableContact::loadWorker(0, 0, 0, $entry->url . '/poco');
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               // Query your contacts from Friendica and Redmatrix/Hubzilla for their contacts
+               $r = q(
+                       "SELECT DISTINCT(`poco`) AS `poco` FROM `contact` WHERE `network` IN ('%s', '%s')",
+                       dbesc(NETWORK_DFRN),
+                       dbesc(NETWORK_DIASPORA)
+               );
+
+               if (DBM::is_result($r)) {
+                       foreach ($r as $rr) {
+                               $base = substr($rr['poco'], 0, strrpos($rr['poco'], '/'));
+                               if (! in_array($base, $done)) {
+                                       PortableContact::loadWorker(0, 0, 0, $base);
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @brief Removes unwanted parts from a contact url
+        *
+        * @param string $url Contact url
+        *
+        * @return string Contact url with the wanted parts
+        */
+       public static function cleanContactUrl($url)
+       {
+               $parts = parse_url($url);
+
+               if (!isset($parts["scheme"]) || !isset($parts["host"])) {
+                       return $url;
+               }
+
+               $new_url = $parts["scheme"]."://".$parts["host"];
+
+               if (isset($parts["port"])) {
+                       $new_url .= ":".$parts["port"];
+               }
+
+               if (isset($parts["path"])) {
+                       $new_url .= $parts["path"];
+               }
+
+               if ($new_url != $url) {
+                       logger("Cleaned contact url ".$url." to ".$new_url." - Called by: ".System::callstack(), LOGGER_DEBUG);
+               }
+
+               return $new_url;
+       }
+
+       /**
+        * @brief Replace alternate OStatus user format with the primary one
+        *
+        * @param arr $contact contact array (called by reference)
+        * @return void
+        */
+       public static function fixAlternateContactAddress(&$contact)
+       {
+               if (($contact["network"] == NETWORK_OSTATUS) && PortableContact::alternateOStatusUrl($contact["url"])) {
+                       $data = Probe::uri($contact["url"]);
+                       if ($contact["network"] == NETWORK_OSTATUS) {
+                               logger("Fix primary url from ".$contact["url"]." to ".$data["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
+                               $contact["url"] = $data["url"];
+                               $contact["addr"] = $data["addr"];
+                               $contact["alias"] = $data["alias"];
+                               $contact["server_url"] = $data["baseurl"];
+                       }
+               }
+       }
+
+       /**
+        * @brief Fetch the gcontact id, add an entry if not existed
+        *
+        * @param arr $contact contact array
+        *
+        * @return bool|int Returns false if not found, integer if contact was found
+        */
+       public static function getId($contact)
+       {
+               $gcontact_id = 0;
+               $doprobing = false;
+
+               if (in_array($contact["network"], array(NETWORK_PHANTOM))) {
+                       logger("Invalid network for contact url ".$contact["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
+                       return false;
+               }
+
+               if ($contact["network"] == NETWORK_STATUSNET) {
+                       $contact["network"] = NETWORK_OSTATUS;
+               }
+
+               // All new contacts are hidden by default
+               if (!isset($contact["hide"])) {
+                       $contact["hide"] = true;
+               }
+
+               // Replace alternate OStatus user format with the primary one
+               self::fixAlternateContactAddress($contact);
+
+               // Remove unwanted parts from the contact url (e.g. "?zrl=...")
+               if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
+                       $contact["url"] = self::cleanContactUrl($contact["url"]);
+               }
+
+               dba::lock('gcontact');
+               $r = q(
+                       "SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
+                       dbesc(normalise_link($contact["url"]))
+               );
+
+               if (DBM::is_result($r)) {
+                       $gcontact_id = $r[0]["id"];
+
+                       // Update every 90 days
+                       if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
+                               $last_failure_str = $r[0]["last_failure"];
+                               $last_failure = strtotime($r[0]["last_failure"]);
+                               $last_contact_str = $r[0]["last_contact"];
+                               $last_contact = strtotime($r[0]["last_contact"]);
+                               $doprobing = (((time() - $last_contact) > (90 * 86400)) && ((time() - $last_failure) > (90 * 86400)));
+                       }
+               } else {
+                       q(
+                               "INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`, `hide`, `generation`)
+                               VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
+                               dbesc($contact["name"]),
+                               dbesc($contact["nick"]),
+                               dbesc($contact["addr"]),
+                               dbesc($contact["network"]),
+                               dbesc($contact["url"]),
+                               dbesc(normalise_link($contact["url"])),
+                               dbesc($contact["photo"]),
+                               dbesc(datetime_convert()),
+                               dbesc(datetime_convert()),
+                               dbesc($contact["location"]),
+                               dbesc($contact["about"]),
+                               intval($contact["hide"]),
+                               intval($contact["generation"])
+                       );
+
+                       $r = q(
+                               "SELECT `id`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 2",
+                               dbesc(normalise_link($contact["url"]))
+                       );
+
+                       if (DBM::is_result($r)) {
+                               $gcontact_id = $r[0]["id"];
+
+                               $doprobing = in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""));
+                       }
+               }
+               dba::unlock();
+
+               if ($doprobing) {
+                       logger("Last Contact: ". $last_contact_str." - Last Failure: ".$last_failure_str." - Checking: ".$contact["url"], LOGGER_DEBUG);
+                       Worker::add(PRIORITY_LOW, 'GProbe', $contact["url"]);
+               }
+
+               return $gcontact_id;
+       }
+
+       /**
+        * @brief Updates the gcontact table from a given array
+        *
+        * @param arr $contact contact array
+        *
+        * @return bool|int Returns false if not found, integer if contact was found
+        */
+       public static function update($contact)
+       {
+               // Check for invalid "contact-type" value
+               if (isset($contact['contact-type']) && (intval($contact['contact-type']) < 0)) {
+                       $contact['contact-type'] = 0;
+               }
+
+               /// @todo update contact table as well
+
+               $gcontact_id = self::getId($contact);
+
+               if (!$gcontact_id) {
+                       return false;
+               }
+
+               $r = q(
+                       "SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`,
+                               `contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url`
+                       FROM `gcontact` WHERE `id` = %d LIMIT 1",
+                       intval($gcontact_id)
+               );
+
+               // Get all field names
+               $fields = array();
+               foreach ($r[0] as $field => $data) {
+                       $fields[$field] = $data;
+               }
+
+               unset($fields["url"]);
+               unset($fields["updated"]);
+               unset($fields["hide"]);
+
+               // Bugfix: We had an error in the storing of keywords which lead to the "0"
+               // This value is still transmitted via poco.
+               if ($contact["keywords"] == "0") {
+                       unset($contact["keywords"]);
+               }
+
+               if ($r[0]["keywords"] == "0") {
+                       $r[0]["keywords"] = "";
+               }
+
+               // assign all unassigned fields from the database entry
+               foreach ($fields as $field => $data) {
+                       if (!isset($contact[$field]) || ($contact[$field] == "")) {
+                               $contact[$field] = $r[0][$field];
+                       }
+               }
+
+               if (!isset($contact["hide"])) {
+                       $contact["hide"] = $r[0]["hide"];
+               }
+
+               $fields["hide"] = $r[0]["hide"];
+
+               if ($contact["network"] == NETWORK_STATUSNET) {
+                       $contact["network"] = NETWORK_OSTATUS;
+               }
+
+               // Replace alternate OStatus user format with the primary one
+               self::fixAlternateContactAddress($contact);
+
+               if (!isset($contact["updated"])) {
+                       $contact["updated"] = DBM::date();
+               }
+
+               if ($contact["network"] == NETWORK_TWITTER) {
+                       $contact["server_url"] = 'http://twitter.com';
+               }
+
+               if ($contact["server_url"] == "") {
+                       $data = Probe::uri($contact["url"]);
+                       if ($data["network"] != NETWORK_PHANTOM) {
+                               $contact["server_url"] = $data['baseurl'];
+                       }
+               } else {
+                       $contact["server_url"] = normalise_link($contact["server_url"]);
+               }
+
+               if (($contact["addr"] == "") && ($contact["server_url"] != "") && ($contact["nick"] != "")) {
+                       $hostname = str_replace("http://", "", $contact["server_url"]);
+                       $contact["addr"] = $contact["nick"]."@".$hostname;
+               }
+
+               // Check if any field changed
+               $update = false;
+               unset($fields["generation"]);
+
+               if ((($contact["generation"] > 0) && ($contact["generation"] <= $r[0]["generation"])) || ($r[0]["generation"] == 0)) {
+                       foreach ($fields as $field => $data) {
+                               if ($contact[$field] != $r[0][$field]) {
+                                       logger("Difference for contact ".$contact["url"]." in field '".$field."'. New value: '".$contact[$field]."', old value '".$r[0][$field]."'", LOGGER_DEBUG);
+                                       $update = true;
+                               }
+                       }
+
+                       if ($contact["generation"] < $r[0]["generation"]) {
+                               logger("Difference for contact ".$contact["url"]." in field 'generation'. new value: '".$contact["generation"]."', old value '".$r[0]["generation"]."'", LOGGER_DEBUG);
+                               $update = true;
+                       }
+               }
+
+               if ($update) {
+                       logger("Update gcontact for ".$contact["url"], LOGGER_DEBUG);
+                       $condition = array('`nurl` = ? AND (`generation` = 0 OR `generation` >= ?)',
+                                       normalise_link($contact["url"]), $contact["generation"]);
+                       $contact["updated"] = DBM::date($contact["updated"]);
+
+                       $updated = array('photo' => $contact['photo'], 'name' => $contact['name'],
+                                       'nick' => $contact['nick'], 'addr' => $contact['addr'],
+                                       'network' => $contact['network'], 'birthday' => $contact['birthday'],
+                                       'gender' => $contact['gender'], 'keywords' => $contact['keywords'],
+                                       'hide' => $contact['hide'], 'nsfw' => $contact['nsfw'],
+                                       'contact-type' => $contact['contact-type'], 'alias' => $contact['alias'],
+                                       'notify' => $contact['notify'], 'url' => $contact['url'],
+                                       'location' => $contact['location'], 'about' => $contact['about'],
+                                       'generation' => $contact['generation'], 'updated' => $contact['updated'],
+                                       'server_url' => $contact['server_url'], 'connect' => $contact['connect']);
+
+                       dba::update('gcontact', $updated, $condition, $fields);
+
+                       // Now update the contact entry with the user id "0" as well.
+                       // This is used for the shadow copies of public items.
+                       $r = q(
+                               "SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0 ORDER BY `id` LIMIT 1",
+                               dbesc(normalise_link($contact["url"]))
+                       );
+
+                       if (DBM::is_result($r)) {
+                               logger("Update public contact ".$r[0]["id"], LOGGER_DEBUG);
+
+                               Contact::updateAvatar($contact["photo"], 0, $r[0]["id"]);
+
+                               $fields = array('name', 'nick', 'addr',
+                                               'network', 'bd', 'gender',
+                                               'keywords', 'alias', 'contact-type',
+                                               'url', 'location', 'about');
+                               $old_contact = dba::select('contact', $fields, array('id' => $r[0]["id"]), array('limit' => 1));
+
+                               // Update it with the current values
+                               $fields = array('name' => $contact['name'], 'nick' => $contact['nick'],
+                                               'addr' => $contact['addr'], 'network' => $contact['network'],
+                                               'bd' => $contact['birthday'], 'gender' => $contact['gender'],
+                                               'keywords' => $contact['keywords'], 'alias' => $contact['alias'],
+                                               'contact-type' => $contact['contact-type'], 'url' => $contact['url'],
+                                               'location' => $contact['location'], 'about' => $contact['about']);
+
+                               dba::update('contact', $fields, array('id' => $r[0]["id"]), $old_contact);
+                       }
+               }
+
+               return $gcontact_id;
+       }
+
+       /**
+        * @brief Updates the gcontact entry from probe
+        *
+        * @param str $url profile link
+        * @return void
+        */
+       public static function updateFromProbe($url)
+       {
+               $data = Probe::uri($url);
+
+               if (in_array($data["network"], array(NETWORK_PHANTOM))) {
+                       logger("Invalid network for contact url ".$data["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
+                       return;
+               }
+
+               $data["server_url"] = $data["baseurl"];
+
+               self::update($data);
+       }
+
+       /**
+        * @brief Update the gcontact entry for a given user id
+        *
+        * @param int $uid User ID
+        * @return void
+        */
+       public static function updateForUser($uid)
+       {
+               $r = q(
+                       "SELECT `profile`.`locality`, `profile`.`region`, `profile`.`country-name`,
+                               `profile`.`name`, `profile`.`about`, `profile`.`gender`,
+                               `profile`.`pub_keywords`, `profile`.`dob`, `profile`.`photo`,
+                               `profile`.`net-publish`, `user`.`nickname`, `user`.`hidewall`,
+                               `contact`.`notify`, `contact`.`url`, `contact`.`addr`
+                       FROM `profile`
+                               INNER JOIN `user` ON `user`.`uid` = `profile`.`uid`
+                               INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid`
+                       WHERE `profile`.`uid` = %d AND `profile`.`is-default` AND `contact`.`self`",
+                       intval($uid)
+               );
+
+               $location = Profile::formatLocation(
+                       array("locality" => $r[0]["locality"], "region" => $r[0]["region"], "country-name" => $r[0]["country-name"])
+               );
+
+               // The "addr" field was added in 3.4.3 so it can be empty for older users
+               if ($r[0]["addr"] != "") {
+                       $addr = $r[0]["nickname"].'@'.str_replace(array("http://", "https://"), "", System::baseUrl());
+               } else {
+                       $addr = $r[0]["addr"];
+               }
+
+               $gcontact = array("name" => $r[0]["name"], "location" => $location, "about" => $r[0]["about"],
+                               "gender" => $r[0]["gender"], "keywords" => $r[0]["pub_keywords"],
+                               "birthday" => $r[0]["dob"], "photo" => $r[0]["photo"],
+                               "notify" => $r[0]["notify"], "url" => $r[0]["url"],
+                               "hide" => ($r[0]["hidewall"] || !$r[0]["net-publish"]),
+                               "nick" => $r[0]["nickname"], "addr" => $addr,
+                               "connect" => $addr, "server_url" => System::baseUrl(),
+                               "generation" => 1, "network" => NETWORK_DFRN);
+
+               self::update($gcontact);
+       }
+
+       /**
+        * @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.
+        *
+        * @param str $server Server address
+        * @return void
+        */
+       public static function fetchGsUsers($server)
+       {
+               logger("Fetching users from GNU Social server ".$server, LOGGER_DEBUG);
+
+               $url = $server."/main/statistics";
+
+               $result = z_fetch_url($url);
+               if (!$result["success"]) {
+                       return false;
+               }
+
+               $statistics = json_decode($result["body"]);
+
+               if (is_object($statistics->config)) {
+                       if ($statistics->config->instance_with_ssl) {
+                               $server = "https://";
+                       } else {
+                               $server = "http://";
+                       }
+
+                       $server .= $statistics->config->instance_address;
+
+                       $hostname = $statistics->config->instance_address;
+               } else {
+                       /// @TODO is_object() above means here no object, still $statistics is being used as object
+                       if ($statistics->instance_with_ssl) {
+                               $server = "https://";
+                       } else {
+                               $server = "http://";
+                       }
+
+                       $server .= $statistics->instance_address;
+
+                       $hostname = $statistics->instance_address;
+               }
+
+               if (is_object($statistics->users)) {
+                       foreach ($statistics->users as $nick => $user) {
+                               $profile_url = $server."/".$user->nickname;
+
+                               $contact = array("url" => $profile_url,
+                                               "name" => $user->fullname,
+                                               "addr" => $user->nickname."@".$hostname,
+                                               "nick" => $user->nickname,
+                                               "about" => $user->bio,
+                                               "network" => NETWORK_OSTATUS,
+                                               "photo" => System::baseUrl()."/images/person-175.jpg");
+                               self::getId($contact);
+                       }
+               }
+       }
+
+       /**
+        * @brief Asking GNU Social server on a regular base for their user data
+        * @return void
+        */
+       public static function discoverGsUsers()
+       {
+               $requery_days = intval(Config::get("system", "poco_requery_days"));
+
+               $last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
+
+               $r = q(
+                       "SELECT `nurl`, `url` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `network` = '%s' AND `last_poco_query` < '%s' ORDER BY RAND() LIMIT 5",
+                       dbesc(NETWORK_OSTATUS),
+                       dbesc($last_update)
+               );
+
+               if (!DBM::is_result($r)) {
+                       return;
+               }
+
+               foreach ($r as $server) {
+                       self::fetchGsUsers($server["url"]);
+                       q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
+               }
+       }
+
+       /**
+        * @return string
+        */
+       public static function getRandomUrl()
+       {
+               $r = q(
+                       "SELECT `url` FROM `gcontact` WHERE `network` = '%s'
+                                       AND `last_contact` >= `last_failure`
+                                       AND `updated` > UTC_TIMESTAMP - INTERVAL 1 MONTH
+                               ORDER BY rand() LIMIT 1",
+                       dbesc(NETWORK_DFRN)
+               );
+
+               if (DBM::is_result($r)) {
+                       return dirname($r[0]['url']);
+               }
+
+               return '';
+       }
+}
diff --git a/src/Model/GlobalContact.php b/src/Model/GlobalContact.php
deleted file mode 100644 (file)
index 6c92e4f..0000000
+++ /dev/null
@@ -1,1076 +0,0 @@
-<?php
-/**
- * @file src/Model/GlobalContact.php
- * @brief This file includes the GlobalContact class with directory related functions
- */
-namespace Friendica\Model;
-
-use Friendica\Core\Config;
-use Friendica\Core\System;
-use Friendica\Core\Worker;
-use Friendica\Database\DBM;
-use Friendica\Model\Contact;
-use Friendica\Model\Profile;
-use Friendica\Network\Probe;
-use Friendica\Protocol\PortableContact;
-use dba;
-use Exception;
-
-require_once 'include/datetime.php';
-require_once 'include/network.php';
-require_once 'include/html2bbcode.php';
-
-/**
- * @brief This class handles GlobalContact related functions
- */
-class GlobalContact
-{
-       /**
-        * @brief Search global contact table by nick or name
-        *
-        * @param string $search Name or nick
-        * @param string $mode   Search mode (e.g. "community")
-        *
-        * @return array with search results
-        */
-       public static function searchByName($search, $mode = '')
-       {
-               if ($search) {
-                       // check supported networks
-                       if (Config::get('system', 'diaspora_enabled')) {
-                               $diaspora = NETWORK_DIASPORA;
-                       } else {
-                               $diaspora = NETWORK_DFRN;
-                       }
-
-                       if (!Config::get('system', 'ostatus_disabled')) {
-                               $ostatus = NETWORK_OSTATUS;
-                       } else {
-                               $ostatus = NETWORK_DFRN;
-                       }
-
-                       // check if we search only communities or every contact
-                       if ($mode === "community") {
-                               $extra_sql = " AND `community`";
-                       } else {
-                               $extra_sql = "";
-                       }
-
-                       $search .= "%";
-
-                       $results = q(
-                               "SELECT `contact`.`id` AS `cid`, `gcontact`.`url`, `gcontact`.`name`, `gcontact`.`nick`, `gcontact`.`photo`,
-                                               `gcontact`.`network`, `gcontact`.`keywords`, `gcontact`.`addr`, `gcontact`.`community`
-                               FROM `gcontact`
-                               LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl`
-                                       AND `contact`.`uid` = %d AND NOT `contact`.`blocked`
-                                       AND NOT `contact`.`pending` AND `contact`.`rel` IN ('%s', '%s')
-                               WHERE (`contact`.`id` > 0 OR (NOT `gcontact`.`hide` AND `gcontact`.`network` IN ('%s', '%s', '%s') AND
-                               ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR
-                               (`gcontact`.`updated` >= `gcontact`.`last_failure`)))) AND
-                               (`gcontact`.`addr` LIKE '%s' OR `gcontact`.`name` LIKE '%s' OR `gcontact`.`nick` LIKE '%s') $extra_sql
-                                       GROUP BY `gcontact`.`nurl`
-                                       ORDER BY `gcontact`.`nurl` DESC
-                                       LIMIT 1000",
-                               intval(local_user()),
-                               dbesc(CONTACT_IS_SHARING),
-                               dbesc(CONTACT_IS_FRIEND),
-                               dbesc(NETWORK_DFRN),
-                               dbesc($ostatus),
-                               dbesc($diaspora),
-                               dbesc(escape_tags($search)),
-                               dbesc(escape_tags($search)),
-                               dbesc(escape_tags($search))
-                       );
-
-                       return $results;
-               }
-       }
-
-       /**
-        * @brief Link the gcontact entry with user, contact and global contact
-        *
-        * @param integer $gcid Global contact ID
-        * @param integer $uid  User ID
-        * @param integer $cid  Contact ID
-        * @param integer $zcid Global Contact ID
-        * @return void
-        */
-       public static function link($gcid, $uid = 0, $cid = 0, $zcid = 0)
-       {
-               if ($gcid <= 0) {
-                       return;
-               }
-
-               $r = q(
-                       "SELECT * FROM `glink` WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d LIMIT 1",
-                       intval($cid),
-                       intval($uid),
-                       intval($gcid),
-                       intval($zcid)
-               );
-
-               if (!DBM::is_result($r)) {
-                       q(
-                               "INSERT INTO `glink` (`cid`, `uid`, `gcid`, `zcid`, `updated`) VALUES (%d, %d, %d, %d, '%s') ",
-                               intval($cid),
-                               intval($uid),
-                               intval($gcid),
-                               intval($zcid),
-                               dbesc(datetime_convert())
-                       );
-               } else {
-                       q(
-                               "UPDATE `glink` SET `updated` = '%s' WHERE `cid` = %d AND `uid` = %d AND `gcid` = %d AND `zcid` = %d",
-                               dbesc(datetime_convert()),
-                               intval($cid),
-                               intval($uid),
-                               intval($gcid),
-                               intval($zcid)
-                       );
-               }
-       }
-
-       /**
-        * @brief Sanitize the given gcontact data
-        *
-        * @param array $gcontact array with gcontact data
-        * @throw Exception
-        *
-        * Generation:
-        *  0: No definition
-        *  1: Profiles on this server
-        *  2: Contacts of profiles on this server
-        *  3: Contacts of contacts of profiles on this server
-        *  4: ...
-        * @return array $gcontact
-        */
-       public static function sanitize($gcontact)
-       {
-               if ($gcontact['url'] == "") {
-                       throw new Exception('URL is empty');
-               }
-
-               $urlparts = parse_url($gcontact['url']);
-               if (!isset($urlparts["scheme"])) {
-                       throw new Exception("This (".$gcontact['url'].") doesn't seem to be an url.");
-               }
-
-               if (in_array($urlparts["host"], array("www.facebook.com", "facebook.com", "twitter.com", "identi.ca", "alpha.app.net"))) {
-                       throw new Exception('Contact from a non federated network ignored. ('.$gcontact['url'].')');
-               }
-
-               // Don't store the statusnet connector as network
-               // We can't simply set this to NETWORK_OSTATUS since the connector could have fetched posts from friendica as well
-               if ($gcontact['network'] == NETWORK_STATUSNET) {
-                       $gcontact['network'] = "";
-               }
-
-               // Assure that there are no parameter fragments in the profile url
-               if (in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
-                       $gcontact['url'] = self::cleanContactUrl($gcontact['url']);
-               }
-
-               $alternate = PortableContact::alternateOStatusUrl($gcontact['url']);
-
-               // The global contacts should contain the original picture, not the cached one
-               if (($gcontact['generation'] != 1) && stristr(normalise_link($gcontact['photo']), normalise_link(System::baseUrl()."/photo/"))) {
-                       $gcontact['photo'] = "";
-               }
-
-               if (!isset($gcontact['network'])) {
-                       $r = q(
-                               "SELECT `network` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s' AND `network` != '' AND `network` != '%s' LIMIT 1",
-                               dbesc(normalise_link($gcontact['url'])),
-                               dbesc(NETWORK_STATUSNET)
-                       );
-                       if (DBM::is_result($r)) {
-                               $gcontact['network'] = $r[0]["network"];
-                       }
-
-                       if (($gcontact['network'] == "") || ($gcontact['network'] == NETWORK_OSTATUS)) {
-                               $r = q(
-                                       "SELECT `network`, `url` FROM `contact` WHERE `uid` = 0 AND `alias` IN ('%s', '%s') AND `network` != '' AND `network` != '%s' LIMIT 1",
-                                       dbesc($gcontact['url']),
-                                       dbesc(normalise_link($gcontact['url'])),
-                                       dbesc(NETWORK_STATUSNET)
-                               );
-                               if (DBM::is_result($r)) {
-                                       $gcontact['network'] = $r[0]["network"];
-                               }
-                       }
-               }
-
-               $gcontact['server_url'] = '';
-               $gcontact['network'] = '';
-
-               $x = q(
-                       "SELECT * FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
-                       dbesc(normalise_link($gcontact['url']))
-               );
-
-               if (DBM::is_result($x)) {
-                       if (!isset($gcontact['network']) && ($x[0]["network"] != NETWORK_STATUSNET)) {
-                               $gcontact['network'] = $x[0]["network"];
-                       }
-                       if ($gcontact['updated'] <= NULL_DATE) {
-                               $gcontact['updated'] = $x[0]["updated"];
-                       }
-                       if (!isset($gcontact['server_url']) && (normalise_link($x[0]["server_url"]) != normalise_link($x[0]["url"]))) {
-                               $gcontact['server_url'] = $x[0]["server_url"];
-                       }
-                       if (!isset($gcontact['addr'])) {
-                               $gcontact['addr'] = $x[0]["addr"];
-                       }
-               }
-
-               if ((!isset($gcontact['network']) || !isset($gcontact['name']) || !isset($gcontact['addr']) || !isset($gcontact['photo']) || !isset($gcontact['server_url']) || $alternate)
-                       && PortableContact::reachable($gcontact['url'], $gcontact['server_url'], $gcontact['network'], false)
-               ) {
-                       $data = Probe::uri($gcontact['url']);
-
-                       if ($data["network"] == NETWORK_PHANTOM) {
-                               throw new Exception('Probing for URL '.$gcontact['url'].' failed');
-                       }
-
-                       $orig_profile = $gcontact['url'];
-
-                       $gcontact["server_url"] = $data["baseurl"];
-
-                       $gcontact = array_merge($gcontact, $data);
-
-                       if ($alternate && ($gcontact['network'] == NETWORK_OSTATUS)) {
-                               // Delete the old entry - if it exists
-                               $r = q("SELECT `id` FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
-                               if (DBM::is_result($r)) {
-                                       q("DELETE FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($orig_profile)));
-                                       q("DELETE FROM `glink` WHERE `gcid` = %d", intval($r[0]["id"]));
-                               }
-                       }
-               }
-
-               if (!isset($gcontact['name']) || !isset($gcontact['photo'])) {
-                       throw new Exception('No name and photo for URL '.$gcontact['url']);
-               }
-
-               if (!in_array($gcontact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
-                       throw new Exception('No federated network ('.$gcontact['network'].') detected for URL '.$gcontact['url']);
-               }
-
-               if (!isset($gcontact['server_url'])) {
-                       // We check the server url to be sure that it is a real one
-                       $server_url = PortableContact::detectServer($gcontact['url']);
-
-                       // We are now sure that it is a correct URL. So we use it in the future
-                       if ($server_url != "") {
-                               $gcontact['server_url'] = $server_url;
-                       }
-               }
-
-               // The server URL doesn't seem to be valid, so we don't store it.
-               if (!PortableContact::checkServer($gcontact['server_url'], $gcontact['network'])) {
-                       $gcontact['server_url'] = "";
-               }
-
-               return $gcontact;
-       }
-
-       /**
-        * @param integer $uid id
-        * @param integer $cid id
-        * @return integer
-        */
-       public static function countCommonFriends($uid, $cid)
-       {
-               $r = q(
-                       "SELECT count(*) as `total`
-                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
-                       WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
-                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR
-                       (`gcontact`.`updated` >= `gcontact`.`last_failure`))
-                       AND `gcontact`.`nurl` IN (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
-                       intval($cid),
-                       intval($uid),
-                       intval($uid),
-                       intval($cid)
-               );
-
-               // logger("countCommonFriends: $uid $cid {$r[0]['total']}");
-               if (DBM::is_result($r)) {
-                       return $r[0]['total'];
-               }
-               return 0;
-       }
-
-       /**
-        * @param integer $uid  id
-        * @param integer $zcid zcid
-        * @return integer
-        */
-       public static function countCommonFriendsZcid($uid, $zcid)
-       {
-               $r = q(
-                       "SELECT count(*) as `total`
-                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
-                       where `glink`.`zcid` = %d
-                       and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 ) ",
-                       intval($zcid),
-                       intval($uid)
-               );
-
-               if (DBM::is_result($r)) {
-                       return $r[0]['total'];
-               }
-
-               return 0;
-       }
-
-       /**
-        * @param object  $uid     user
-        * @param object  $cid     cid
-        * @param integer $start   optional, default 0
-        * @param integer $limit   optional, default 9999
-        * @param boolean $shuffle optional, default false
-        * @return object
-        */
-       public static function commonFriends($uid, $cid, $start = 0, $limit = 9999, $shuffle = false)
-       {
-               if ($shuffle) {
-                       $sql_extra = " order by rand() ";
-               } else {
-                       $sql_extra = " order by `gcontact`.`name` asc ";
-               }
-
-               $r = q(
-                       "SELECT `gcontact`.*, `contact`.`id` AS `cid`
-                       FROM `glink`
-                       INNER JOIN `gcontact` ON `glink`.`gcid` = `gcontact`.`id`
-                       INNER JOIN `contact` ON `gcontact`.`nurl` = `contact`.`nurl`
-                       WHERE `glink`.`cid` = %d and `glink`.`uid` = %d
-                               AND `contact`.`uid` = %d AND `contact`.`self` = 0 AND `contact`.`blocked` = 0
-                               AND `contact`.`hidden` = 0 AND `contact`.`id` != %d
-                               AND ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
-                               $sql_extra LIMIT %d, %d",
-                       intval($cid),
-                       intval($uid),
-                       intval($uid),
-                       intval($cid),
-                       intval($start),
-                       intval($limit)
-               );
-
-               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
-               return $r;
-       }
-
-       /**
-        * @param object  $uid     user
-        * @param object  $zcid    zcid
-        * @param integer $start   optional, default 0
-        * @param integer $limit   optional, default 9999
-        * @param boolean $shuffle optional, default false
-        * @return object
-        */
-       public static function commonFriendsZcid($uid, $zcid, $start = 0, $limit = 9999, $shuffle = false)
-       {
-               if ($shuffle) {
-                       $sql_extra = " order by rand() ";
-               } else {
-                       $sql_extra = " order by `gcontact`.`name` asc ";
-               }
-
-               $r = q(
-                       "SELECT `gcontact`.*
-                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
-                       where `glink`.`zcid` = %d
-                       and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 )
-                       $sql_extra limit %d, %d",
-                       intval($zcid),
-                       intval($uid),
-                       intval($start),
-                       intval($limit)
-               );
-
-               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
-               return $r;
-       }
-
-       /**
-        * @param object $uid user
-        * @param object $cid cid
-        * @return integer
-        */
-       public static function countAllFriends($uid, $cid)
-       {
-               $r = q(
-                       "SELECT count(*) as `total`
-                       FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
-                       where `glink`.`cid` = %d and `glink`.`uid` = %d AND
-                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))",
-                       intval($cid),
-                       intval($uid)
-               );
-
-               if (DBM::is_result($r)) {
-                       return $r[0]['total'];
-               }
-
-               return 0;
-       }
-
-       /**
-        * @param object  $uid   user
-        * @param object  $cid   cid
-        * @param integer $start optional, default 0
-        * @param integer $limit optional, default 80
-        * @return object
-        */
-       public static function allFriends($uid, $cid, $start = 0, $limit = 80)
-       {
-               $r = q(
-                       "SELECT `gcontact`.*, `contact`.`id` AS `cid`
-                       FROM `glink`
-                       INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id`
-                       LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` AND `contact`.`uid` = %d
-                       WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND
-                       ((`gcontact`.`last_contact` >= `gcontact`.`last_failure`) OR (`gcontact`.`updated` >= `gcontact`.`last_failure`))
-                       ORDER BY `gcontact`.`name` ASC LIMIT %d, %d ",
-                       intval($uid),
-                       intval($cid),
-                       intval($uid),
-                       intval($start),
-                       intval($limit)
-               );
-
-               /// @TODO Check all calling-findings of this function if they properly use DBM::is_result()
-               return $r;
-       }
-
-       /**
-        * @param object  $uid   user
-        * @param integer $start optional, default 0
-        * @param integer $limit optional, default 80
-        * @return array
-        */
-       public static function suggestionQuery($uid, $start = 0, $limit = 80)
-       {
-               if (!$uid) {
-                       return array();
-               }
-
-               /*
-               * Uncommented because the result of the queries are to big to store it in the cache.
-               * We need to decide if we want to change the db column type or if we want to delete it.
-               */
-               //$list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit);
-               //if (!is_null($list)) {
-               //      return $list;
-               //}
-
-               $network = array(NETWORK_DFRN);
-
-               if (Config::get('system', 'diaspora_enabled')) {
-                       $network[] = NETWORK_DIASPORA;
-               }
-
-               if (!Config::get('system', 'ostatus_disabled')) {
-                       $network[] = NETWORK_OSTATUS;
-               }
-
-               $sql_network = implode("', '", $network);
-               $sql_network = "'".$sql_network."'";
-
-               /// @todo This query is really slow
-               // By now we cache the data for five minutes
-               $r = q(
-                       "SELECT count(glink.gcid) as `total`, gcontact.* from gcontact
-                       INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id`
-                       where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d )
-                       AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
-                       AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
-                       AND `gcontact`.`updated` >= '%s'
-                       AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
-                       AND `gcontact`.`network` IN (%s)
-                       GROUP BY `glink`.`gcid` ORDER BY `gcontact`.`updated` DESC,`total` DESC LIMIT %d, %d",
-                       intval($uid),
-                       intval($uid),
-                       intval($uid),
-                       intval($uid),
-                       dbesc(NULL_DATE),
-                       $sql_network,
-                       intval($start),
-                       intval($limit)
-               );
-
-               if (DBM::is_result($r) && count($r) >= ($limit -1)) {
-                       /*
-                       * Uncommented because the result of the queries are to big to store it in the cache.
-                       * We need to decide if we want to change the db column type or if we want to delete it.
-                       */
-                       //Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES);
-
-                       return $r;
-               }
-
-               $r2 = q(
-                       "SELECT gcontact.* FROM gcontact
-                       INNER JOIN `glink` ON `glink`.`gcid` = `gcontact`.`id`
-                       WHERE `glink`.`uid` = 0 AND `glink`.`cid` = 0 AND `glink`.`zcid` = 0 AND NOT `gcontact`.`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = %d)
-                       AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
-                       AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
-                       AND `gcontact`.`updated` >= '%s'
-                       AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
-                       AND `gcontact`.`network` IN (%s)
-                       ORDER BY rand() LIMIT %d, %d",
-                       intval($uid),
-                       intval($uid),
-                       intval($uid),
-                       dbesc(NULL_DATE),
-                       $sql_network,
-                       intval($start),
-                       intval($limit)
-               );
-
-               $list = array();
-               foreach ($r2 as $suggestion) {
-                       $list[$suggestion["nurl"]] = $suggestion;
-               }
-
-               foreach ($r as $suggestion) {
-                       $list[$suggestion["nurl"]] = $suggestion;
-               }
-
-               while (sizeof($list) > ($limit)) {
-                       array_pop($list);
-               }
-
-               /*
-               * Uncommented because the result of the queries are to big to store it in the cache.
-               * We need to decide if we want to change the db column type or if we want to delete it.
-               */
-               //Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES);
-               return $list;
-       }
-
-       /**
-        * @return void
-        */
-       public static function updateSuggestions()
-       {
-               $a = get_app();
-
-               $done = array();
-
-               /// @TODO Check if it is really neccessary to poll the own server
-               PortableContact::loadWorker(0, 0, 0, System::baseUrl() . '/poco');
-
-               $done[] = System::baseUrl() . '/poco';
-
-               if (strlen(Config::get('system', 'directory'))) {
-                       $x = fetch_url(get_server()."/pubsites");
-                       if ($x) {
-                               $j = json_decode($x);
-                               if ($j->entries) {
-                                       foreach ($j->entries as $entry) {
-                                               PortableContact::checkServer($entry->url);
-
-                                               $url = $entry->url . '/poco';
-                                               if (! in_array($url, $done)) {
-                                                       PortableContact::loadWorker(0, 0, 0, $entry->url . '/poco');
-                                               }
-                                       }
-                               }
-                       }
-               }
-
-               // Query your contacts from Friendica and Redmatrix/Hubzilla for their contacts
-               $r = q(
-                       "SELECT DISTINCT(`poco`) AS `poco` FROM `contact` WHERE `network` IN ('%s', '%s')",
-                       dbesc(NETWORK_DFRN),
-                       dbesc(NETWORK_DIASPORA)
-               );
-
-               if (DBM::is_result($r)) {
-                       foreach ($r as $rr) {
-                               $base = substr($rr['poco'], 0, strrpos($rr['poco'], '/'));
-                               if (! in_array($base, $done)) {
-                                       PortableContact::loadWorker(0, 0, 0, $base);
-                               }
-                       }
-               }
-       }
-
-       /**
-        * @brief Removes unwanted parts from a contact url
-        *
-        * @param string $url Contact url
-        *
-        * @return string Contact url with the wanted parts
-        */
-       public static function cleanContactUrl($url)
-       {
-               $parts = parse_url($url);
-
-               if (!isset($parts["scheme"]) || !isset($parts["host"])) {
-                       return $url;
-               }
-
-               $new_url = $parts["scheme"]."://".$parts["host"];
-
-               if (isset($parts["port"])) {
-                       $new_url .= ":".$parts["port"];
-               }
-
-               if (isset($parts["path"])) {
-                       $new_url .= $parts["path"];
-               }
-
-               if ($new_url != $url) {
-                       logger("Cleaned contact url ".$url." to ".$new_url." - Called by: ".System::callstack(), LOGGER_DEBUG);
-               }
-
-               return $new_url;
-       }
-
-       /**
-        * @brief Replace alternate OStatus user format with the primary one
-        *
-        * @param arr $contact contact array (called by reference)
-        * @return void
-        */
-       public static function fixAlternateContactAddress(&$contact)
-       {
-               if (($contact["network"] == NETWORK_OSTATUS) && PortableContact::alternateOStatusUrl($contact["url"])) {
-                       $data = Probe::uri($contact["url"]);
-                       if ($contact["network"] == NETWORK_OSTATUS) {
-                               logger("Fix primary url from ".$contact["url"]." to ".$data["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
-                               $contact["url"] = $data["url"];
-                               $contact["addr"] = $data["addr"];
-                               $contact["alias"] = $data["alias"];
-                               $contact["server_url"] = $data["baseurl"];
-                       }
-               }
-       }
-
-       /**
-        * @brief Fetch the gcontact id, add an entry if not existed
-        *
-        * @param arr $contact contact array
-        *
-        * @return bool|int Returns false if not found, integer if contact was found
-        */
-       public static function getId($contact)
-       {
-               $gcontact_id = 0;
-               $doprobing = false;
-
-               if (in_array($contact["network"], array(NETWORK_PHANTOM))) {
-                       logger("Invalid network for contact url ".$contact["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
-                       return false;
-               }
-
-               if ($contact["network"] == NETWORK_STATUSNET) {
-                       $contact["network"] = NETWORK_OSTATUS;
-               }
-
-               // All new contacts are hidden by default
-               if (!isset($contact["hide"])) {
-                       $contact["hide"] = true;
-               }
-
-               // Replace alternate OStatus user format with the primary one
-               self::fixAlternateContactAddress($contact);
-
-               // Remove unwanted parts from the contact url (e.g. "?zrl=...")
-               if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
-                       $contact["url"] = self::cleanContactUrl($contact["url"]);
-               }
-
-               dba::lock('gcontact');
-               $r = q(
-                       "SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
-                       dbesc(normalise_link($contact["url"]))
-               );
-
-               if (DBM::is_result($r)) {
-                       $gcontact_id = $r[0]["id"];
-
-                       // Update every 90 days
-                       if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) {
-                               $last_failure_str = $r[0]["last_failure"];
-                               $last_failure = strtotime($r[0]["last_failure"]);
-                               $last_contact_str = $r[0]["last_contact"];
-                               $last_contact = strtotime($r[0]["last_contact"]);
-                               $doprobing = (((time() - $last_contact) > (90 * 86400)) && ((time() - $last_failure) > (90 * 86400)));
-                       }
-               } else {
-                       q(
-                               "INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`, `hide`, `generation`)
-                               VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
-                               dbesc($contact["name"]),
-                               dbesc($contact["nick"]),
-                               dbesc($contact["addr"]),
-                               dbesc($contact["network"]),
-                               dbesc($contact["url"]),
-                               dbesc(normalise_link($contact["url"])),
-                               dbesc($contact["photo"]),
-                               dbesc(datetime_convert()),
-                               dbesc(datetime_convert()),
-                               dbesc($contact["location"]),
-                               dbesc($contact["about"]),
-                               intval($contact["hide"]),
-                               intval($contact["generation"])
-                       );
-
-                       $r = q(
-                               "SELECT `id`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 2",
-                               dbesc(normalise_link($contact["url"]))
-                       );
-
-                       if (DBM::is_result($r)) {
-                               $gcontact_id = $r[0]["id"];
-
-                               $doprobing = in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""));
-                       }
-               }
-               dba::unlock();
-
-               if ($doprobing) {
-                       logger("Last Contact: ". $last_contact_str." - Last Failure: ".$last_failure_str." - Checking: ".$contact["url"], LOGGER_DEBUG);
-                       Worker::add(PRIORITY_LOW, 'GProbe', $contact["url"]);
-               }
-
-               return $gcontact_id;
-       }
-
-       /**
-        * @brief Updates the gcontact table from a given array
-        *
-        * @param arr $contact contact array
-        *
-        * @return bool|int Returns false if not found, integer if contact was found
-        */
-       public static function update($contact)
-       {
-               // Check for invalid "contact-type" value
-               if (isset($contact['contact-type']) && (intval($contact['contact-type']) < 0)) {
-                       $contact['contact-type'] = 0;
-               }
-
-               /// @todo update contact table as well
-
-               $gcontact_id = self::getId($contact);
-
-               if (!$gcontact_id) {
-                       return false;
-               }
-
-               $r = q(
-                       "SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`,
-                               `contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url`
-                       FROM `gcontact` WHERE `id` = %d LIMIT 1",
-                       intval($gcontact_id)
-               );
-
-               // Get all field names
-               $fields = array();
-               foreach ($r[0] as $field => $data) {
-                       $fields[$field] = $data;
-               }
-
-               unset($fields["url"]);
-               unset($fields["updated"]);
-               unset($fields["hide"]);
-
-               // Bugfix: We had an error in the storing of keywords which lead to the "0"
-               // This value is still transmitted via poco.
-               if ($contact["keywords"] == "0") {
-                       unset($contact["keywords"]);
-               }
-
-               if ($r[0]["keywords"] == "0") {
-                       $r[0]["keywords"] = "";
-               }
-
-               // assign all unassigned fields from the database entry
-               foreach ($fields as $field => $data) {
-                       if (!isset($contact[$field]) || ($contact[$field] == "")) {
-                               $contact[$field] = $r[0][$field];
-                       }
-               }
-
-               if (!isset($contact["hide"])) {
-                       $contact["hide"] = $r[0]["hide"];
-               }
-
-               $fields["hide"] = $r[0]["hide"];
-
-               if ($contact["network"] == NETWORK_STATUSNET) {
-                       $contact["network"] = NETWORK_OSTATUS;
-               }
-
-               // Replace alternate OStatus user format with the primary one
-               self::fixAlternateContactAddress($contact);
-
-               if (!isset($contact["updated"])) {
-                       $contact["updated"] = DBM::date();
-               }
-
-               if ($contact["network"] == NETWORK_TWITTER) {
-                       $contact["server_url"] = 'http://twitter.com';
-               }
-
-               if ($contact["server_url"] == "") {
-                       $data = Probe::uri($contact["url"]);
-                       if ($data["network"] != NETWORK_PHANTOM) {
-                               $contact["server_url"] = $data['baseurl'];
-                       }
-               } else {
-                       $contact["server_url"] = normalise_link($contact["server_url"]);
-               }
-
-               if (($contact["addr"] == "") && ($contact["server_url"] != "") && ($contact["nick"] != "")) {
-                       $hostname = str_replace("http://", "", $contact["server_url"]);
-                       $contact["addr"] = $contact["nick"]."@".$hostname;
-               }
-
-               // Check if any field changed
-               $update = false;
-               unset($fields["generation"]);
-
-               if ((($contact["generation"] > 0) && ($contact["generation"] <= $r[0]["generation"])) || ($r[0]["generation"] == 0)) {
-                       foreach ($fields as $field => $data) {
-                               if ($contact[$field] != $r[0][$field]) {
-                                       logger("Difference for contact ".$contact["url"]." in field '".$field."'. New value: '".$contact[$field]."', old value '".$r[0][$field]."'", LOGGER_DEBUG);
-                                       $update = true;
-                               }
-                       }
-
-                       if ($contact["generation"] < $r[0]["generation"]) {
-                               logger("Difference for contact ".$contact["url"]." in field 'generation'. new value: '".$contact["generation"]."', old value '".$r[0]["generation"]."'", LOGGER_DEBUG);
-                               $update = true;
-                       }
-               }
-
-               if ($update) {
-                       logger("Update gcontact for ".$contact["url"], LOGGER_DEBUG);
-                       $condition = array('`nurl` = ? AND (`generation` = 0 OR `generation` >= ?)',
-                                       normalise_link($contact["url"]), $contact["generation"]);
-                       $contact["updated"] = DBM::date($contact["updated"]);
-
-                       $updated = array('photo' => $contact['photo'], 'name' => $contact['name'],
-                                       'nick' => $contact['nick'], 'addr' => $contact['addr'],
-                                       'network' => $contact['network'], 'birthday' => $contact['birthday'],
-                                       'gender' => $contact['gender'], 'keywords' => $contact['keywords'],
-                                       'hide' => $contact['hide'], 'nsfw' => $contact['nsfw'],
-                                       'contact-type' => $contact['contact-type'], 'alias' => $contact['alias'],
-                                       'notify' => $contact['notify'], 'url' => $contact['url'],
-                                       'location' => $contact['location'], 'about' => $contact['about'],
-                                       'generation' => $contact['generation'], 'updated' => $contact['updated'],
-                                       'server_url' => $contact['server_url'], 'connect' => $contact['connect']);
-
-                       dba::update('gcontact', $updated, $condition, $fields);
-
-                       // Now update the contact entry with the user id "0" as well.
-                       // This is used for the shadow copies of public items.
-                       $r = q(
-                               "SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = 0 ORDER BY `id` LIMIT 1",
-                               dbesc(normalise_link($contact["url"]))
-                       );
-
-                       if (DBM::is_result($r)) {
-                               logger("Update public contact ".$r[0]["id"], LOGGER_DEBUG);
-
-                               Contact::updateAvatar($contact["photo"], 0, $r[0]["id"]);
-
-                               $fields = array('name', 'nick', 'addr',
-                                               'network', 'bd', 'gender',
-                                               'keywords', 'alias', 'contact-type',
-                                               'url', 'location', 'about');
-                               $old_contact = dba::select('contact', $fields, array('id' => $r[0]["id"]), array('limit' => 1));
-
-                               // Update it with the current values
-                               $fields = array('name' => $contact['name'], 'nick' => $contact['nick'],
-                                               'addr' => $contact['addr'], 'network' => $contact['network'],
-                                               'bd' => $contact['birthday'], 'gender' => $contact['gender'],
-                                               'keywords' => $contact['keywords'], 'alias' => $contact['alias'],
-                                               'contact-type' => $contact['contact-type'], 'url' => $contact['url'],
-                                               'location' => $contact['location'], 'about' => $contact['about']);
-
-                               dba::update('contact', $fields, array('id' => $r[0]["id"]), $old_contact);
-                       }
-               }
-
-               return $gcontact_id;
-       }
-
-       /**
-        * @brief Updates the gcontact entry from probe
-        *
-        * @param str $url profile link
-        * @return void
-        */
-       public static function updateFromProbe($url)
-       {
-               $data = Probe::uri($url);
-
-               if (in_array($data["network"], array(NETWORK_PHANTOM))) {
-                       logger("Invalid network for contact url ".$data["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG);
-                       return;
-               }
-
-               $data["server_url"] = $data["baseurl"];
-
-               self::update($data);
-       }
-
-       /**
-        * @brief Update the gcontact entry for a given user id
-        *
-        * @param int $uid User ID
-        * @return void
-        */
-       public static function updateForUser($uid)
-       {
-               $r = q(
-                       "SELECT `profile`.`locality`, `profile`.`region`, `profile`.`country-name`,
-                               `profile`.`name`, `profile`.`about`, `profile`.`gender`,
-                               `profile`.`pub_keywords`, `profile`.`dob`, `profile`.`photo`,
-                               `profile`.`net-publish`, `user`.`nickname`, `user`.`hidewall`,
-                               `contact`.`notify`, `contact`.`url`, `contact`.`addr`
-                       FROM `profile`
-                               INNER JOIN `user` ON `user`.`uid` = `profile`.`uid`
-                               INNER JOIN `contact` ON `contact`.`uid` = `profile`.`uid`
-                       WHERE `profile`.`uid` = %d AND `profile`.`is-default` AND `contact`.`self`",
-                       intval($uid)
-               );
-
-               $location = Profile::formatLocation(
-                       array("locality" => $r[0]["locality"], "region" => $r[0]["region"], "country-name" => $r[0]["country-name"])
-               );
-
-               // The "addr" field was added in 3.4.3 so it can be empty for older users
-               if ($r[0]["addr"] != "") {
-                       $addr = $r[0]["nickname"].'@'.str_replace(array("http://", "https://"), "", System::baseUrl());
-               } else {
-                       $addr = $r[0]["addr"];
-               }
-
-               $gcontact = array("name" => $r[0]["name"], "location" => $location, "about" => $r[0]["about"],
-                               "gender" => $r[0]["gender"], "keywords" => $r[0]["pub_keywords"],
-                               "birthday" => $r[0]["dob"], "photo" => $r[0]["photo"],
-                               "notify" => $r[0]["notify"], "url" => $r[0]["url"],
-                               "hide" => ($r[0]["hidewall"] || !$r[0]["net-publish"]),
-                               "nick" => $r[0]["nickname"], "addr" => $addr,
-                               "connect" => $addr, "server_url" => System::baseUrl(),
-                               "generation" => 1, "network" => NETWORK_DFRN);
-
-               self::update($gcontact);
-       }
-
-       /**
-        * @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.
-        *
-        * @param str $server Server address
-        * @return void
-        */
-       public static function fetchGsUsers($server)
-       {
-               logger("Fetching users from GNU Social server ".$server, LOGGER_DEBUG);
-
-               $url = $server."/main/statistics";
-
-               $result = z_fetch_url($url);
-               if (!$result["success"]) {
-                       return false;
-               }
-
-               $statistics = json_decode($result["body"]);
-
-               if (is_object($statistics->config)) {
-                       if ($statistics->config->instance_with_ssl) {
-                               $server = "https://";
-                       } else {
-                               $server = "http://";
-                       }
-
-                       $server .= $statistics->config->instance_address;
-
-                       $hostname = $statistics->config->instance_address;
-               } else {
-                       /// @TODO is_object() above means here no object, still $statistics is being used as object
-                       if ($statistics->instance_with_ssl) {
-                               $server = "https://";
-                       } else {
-                               $server = "http://";
-                       }
-
-                       $server .= $statistics->instance_address;
-
-                       $hostname = $statistics->instance_address;
-               }
-
-               if (is_object($statistics->users)) {
-                       foreach ($statistics->users as $nick => $user) {
-                               $profile_url = $server."/".$user->nickname;
-
-                               $contact = array("url" => $profile_url,
-                                               "name" => $user->fullname,
-                                               "addr" => $user->nickname."@".$hostname,
-                                               "nick" => $user->nickname,
-                                               "about" => $user->bio,
-                                               "network" => NETWORK_OSTATUS,
-                                               "photo" => System::baseUrl()."/images/person-175.jpg");
-                               self::getId($contact);
-                       }
-               }
-       }
-
-       /**
-        * @brief Asking GNU Social server on a regular base for their user data
-        * @return void
-        */
-       public static function discoverGsUsers()
-       {
-               $requery_days = intval(Config::get("system", "poco_requery_days"));
-
-               $last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
-
-               $r = q(
-                       "SELECT `nurl`, `url` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `network` = '%s' AND `last_poco_query` < '%s' ORDER BY RAND() LIMIT 5",
-                       dbesc(NETWORK_OSTATUS),
-                       dbesc($last_update)
-               );
-
-               if (!DBM::is_result($r)) {
-                       return;
-               }
-
-               foreach ($r as $server) {
-                       self::fetchGsUsers($server["url"]);
-                       q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
-               }
-       }
-
-       /**
-        * @return string
-        */
-       public static function getRandomUrl()
-       {
-               $r = q(
-                       "SELECT `url` FROM `gcontact` WHERE `network` = '%s'
-                                       AND `last_contact` >= `last_failure`
-                                       AND `updated` > UTC_TIMESTAMP - INTERVAL 1 MONTH
-                               ORDER BY rand() LIMIT 1",
-                       dbesc(NETWORK_DFRN)
-               );
-
-               if (DBM::is_result($r)) {
-                       return dirname($r[0]['url']);
-               }
-
-               return '';
-       }
-}
index cddbb4d7c084403542677d538d9ed1a1ee76d064..62ada9620ae902f7214dceaac15a840b593449fa 100644 (file)
@@ -14,7 +14,7 @@ use Friendica\Core\System;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Model\Profile;
 use Friendica\Object\Image;
 use Friendica\Protocol\OStatus;
@@ -1678,9 +1678,9 @@ class DFRN
                        $poco["photo"] = $author["avatar"];
                        $poco["hide"] = $hide;
                        $poco["contact-type"] = $contact["contact-type"];
-                       $gcid = GlobalContact::update($poco);
+                       $gcid = GContact::update($poco);
 
-                       GlobalContact::link($gcid, $importer["uid"], $contact["id"]);
+                       GContact::link($gcid, $importer["uid"], $contact["id"]);
                }
 
                return($author);
index ef132a68be6b96a2a628d153f10dc083dfa4dac3..550d04627969e58c54cb455b5f11da7feed9f0e0 100644 (file)
@@ -17,7 +17,7 @@ use Friendica\Core\PConfig;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Model\Profile;
 use Friendica\Network\Probe;
 use Friendica\Util\XML;
@@ -2245,9 +2245,9 @@ class Diaspora
                                        "addr" => $author, "nick" => $nick, "keywords" => $keywords,
                                        "hide" => !$searchable, "nsfw" => $nsfw);
 
-               $gcid = GlobalContact::update($gcontact);
+               $gcid = GContact::update($gcontact);
 
-               GlobalContact::link($gcid, $importer["uid"], $contact["id"]);
+               GContact::link($gcid, $importer["uid"], $contact["id"]);
 
                logger("Profile of contact ".$contact["id"]." stored for user ".$importer["uid"], LOGGER_DEBUG);
 
index b96eeeb3ec2f2f5d9313ee7b02121328a3d7918d..2a021c89e9a3dac70fdb5cd42d857c1b6725a697 100644 (file)
@@ -10,7 +10,7 @@ use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Object\Image;
 use Friendica\Util\Lock;
@@ -226,9 +226,9 @@ class OStatus
                        $contact["generation"] = 2;
                        $contact["hide"] = false; // OStatus contacts are never hidden
                        $contact["photo"] = $author["author-avatar"];
-                       $gcid = GlobalContact::update($contact);
+                       $gcid = GContact::update($contact);
 
-                       GlobalContact::link($gcid, $contact["uid"], $contact["id"]);
+                       GContact::link($gcid, $contact["uid"], $contact["id"]);
                }
 
                return $author;
index 3e2defb2b79cd38573870fcec4959444dbf45eda..2b37a99624dab2cd5e5fe897697aefa065b6e9a8 100644 (file)
@@ -12,7 +12,7 @@ namespace Friendica\Protocol;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Model\Profile;
 use Friendica\Network\Probe;
 use dba;
@@ -192,10 +192,10 @@ class PortableContact
                                        "generation" => $generation);
 
                        try {
-                               $gcontact = GlobalContact::sanitize($gcontact);
-                               $gcid = GlobalContact::update($gcontact);
+                               $gcontact = GContact::sanitize($gcontact);
+                               $gcid = GContact::update($gcontact);
 
-                               GlobalContact::link($gcid, $uid, $cid, $zcid);
+                               GContact::link($gcid, $uid, $cid, $zcid);
                        } catch (Exception $e) {
                                logger($e->getMessage(), LOGGER_DEBUG);
                        }
@@ -424,7 +424,7 @@ class PortableContact
 
                                                $contact = array_merge($contact, $noscrape);
 
-                                               GlobalContact::update($contact);
+                                               GContact::update($contact);
 
                                                if (trim($noscrape["updated"]) != "") {
                                                        q(
@@ -446,7 +446,7 @@ class PortableContact
                if (!$force && !self::updateNeeded($gcontacts[0]["created"], $gcontacts[0]["updated"], $gcontacts[0]["last_failure"], $gcontacts[0]["last_contact"])) {
                        logger("Profile ".$profile." was last updated at ".$gcontacts[0]["updated"]." (cached)", LOGGER_DEBUG);
 
-                       GlobalContact::update($contact);
+                       GContact::update($contact);
                        return $gcontacts[0]["updated"];
                }
 
@@ -467,8 +467,8 @@ class PortableContact
                        $gcontact["server_url"] = $data["baseurl"];
 
                        try {
-                               $gcontact = GlobalContact::sanitize($gcontact);
-                               GlobalContact::update($gcontact);
+                               $gcontact = GContact::sanitize($gcontact);
+                               GContact::update($gcontact);
 
                                self::lastUpdated($data["url"], $force);
                        } catch (Exception $e) {
@@ -494,7 +494,7 @@ class PortableContact
 
                $contact["server_url"] = $data["baseurl"];
 
-               GlobalContact::update($contact);
+               GContact::update($contact);
 
                $feedret = z_fetch_url($data["poll"]);
 
@@ -1600,8 +1600,8 @@ class PortableContact
                                                "generation" => $generation);
 
                                try {
-                                       $gcontact = GlobalContact::sanitize($gcontact);
-                                       GlobalContact::update($gcontact);
+                                       $gcontact = GContact::sanitize($gcontact);
+                                       GContact::update($gcontact);
                                } catch (Exception $e) {
                                        logger($e->getMessage(), LOGGER_DEBUG);
                                }
index 18c1d2b5312c3f315da9e5f7179017335a053220..b59f096d7de3fcf8ea0e8aa9f5d9bb8a8c3d6e91 100644 (file)
@@ -11,7 +11,7 @@ use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Protocol\PortableContact;
 use dba;
@@ -280,7 +280,7 @@ class CronJobs
                $r = q("SELECT `uid` FROM `user` WHERE `verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired`");
                if (DBM::is_result($r)) {
                        foreach ($r AS $user) {
-                               GlobalContact::updateForUser($user["uid"]);
+                               GContact::updateForUser($user["uid"]);
                        }
                }
 
index 96cfae00b61f3e43da5161864c5c0089e6bae876..b3c03e905054b8c03c1d743fcdb4cd3365045281 100644 (file)
@@ -8,7 +8,7 @@ use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Core\Worker;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Protocol\PortableContact;
 
@@ -90,7 +90,7 @@ class DiscoverPoCo {
                        }
                        logger($result, LOGGER_DEBUG);
                } elseif ($mode == 3) {
-                       GlobalContact::updateSuggestions();
+                       GContact::updateSuggestions();
                } elseif (($mode == 2) && Config::get('system', 'poco_completion')) {
                        self::discoverUsers();
                } elseif (($mode == 1) && ($search != "") && Config::get('system', 'poco_local_search')) {
@@ -102,7 +102,7 @@ class DiscoverPoCo {
 
                        // Query GNU Social servers for their users ("statistics" addon has to be enabled on the GS server)
                        if (!Config::get('system', 'ostatus_disabled')) {
-                               GlobalContact::discoverGsUsers();
+                               GContact::discoverGsUsers();
                        }
                }
 
@@ -256,7 +256,7 @@ class DiscoverPoCo {
 
                                        $data["server_url"] = $data["baseurl"];
 
-                                       GlobalContact::update($data);
+                                       GContact::update($data);
                                } else {
                                        logger("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], LOGGER_DEBUG);
                                }
@@ -297,7 +297,7 @@ class DiscoverPoCo {
                        $contact = Probe::uri($user->site_address."/".$user->name);
                        if ($contact["network"] != NETWORK_PHANTOM) {
                                $contact["about"] = $user->description;
-                               GlobalContact::update($contact);
+                               GContact::update($contact);
                        }
                }
        }
index 2dd66336725be757b88a33665db31ee74d49cbe6..0d8c3765a8dea74d42e03dbc7a3bb4a1e55047af 100644 (file)
@@ -8,7 +8,7 @@ namespace Friendica\Worker;
 use Friendica\Core\Cache;
 use Friendica\Core\Config;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 use Friendica\Network\Probe;
 use Friendica\Protocol\PortableContact;
 
@@ -47,7 +47,7 @@ class GProbe {
                        }
 
                        if (!in_array($arr["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) {
-                               GlobalContact::update($arr);
+                               GContact::update($arr);
                        }
 
                        $r = q(
index 0f81200890be8b702c22761669b2a08b731f93ac..b7c76b02ef0fafc93797d558db3e71d109801947 100644 (file)
@@ -15,7 +15,7 @@ use Friendica\Core\Config;
 use Friendica\Core\PConfig;
 use Friendica\Core\System;
 use Friendica\Database\DBM;
-use Friendica\Model\GlobalContact;
+use Friendica\Model\GContact;
 
 require_once "include/plugin.php";
 require_once "mod/proxy.php";
@@ -139,7 +139,7 @@ function vier_community_info() {
 
        // comunity_profiles
        if ($show_profiles) {
-               $r = GlobalContact::suggestionQuery(local_user(), 0, 9);
+               $r = GContact::suggestionQuery(local_user(), 0, 9);
 
                $tpl = get_markup_template('ch_directory_item.tpl');
                if (DBM::is_result($r)) {