diff --git a/include/ircd/m/rooms.h b/include/ircd/m/rooms.h index b4c7b370d..12c5aff5a 100644 --- a/include/ircd/m/rooms.h +++ b/include/ircd/m/rooms.h @@ -33,6 +33,8 @@ namespace ircd::m::rooms bool for_each_public(const string_view &room_id_lb, const room::id::closure_bool &); bool for_each_public(const room::id::closure_bool &); + size_t count_public(const string_view &server = {}); + // Linkage to utils that build a publicrooms summary from room state. void summary_chunk(const m::room &, json::stack::object &chunk); json::object summary_chunk(const m::room &, const mutable_buffer &out); diff --git a/ircd/m/m.cc b/ircd/m/m.cc index 1ca9fe068..4fa6fc648 100644 --- a/ircd/m/m.cc +++ b/ircd/m/m.cc @@ -1532,6 +1532,19 @@ ircd::m::rooms::for_each(const user &user, return rooms.for_each(membership, closure); } +size_t +ircd::m::rooms::count_public(const string_view &server) +{ + using prototype = size_t (const string_view &); + + static mods::import function + { + "m_rooms", "_count_public" + }; + + return function(server); +} + bool ircd::m::rooms::for_each_public(const room::id::closure_bool &closure) { diff --git a/modules/client/publicrooms.cc b/modules/client/publicrooms.cc index e4338e0cb..910015c0d 100644 --- a/modules/client/publicrooms.cc +++ b/modules/client/publicrooms.cc @@ -16,17 +16,6 @@ IRCD_MODULE "Client 7.5 :Public Rooms" }; -const ircd::m::room::id::buf -public_room_id -{ - "public", ircd::my_host() -}; - -m::room public_ -{ - public_room_id -}; - resource publicrooms_resource { @@ -105,11 +94,6 @@ post__publicrooms(client &client, size_t count{0}; m::room::id::buf prev_batch_buf; m::room::id::buf next_batch_buf; - const m::room::state publix - { - public_ - }; - json::stack::object top{out}; { json::stack::member chunk_m{top, "chunk"}; @@ -132,7 +116,7 @@ post__publicrooms(client &client, { top, "total_room_count_estimate", json::value { - long(publix.count("ircd.room")) + ssize_t(m::rooms::count_public()) } }; @@ -148,7 +132,7 @@ post__publicrooms(client &client, top, "next_batch", next_batch_buf }; - return {}; + return response; } resource::method diff --git a/modules/m_rooms.cc b/modules/m_rooms.cc index 0174f8167..8588c2e89 100644 --- a/modules/m_rooms.cc +++ b/modules/m_rooms.cc @@ -11,12 +11,13 @@ namespace ircd::m::rooms { extern "C" void _summary_chunk(const m::room &room, json::stack::object &obj); + extern "C" size_t _count_public(const string_view &server); extern "C" bool _for_each_public(const string_view &room_id_lb, const room::id::closure_bool &); extern "C" bool _for_each(const string_view &room_id_lb, const room::id::closure_bool &); static void create_public_room(const m::event &, m::vm::eval &); - extern const ircd::m::room::id::buf public_room_id; - extern m::hookfn create_public_room_hook; + extern const room::id::buf public_room_id; + extern m::hookfn create_public_room_hook; } ircd::mapi::header @@ -70,6 +71,18 @@ ircd::m::rooms::_for_each(const string_view &room_id_lb, return state.for_each("ircd.room", room_id_lb, keys); } +size_t +ircd::m::rooms::_count_public(const string_view &server) +{ + const room::state state + { + public_room_id + }; + + //TODO: server + return state.count("ircd.room"); +} + bool ircd::m::rooms::_for_each_public(const string_view &room_id_lb, const room::id::closure_bool &closure)