diff --git a/php/servers/servers-rooms.php b/php/servers/servers-rooms.php index f3d0722..72f298f 100644 --- a/php/servers/servers-rooms.php +++ b/php/servers/servers-rooms.php @@ -156,6 +156,7 @@ if ($suppress_processing) return; + $this->language_flag = $details['language_flag'] ?? $this->get_language_flag(); $this->extract_tags_from_description(); $this->tags = isset($details['tags']) ? CommunityTag::from_details_array($details['tags']) @@ -179,16 +180,12 @@ public function get_language_flag(): string { global $languages; - $room_identifier = $this->get_room_identifier(); - $server_pubkey = $this->server->get_pubkey(); - if (isset($this->language_flag)) { return $this->language_flag; } - // Latter only applies to fetching stage - // where the language flag is serialized into JSON. - // Later stages deserialize the property and detect it above. + $room_identifier = $this->get_room_identifier(); + $server_pubkey = $this->server->get_pubkey(); if (isset($languages[$room_identifier])) { return $languages[$room_identifier]; @@ -666,6 +663,12 @@ **/ private array $pubkey_candidates = []; + /** + * @var array[] $_intermediate_room_data + * Array of room details fetched before constructing room objects. + */ + private ?array $_intermediate_room_data = null; + /** * @var CommunityRoom[]|null $rooms * Array of Communities hosted by this server. @@ -872,6 +875,7 @@ */ function jsonSerialize(): array { $details = get_object_vars($this); + unset($details['_intermediate_room_data']); unset($details['room_hints']); unset($details['merge_error']); unset($details['pubkey_candidates']); @@ -1002,6 +1006,7 @@ $fetch_job = function() use ($server, &$reachable_servers): Generator { if (!yield from $server->fetch_rooms_coroutine()) return; if (!yield from $server->fetch_pubkey_coroutine()) return; + $server->construct_rooms(); $reachable_servers[] = $server; }; // passthrough hack @@ -1310,7 +1315,7 @@ return false; } - $this->rooms = CommunityRoom::from_details_array($this, $room_data); + $this->_intermediate_room_data = $room_data; return true; } @@ -1324,7 +1329,7 @@ $base_url = $this->base_url; - if (empty($this->rooms)) { + if (empty($this->_intermediate_room_data)) { log_warning("Server $base_url has no rooms to poll for public key"); return false; } @@ -1335,7 +1340,11 @@ return true; } - $preview_url = $this->rooms[0]->get_preview_url(); + // This is ugly. 'RoomBuilder' would be better. + $preview_url = CommunityRoom::_from_intermediate_data( + $this, + $this->_intermediate_room_data[0] + )->get_preview_url(); log_info("Fetching pubkey from $preview_url"); $room_view_response = yield from FetchingCoroutine