diff --git a/include/ircd/m/device.h b/include/ircd/m/device.h index 1e41ca4c9..102ea1ef1 100644 --- a/include/ircd/m/device.h +++ b/include/ircd/m/device.h @@ -135,6 +135,7 @@ struct ircd::m::device static bool put(const user &, const string_view &id, const string_view &prop, const string_view &val); static bool set(const user &, const string_view &id, const string_view &prop, const string_view &val); static bool set(const user &, const device &); + static bool set(const device_list_update &); // composite interface static std::map count_one_time_keys(const user &, const string_view &); diff --git a/matrix/device.cc b/matrix/device.cc index b9c28a235..ad3c1cadb 100644 --- a/matrix/device.cc +++ b/matrix/device.cc @@ -46,6 +46,44 @@ ircd::m::device::count_one_time_keys(const user &user, return ret; } +bool +ircd::m::device::set(const device_list_update &update) +{ + const m::user &user + { + json::at<"user_id"_>(update) + }; + + const auto &device_id + { + json::at<"device_id"_>(update) + }; + + if(json::get<"deleted"_>(update)) + return del(user, device_id); + + // Properties we're interested in for now... + static const string_view mask[] + { + "device_id", + "device_display_name", + "keys", + }; + + bool ret {false}; + json::for_each(update, mask, [&ret, &user, &device_id] + (const auto &prop, auto &&val) + { + if constexpr(std::is_assignable()) + { + if(json::defined(json::value(val))) + ret |= set(user, device_id, prop, val); + } + }); + + return ret; +} + bool ircd::m::device::set(const m::user &user, const device &device)