mirror of
https://github.com/matrix-construct/construct
synced 2024-05-29 00:03:45 +02:00
ircd:Ⓜ️:rooms: Retype and rekey the state in !public organized by server.
This commit is contained in:
parent
af0cca91c3
commit
72bfd645da
|
@ -29,8 +29,11 @@ namespace ircd::m::rooms
|
|||
bool for_each(const user &, const user::rooms::closure_bool &);
|
||||
void for_each(const user &, const user::rooms::closure &);
|
||||
|
||||
// All public rooms only
|
||||
bool for_each_public(const string_view &room_id_lb, const room::id::closure_bool &);
|
||||
// All public rooms only; key is either a server hostname or room_id.
|
||||
// - for server hostname: iterates known rooms from that server.
|
||||
// - for room_id: starts iteration from that (or closest) room_id
|
||||
// which can be used as a since/pagination token.
|
||||
bool for_each_public(const string_view &key, const room::id::closure_bool &);
|
||||
bool for_each_public(const room::id::closure_bool &);
|
||||
|
||||
size_t count_public(const string_view &server = {});
|
||||
|
|
|
@ -1552,7 +1552,7 @@ ircd::m::rooms::for_each_public(const room::id::closure_bool &closure)
|
|||
}
|
||||
|
||||
bool
|
||||
ircd::m::rooms::for_each_public(const string_view &room_id_lb,
|
||||
ircd::m::rooms::for_each_public(const string_view &key,
|
||||
const room::id::closure_bool &closure)
|
||||
{
|
||||
using prototype = bool (const string_view &, const room::id::closure_bool &);
|
||||
|
@ -1562,7 +1562,7 @@ ircd::m::rooms::for_each_public(const string_view &room_id_lb,
|
|||
"m_rooms", "_for_each_public"
|
||||
};
|
||||
|
||||
return function(room_id_lb, closure);
|
||||
return function(key, closure);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -10,11 +10,16 @@
|
|||
|
||||
namespace ircd::m::rooms
|
||||
{
|
||||
static string_view make_state_key(const mutable_buffer &out, const m::room::id &);
|
||||
static m::room::id::buf unmake_state_key(const string_view &);
|
||||
|
||||
extern conf::item<size_t> fetch_limit;
|
||||
extern conf::item<seconds> fetch_timeout;
|
||||
extern "C" std::pair<size_t, std::string> _fetch_update_(const net::hostport &, const string_view &since, const size_t &limit, const seconds &timeout);
|
||||
extern "C" std::pair<size_t, std::string> _fetch_update(const net::hostport &, const string_view &since = {});
|
||||
|
||||
static void remote_summary_chunk(const m::room &room, json::stack::object &obj);
|
||||
static void local_summary_chunk(const m::room &room, json::stack::object &obj);
|
||||
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 &);
|
||||
|
@ -79,17 +84,20 @@ ircd::m::rooms::_for_each(const string_view &room_id_lb,
|
|||
size_t
|
||||
ircd::m::rooms::_count_public(const string_view &server)
|
||||
{
|
||||
const room::state state
|
||||
size_t ret{0};
|
||||
const auto count{[&ret]
|
||||
(const m::room::id &room_id)
|
||||
{
|
||||
public_room_id
|
||||
};
|
||||
++ret;
|
||||
return true;
|
||||
}};
|
||||
|
||||
//TODO: server
|
||||
return state.count("ircd.room");
|
||||
for_each_public(server, count);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::m::rooms::_for_each_public(const string_view &room_id_lb,
|
||||
ircd::m::rooms::_for_each_public(const string_view &key,
|
||||
const room::id::closure_bool &closure)
|
||||
{
|
||||
const room::state state
|
||||
|
@ -97,37 +105,84 @@ ircd::m::rooms::_for_each_public(const string_view &room_id_lb,
|
|||
public_room_id
|
||||
};
|
||||
|
||||
const room::state::keys_bool keys{[&closure]
|
||||
(const string_view &room_id) -> bool
|
||||
const bool is_room_id
|
||||
{
|
||||
m::valid(m::id::ROOM, key)
|
||||
};
|
||||
|
||||
char state_key_buf[256];
|
||||
const auto state_key
|
||||
{
|
||||
is_room_id?
|
||||
make_state_key(state_key_buf, key):
|
||||
key
|
||||
};
|
||||
|
||||
const string_view &server
|
||||
{
|
||||
is_room_id?
|
||||
room::id(key).host():
|
||||
key
|
||||
};
|
||||
|
||||
const room::state::keys_bool keys{[&closure, &server]
|
||||
(const string_view &state_key) -> bool
|
||||
{
|
||||
const auto room_id
|
||||
{
|
||||
unmake_state_key(state_key)
|
||||
};
|
||||
|
||||
if(server && room_id.host() != server)
|
||||
return false;
|
||||
|
||||
return closure(room_id);
|
||||
}};
|
||||
|
||||
return state.for_each("ircd.room", room_id_lb, keys);
|
||||
return state.for_each("ircd.rooms", state_key, keys);
|
||||
}
|
||||
|
||||
void
|
||||
ircd::m::rooms::_summary_chunk(const m::room &room,
|
||||
json::stack::object &obj)
|
||||
{
|
||||
if(!exists(room))
|
||||
return exists(room)?
|
||||
local_summary_chunk(room, obj):
|
||||
remote_summary_chunk(room, obj);
|
||||
}
|
||||
|
||||
void
|
||||
ircd::m::rooms::remote_summary_chunk(const m::room &room,
|
||||
json::stack::object &obj)
|
||||
{
|
||||
const m::room publix
|
||||
{
|
||||
const m::room publix{public_room_id};
|
||||
publix.get("ircd.room", room.room_id, [&obj]
|
||||
(const m::event &event)
|
||||
public_room_id
|
||||
};
|
||||
|
||||
char state_key_buf[256];
|
||||
const auto state_key
|
||||
{
|
||||
make_state_key(state_key_buf, room.room_id)
|
||||
};
|
||||
|
||||
publix.get("ircd.rooms", state_key, [&obj]
|
||||
(const m::event &event)
|
||||
{
|
||||
const json::object &summary
|
||||
{
|
||||
const json::object &summary
|
||||
{
|
||||
json::at<"content"_>(event)
|
||||
};
|
||||
json::at<"content"_>(event)
|
||||
};
|
||||
|
||||
for(const auto &member : summary)
|
||||
json::stack::member m{obj, member.first, member.second};
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
for(const auto &member : summary)
|
||||
json::stack::member m{obj, member.first, member.second};
|
||||
});
|
||||
}
|
||||
|
||||
void
|
||||
ircd::m::rooms::local_summary_chunk(const m::room &room,
|
||||
json::stack::object &obj)
|
||||
{
|
||||
static const event::keys keys
|
||||
{
|
||||
event::keys::include
|
||||
|
@ -326,12 +381,45 @@ ircd::m::rooms::_fetch_update_(const net::hostport &hp,
|
|||
unquote(summary.at("room_id"))
|
||||
};
|
||||
|
||||
send(public_room_id, m::me, "ircd.room", room_id, summary);
|
||||
char state_key_buf[256];
|
||||
const auto state_key
|
||||
{
|
||||
make_state_key(state_key_buf, room_id)
|
||||
};
|
||||
|
||||
send(public_room_id, m::me, "ircd.rooms", state_key, summary);
|
||||
}
|
||||
|
||||
return
|
||||
{
|
||||
response.get("total_room_count_estimate", 0UL),
|
||||
response.get("next_batch", string_view{})
|
||||
unquote(response.get("next_batch", string_view{}))
|
||||
};
|
||||
}
|
||||
|
||||
ircd::m::room::id::buf
|
||||
ircd::m::rooms::unmake_state_key(const string_view &key)
|
||||
{
|
||||
const auto s
|
||||
{
|
||||
split(key, '!')
|
||||
};
|
||||
|
||||
return m::room::id::buf
|
||||
{
|
||||
s.second, s.first
|
||||
};
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
ircd::m::rooms::make_state_key(const mutable_buffer &buf,
|
||||
const m::room::id &room_id)
|
||||
{
|
||||
mutable_buffer out{buf};
|
||||
consume(out, copy(out, room_id.host()));
|
||||
consume(out, copy(out, room_id.local()));
|
||||
return string_view
|
||||
{
|
||||
data(buf), data(out)
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue