diff --git a/include/ircd/m/room.h b/include/ircd/m/room.h index 97356c2e4..aa026b9c0 100644 --- a/include/ircd/m/room.h +++ b/include/ircd/m/room.h @@ -27,6 +27,9 @@ namespace ircd::m // [GET] Util bool exists(const id::room &); + id::room room_id(const mutable_buffer &, const id::room_alias &); + id::room::buf room_id(const id::room_alias &); + // [GET] Current Event suite (non-locking) (one) id::event::buf head(std::nothrow_t, const id::room &, int64_t &); id::event::buf head(const id::room &, uint64_t &); @@ -105,7 +108,6 @@ struct ircd::m::room // misc bool membership(const m::id::user &, const string_view &membership = "join") const; - room(const alias &, const event::id &event_id = {}); room(const id &room_id, const event::id &event_id = {}) :room_id{room_id} ,event_id{event_id} diff --git a/ircd/m/m.cc b/ircd/m/m.cc index a90bcacbb..8971a3b8e 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -460,6 +460,28 @@ ircd::m::commit(const room &room, return function(room, event, contents); } +ircd::m::id::room::buf +ircd::m::room_id(const id::room_alias &room_alias) +{ + id::room::buf buf; + room_id(buf, room_alias); + return buf; +} + +ircd::m::id::room +ircd::m::room_id(const mutable_buffer &out, + const id::room_alias &room_alias) +{ + using prototype = id::room (const mutable_buffer &, const id::room_alias &); + + static import function + { + "client_directory_room", "room_id__room_alias" + }; + + return function(out, room_alias); +} + /////////////////////////////////////////////////////////////////////////////// // // m/hook.h diff --git a/ircd/m/room.cc b/ircd/m/room.cc index 176555c5f..743581562 100644 --- a/ircd/m/room.cc +++ b/ircd/m/room.cc @@ -104,14 +104,6 @@ ircd::m::my(const room &room) // room // -ircd::m::room::room(const alias &alias, - const event::id &event_id) -:room_id{} -,event_id{event_id} -{ - assert(0); //TODO: translate -} - bool ircd::m::room::membership(const m::id::user &user_id, const string_view &membership) diff --git a/modules/client/directory/room.cc b/modules/client/directory/room.cc index de641e1c9..3f29c7949 100644 --- a/modules/client/directory/room.cc +++ b/modules/client/directory/room.cc @@ -26,6 +26,10 @@ directory_room_resource } }; +extern "C" m::id::room +room_id__room_alias(const mutable_buffer &out, + const m::id::room_alias &); + resource::response get__directory_room(client &client, const resource::request &request) @@ -35,49 +39,18 @@ get__directory_room(client &client, url::decode(request.parv[0], room_alias) }; - //TODO: XXX cache strat - - const unique_buffer buf + char buf[256]; + const auto room_id { - 16_KiB + m::room_id(buf, room_alias) }; - m::v1::query::directory federation_request - { - room_alias, buf - }; - - //TODO: conf - if(federation_request.wait(seconds(8)) == ctx::future_status::timeout) - { - cancel(federation_request); - return resource::response - { - client, http::REQUEST_TIMEOUT - }; - } - - const http::code &code - { - federation_request.get() - }; - - const json::object &response - { - federation_request - }; - - if(empty(response["room_id"])) - throw m::NOT_FOUND{}; - - if(empty(response["servers"])) - throw m::NOT_FOUND{}; - - //TODO: XXX cache strat - return resource::response { - client, response + client, json::members + { + { "room_id", room_id } + } }; } @@ -120,3 +93,58 @@ directory_room_put { directory_room_resource, "PUT", put__directory_room }; + +m::id::room +room_id__room_alias(const mutable_buffer &out, + const m::id::room_alias &alias) +{ + //TODO: XXX cache strat + + const unique_buffer buf + { + 8_KiB //TODO: XXX + }; + + m::v1::query::directory federation_request + { + alias, buf + }; + + //TODO: conf + if(federation_request.wait(seconds(8)) == ctx::future_status::timeout) + throw http::error + { + http::REQUEST_TIMEOUT + }; + + const http::code &code + { + federation_request.get() + }; + + const json::object &response + { + federation_request + }; + + if(empty(response["room_id"])) + throw m::NOT_FOUND{}; + + if(empty(response["servers"])) + throw m::NOT_FOUND{}; + + const auto &room_id + { + unquote(response.at("room_id")) + }; + + //TODO: XXX cache strat + + return m::room::id + { + string_view + { + data(out), copy(out, room_id) + } + }; +} diff --git a/modules/client/join.cc b/modules/client/join.cc index 8f85e785d..b39e18a72 100644 --- a/modules/client/join.cc +++ b/modules/client/join.cc @@ -81,11 +81,9 @@ _post__join(client &client, const resource::request &request, const m::room::alias &room_alias) { - throw m::NOT_FOUND{}; //TODO: X - - const m::room::id room_id + const m::room::id::buf room_id { - + m::room_id(room_alias) }; return resource::response