+ /**
+ * @brief Fetch relay data from a given server url
+ *
+ * @param string $server_url address of the server
+ */
+ private static function discoverRelay($server_url)
+ {
+ logger("Discover relay data for server " . $server_url, LOGGER_DEBUG);
+
+ $serverret = Network::curl($server_url."/.well-known/x-social-relay");
+ if (!$serverret["success"]) {
+ return;
+ }
+
+ $data = json_decode($serverret['body']);
+ if (!is_object($data)) {
+ return;
+ }
+
+ $gserver = dba::selectFirst('gserver', ['id', 'relay-subscribe', 'relay-scope'], ['nurl' => normalise_link($server_url)]);
+ if (!DBM::is_result($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);
+ $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'] = NETWORK_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'] = NETWORK_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);
+ }
+