]> git.mxchange.org Git - friendica.git/blobdiff - include/socgraph.php
Split poco discovery in smaller function calls
[friendica.git] / include / socgraph.php
index 349869c40624dc5e81306d1af5318709603c6cb3..b787452b8f88aa0da5d605ec10f45c86019c844e 100644 (file)
@@ -40,7 +40,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) {
                        $r = q("select `poco`, `uid` from `contact` where `id` = %d limit 1",
                                intval($cid)
                        );
-                       if(count($r)) {
+                       if (dbm::is_result($r)) {
                                $url = $r[0]['poco'];
                                $uid = $r[0]['uid'];
                        }
@@ -91,50 +91,58 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) {
 
                $name = $entry->displayName;
 
-               if(isset($entry->urls)) {
-                       foreach($entry->urls as $url) {
-                               if($url->type == 'profile') {
+               if (isset($entry->urls)) {
+                       foreach ($entry->urls as $url) {
+                               if ($url->type == 'profile') {
                                        $profile_url = $url->value;
                                        continue;
                                }
-                               if($url->type == 'webfinger') {
+                               if ($url->type == 'webfinger') {
                                        $connect_url = str_replace('acct:' , '', $url->value);
                                        continue;
                                }
                        }
                }
-               if(isset($entry->photos)) {
-                       foreach($entry->photos as $photo) {
-                               if($photo->type == 'profile') {
+               if (isset($entry->photos)) {
+                       foreach ($entry->photos as $photo) {
+                               if ($photo->type == 'profile') {
                                        $profile_photo = $photo->value;
                                        continue;
                                }
                        }
                }
 
-               if(isset($entry->updated))
+               if (isset($entry->updated)) {
                        $updated = date("Y-m-d H:i:s", strtotime($entry->updated));
+               }
 
-               if(isset($entry->network))
+               if (isset($entry->network)) {
                        $network = $entry->network;
+               }
 
-               if(isset($entry->currentLocation))
+               if (isset($entry->currentLocation)) {
                        $location = $entry->currentLocation;
+               }
 
-               if(isset($entry->aboutMe))
+               if (isset($entry->aboutMe)) {
                        $about = html2bbcode($entry->aboutMe);
+               }
 
-               if(isset($entry->gender))
+               if (isset($entry->gender)) {
                        $gender = $entry->gender;
+               }
 
-               if(isset($entry->generation) AND ($entry->generation > 0))
+               if (isset($entry->generation) AND ($entry->generation > 0)) {
                        $generation = ++$entry->generation;
+               }
 
-               if(isset($entry->tags))
-                       foreach($entry->tags as $tag)
+               if (isset($entry->tags)) {
+                       foreach($entry->tags as $tag) {
                                $keywords = implode(", ", $tag);
+                       }
+               }
 
-               if(isset($entry->contactType) AND ($entry->contactType >= 0))
+               if (isset($entry->contactType) AND ($entry->contactType >= 0))
                        $contact_type = $entry->contactType;
 
                // If you query a Friendica server for its profiles, the network has to be Friendica
@@ -171,8 +179,6 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) {
 
 function poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, $cid = 0, $uid = 0, $zcid = 0) {
 
-       $a = get_app();
-
        // Generation:
        //  0: No definition
        //  1: Profiles on this server
@@ -207,20 +213,22 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
        $orig_updated = $updated;
 
        // The global contacts should contain the original picture, not the cached one
-       if (($generation != 1) AND stristr(normalise_link($profile_photo), normalise_link($a->get_baseurl()."/photo/")))
+       if (($generation != 1) AND stristr(normalise_link($profile_photo), normalise_link(App::get_baseurl()."/photo/"))) {
                $profile_photo = "";
+       }
 
        $r = q("SELECT `network` FROM `contact` WHERE `nurl` = '%s' AND `network` != '' AND `network` != '%s' LIMIT 1",
                dbesc(normalise_link($profile_url)), dbesc(NETWORK_STATUSNET)
        );
-       if(count($r))
+       if (dbm::is_result($r)) {
                $network = $r[0]["network"];
+       }
 
        if (($network == "") OR ($network == NETWORK_OSTATUS)) {
                $r = q("SELECT `network`, `url` FROM `contact` WHERE `alias` IN ('%s', '%s') AND `network` != '' AND `network` != '%s' LIMIT 1",
                        dbesc($profile_url), dbesc(normalise_link($profile_url)), dbesc(NETWORK_STATUSNET)
                );
-               if(count($r)) {
+               if (dbm::is_result($r)) {
                        $network = $r[0]["network"];
                        //$profile_url = $r[0]["url"];
                }
@@ -330,7 +338,7 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
                intval($gcid),
                intval($zcid)
        );
-       if(! count($r)) {
+       if (! dbm::is_result($r)) {
                q("INSERT INTO `glink` (`cid`,`uid`,`gcid`,`zcid`, `updated`) VALUES (%d,%d,%d,%d, '%s') ",
                        intval($cid),
                        intval($uid),
@@ -391,6 +399,15 @@ function poco_detect_server($profile) {
                }
        }
 
+       // Mastodon
+       if ($server_url == "") {
+               $red = preg_replace("=(https?://)(.*)/users/(.*)=ism", "$1$2", $profile);
+               if ($red != $profile) {
+                       $server_url = $red;
+                       $network = NETWORK_OSTATUS;
+               }
+       }
+
        return $server_url;
 }
 
@@ -755,6 +772,13 @@ function poco_check_server($server_url, $network = "", $force = false) {
                                                $versionparts = explode("-", $version);
                                                $version = $versionparts[0];
                                        }
+
+                                       if(stristr($line,'Server: Mastodon')) {
+                                               $platform = "Mastodon";
+                                               $network = NETWORK_OSTATUS;
+                                               // Mastodon doesn't reveal version numbers
+                                               $version = "";
+                                       }
                                }
                }
        }
@@ -960,7 +984,7 @@ function count_common_friends($uid,$cid) {
        );
 
 //     logger("count_common_friends: $uid $cid {$r[0]['total']}");
-       if(count($r))
+       if (dbm::is_result($r))
                return $r[0]['total'];
        return 0;
 
@@ -1006,7 +1030,7 @@ function count_common_friends_zcid($uid,$zcid) {
                intval($uid)
        );
 
-       if(count($r))
+       if (dbm::is_result($r))
                return $r[0]['total'];
        return 0;
 
@@ -1045,7 +1069,7 @@ function count_all_friends($uid,$cid) {
                intval($uid)
        );
 
-       if(count($r))
+       if (dbm::is_result($r))
                return $r[0]['total'];
        return 0;
 
@@ -1079,10 +1103,12 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
                return array();
        }
 
-       $list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit);
-       if (!is_null($list)) {
-               return $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.
+//     $list = Cache::get("suggestion_query:".$uid.":".$start.":".$limit);
+//     if (!is_null($list)) {
+//             return $list;
+//     }
 
        $network = array(NETWORK_DFRN);
 
@@ -1115,8 +1141,11 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
                intval($limit)
        );
 
-       if (count($r) && count($r) >= ($limit -1)) {
-               Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $r, CACHE_FIVE_MINUTES);
+       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;
        }
 
@@ -1147,7 +1176,9 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
        while (sizeof($list) > ($limit))
                array_pop($list);
 
-       Cache::set("suggestion_query:".$uid.":".$start.":".$limit, $list, CACHE_FIVE_MINUTES);
+// 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;
 }
 
@@ -1157,23 +1188,24 @@ function update_suggestions() {
 
        $done = array();
 
-       /// TODO Check if it is really neccessary to poll the own server
-       poco_load(0,0,0,$a->get_baseurl() . '/poco');
+       /// @TODO Check if it is really neccessary to poll the own server
+       poco_load(0,0,0,App::get_baseurl() . '/poco');
 
-       $done[] = $a->get_baseurl() . '/poco';
+       $done[] = App::get_baseurl() . '/poco';
 
-       if(strlen(get_config('system','directory'))) {
+       if (strlen(get_config('system','directory'))) {
                $x = fetch_url(get_server()."/pubsites");
-               if($x) {
+               if ($x) {
                        $j = json_decode($x);
-                       if($j->entries) {
-                               foreach($j->entries as $entry) {
+                       if ($j->entries) {
+                               foreach ($j->entries as $entry) {
 
                                        poco_check_server($entry->url);
 
                                        $url = $entry->url . '/poco';
-                                       if(! in_array($url,$done))
+                                       if (! in_array($url,$done)) {
                                                poco_load(0,0,0,$entry->url . '/poco');
+                                       }
                                }
                        }
                }
@@ -1184,8 +1216,8 @@ function update_suggestions() {
                dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA)
        );
 
-       if(count($r)) {
-               foreach($r as $rr) {
+       if (dbm::is_result($r)) {
+               foreach ($r as $rr) {
                        $base = substr($rr['poco'],0,strrpos($rr['poco'],'/'));
                        if(! in_array($base,$done))
                                poco_load(0,0,0,$base);
@@ -1196,7 +1228,7 @@ function update_suggestions() {
 function poco_discover_federation() {
        $last = get_config('poco','last_federation_discovery');
 
-       if($last) {
+       if ($last) {
                $next = $last + (24 * 60 * 60);
                if($next > time())
                        return;
@@ -1228,77 +1260,93 @@ function poco_discover_federation() {
        set_config('poco','last_federation_discovery', time());
 }
 
-function poco_discover($complete = false) {
+function poco_discover_single_server($id) {
+       $r = q("SELECT `poco`, `nurl`, `url`, `network` FROM `gserver` WHERE `id` = %d", intval($id));
+       if (!dbm::is_result($r)) {
+               return false;
+       }
 
-       // Update the server list
-       poco_discover_federation();
+       $server = $r[0];
 
-       $no_of_queries = 5;
+       if (!poco_check_server($server["url"], $server["network"])) {
+               // The server is not reachable? Okay, then we will try it later
+               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
+               return false;
+       }
 
-       $requery_days = intval(get_config("system", "poco_requery_days"));
+       // Fetch all users from the other server
+       $url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
 
-       if ($requery_days == 0)
-               $requery_days = 7;
+       logger("Fetch all users from the server ".$server["nurl"], LOGGER_DEBUG);
 
-       $last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
+       $retdata = z_fetch_url($url);
+       if ($retdata["success"]) {
+               $data = json_decode($retdata["body"]);
 
-       $r = q("SELECT `poco`, `nurl`, `url`, `network` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update));
-       if ($r)
-               foreach ($r AS $server) {
+               poco_discover_server($data, 2);
 
-                       if (!poco_check_server($server["url"], $server["network"])) {
-                               // The server is not reachable? Okay, then we will try it later
-                               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
-                               continue;
+               if (get_config('system','poco_discovery') > 1) {
+
+                       $timeframe = get_config('system','poco_discovery_since');
+                       if ($timeframe == 0) {
+                               $timeframe = 30;
                        }
 
-                       // Fetch all users from the other server
-                       $url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
+                       $updatedSince = date("Y-m-d H:i:s", time() - $timeframe * 86400);
+
+                       // Fetch all global contacts from the other server (Not working with Redmatrix and Friendica versions before 3.3)
+                       $url = $server["poco"]."/@global?updatedSince=".$updatedSince."&fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
 
-                       logger("Fetch all users from the server ".$server["nurl"], LOGGER_DEBUG);
+                       $success = false;
 
                        $retdata = z_fetch_url($url);
                        if ($retdata["success"]) {
-                               $data = json_decode($retdata["body"]);
+                               logger("Fetch all global contacts from the server ".$server["nurl"], LOGGER_DEBUG);
+                               $success = poco_discover_server(json_decode($retdata["body"]));
+                       }
 
-                               poco_discover_server($data, 2);
+                       if (!$success AND (get_config('system','poco_discovery') > 2)) {
+                               logger("Fetch contacts from users of the server ".$server["nurl"], LOGGER_DEBUG);
+                               poco_discover_server_users($data, $server);
+                       }
+               }
 
-                               if (get_config('system','poco_discovery') > 1) {
+               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
 
-                                       $timeframe = get_config('system','poco_discovery_since');
-                                       if ($timeframe == 0)
-                                               $timeframe = 30;
+               return true;
+       } else {
+               // If the server hadn't replied correctly, then force a sanity check
+               poco_check_server($server["url"], $server["network"], true);
 
-                                       $updatedSince = date("Y-m-d H:i:s", time() - $timeframe * 86400);
+               // If we couldn't reach the server, we will try it some time later
+               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
 
-                                       // Fetch all global contacts from the other server (Not working with Redmatrix and Friendica versions before 3.3)
-                                       $url = $server["poco"]."/@global?updatedSince=".$updatedSince."&fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
+               return false;
+       }
+}
 
-                                       $success = false;
+function poco_discover($complete = false) {
 
-                                       $retdata = z_fetch_url($url);
-                                       if ($retdata["success"]) {
-                                               logger("Fetch all global contacts from the server ".$server["nurl"], LOGGER_DEBUG);
-                                               $success = poco_discover_server(json_decode($retdata["body"]));
-                                       }
+       // Update the server list
+       poco_discover_federation();
 
-                                       if (!$success AND (get_config('system','poco_discovery') > 2)) {
-                                               logger("Fetch contacts from users of the server ".$server["nurl"], LOGGER_DEBUG);
-                                               poco_discover_server_users($data, $server);
-                                       }
-                               }
+       $no_of_queries = 5;
 
-                               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
-                               if (!$complete AND (--$no_of_queries == 0))
-                                       break;
-                       } else {
-                               // If the server hadn't replied correctly, then force a sanity check
-                               poco_check_server($server["url"], $server["network"], true);
+       $requery_days = intval(get_config("system", "poco_requery_days"));
 
-                               // If we couldn't reach the server, we will try it some time later
-                               q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
+       if ($requery_days == 0)
+               $requery_days = 7;
+
+       $last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
+
+       $r = q("SELECT `id` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update));
+       if (dbm::is_result($r)) {
+               foreach ($r AS $server) {
+                       if (poco_discover_single_server($server['id']) AND !$complete AND (--$no_of_queries == 0)) {
+                               break;
                        }
                }
+       }
 }
 
 function poco_discover_server_users($data, $server) {
@@ -1310,7 +1358,7 @@ function poco_discover_server_users($data, $server) {
                $username = "";
                if (isset($entry->urls)) {
                        foreach($entry->urls as $url)
-                               if($url->type == 'profile') {
+                               if ($url->type == 'profile') {
                                        $profile_url = $url->value;
                                        $urlparts = parse_url($profile_url);
                                        $username = end(explode("/", $urlparts["path"]));
@@ -1352,52 +1400,61 @@ function poco_discover_server($data, $default_generation = 0) {
 
                $name = $entry->displayName;
 
-               if(isset($entry->urls)) {
+               if (isset($entry->urls)) {
                        foreach($entry->urls as $url) {
-                               if($url->type == 'profile') {
+                               if ($url->type == 'profile') {
                                        $profile_url = $url->value;
                                        continue;
                                }
-                               if($url->type == 'webfinger') {
+                               if ($url->type == 'webfinger') {
                                        $connect_url = str_replace('acct:' , '', $url->value);
                                        continue;
                                }
                        }
                }
 
-               if(isset($entry->photos)) {
-                       foreach($entry->photos as $photo) {
-                               if($photo->type == 'profile') {
+               if (isset($entry->photos)) {
+                       foreach ($entry->photos as $photo) {
+                               if ($photo->type == 'profile') {
                                        $profile_photo = $photo->value;
                                        continue;
                                }
                        }
                }
 
-               if(isset($entry->updated))
+               if (isset($entry->updated)) {
                        $updated = date("Y-m-d H:i:s", strtotime($entry->updated));
+               }
 
-               if(isset($entry->network))
+               if(isset($entry->network)) {
                        $network = $entry->network;
+               }
 
-               if(isset($entry->currentLocation))
+               if(isset($entry->currentLocation)) {
                        $location = $entry->currentLocation;
+               }
 
-               if(isset($entry->aboutMe))
+               if(isset($entry->aboutMe)) {
                        $about = html2bbcode($entry->aboutMe);
+               }
 
-               if(isset($entry->gender))
+               if(isset($entry->gender)) {
                        $gender = $entry->gender;
+               }
 
-               if(isset($entry->generation) AND ($entry->generation > 0))
+               if(isset($entry->generation) AND ($entry->generation > 0)) {
                        $generation = ++$entry->generation;
+               }
 
-               if(isset($entry->contactType) AND ($entry->contactType >= 0))
+               if(isset($entry->contactType) AND ($entry->contactType >= 0)) {
                        $contact_type = $entry->contactType;
+               }
 
-               if(isset($entry->tags))
-                       foreach($entry->tags as $tag)
+               if(isset($entry->tags)) {
+                       foreach ($entry->tags as $tag) {
                                $keywords = implode(", ", $tag);
+                       }
+               }
 
                if ($generation > 0) {
                        $success = true;
@@ -1488,7 +1545,7 @@ function get_gcontact_id($contact) {
        if (in_array($contact["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)))
                $contact["url"] = clean_contact_url($contact["url"]);
 
-       $r = q("SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 2",
+       $r = q("SELECT `id`, `last_contact`, `last_failure`, `network` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 2",
                dbesc(normalise_link($contact["url"])));
 
        if ($r) {
@@ -1535,7 +1592,7 @@ function get_gcontact_id($contact) {
                proc_run(PRIORITY_LOW, 'include/gprobe.php', bin2hex($contact["url"]));
        }
 
-       if ((count($r) > 1) AND ($gcontact_id > 0) AND ($contact["url"] != ""))
+       if ((dbm::is_result($r)) AND (count($r) > 1) AND ($gcontact_id > 0) AND ($contact["url"] != ""))
         q("DELETE FROM `gcontact` WHERE `nurl` = '%s' AND `id` != %d",
                dbesc(normalise_link($contact["url"])),
                intval($gcontact_id));
@@ -1748,8 +1805,6 @@ function gs_fetch_users($server) {
 
        logger("Fetching users from GNU Social server ".$server, LOGGER_DEBUG);
 
-       $a = get_app();
-
        $url = $server."/main/statistics";
 
        $result = z_fetch_url($url);
@@ -1788,7 +1843,7 @@ function gs_fetch_users($server) {
                                        "nick" => $user->nickname,
                                        "about" => $user->bio,
                                        "network" => NETWORK_OSTATUS,
-                                       "photo" => $a->get_baseurl()."/images/person-175.jpg");
+                                       "photo" => App::get_baseurl()."/images/person-175.jpg");
                        get_gcontact_id($contact);
                }
 }