From fb550a01727c63200a1232a65f307cc5d1e40407 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Wed, 1 Jan 2020 21:29:36 +0000
Subject: [PATCH] Relocated functions from PortableContact to GServer

---
 src/Core/Search.php                    |   4 -
 src/Model/GServer.php                  |  94 +++++++++++++++++++++
 src/Protocol/PortableContact.php       | 111 -------------------------
 src/Worker/UpdateServerDirectories.php |   3 +-
 4 files changed, 96 insertions(+), 116 deletions(-)

diff --git a/src/Core/Search.php b/src/Core/Search.php
index ab06a51a7d..c10b5f6d6a 100644
--- a/src/Core/Search.php
+++ b/src/Core/Search.php
@@ -205,10 +205,6 @@ class Search
 		}
 
 		while ($row = DBA::fetch($data)) {
-			if (PortableContact::alternateOStatusUrl($row["nurl"])) {
-				continue;
-			}
-
 			$urlParts = parse_url($row["nurl"]);
 
 			// Ignore results that look strange.
diff --git a/src/Model/GServer.php b/src/Model/GServer.php
index de8a3c1a1a..0448807248 100644
--- a/src/Model/GServer.php
+++ b/src/Model/GServer.php
@@ -1306,4 +1306,98 @@ class GServer
 			PortableContact::discoverSingleServer($gserver['id']);
 		}
 	}
+
+	/**
+	 * Update GServer entries
+	 */
+	public static function discover()
+	{
+		// Update the server list
+		self::discoverFederation();
+
+		$no_of_queries = 5;
+
+		$requery_days = intval(Config::get('system', 'poco_requery_days'));
+
+		if ($requery_days == 0) {
+			$requery_days = 7;
+		}
+
+		$last_update = date('c', time() - (60 * 60 * 24 * $requery_days));
+
+		$gservers = DBA::p("SELECT `id`, `url`, `nurl`, `network`, `poco`
+			FROM `gserver`
+			WHERE `last_contact` >= `last_failure`
+			AND `poco` != ''
+			AND `last_poco_query` < ?
+			ORDER BY RAND()", $last_update
+		);
+
+		while ($gserver = DBA::fetch($gservers)) {
+			if (!GServer::check($gserver['url'], $gserver['network'])) {
+				// The server is not reachable? Okay, then we will try it later
+				$fields = ['last_poco_query' => DateTimeFormat::utcNow()];
+				DBA::update('gserver', $fields, ['nurl' => $gserver['nurl']]);
+				continue;
+			}
+
+			Logger::info('Update directory', ['server' => $gserver['url'], 'id' => $gserver['id']]);
+			Worker::add(PRIORITY_LOW, 'UpdateServerDirectory', $gserver);
+
+			if (--$no_of_queries == 0) {
+				break;
+			}
+		}
+
+		DBA::close($gservers);
+	}
+
+	/**
+	 * Discover federated servers
+	 */
+	private static function discoverFederation()
+	{
+		$last = Config::get('poco', 'last_federation_discovery');
+
+		if ($last) {
+			$next = $last + (24 * 60 * 60);
+
+			if ($next > time()) {
+				return;
+			}
+		}
+
+		// Discover federated servers
+		$curlResult = Network::fetchUrl("http://the-federation.info/pods.json");
+
+		if (!empty($curlResult)) {
+			$servers = json_decode($curlResult, true);
+
+			if (!empty($servers['pods'])) {
+				foreach ($servers['pods'] as $server) {
+					Worker::add(PRIORITY_LOW, 'UpdateGServer', 'https://' . $server['host']);
+				}
+			}
+		}
+
+		// Disvover Mastodon servers
+		$accesstoken = Config::get('system', 'instances_social_key');
+
+		if (!empty($accesstoken)) {
+			$api = 'https://instances.social/api/1.0/instances/list?count=0';
+			$header = ['Authorization: Bearer '.$accesstoken];
+			$curlResult = Network::curl($api, false, ['headers' => $header]);
+
+			if ($curlResult->isSuccess()) {
+				$servers = json_decode($curlResult->getBody(), true);
+
+				foreach ($servers['instances'] as $server) {
+					$url = (is_null($server['https_score']) ? 'http' : 'https') . '://' . $server['name'];
+					Worker::add(PRIORITY_LOW, 'UpdateGServer', $url);
+				}
+			}
+		}
+
+		Config::set('poco', 'last_federation_discovery', time());
+	}
 }
diff --git a/src/Protocol/PortableContact.php b/src/Protocol/PortableContact.php
index 49da85e615..9ba6a4b900 100644
--- a/src/Protocol/PortableContact.php
+++ b/src/Protocol/PortableContact.php
@@ -214,11 +214,6 @@ class PortableContact
 		DBA::delete('glink', $condition);
 	}
 
-	public static function alternateOStatusUrl($url)
-	{
-		return(preg_match("=https?://.+/user/\d+=ism", $url, $matches));
-	}
-
 	/**
 	 * @brief Returns a list of all known servers
 	 * @return array List of server urls
@@ -275,69 +270,6 @@ class PortableContact
 		}
 	}
 
-	private static function discoverFederation()
-	{
-		$last = Config::get('poco', 'last_federation_discovery');
-
-		if ($last) {
-			$next = $last + (24 * 60 * 60);
-
-			if ($next > time()) {
-				return;
-			}
-		}
-
-		// Discover Friendica, Hubzilla and Diaspora servers
-		$curlResult = Network::fetchUrl("http://the-federation.info/pods.json");
-
-		if (!empty($curlResult)) {
-			$servers = json_decode($curlResult, true);
-
-			if (!empty($servers['pods'])) {
-				foreach ($servers['pods'] as $server) {
-					Worker::add(PRIORITY_LOW, 'UpdateGServer', 'https://' . $server['host']);
-				}
-			}
-		}
-
-		// Disvover Mastodon servers
-		if (!Config::get('system', 'ostatus_disabled')) {
-			$accesstoken = Config::get('system', 'instances_social_key');
-
-			if (!empty($accesstoken)) {
-				$api = 'https://instances.social/api/1.0/instances/list?count=0';
-				$header = ['Authorization: Bearer '.$accesstoken];
-				$curlResult = Network::curl($api, false, ['headers' => $header]);
-
-				if ($curlResult->isSuccess()) {
-					$servers = json_decode($curlResult->getBody(), true);
-
-					foreach ($servers['instances'] as $server) {
-						$url = (is_null($server['https_score']) ? 'http' : 'https') . '://' . $server['name'];
-						Worker::add(PRIORITY_LOW, 'UpdateGServer', $url);
-					}
-				}
-			}
-		}
-
-		// Currently disabled, since the service isn't available anymore.
-		// It is not removed since I hope that there will be a successor.
-		// Discover GNU Social Servers.
-		//if (!Config::get('system','ostatus_disabled')) {
-		//	$serverdata = "http://gstools.org/api/get_open_instances/";
-
-		//	$curlResult = Network::curl($serverdata);
-		//	if ($curlResult->isSuccess()) {
-		//		$servers = json_decode($result->getBody(), true);
-
-		//		foreach($servers['data'] as $server)
-		//			GServer::check($server['instance_address']);
-		//	}
-		//}
-
-		Config::set('poco', 'last_federation_discovery', time());
-	}
-
 	public static function discoverSingleServer($id)
 	{
 		$server = DBA::selectFirst('gserver', ['poco', 'nurl', 'url', 'network'], ['id' => $id]);
@@ -410,48 +342,6 @@ class PortableContact
 		}
 	}
 
-	public static function discover($complete = false)
-	{
-		// Update the server list
-		self::discoverFederation();
-
-		$no_of_queries = 5;
-
-		$requery_days = intval(Config::get('system', 'poco_requery_days'));
-
-		if ($requery_days == 0) {
-			$requery_days = 7;
-		}
-
-		$last_update = date('c', time() - (60 * 60 * 24 * $requery_days));
-
-		$gservers = q("SELECT `id`, `url`, `nurl`, `network`, `poco`
-			FROM `gserver`
-			WHERE `last_contact` >= `last_failure`
-			AND `poco` != ''
-			AND `last_poco_query` < '%s'
-			ORDER BY RAND()", DBA::escape($last_update)
-		);
-
-		if (DBA::isResult($gservers)) {
-			foreach ($gservers as $gserver) {
-				if (!GServer::check($gserver['url'], $gserver['network'])) {
-					// The server is not reachable? Okay, then we will try it later
-					$fields = ['last_poco_query' => DateTimeFormat::utcNow()];
-					DBA::update('gserver', $fields, ['nurl' => $gserver['nurl']]);
-					continue;
-				}
-
-				Logger::log('Update directory from server ' . $gserver['url'] . ' with ID ' . $gserver['id'], Logger::DEBUG);
-				Worker::add(PRIORITY_LOW, 'UpdateServerDirectory', $gserver);
-
-				if (!$complete && ( --$no_of_queries == 0)) {
-					break;
-				}
-			}
-		}
-	}
-
 	private static function discoverServerUsers(array $data, array $server)
 	{
 		if (!isset($data['entry'])) {
@@ -602,5 +492,4 @@ class PortableContact
 		}
 		return $success;
 	}
-
 }
diff --git a/src/Worker/UpdateServerDirectories.php b/src/Worker/UpdateServerDirectories.php
index 433685cb29..d651c9ae68 100644
--- a/src/Worker/UpdateServerDirectories.php
+++ b/src/Worker/UpdateServerDirectories.php
@@ -7,6 +7,7 @@ namespace Friendica\Worker;
 use Friendica\Core\Config;
 use Friendica\Core\Logger;
 use Friendica\Model\GContact;
+use Friendica\Model\GServer;
 use Friendica\Protocol\PortableContact;
 
 class UpdateServerDirectories
@@ -21,7 +22,7 @@ class UpdateServerDirectories
 		}
 
 		// Query Friendica and Hubzilla servers for their users
-		PortableContact::discover();
+		GServer::discover();
 
 		// Query GNU Social servers for their users ("statistics" addon has to be enabled on the GS server)
 		if (!Config::get('system', 'ostatus_disabled')) {