diff --git a/include/ircd/m/v1/user_keys.h b/include/ircd/m/v1/user_keys.h index 5825c5bfc..85f0b1d44 100644 --- a/include/ircd/m/v1/user_keys.h +++ b/include/ircd/m/v1/user_keys.h @@ -67,6 +67,7 @@ struct ircd::m::v1::user::keys::claim using device = std::pair; using devices = vector_view; using user_devices = std::pair; + using user_devices_map = std::map; explicit operator json::object() const { @@ -79,6 +80,10 @@ struct ircd::m::v1::user::keys::claim const mutable_buffer &, opts); + claim(const user_devices_map &, + const mutable_buffer &, + opts); + claim(const vector_view &, const mutable_buffer &, opts); diff --git a/ircd/m_v1.cc b/ircd/m_v1.cc index effb62a07..92df0be21 100644 --- a/ircd/m_v1.cc +++ b/ircd/m_v1.cc @@ -1087,6 +1087,40 @@ ircd::m::v1::user::keys::claim::claim(const vector_view &v, }; } +ircd::m::v1::user::keys::claim::claim(const user_devices_map &map, + const mutable_buffer &buf, + opts opts) +{ + json::stack out{buf}; + { + json::stack::object top{out}; + json::stack::object one_time_keys + { + top, "one_time_keys" + }; + + for(const auto &p : map) + { + const m::user::id &user_id(p.first); + const json::object &devices(p.second); + json::stack::member user + { + one_time_keys, user_id, devices + }; + } + } + + const json::object &content + { + out.completed() + }; + + new (this) claim + { + content, buf + size(string_view(content)), std::move(opts) + }; +} + ircd::m::v1::user::keys::claim::claim(const json::object &content, const mutable_buffer &buf, opts opts)