From 37f05195140e09a5897f931c2955ff2a77b09d4f Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Fri, 20 Dec 2019 20:30:13 +0000
Subject: [PATCH] 'SearchDirectory' created (moved out of 'DiscoverPoco' mess)

---
 src/Core/Search.php            |   2 +-
 src/Worker/DiscoverPoCo.php    | 169 +++++----------------------------
 src/Worker/SearchDirectory.php |  91 ++++++++++++++++++
 3 files changed, 115 insertions(+), 147 deletions(-)
 create mode 100644 src/Worker/SearchDirectory.php

diff --git a/src/Core/Search.php b/src/Core/Search.php
index 9700c64722..e43e621d29 100644
--- a/src/Core/Search.php
+++ b/src/Core/Search.php
@@ -242,7 +242,7 @@ class Search extends BaseObject
 		DBA::close($data);
 
 		// Add found profiles from the global directory to the local directory
-		Worker::add(PRIORITY_LOW, 'DiscoverPoCo', "dirsearch", urlencode($search));
+		Worker::add(PRIORITY_LOW, 'SearchDirectory', $search);
 
 		return $resultList;
 	}
diff --git a/src/Worker/DiscoverPoCo.php b/src/Worker/DiscoverPoCo.php
index d495b4c2a6..2c3536bf86 100644
--- a/src/Worker/DiscoverPoCo.php
+++ b/src/Worker/DiscoverPoCo.php
@@ -26,58 +26,21 @@ class DiscoverPoCo
 	{
 		/*
 		This function can be called in these ways:
-		- dirsearch <search pattern>: Searches for "search pattern" in the directory. "search pattern" is url encoded.
 		- checkcontact: Updates gcontact entries
 		- suggestions: Discover other servers for their contacts.
 		- server <poco url>: Searches for the poco server list. "poco url" is base64 encoded.
 		- update_server: Frequently check the first 250 servers for vitality.
 		- update_server_directory: Discover the given server id for their contacts
 		- PortableContact::load: Load POCO data from a given POCO address
-		- check_profile: Update remote profile data
 		*/
 
 		$search = "";
 		$mode = 0;
-		if ($command == "dirsearch") {
-			$search = urldecode($param1);
-			$mode = 1;
-		} elseif ($command == "checkcontact") {
-			$mode = 2;
+		if (($command == "checkcontact") && Config::get('system', 'poco_completion')) {
+			self::discoverUsers();
 		} elseif ($command == "suggestions") {
-			$mode = 3;
+			GContact::updateSuggestions();
 		} elseif ($command == "server") {
-			$mode = 4;
-		} elseif ($command == "update_server") {
-			$mode = 5;
-		} elseif ($command == "update_server_directory") {
-			$mode = 6;
-		} elseif ($command == "load") {
-			$mode = 7;
-		} elseif ($command == "check_profile") {
-			$mode = 8;
-		} elseif ($command !== "") {
-			Logger::log("Unknown or missing parameter ".$command."\n");
-			return;
-		}
-
-		Logger::log('start '.$search);
-
-		if ($mode == 8) {
-			if ($param1 != "") {
-				GContact::updateFromProbe($param1, true);
-			}
-		} elseif ($mode == 7) {
-			if (!empty($param4)) {
-				$url = $param4;
-			} else {
-				$url = '';
-			}
-			PortableContact::load(intval($param1), intval($param2), intval($param3), $url);
-		} elseif ($mode == 6) {
-			PortableContact::discoverSingleServer(intval($param1));
-		} elseif ($mode == 5) {
-			self::updateServer();
-		} elseif ($mode == 4) {
 			$server_url = $param1;
 			if ($server_url == "") {
 				return;
@@ -94,14 +57,25 @@ class DiscoverPoCo
 				$result .= "failed";
 			}
 			Logger::log($result, Logger::DEBUG);
-		} elseif ($mode == 3) {
-			GContact::updateSuggestions();
-		} elseif (($mode == 2) && Config::get('system', 'poco_completion')) {
-			self::discoverUsers();
-		} elseif (($mode == 1) && ($search != "") && Config::get('system', 'poco_local_search')) {
-			self::discoverDirectory($search);
-			self::gsSearchUser($search);
-		} elseif (($mode == 0) && ($search == "") && (Config::get('system', 'poco_discovery') != PortableContact::DISABLED)) {
+		} elseif ($command == "update_server") {
+			self::updateServer();
+		} elseif ($command == "update_server_directory") {
+			PortableContact::discoverSingleServer(intval($param1));
+		} elseif ($command == "load") {
+			if (!empty($param4)) {
+				$url = $param4;
+			} else {
+				$url = '';
+			}
+			PortableContact::load(intval($param1), intval($param2), intval($param3), $url);
+		} elseif ($command !== "") {
+			Logger::log("Unknown or missing parameter ".$command."\n");
+			return;
+		}
+
+		Logger::log('start '.$search);
+
+		if (($mode == 0) && ($search == "") && (Config::get('system', 'poco_discovery') != PortableContact::DISABLED)) {
 			// Query Friendica and Hubzilla servers for their users
 			PortableContact::discover();
 
@@ -189,7 +163,7 @@ class DiscoverPoCo
 
 			if ((($server_url == "") && ($user["network"] == Protocol::FEED)) || $force_update || GServer::check($server_url, $user["network"])) {
 				Logger::log('Check profile '.$user["url"]);
-				Worker::add(PRIORITY_LOW, "DiscoverPoCo", "check_profile", $user["url"]);
+				Worker::add(PRIORITY_LOW, 'UpdateGContact', $user['url'], 'force');
 
 				if (++$checked > 100) {
 					return;
@@ -205,101 +179,4 @@ class DiscoverPoCo
 			}
 		}
 	}
-
-	private static function discoverDirectory($search) {
-
-		$data = Cache::get("dirsearch:".$search);
-		if (!is_null($data)) {
-			// Only search for the same item every 24 hours
-			if (time() < $data + (60 * 60 * 24)) {
-				Logger::log("Already searched for ".$search." in the last 24 hours", Logger::DEBUG);
-				return;
-			}
-		}
-
-		$x = Network::fetchUrl(get_server()."/lsearch?p=1&n=500&search=".urlencode($search));
-		$j = json_decode($x);
-
-		if (!empty($j->results)) {
-			foreach ($j->results as $jj) {
-				// Check if the contact already exists
-				$exists = q("SELECT `id`, `last_contact`, `last_failure`, `updated` FROM `gcontact` WHERE `nurl` = '%s'", Strings::normaliseLink($jj->url));
-				if (DBA::isResult($exists)) {
-					Logger::log("Profile ".$jj->url." already exists (".$search.")", Logger::DEBUG);
-
-					if (($exists[0]["last_contact"] < $exists[0]["last_failure"]) &&
-						($exists[0]["updated"] < $exists[0]["last_failure"])) {
-						continue;
-					}
-					// Update the contact
-					GContact::updateFromProbe($jj->url);
-					continue;
-				}
-
-				$server_url = Contact::getBasepath($jj->url);
-				if ($server_url != '') {
-					if (!GServer::check($server_url)) {
-						Logger::log("Friendica server ".$server_url." doesn't answer.", Logger::DEBUG);
-						continue;
-					}
-					Logger::log("Friendica server ".$server_url." seems to be okay.", Logger::DEBUG);
-				}
-
-				$data = Probe::uri($jj->url);
-				if ($data["network"] == Protocol::DFRN) {
-					Logger::log("Profile ".$jj->url." is reachable (".$search.")", Logger::DEBUG);
-					Logger::log("Add profile ".$jj->url." to local directory (".$search.")", Logger::DEBUG);
-
-					if ($jj->tags != "") {
-						$data["keywords"] = $jj->tags;
-					}
-
-					$data["server_url"] = $data["baseurl"];
-
-					GContact::update($data);
-				} else {
-					Logger::log("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], Logger::DEBUG);
-				}
-			}
-		}
-		Cache::set("dirsearch:".$search, time(), Cache::DAY);
-	}
-
-	/**
-	 * @brief Search for GNU Social user with gstools.org
-	 *
-	 * @param string $search User name
-	 * @return bool
-	 * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-	 * @throws \ImagickException
-	 */
-	private static function gsSearchUser($search) {
-
-		// Currently disabled, since the service isn't available anymore.
-		// It is not removed since I hope that there will be a successor.
-		return false;
-
-		$url = "http://gstools.org/api/users_search/".urlencode($search);
-
-		$curlResult = Network::curl($url);
-		if (!$curlResult->isSuccess()) {
-			return false;
-		}
-
-		$contacts = json_decode($curlResult->getBody());
-
-		if ($contacts->status == 'ERROR') {
-			return false;
-		}
-
-		/// @TODO AS is considered as a notation for constants (as they usually being written all upper-case)
-		/// @TODO find all those and convert to all lower-case which is a keyword then
-		foreach ($contacts->data AS $user) {
-			$contact = Probe::uri($user->site_address."/".$user->name);
-			if ($contact["network"] != Protocol::PHANTOM) {
-				$contact["about"] = $user->description;
-				GContact::update($contact);
-			}
-		}
-	}
 }
diff --git a/src/Worker/SearchDirectory.php b/src/Worker/SearchDirectory.php
new file mode 100644
index 0000000000..0f5782db55
--- /dev/null
+++ b/src/Worker/SearchDirectory.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * @file src/Worker/SearchDirectory.php
+ */
+namespace Friendica\Worker;
+
+use Friendica\Core\Cache;
+use Friendica\Core\Config;
+use Friendica\Core\Logger;
+use Friendica\Core\Protocol;
+use Friendica\Database\DBA;
+use Friendica\Model\GContact;
+use Friendica\Model\Contact;
+use Friendica\Model\GServer;
+use Friendica\Network\Probe;
+use Friendica\Util\Network;
+use Friendica\Util\Strings;
+
+class SearchDirectory
+{
+	// <search pattern>: Searches for "search pattern" in the directory.
+	public static function execute($search)
+	{
+		if (!Config::get('system', 'poco_local_search')) {
+			Logger::info('Local search is not enabled');
+			return;
+		}
+
+		self::discoverDirectory($search);
+		return;
+	}
+
+	private static function discoverDirectory($search)
+	{
+		$data = Cache::get('discoverDirectory' . $search);
+		if (!is_null($data)) {
+			// Only search for the same item every 24 hours
+			if (time() < $data + (60 * 60 * 24)) {
+				Logger::info('Already searched this in the last 24 hours', ['search' => $search]);
+				return;
+			}
+		}
+
+		$x = Network::fetchUrl(get_server() . '/lsearch?p=1&n=500&search=' . urlencode($search));
+		$j = json_decode($x);
+
+		if (!empty($j->results)) {
+			foreach ($j->results as $jj) {
+				// Check if the contact already exists
+				$gcontact = DBA::selectFirst('gcontact', ['id', 'last_contact', 'last_failure', 'updated'], ['nurl' => Strings::normaliseLink($jj->url)]);
+				if (DBA::isResult($gcontact)) {
+					Logger::info('Profile already exists', ['profile' => $jj->url, 'search' => $search]);
+
+					if (($gcontact['last_contact'] < $gcontact['last_failure']) &&
+						($gcontact['updated'] < $gcontact['last_failure'])) {
+						continue;
+					}
+
+					// Update the contact
+					GContact::updateFromProbe($jj->url);
+					continue;
+				}
+
+				$server_url = Contact::getBasepath($jj->url);
+				if ($server_url != '') {
+					if (!GServer::check($server_url)) {
+						Logger::log("Friendica server doesn't answer.", ['server' => $server_url]);
+						continue;
+					}
+					Logger::log('Friendica server seems to be okay.', ['server' => $server_url]);
+				}
+
+				$data = Probe::uri($jj->url);
+				if ($data['network'] == Protocol::DFRN) {
+					Logger::log('Add profile to local directory', ['profile' => $jj->url]);
+
+					if ($jj->tags != '') {
+						$data['keywords'] = $jj->tags;
+					}
+
+					$data['server_url'] = $data['baseurl'];
+
+					GContact::update($data);
+				} else {
+					Logger::log('Profile is not responding or no Friendica contact', ['profile' => $jj->url, 'network' => $data['network']]);
+				}
+			}
+		}
+		Cache::set('discoverDirectory' . $search, time(), Cache::DAY);
+	}
+}
-- 
2.39.5