X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fsocgraph.php;h=349fd0b2caebcecd5dfff17e050a2129c5161ec1;hb=b631442760b134b14071eaeab9a2a8756feeca98;hp=b2b84808b1fcdc7b4e7c9ab767324fa4c3a50ff5;hpb=8992577bb63ba38bc3479dbbd8cf764ca1b15de5;p=friendica.git diff --git a/include/socgraph.php b/include/socgraph.php index b2b84808b1..349fd0b2ca 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -9,6 +9,7 @@ require_once('include/datetime.php'); require_once("include/Scrape.php"); +require_once("include/network.php"); require_once("include/html2bbcode.php"); require_once("include/Contact.php"); require_once("include/Photo.php"); @@ -39,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']; } @@ -51,7 +52,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { if(! $url) return; - $url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,generation' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,generation') ; + $url = $url . (($uid) ? '/@me/@all?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation' : '?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation') ; logger('poco_load: ' . $url, LOGGER_DEBUG); @@ -85,6 +86,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { $about = ''; $keywords = ''; $gender = ''; + $contact_type = -1; $generation = 0; $name = $entry->displayName; @@ -132,6 +134,9 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { foreach($entry->tags as $tag) $keywords = implode(", ", $tag); + 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 /// TODO It could also be a Redmatrix server //if ($uid == 0) @@ -139,6 +144,9 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, $cid, $uid, $zcid); + $gcontact = array("url" => $profile_url, "contact-type" => $contact_type, "generation" => $generation); + update_gcontact($gcontact); + // Update the Friendica contacts. Diaspora is doing it via a message. (See include/diaspora.php) // Deactivated because we now update Friendica contacts in dfrn.php //if (($location != "") OR ($about != "") OR ($keywords != "") OR ($gender != "")) @@ -205,14 +213,14 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca $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"]; } @@ -322,7 +330,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), @@ -383,6 +391,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; } @@ -453,8 +470,11 @@ function poco_last_updated($profile, $force = false) { "network" => $server[0]["network"], "generation" => $gcontacts[0]["generation"]); - $contact["name"] = $noscrape["fn"]; - $contact["community"] = $noscrape["comm"]; + if (isset($noscrape["fn"])) + $contact["name"] = $noscrape["fn"]; + + if (isset($noscrape["comm"])) + $contact["community"] = $noscrape["comm"]; if (isset($noscrape["tags"])) { $keywords = implode(" ", $noscrape["tags"]); @@ -466,7 +486,8 @@ function poco_last_updated($profile, $force = false) { if ($location) $contact["location"] = $location; - $contact["notify"] = $noscrape["dfrn-notify"]; + if (isset($noscrape["dfrn-notify"])) + $contact["notify"] = $noscrape["dfrn-notify"]; // Remove all fields that are not present in the gcontact table unset($noscrape["fn"]); @@ -743,6 +764,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 = ""; + } } } } @@ -948,7 +976,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; @@ -994,7 +1022,7 @@ function count_common_friends_zcid($uid,$zcid) { intval($uid) ); - if(count($r)) + if (dbm::is_result($r)) return $r[0]['total']; return 0; @@ -1033,7 +1061,7 @@ function count_all_friends($uid,$cid) { intval($uid) ); - if(count($r)) + if (dbm::is_result($r)) return $r[0]['total']; return 0; @@ -1063,8 +1091,16 @@ function all_friends($uid,$cid,$start = 0, $limit = 80) { function suggestion_query($uid, $start = 0, $limit = 80) { - if(! $uid) + 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); @@ -1075,9 +1111,10 @@ function suggestion_query($uid, $start = 0, $limit = 80) { $network[] = NETWORK_OSTATUS; $sql_network = implode("', '", $network); - //$sql_network = "'".$sql_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 ) @@ -1096,8 +1133,13 @@ function suggestion_query($uid, $start = 0, $limit = 80) { intval($limit) ); - if(count($r) && count($r) >= ($limit -1)) + 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` @@ -1126,6 +1168,9 @@ function suggestion_query($uid, $start = 0, $limit = 80) { 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; } @@ -1162,7 +1207,7 @@ function update_suggestions() { dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA) ); - if(count($r)) { + if (dbm::is_result($r)) { foreach($r as $rr) { $base = substr($rr['poco'],0,strrpos($rr['poco'],'/')); if(! in_array($base,$done)) @@ -1231,7 +1276,7 @@ function poco_discover($complete = false) { } // Fetch all users from the other server - $url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,generation"; + $url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation"; logger("Fetch all users from the server ".$server["nurl"], LOGGER_DEBUG); @@ -1250,7 +1295,7 @@ function poco_discover($complete = false) { $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,generation"; + $url = $server["poco"]."/@global?updatedSince=".$updatedSince."&fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation"; $success = false; @@ -1298,7 +1343,7 @@ function poco_discover_server_users($data, $server) { logger("Fetch contacts for the user ".$username." from the server ".$server["nurl"], LOGGER_DEBUG); // Fetch all contacts from a given user from the other server - $url = $server["poco"]."/".$username."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,generation"; + $url = $server["poco"]."/".$username."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation"; $retdata = z_fetch_url($url); if ($retdata["success"]) @@ -1325,6 +1370,7 @@ function poco_discover_server($data, $default_generation = 0) { $about = ''; $keywords = ''; $gender = ''; + $contact_type = -1; $generation = $default_generation; $name = $entry->displayName; @@ -1369,6 +1415,9 @@ function poco_discover_server($data, $default_generation = 0) { if(isset($entry->generation) AND ($entry->generation > 0)) $generation = ++$entry->generation; + if(isset($entry->contactType) AND ($entry->contactType >= 0)) + $contact_type = $entry->contactType; + if(isset($entry->tags)) foreach($entry->tags as $tag) $keywords = implode(", ", $tag); @@ -1378,6 +1427,10 @@ function poco_discover_server($data, $default_generation = 0) { logger("Store profile ".$profile_url, LOGGER_DEBUG); poco_check($profile_url, $name, $network, $profile_photo, $about, $location, $gender, $keywords, $connect_url, $updated, $generation, 0, 0, 0); + + $gcontact = array("url" => $profile_url, "contact-type" => $contact_type, "generation" => $generation); + update_gcontact($gcontact); + logger("Done for profile ".$profile_url, LOGGER_DEBUG); } } @@ -1391,23 +1444,23 @@ function poco_discover_server($data, $default_generation = 0) { * @return string Contact url with the wanted parts */ function clean_contact_url($url) { - $parts = parse_url($url); + $parts = parse_url($url); - if (!isset($parts["scheme"]) OR !isset($parts["host"])) - return $url; + if (!isset($parts["scheme"]) OR !isset($parts["host"])) + return $url; - $new_url = $parts["scheme"]."://".$parts["host"]; + $new_url = $parts["scheme"]."://".$parts["host"]; - if (isset($parts["port"])) - $new_url .= ":".$parts["port"]; + if (isset($parts["port"])) + $new_url .= ":".$parts["port"]; - if (isset($parts["path"])) - $new_url .= $parts["path"]; + if (isset($parts["path"])) + $new_url .= $parts["path"]; if ($new_url != $url) logger("Cleaned contact url ".$url." to ".$new_url." - Called by: ".App::callstack(), LOGGER_DEBUG); - return $new_url; + return $new_url; } /** @@ -1417,7 +1470,7 @@ function clean_contact_url($url) { */ function fix_alternate_contact_address(&$contact) { if (($contact["network"] == NETWORK_OSTATUS) AND poco_alternate_ostatus_url($contact["url"])) { - $data = probe_url($contact["url"]); + $data = probe_url($contact["url"]); if ($contact["network"] == NETWORK_OSTATUS) { logger("Fix primary url from ".$contact["url"]." to ".$data["url"]." - Called by: ".App::callstack(), LOGGER_DEBUG); $contact["url"] = $data["url"]; @@ -1447,6 +1500,10 @@ function get_gcontact_id($contact) { 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 fix_alternate_contact_address($contact); @@ -1469,8 +1526,8 @@ function get_gcontact_id($contact) { $doprobing = (((time() - $last_contact) > (90 * 86400)) AND ((time() - $last_failure) > (90 * 86400))); } } else { - q("INSERT INTO `gcontact` (`name`, `nick`, `addr` , `network`, `url`, `nurl`, `photo`, `created`, `updated`, `location`, `about`, `generation`) - VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)", + 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"]), @@ -1482,6 +1539,7 @@ function get_gcontact_id($contact) { dbesc(datetime_convert()), dbesc($contact["location"]), dbesc($contact["about"]), + intval($contact["hide"]), intval($contact["generation"]) ); @@ -1497,7 +1555,7 @@ function get_gcontact_id($contact) { if ($doprobing) { logger("Last Contact: ". $last_contact_str." - Last Failure: ".$last_failure_str." - Checking: ".$contact["url"], LOGGER_DEBUG); - proc_run('php', 'include/gprobe.php', bin2hex($contact["url"])); + proc_run(PRIORITY_LOW, 'include/gprobe.php', bin2hex($contact["url"])); } if ((count($r) > 1) AND ($gcontact_id > 0) AND ($contact["url"] != "")) @@ -1524,7 +1582,7 @@ function update_gcontact($contact) { return false; $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, - `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url` + `contact-type`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url` FROM `gcontact` WHERE `id` = %d LIMIT 1", intval($gcontact_id)); @@ -1604,20 +1662,20 @@ function update_gcontact($contact) { } if ($update) { - logger("Update gcontact for ".$contact["url"]." Callstack: ".App::callstack(), LOGGER_DEBUG); + logger("Update gcontact for ".$contact["url"], LOGGER_DEBUG); q("UPDATE `gcontact` SET `photo` = '%s', `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s', `birthday` = '%s', `gender` = '%s', `keywords` = '%s', `hide` = %d, `nsfw` = %d, - `alias` = '%s', `notify` = '%s', `url` = '%s', + `contact-type` = %d, `alias` = '%s', `notify` = '%s', `url` = '%s', `location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s', `server_url` = '%s', `connect` = '%s' WHERE `nurl` = '%s' AND (`generation` = 0 OR `generation` >= %d)", dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]), dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]), - intval($contact["nsfw"]), dbesc($contact["alias"]), dbesc($contact["notify"]), - dbesc($contact["url"]), dbesc($contact["location"]), dbesc($contact["about"]), - intval($contact["generation"]), dbesc($contact["updated"]), + intval($contact["nsfw"]), intval($contact["contact-type"]), dbesc($contact["alias"]), + dbesc($contact["notify"]), dbesc($contact["url"]), dbesc($contact["location"]), + dbesc($contact["about"]), intval($contact["generation"]), dbesc($contact["updated"]), dbesc($contact["server_url"]), dbesc($contact["connect"]), dbesc(normalise_link($contact["url"])), intval($contact["generation"])); @@ -1634,13 +1692,14 @@ function update_gcontact($contact) { q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s', `bd` = '%s', `gender` = '%s', - `keywords` = '%s', `alias` = '%s', `url` = '%s', - `location` = '%s', `about` = '%s' + `keywords` = '%s', `alias` = '%s', `contact-type` = %d, + `url` = '%s', `location` = '%s', `about` = '%s' WHERE `id` = %d", dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]), dbesc($contact["gender"]), - dbesc($contact["keywords"]), dbesc($contact["alias"]), dbesc($contact["url"]), - dbesc($contact["location"]), dbesc($contact["about"]), intval($r[0]["id"])); + dbesc($contact["keywords"]), dbesc($contact["alias"]), intval($contact["contact-type"]), + dbesc($contact["url"]), dbesc($contact["location"]), dbesc($contact["about"]), + intval($r[0]["id"])); } } @@ -1663,6 +1722,44 @@ function update_gcontact_from_probe($url) { update_gcontact($data); } +/** + * @brief Update the gcontact entry for a given user id + * + * @param int $uid User ID + */ +function update_gcontact_for_user($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 = formatted_location(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://"), "", App::get_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"] OR !$r[0]["net-publish"]), + "nick" => $r[0]["nickname"], "addr" => $addr, + "connect" => $addr, "server_url" => App::get_baseurl(), + "generation" => 1, "network" => NETWORK_DFRN); + + update_gcontact($gcontact); +} + /** * @brief Fetches users of given GNU Social server *