extends Reference class_name PolyServiceBuilder ## https://xmpp.org/extensions/xep-0030.html func request(connection: Connections.Connection) -> Sums.Promise: return connection.promise_iq(connection.domain, "get", Stanza.disco_items_queury, _service_discovery(connection)) func _service_discovery(connection: Connections.Connection) -> Sums.Result: var response = yield() if not response.is_ok: return response var query := Stanza.unwrap_query_result(response.value) if not query.is_ok: return query.value var feature_promises := Array() var poly_services := Dictionary() # of Jid to PolyService for item in query.value.children: if not item.is_element() or item.name != "item": continue var poly_service = load("res://scenes/PolyService.gd").new() poly_service.jid = item.attributes["jid"] if "name" in item.attributes: poly_service.name = item.attributes["name"] poly_services[item.attributes["jid"]] = poly_service feature_promises.push_back(connection.promise_iq( item.attributes["jid"], "get", Stanza.disco_info_queury, Stanza.yield_as_is())) while not Sums.are_promises_done(feature_promises): yield() # todo: Allow partial success. if not Sums.are_promises_ok(feature_promises): return Sums.Result.make_error(Sums.collect_promise_errors(feature_promises)) for feature_response in Sums.collect_promise_values(feature_promises): var jid = feature_response.attributes["from"] var features := Stanza.unwrap_query_result(feature_response) if not features.is_ok: # todo: Signal the error. continue var poly_service = poly_services[jid] poly_service.muc = load("res://scenes/MucService.gd").new().try_init( connection, jid, features.value) return Sums.Result.make_value(poly_services.values())