+ if ($gserver['directory-type'] == GServer::DT_MASTODON) {
+ self::discoverMastodonDirectory($gserver);
+ } elseif (!empty($gserver['poco'])) {
+ self::discoverPoCo($gserver);
+ }
+ }
+
+ private static function discoverPoCo(array $gserver)
+ {
+ $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']]);