summary refs log tree commit diff
path: root/include/RoomState.h
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-04 18:41:19 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-04 18:41:19 +0200
commita605e4486f4b9d90d668d6d1844ba5f0d58bbc26 (patch)
treec82001904cb120d975361edb38a62b5b77fa0644 /include/RoomState.h
parentRun tests only with gcc (diff)
downloadnheko-a605e4486f4b9d90d668d6d1844ba5f0d58bbc26.tar.xz
Migrate to matrix-structs for event and response parsing
Diffstat (limited to 'include/RoomState.h')
-rw-r--r--include/RoomState.h96
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); + } + } +}