X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FWorker%2FUpdateServerDirectory.php;h=c5a1a078b82453dbb9056b92dbb8cacbc6fa9aa2;hb=1585f711ee98a92606084126acc7a76063519ce4;hp=fd5ee0534ba0edc3a74a4d3d40e01d3a8ea0726a;hpb=94954c810b3ee0f885029f9818b217e0817ad70b;p=friendica.git diff --git a/src/Worker/UpdateServerDirectory.php b/src/Worker/UpdateServerDirectory.php index fd5ee0534b..c5a1a078b8 100644 --- a/src/Worker/UpdateServerDirectory.php +++ b/src/Worker/UpdateServerDirectory.php @@ -1,21 +1,106 @@ . + * */ + namespace Friendica\Worker; use Friendica\Core\Logger; +use Friendica\DI; +use Friendica\Model\Contact; use Friendica\Model\GServer; +use Friendica\Network\HTTPClient\Client\HttpClientAccept; class UpdateServerDirectory { /** * Query the given server for their users - * @param string $gserver Server URL + * + * @param array $gserver Server record */ - public static function execute($gserver) + public static function execute(array $gserver) + { + if ($gserver['directory-type'] == GServer::DT_MASTODON) { + self::discoverMastodonDirectory($gserver); + } elseif (!empty($gserver['poco'])) { + self::discoverPoCo($gserver); + } + } + + private static function discoverPoCo(array $gserver) { - GServer::updateDirectory($gserver); - return; + $result = DI::httpClient()->fetch($gserver['poco'] . '?fields=urls', HttpClientAccept::JSON); + if (empty($result)) { + Logger::info('Empty result', ['url' => $gserver['url']]); + return; + } + + $contacts = json_decode($result, true); + if (empty($contacts['entry'])) { + Logger::info('No contacts', ['url' => $gserver['url']]); + return; + } + + Logger::info('PoCo discovery started', ['poco' => $gserver['poco']]); + + $urls = []; + foreach (array_column($contacts['entry'], 'urls') as $url_entries) { + foreach ($url_entries as $url_entry) { + if (empty($url_entry['type']) || empty($url_entry['value'])) { + continue; + } + if ($url_entry['type'] == 'profile') { + $urls[] = $url_entry['value']; + } + } + } + + $result = Contact::addByUrls($urls); + + Logger::info('PoCo discovery ended', ['count' => $result['count'], 'added' => $result['added'], 'updated' => $result['updated'], 'unchanged' => $result['unchanged'], 'poco' => $gserver['poco']]); + } + + private static function discoverMastodonDirectory(array $gserver) + { + $result = DI::httpClient()->fetch($gserver['url'] . '/api/v1/directory?order=new&local=true&limit=200&offset=0', HttpClientAccept::JSON); + if (empty($result)) { + Logger::info('Empty result', ['url' => $gserver['url']]); + return; + } + + $accounts = json_decode($result, true); + if (empty($accounts)) { + Logger::info('No contacts', ['url' => $gserver['url']]); + return; + } + + Logger::info('Account discovery started', ['url' => $gserver['url']]); + + $urls = []; + foreach ($accounts as $account) { + if (!empty($account['url'])) { + $urls[] = $account['url']; + } + } + + $result = Contact::addByUrls($urls); + + Logger::info('Account discovery ended', ['count' => $result['count'], 'added' => $result['added'], 'updated' => $result['updated'], 'unchanged' => $result['unchanged'], 'url' => $gserver['url']]); } }