+ if (in_array($data["network"], array(NETWORK_PHANTOM))) {
+ logger("Invalid network for contact url ".$data["url"]." - Called by: ".App::callstack(), LOGGER_DEBUG);
+ return;
+ }
+
+ 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
+ *
+ * If the "Statistics" plugin is enabled (See http://gstools.org/ for details) we query user data with this.
+ *
+ * @param str $server Server address
+ */
+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);
+ 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 {
+ 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" => $a->get_baseurl()."/images/person-175.jpg");
+ get_gcontact_id($contact);
+ }
+}
+
+/**
+ * @brief Asking GNU Social server on a regular base for their user data
+ *
+ */
+function gs_discover() {
+
+ $requery_days = intval(get_config("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 (!$r)
+ return;
+
+ foreach ($r AS $server) {
+ gs_fetch_users($server["url"]);
+ q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
+ }