+ /**
+ * @brief Fetch relay data from a given server url
+ *
+ * @param string $server_url address of the server
+ */
+ private static function discoverRelay($server_url)
+ {
+ Logger::log("Discover relay data for server " . $server_url, Logger::DEBUG);
+
+ $curlResult = Network::curl($server_url . "/.well-known/x-social-relay");
+
+ if (!$curlResult->isSuccess()) {
+ return;
+ }
+
+ $data = json_decode($curlResult->getBody(), true);
+
+ if (!is_array($data)) {
+ return;
+ }
+
+ $gserver = DBA::selectFirst('gserver', ['id', 'relay-subscribe', 'relay-scope'], ['nurl' => Strings::normaliseLink($server_url)]);
+
+ if (!DBA::isResult($gserver)) {
+ return;
+ }
+
+ if (($gserver['relay-subscribe'] != $data['subscribe']) || ($gserver['relay-scope'] != $data['scope'])) {
+ $fields = ['relay-subscribe' => $data['subscribe'], 'relay-scope' => $data['scope']];
+ DBA::update('gserver', $fields, ['id' => $gserver['id']]);
+ }
+
+ DBA::delete('gserver-tag', ['gserver-id' => $gserver['id']]);
+
+ if ($data['scope'] == 'tags') {
+ // Avoid duplicates
+ $tags = [];
+ foreach ($data['tags'] as $tag) {
+ $tag = mb_strtolower($tag);
+ if (strlen($tag) < 100) {
+ $tags[$tag] = $tag;
+ }
+ }
+
+ foreach ($tags as $tag) {
+ DBA::insert('gserver-tag', ['gserver-id' => $gserver['id'], 'tag' => $tag], true);
+ }
+ }
+
+ // Create or update the relay contact
+ $fields = [];
+ if (isset($data['protocols'])) {
+ if (isset($data['protocols']['diaspora'])) {
+ $fields['network'] = Protocol::DIASPORA;
+
+ if (isset($data['protocols']['diaspora']['receive'])) {
+ $fields['batch'] = $data['protocols']['diaspora']['receive'];
+ } elseif (is_string($data['protocols']['diaspora'])) {
+ $fields['batch'] = $data['protocols']['diaspora'];
+ }
+ }
+
+ if (isset($data['protocols']['dfrn'])) {
+ $fields['network'] = Protocol::DFRN;
+
+ if (isset($data['protocols']['dfrn']['receive'])) {
+ $fields['batch'] = $data['protocols']['dfrn']['receive'];
+ } elseif (is_string($data['protocols']['dfrn'])) {
+ $fields['batch'] = $data['protocols']['dfrn'];
+ }
+ }
+ }
+ Diaspora::setRelayContact($server_url, $fields);
+ }
+