refactor: use incomplete instances to postpone lang info

dev
gravel 2 years ago
parent 6d04a5a480
commit 5dabdb4ebb
Signed by: gravel
GPG Key ID: C0538F3C906B308F

@ -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

Loading…
Cancel
Save