Skip to content
Snippets Groups Projects
Verified Commit bb33fcb3 authored by Nicolas Werner's avatar Nicolas Werner
Browse files

Add API to set and get account data

parent 6bbe8596
No related branches found
No related tags found
No related merge requests found
Pipeline #967 passed
...@@ -316,5 +316,24 @@ constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretSen ...@@ -316,5 +316,24 @@ constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretSen
template<> template<>
constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretRequest> = constexpr inline EventType to_device_content_to_type<mtx::events::msg::SecretRequest> =
EventType::SecretRequest; EventType::SecretRequest;
//! Get the right event type for some type of account_data event content.
template<typename Content>
constexpr inline EventType account_data_content_to_type = EventType::Unsupported;
template<>
constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePack> =
EventType::ImagePackInAccountData;
template<>
constexpr inline EventType account_data_content_to_type<mtx::events::msc2545::ImagePackRooms> =
EventType::ImagePackRooms;
template<>
constexpr inline EventType account_data_content_to_type<mtx::events::account_data::Tags> =
EventType::Tag;
template<>
constexpr inline EventType
account_data_content_to_type<mtx::events::account_data::nheko_extensions::HiddenEvents> =
EventType::NhekoHiddenEvents;
} // namespace events } // namespace events
} // namespace mtx } // namespace mtx
...@@ -421,6 +421,42 @@ public: ...@@ -421,6 +421,42 @@ public:
void get_event(const std::string &room_id, void get_event(const std::string &room_id,
const std::string &event_id, const std::string &event_id,
Callback<mtx::events::collections::TimelineEvents> cb); Callback<mtx::events::collections::TimelineEvents> cb);
//! Store a room account_data event.
template<class Payload>
void put_room_account_data(const std::string &room_id,
const std::string &type,
const Payload &payload,
ErrCallback cb);
//! Store a room account_data event.
template<class Payload>
void put_room_account_data(const std::string &room_id,
const Payload &payload,
ErrCallback cb);
//! Store an account_data event.
template<class Payload>
void put_account_data(const std::string &type, const Payload &payload, ErrCallback cb);
//! Store an account_data event.
template<class Payload>
void put_account_data(const Payload &payload, ErrCallback cb);
//! Retrieve a room account_data event.
template<class Payload>
void get_room_account_data(const std::string &room_id,
const std::string &type,
Callback<Payload> payload);
//! Retrieve a room account_data event.
template<class Payload>
void get_room_account_data(const std::string &room_id, Callback<Payload> cb);
//! Retrieve an account_data event.
template<class Payload>
void get_account_data(const std::string &type, Callback<Payload> payload);
//! Retrieve an account_data event.
template<class Payload>
void get_account_data(Callback<Payload> cb);
//! Send a room message with auto-generated transaction id. //! Send a room message with auto-generated transaction id.
template<class Payload> template<class Payload>
void send_room_message(const std::string &room_id, void send_room_message(const std::string &room_id,
...@@ -717,3 +753,28 @@ MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::KeyVerificationKey) ...@@ -717,3 +753,28 @@ MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::KeyVerificationKey)
MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::KeyVerificationMac) MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::KeyVerificationMac)
MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::SecretSend) MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::SecretSend)
MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::SecretRequest) MTXCLIENT_SEND_TO_DEVICE_FWD(mtx::events::msg::SecretRequest)
#define MTXCLIENT_ACCOUNT_DATA_FWD(Payload) \
extern template void mtx::http::Client::put_room_account_data<Payload>( \
const std::string &room_id, \
const std::string &type, \
const Payload &payload, \
ErrCallback cb); \
extern template void mtx::http::Client::put_room_account_data<Payload>( \
const std::string &room_id, const Payload &payload, ErrCallback cb); \
extern template void mtx::http::Client::put_account_data<Payload>( \
const std::string &type, const Payload &payload, ErrCallback cb); \
extern template void mtx::http::Client::put_account_data<Payload>(const Payload &payload, \
ErrCallback cb); \
extern template void mtx::http::Client::get_room_account_data<Payload>( \
const std::string &room_id, const std::string &type, Callback<Payload> payload); \
extern template void mtx::http::Client::get_room_account_data<Payload>( \
const std::string &room_id, Callback<Payload> cb); \
extern template void mtx::http::Client::get_account_data<Payload>( \
const std::string &type, Callback<Payload> payload); \
extern template void mtx::http::Client::get_account_data<Payload>(Callback<Payload> cb);
MTXCLIENT_ACCOUNT_DATA_FWD(mtx::events::msc2545::ImagePack)
MTXCLIENT_ACCOUNT_DATA_FWD(mtx::events::msc2545::ImagePackRooms)
MTXCLIENT_ACCOUNT_DATA_FWD(mtx::events::account_data::nheko_extensions::HiddenEvents)
MTXCLIENT_ACCOUNT_DATA_FWD(mtx::events::account_data::Tags)
...@@ -234,3 +234,81 @@ mtx::http::Client::send_state_event(const std::string &room_id, ...@@ -234,3 +234,81 @@ mtx::http::Client::send_state_event(const std::string &room_id,
{ {
send_state_event<Payload>(room_id, "", payload, callback); send_state_event<Payload>(room_id, "", payload, callback);
} }
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::put_room_account_data(const std::string &room_id,
const std::string &type,
const Payload &payload,
ErrCallback cb)
{
const auto api_path = "/client/r0/user/" +
mtx::client::utils::url_encode(user_id_.to_string()) + "/rooms/" +
mtx::client::utils::url_encode(room_id) + "/account_data/" + type;
put<Payload>(api_path, payload, cb);
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::put_room_account_data(const std::string &room_id,
const Payload &payload,
ErrCallback cb)
{
constexpr auto event_type = mtx::events::account_data_content_to_type<Payload>;
static_assert(event_type != mtx::events::EventType::Unsupported);
put_room_account_data(room_id, to_string(event_type), payload, std::move(cb));
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::put_account_data(const std::string &type, const Payload &payload, ErrCallback cb)
{
const auto api_path = "/client/r0/user/" +
mtx::client::utils::url_encode(user_id_.to_string()) +
"/account_data/" + type;
put<Payload>(api_path, payload, cb);
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::put_account_data(const Payload &payload, ErrCallback cb)
{
constexpr auto event_type = mtx::events::account_data_content_to_type<Payload>;
static_assert(event_type != mtx::events::EventType::Unsupported);
put_account_data(to_string(event_type), payload, std::move(cb));
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::get_room_account_data(const std::string &room_id,
const std::string &type,
Callback<Payload> cb)
{
const auto api_path = "/client/r0/user/" +
mtx::client::utils::url_encode(user_id_.to_string()) + "/rooms/" +
mtx::client::utils::url_encode(room_id) + "/account_data/" + type;
get<Payload>(api_path,
[cb](const Payload &res, HeaderFields, RequestErr err) { cb(res, err); });
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::get_room_account_data(const std::string &room_id, Callback<Payload> cb)
{
constexpr auto event_type = mtx::events::account_data_content_to_type<Payload>;
static_assert(event_type != mtx::events::EventType::Unsupported);
get_room_account_data(room_id, to_string(event_type), std::move(cb));
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::get_account_data(const std::string &type, Callback<Payload> cb)
{
const auto api_path = "/client/r0/user/" +
mtx::client::utils::url_encode(user_id_.to_string()) +
"/account_data/" + type;
get<Payload>(api_path,
[cb](const Payload &res, HeaderFields, RequestErr err) { cb(res, err); });
}
template<class Payload>
[[gnu::used, llvm::used]] void
mtx::http::Client::get_account_data(Callback<Payload> cb)
{
constexpr auto event_type = mtx::events::account_data_content_to_type<Payload>;
static_assert(event_type != mtx::events::EventType::Unsupported);
get_account_data(to_string(event_type), std::move(cb));
}
...@@ -1493,3 +1493,28 @@ MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::KeyVerificationKey) ...@@ -1493,3 +1493,28 @@ MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::KeyVerificationKey)
MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::KeyVerificationMac) MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::KeyVerificationMac)
MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::SecretSend) MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::SecretSend)
MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::SecretRequest) MTXCLIENT_SEND_TO_DEVICE(mtx::events::msg::SecretRequest)
#define MTXCLIENT_ACCOUNT_DATA(Payload) \
template void mtx::http::Client::put_room_account_data<Payload>( \
const std::string &room_id, \
const std::string &type, \
const Payload &payload, \
ErrCallback cb); \
template void mtx::http::Client::put_room_account_data<Payload>( \
const std::string &room_id, const Payload &payload, ErrCallback cb); \
template void mtx::http::Client::put_account_data<Payload>( \
const std::string &type, const Payload &payload, ErrCallback cb); \
template void mtx::http::Client::put_account_data<Payload>(const Payload &payload, \
ErrCallback cb); \
template void mtx::http::Client::get_room_account_data<Payload>( \
const std::string &room_id, const std::string &type, Callback<Payload> payload); \
template void mtx::http::Client::get_room_account_data<Payload>( \
const std::string &room_id, Callback<Payload> cb); \
template void mtx::http::Client::get_account_data<Payload>(const std::string &type, \
Callback<Payload> payload); \
template void mtx::http::Client::get_account_data<Payload>(Callback<Payload> cb);
MTXCLIENT_ACCOUNT_DATA(mtx::events::msc2545::ImagePack)
MTXCLIENT_ACCOUNT_DATA(mtx::events::msc2545::ImagePackRooms)
MTXCLIENT_ACCOUNT_DATA(mtx::events::account_data::nheko_extensions::HiddenEvents)
MTXCLIENT_ACCOUNT_DATA(mtx::events::account_data::Tags)
...@@ -328,6 +328,83 @@ TEST(ClientAPI, TagRoom) ...@@ -328,6 +328,83 @@ TEST(ClientAPI, TagRoom)
mtx_client->close(); mtx_client->close();
} }
TEST(ClientAPI, RoomAccountData)
{
std::shared_ptr<Client> mtx_client = make_test_client();
mtx_client->login(
"alice", "secret", [mtx_client](const mtx::responses::Login &, RequestErr err) {
check_error(err);
});
while (mtx_client->access_token().empty())
sleep();
mtx::requests::CreateRoom req;
req.name = "Name";
req.topic = "Topic";
mtx_client->create_room(
req, [mtx_client](const mtx::responses::CreateRoom &res, RequestErr err) {
auto room_id = res.room_id;
check_error(err);
mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEv;
hiddenEv.hidden_event_types.push_back(mtx::events::EventType::RoomMember);
mtx_client->put_room_account_data(
room_id.to_string(), hiddenEv, [mtx_client, room_id](RequestErr err) {
check_error(err);
mtx_client->get_room_account_data<
mtx::events::account_data::nheko_extensions::HiddenEvents>(
room_id.to_string(),
[](mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEv,
RequestErr err) {
check_error(err);
ASSERT_EQ(hiddenEv.hidden_event_types.size(), 1);
EXPECT_EQ(hiddenEv.hidden_event_types.at(0),
mtx::events::EventType::RoomMember);
});
});
});
mtx_client->close();
}
TEST(ClientAPI, AccountData)
{
std::shared_ptr<Client> mtx_client = make_test_client();
mtx_client->login(
"alice", "secret", [mtx_client](const mtx::responses::Login &, RequestErr err) {
check_error(err);
});
while (mtx_client->access_token().empty())
sleep();
mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEv;
hiddenEv.hidden_event_types.push_back(mtx::events::EventType::RoomMember);
mtx_client->put_account_data(hiddenEv, [mtx_client](RequestErr err) {
check_error(err);
mtx_client
->get_account_data<mtx::events::account_data::nheko_extensions::HiddenEvents>(
[mtx_client](mtx::events::account_data::nheko_extensions::HiddenEvents hiddenEv,
RequestErr err) {
check_error(err);
ASSERT_EQ(hiddenEv.hidden_event_types.size(), 1);
EXPECT_EQ(hiddenEv.hidden_event_types.at(0),
mtx::events::EventType::RoomMember);
});
});
mtx_client->close();
}
TEST(ClientAPI, LogoutSuccess) TEST(ClientAPI, LogoutSuccess)
{ {
std::shared_ptr<Client> mtx_client = make_test_client(); std::shared_ptr<Client> mtx_client = make_test_client();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment