Migrate to matrix-structs for event and response parsing
1 files changed, 64 insertions, 32 deletions
diff --git a/include/RoomState.h b/include/RoomState.h
index db1cdc68..0e91410c 100644
--- a/include/RoomState.h
+++ b/include/RoomState.h
@@ -21,28 +21,14 @@
#include <QPixmap>
#include <QUrl>
-#include "AliasesEventContent.h"
-#include "AvatarEventContent.h"
-#include "CanonicalAliasEventContent.h"
-#include "CreateEventContent.h"
-#include "HistoryVisibilityEventContent.h"
-#include "JoinRulesEventContent.h"
-#include "MemberEventContent.h"
-#include "NameEventContent.h"
-#include "PowerLevelsEventContent.h"
-#include "TopicEventContent.h"
-
-#include "Event.h"
-#include "RoomEvent.h"
-#include "StateEvent.h"
-
-namespace events = matrix::events;
+#include <mtx.hpp>
class RoomState
{
public:
RoomState();
- RoomState(const QJsonArray &events);
+ RoomState(const mtx::responses::Timeline &timeline);
+ RoomState(const mtx::responses::State &state);
// Calculate room data that are not immediatly accessible. Like room name and
// avatar.
@@ -50,32 +36,37 @@ public:
// e.g If the room is 1-on-1 name and avatar should be extracted from a user.
void resolveName();
void resolveAvatar();
- void parse(const QJsonObject &object);
+ void parse(const nlohmann::json &object);
QUrl getAvatar() const { return avatar_; };
QString getName() const { return name_; };
- QString getTopic() const { return topic.content().topic().simplified(); };
+ QString getTopic() const
+ {
+ return QString::fromStdString(topic.content.topic).simplified();
+ };
void removeLeaveMemberships();
void update(const RoomState &state);
- void updateFromEvents(const QJsonArray &events);
- QJsonObject serialize() const;
+ template<class Collection>
+ void updateFromEvents(const std::vector<Collection> &collection);
+
+ std::string serialize() const;
// The latest state events.
- events::StateEvent<events::AliasesEventContent> aliases;
- events::StateEvent<events::AvatarEventContent> avatar;
- events::StateEvent<events::CanonicalAliasEventContent> canonical_alias;
- events::StateEvent<events::CreateEventContent> create;
- events::StateEvent<events::HistoryVisibilityEventContent> history_visibility;
- events::StateEvent<events::JoinRulesEventContent> join_rules;
- events::StateEvent<events::NameEventContent> name;
- events::StateEvent<events::PowerLevelsEventContent> power_levels;
- events::StateEvent<events::TopicEventContent> topic;
+ mtx::events::StateEvent<mtx::events::state::Aliases> aliases;
+ mtx::events::StateEvent<mtx::events::state::Avatar> avatar;
+ mtx::events::StateEvent<mtx::events::state::CanonicalAlias> canonical_alias;
+ mtx::events::StateEvent<mtx::events::state::Create> create;
+ mtx::events::StateEvent<mtx::events::state::HistoryVisibility> history_visibility;
+ mtx::events::StateEvent<mtx::events::state::JoinRules> join_rules;
+ mtx::events::StateEvent<mtx::events::state::Name> name;
+ mtx::events::StateEvent<mtx::events::state::PowerLevels> power_levels;
+ mtx::events::StateEvent<mtx::events::state::Topic> topic;
// Contains the m.room.member events for all the joined users.
- using UserID = QString;
- QMap<UserID, events::StateEvent<events::MemberEventContent>> memberships;
+ using UserID = std::string;
+ std::map<UserID, mtx::events::StateEvent<mtx::events::state::Member>> memberships;
private:
QUrl avatar_;
@@ -85,3 +76,44 @@ private:
// avatar event this should be empty.
QString userAvatar_;
};
+
+template<class Collection>
+void
+RoomState::updateFromEvents(const std::vector<Collection> &collection)
+{
+ using Aliases = mtx::events::StateEvent<mtx::events::state::Aliases>;
+ using Avatar = mtx::events::StateEvent<mtx::events::state::Avatar>;
+ using CanonicalAlias = mtx::events::StateEvent<mtx::events::state::CanonicalAlias>;
+ using Create = mtx::events::StateEvent<mtx::events::state::Create>;
+ using HistoryVisibility = mtx::events::StateEvent<mtx::events::state::HistoryVisibility>;
+ using JoinRules = mtx::events::StateEvent<mtx::events::state::JoinRules>;
+ using Member = mtx::events::StateEvent<mtx::events::state::Member>;
+ using Name = mtx::events::StateEvent<mtx::events::state::Name>;
+ using PowerLevels = mtx::events::StateEvent<mtx::events::state::PowerLevels>;
+ using Topic = mtx::events::StateEvent<mtx::events::state::Topic>;
+
+ for (const auto &event : collection) {
+ if (mpark::holds_alternative<Aliases>(event)) {
+ this->aliases = mpark::get<Aliases>(event);
+ } else if (mpark::holds_alternative<Avatar>(event)) {
+ this->avatar = mpark::get<Avatar>(event);
+ } else if (mpark::holds_alternative<CanonicalAlias>(event)) {
+ this->canonical_alias = mpark::get<CanonicalAlias>(event);
+ } else if (mpark::holds_alternative<Create>(event)) {
+ this->create = mpark::get<Create>(event);
+ } else if (mpark::holds_alternative<HistoryVisibility>(event)) {
+ this->history_visibility = mpark::get<HistoryVisibility>(event);
+ } else if (mpark::holds_alternative<JoinRules>(event)) {
+ this->join_rules = mpark::get<JoinRules>(event);
+ } else if (mpark::holds_alternative<Name>(event)) {
+ this->name = mpark::get<Name>(event);
+ } else if (mpark::holds_alternative<Member>(event)) {
+ auto membership = mpark::get<Member>(event);
+ this->memberships.emplace(membership.state_key, membership);
+ } else if (mpark::holds_alternative<PowerLevels>(event)) {
+ this->power_levels = mpark::get<PowerLevels>(event);
+ } else if (mpark::holds_alternative<Topic>(event)) {
+ this->topic = mpark::get<Topic>(event);
+ }
+ }
+}
|