From 68fc738a3c99a6bb109268b1cda3b9f93a1e1a2f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 4 Jan 2021 03:52:37 -0800 Subject: [PATCH] modules/client/keys/changes: Implement c2s r0.6.1 13.11.5.2.4 keys/changes (changed half). --- modules/client/keys/changes.cc | 72 +++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/modules/client/keys/changes.cc b/modules/client/keys/changes.cc index 53117be52..bcc1d399c 100644 --- a/modules/client/keys/changes.cc +++ b/modules/client/keys/changes.cc @@ -60,8 +60,78 @@ m::resource::response get__keys_changes(client &client, const m::resource::request &request) { - return m::resource::response + char buf[2][128]; + const string_view range[2] + { + url::decode(buf[0], request.query["from"]), + url::decode(buf[1], request.query["to"]) + }; + + const auto from + { + m::sync::sequence(m::sync::make_since(range[0])) + }; + + const auto to + { + m::sync::sequence(m::sync::make_since(range[1])) + }; + + const m::user::mitsein mitsein + { + request.user_id + }; + + m::resource::response::chunked::json response { client, http::OK }; + + if(likely(request.query.get("changed", true))) + { + json::stack::array out + { + response, "changed" + }; + + m::events::type::for_each_in("ircd.device.keys", [&from, &to, &out, &mitsein] + (const string_view &type, const m::event::idx &event_idx) + { + if(event_idx < from || event_idx >= to) + return true; + + const bool room_id_prefetched + { + m::prefetch(event_idx, "room_id") + }; + + m::get(std::nothrow, event_idx, "sender", [&out, &mitsein, &event_idx] + (const m::user::id &user_id) + { + m::get(std::nothrow, event_idx, "room_id", [&out, &mitsein, &user_id] + (const m::room::id &room_id) + { + if(!m::user::room::is(room_id, user_id)) + return; + + if(!mitsein.has(user_id)) + return; + + out.append(user_id); + }); + }); + + return true; + }); + } + + if(likely(request.query.get("left", true))) + { + json::stack::array out + { + response, "left" + }; + } + + return std::move(response); }