summary refs log tree commit diff
path: root/src/EventAccessors.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/EventAccessors.cpp')
-rw-r--r--src/EventAccessors.cpp489
1 files changed, 243 insertions, 246 deletions
diff --git a/src/EventAccessors.cpp b/src/EventAccessors.cpp

index 362bf4e9..d794a384 100644 --- a/src/EventAccessors.cpp +++ b/src/EventAccessors.cpp
@@ -16,463 +16,460 @@ using is_detected = typename nheko::detail::detector<nheko::nonesuch, void, Op, struct IsStateEvent { - template<class T> - bool operator()(const mtx::events::StateEvent<T> &) - { - return true; - } - template<class T> - bool operator()(const mtx::events::Event<T> &) - { - return false; - } + template<class T> + bool operator()(const mtx::events::StateEvent<T> &) + { + return true; + } + template<class T> + bool operator()(const mtx::events::Event<T> &) + { + return false; + } }; struct EventMsgType { - template<class E> - using msgtype_t = decltype(E::msgtype); - template<class T> - mtx::events::MessageType operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<msgtype_t, T>::value) { - if constexpr (std::is_same_v<std::optional<std::string>, - std::remove_cv_t<decltype(e.content.msgtype)>>) - return mtx::events::getMessageType(e.content.msgtype.value()); - else if constexpr (std::is_same_v< - std::string, - std::remove_cv_t<decltype(e.content.msgtype)>>) - return mtx::events::getMessageType(e.content.msgtype); - } - return mtx::events::MessageType::Unknown; + template<class E> + using msgtype_t = decltype(E::msgtype); + template<class T> + mtx::events::MessageType operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<msgtype_t, T>::value) { + if constexpr (std::is_same_v<std::optional<std::string>, + std::remove_cv_t<decltype(e.content.msgtype)>>) + return mtx::events::getMessageType(e.content.msgtype.value()); + else if constexpr (std::is_same_v<std::string, + std::remove_cv_t<decltype(e.content.msgtype)>>) + return mtx::events::getMessageType(e.content.msgtype); } + return mtx::events::MessageType::Unknown; + } }; struct EventRoomName { - template<class T> - std::string operator()(const T &e) - { - if constexpr (std::is_same_v<mtx::events::StateEvent<mtx::events::state::Name>, T>) - return e.content.name; - return ""; - } + template<class T> + std::string operator()(const T &e) + { + if constexpr (std::is_same_v<mtx::events::StateEvent<mtx::events::state::Name>, T>) + return e.content.name; + return ""; + } }; struct EventRoomTopic { - template<class T> - std::string operator()(const T &e) - { - if constexpr (std::is_same_v<mtx::events::StateEvent<mtx::events::state::Topic>, T>) - return e.content.topic; - return ""; - } + template<class T> + std::string operator()(const T &e) + { + if constexpr (std::is_same_v<mtx::events::StateEvent<mtx::events::state::Topic>, T>) + return e.content.topic; + return ""; + } }; struct CallType { - template<class T> - std::string operator()(const T &e) - { - if constexpr (std::is_same_v<mtx::events::RoomEvent<mtx::events::msg::CallInvite>, - T>) { - const char video[] = "m=video"; - const std::string &sdp = e.content.sdp; - return std::search(sdp.cbegin(), - sdp.cend(), - std::cbegin(video), - std::cend(video) - 1, - [](unsigned char c1, unsigned char c2) { - return std::tolower(c1) == std::tolower(c2); - }) != sdp.cend() - ? "video" - : "voice"; - } - return std::string(); + template<class T> + std::string operator()(const T &e) + { + if constexpr (std::is_same_v<mtx::events::RoomEvent<mtx::events::msg::CallInvite>, T>) { + const char video[] = "m=video"; + const std::string &sdp = e.content.sdp; + return std::search(sdp.cbegin(), + sdp.cend(), + std::cbegin(video), + std::cend(video) - 1, + [](unsigned char c1, unsigned char c2) { + return std::tolower(c1) == std::tolower(c2); + }) != sdp.cend() + ? "video" + : "voice"; } + return std::string(); + } }; struct EventBody { - template<class C> - using body_t = decltype(C::body); - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<body_t, T>::value) { - if constexpr (std::is_same_v<std::optional<std::string>, - std::remove_cv_t<decltype(e.content.body)>>) - return e.content.body ? e.content.body.value() : ""; - else if constexpr (std::is_same_v< - std::string, - std::remove_cv_t<decltype(e.content.body)>>) - return e.content.body; - } - return ""; + template<class C> + using body_t = decltype(C::body); + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<body_t, T>::value) { + if constexpr (std::is_same_v<std::optional<std::string>, + std::remove_cv_t<decltype(e.content.body)>>) + return e.content.body ? e.content.body.value() : ""; + else if constexpr (std::is_same_v<std::string, + std::remove_cv_t<decltype(e.content.body)>>) + return e.content.body; } + return ""; + } }; struct EventFormattedBody { - template<class C> - using formatted_body_t = decltype(C::formatted_body); - template<class T> - std::string operator()(const mtx::events::RoomEvent<T> &e) - { - if constexpr (is_detected<formatted_body_t, T>::value) { - if (e.content.format == "org.matrix.custom.html") - return e.content.formatted_body; - } - return ""; + template<class C> + using formatted_body_t = decltype(C::formatted_body); + template<class T> + std::string operator()(const mtx::events::RoomEvent<T> &e) + { + if constexpr (is_detected<formatted_body_t, T>::value) { + if (e.content.format == "org.matrix.custom.html") + return e.content.formatted_body; } + return ""; + } }; struct EventFile { - template<class Content> - using file_t = decltype(Content::file); - template<class T> - std::optional<mtx::crypto::EncryptedFile> operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<file_t, T>::value) - return e.content.file; - return std::nullopt; - } + template<class Content> + using file_t = decltype(Content::file); + template<class T> + std::optional<mtx::crypto::EncryptedFile> operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<file_t, T>::value) + return e.content.file; + return std::nullopt; + } }; struct EventUrl { - template<class Content> - using url_t = decltype(Content::url); - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<url_t, T>::value) { - if (auto file = EventFile{}(e)) - return file->url; - return e.content.url; - } - return ""; + template<class Content> + using url_t = decltype(Content::url); + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<url_t, T>::value) { + if (auto file = EventFile{}(e)) + return file->url; + return e.content.url; } + return ""; + } }; struct EventThumbnailUrl { - template<class Content> - using thumbnail_url_t = decltype(Content::info.thumbnail_url); - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<thumbnail_url_t, T>::value) { - return e.content.info.thumbnail_url; - } - return ""; + template<class Content> + using thumbnail_url_t = decltype(Content::info.thumbnail_url); + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<thumbnail_url_t, T>::value) { + return e.content.info.thumbnail_url; } + return ""; + } }; struct EventBlurhash { - template<class Content> - using blurhash_t = decltype(Content::info.blurhash); - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<blurhash_t, T>::value) { - return e.content.info.blurhash; - } - return ""; + template<class Content> + using blurhash_t = decltype(Content::info.blurhash); + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<blurhash_t, T>::value) { + return e.content.info.blurhash; } + return ""; + } }; struct EventFilename { - template<class T> - std::string operator()(const mtx::events::Event<T> &) - { - return ""; - } - std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Audio> &e) - { - // body may be the original filename - return e.content.body; - } - std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Video> &e) - { - // body may be the original filename - return e.content.body; - } - std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Image> &e) - { - // body may be the original filename - return e.content.body; - } - std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::File> &e) - { - // body may be the original filename - if (!e.content.filename.empty()) - return e.content.filename; - return e.content.body; - } + template<class T> + std::string operator()(const mtx::events::Event<T> &) + { + return ""; + } + std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Audio> &e) + { + // body may be the original filename + return e.content.body; + } + std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Video> &e) + { + // body may be the original filename + return e.content.body; + } + std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::Image> &e) + { + // body may be the original filename + return e.content.body; + } + std::string operator()(const mtx::events::RoomEvent<mtx::events::msg::File> &e) + { + // body may be the original filename + if (!e.content.filename.empty()) + return e.content.filename; + return e.content.body; + } }; struct EventMimeType { - template<class Content> - using mimetype_t = decltype(Content::info.mimetype); - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<mimetype_t, T>::value) { - return e.content.info.mimetype; - } - return ""; + template<class Content> + using mimetype_t = decltype(Content::info.mimetype); + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<mimetype_t, T>::value) { + return e.content.info.mimetype; } + return ""; + } }; struct EventFilesize { - template<class Content> - using filesize_t = decltype(Content::info.size); - template<class T> - int64_t operator()(const mtx::events::RoomEvent<T> &e) - { - if constexpr (is_detected<filesize_t, T>::value) { - return e.content.info.size; - } - return 0; + template<class Content> + using filesize_t = decltype(Content::info.size); + template<class T> + int64_t operator()(const mtx::events::RoomEvent<T> &e) + { + if constexpr (is_detected<filesize_t, T>::value) { + return e.content.info.size; } + return 0; + } }; struct EventRelations { - template<class Content> - using related_ev_id_t = decltype(Content::relations); - template<class T> - mtx::common::Relations operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<related_ev_id_t, T>::value) { - return e.content.relations; - } - return {}; + template<class Content> + using related_ev_id_t = decltype(Content::relations); + template<class T> + mtx::common::Relations operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<related_ev_id_t, T>::value) { + return e.content.relations; } + return {}; + } }; struct SetEventRelations { - mtx::common::Relations new_relations; - template<class Content> - using related_ev_id_t = decltype(Content::relations); - template<class T> - void operator()(mtx::events::Event<T> &e) - { - if constexpr (is_detected<related_ev_id_t, T>::value) { - e.content.relations = std::move(new_relations); - } + mtx::common::Relations new_relations; + template<class Content> + using related_ev_id_t = decltype(Content::relations); + template<class T> + void operator()(mtx::events::Event<T> &e) + { + if constexpr (is_detected<related_ev_id_t, T>::value) { + e.content.relations = std::move(new_relations); } + } }; struct EventTransactionId { - template<class T> - std::string operator()(const mtx::events::RoomEvent<T> &e) - { - return e.unsigned_data.transaction_id; - } - template<class T> - std::string operator()(const mtx::events::Event<T> &e) - { - return e.unsigned_data.transaction_id; - } + template<class T> + std::string operator()(const mtx::events::RoomEvent<T> &e) + { + return e.unsigned_data.transaction_id; + } + template<class T> + std::string operator()(const mtx::events::Event<T> &e) + { + return e.unsigned_data.transaction_id; + } }; struct EventMediaHeight { - template<class Content> - using h_t = decltype(Content::info.h); - template<class T> - uint64_t operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<h_t, T>::value) { - return e.content.info.h; - } - return -1; + template<class Content> + using h_t = decltype(Content::info.h); + template<class T> + uint64_t operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<h_t, T>::value) { + return e.content.info.h; } + return -1; + } }; struct EventMediaWidth { - template<class Content> - using w_t = decltype(Content::info.w); - template<class T> - uint64_t operator()(const mtx::events::Event<T> &e) - { - if constexpr (is_detected<w_t, T>::value) { - return e.content.info.w; - } - return -1; + template<class Content> + using w_t = decltype(Content::info.w); + template<class T> + uint64_t operator()(const mtx::events::Event<T> &e) + { + if constexpr (is_detected<w_t, T>::value) { + return e.content.info.w; } + return -1; + } }; template<class T> double eventPropHeight(const mtx::events::RoomEvent<T> &e) { - auto w = eventWidth(e); - if (w == 0) - w = 1; + auto w = eventWidth(e); + if (w == 0) + w = 1; - double prop = eventHeight(e) / (double)w; + double prop = eventHeight(e) / (double)w; - return prop > 0 ? prop : 1.; + return prop > 0 ? prop : 1.; } } std::string mtx::accessors::event_id(const mtx::events::collections::TimelineEvents &event) { - return std::visit([](const auto e) { return e.event_id; }, event); + return std::visit([](const auto e) { return e.event_id; }, event); } std::string mtx::accessors::room_id(const mtx::events::collections::TimelineEvents &event) { - return std::visit([](const auto e) { return e.room_id; }, event); + return std::visit([](const auto e) { return e.room_id; }, event); } std::string mtx::accessors::sender(const mtx::events::collections::TimelineEvents &event) { - return std::visit([](const auto e) { return e.sender; }, event); + return std::visit([](const auto e) { return e.sender; }, event); } QDateTime mtx::accessors::origin_server_ts(const mtx::events::collections::TimelineEvents &event) { - return QDateTime::fromMSecsSinceEpoch( - std::visit([](const auto e) { return e.origin_server_ts; }, event)); + return QDateTime::fromMSecsSinceEpoch( + std::visit([](const auto e) { return e.origin_server_ts; }, event)); } std::string mtx::accessors::filename(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventFilename{}, event); + return std::visit(EventFilename{}, event); } mtx::events::MessageType mtx::accessors::msg_type(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventMsgType{}, event); + return std::visit(EventMsgType{}, event); } std::string mtx::accessors::room_name(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventRoomName{}, event); + return std::visit(EventRoomName{}, event); } std::string mtx::accessors::room_topic(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventRoomTopic{}, event); + return std::visit(EventRoomTopic{}, event); } std::string mtx::accessors::call_type(const mtx::events::collections::TimelineEvents &event) { - return std::visit(CallType{}, event); + return std::visit(CallType{}, event); } std::string mtx::accessors::body(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventBody{}, event); + return std::visit(EventBody{}, event); } std::string mtx::accessors::formatted_body(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventFormattedBody{}, event); + return std::visit(EventFormattedBody{}, event); } QString mtx::accessors::formattedBodyWithFallback(const mtx::events::collections::TimelineEvents &event) { - auto formatted = formatted_body(event); - if (!formatted.empty()) - return QString::fromStdString(formatted); - else - return QString::fromStdString(body(event)).toHtmlEscaped().replace("\n", "<br>"); + auto formatted = formatted_body(event); + if (!formatted.empty()) + return QString::fromStdString(formatted); + else + return QString::fromStdString(body(event)).toHtmlEscaped().replace("\n", "<br>"); } std::optional<mtx::crypto::EncryptedFile> mtx::accessors::file(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventFile{}, event); + return std::visit(EventFile{}, event); } std::string mtx::accessors::url(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventUrl{}, event); + return std::visit(EventUrl{}, event); } std::string mtx::accessors::thumbnail_url(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventThumbnailUrl{}, event); + return std::visit(EventThumbnailUrl{}, event); } std::string mtx::accessors::blurhash(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventBlurhash{}, event); + return std::visit(EventBlurhash{}, event); } std::string mtx::accessors::mimetype(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventMimeType{}, event); + return std::visit(EventMimeType{}, event); } mtx::common::Relations mtx::accessors::relations(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventRelations{}, event); + return std::visit(EventRelations{}, event); } void mtx::accessors::set_relations(mtx::events::collections::TimelineEvents &event, mtx::common::Relations relations) { - std::visit(SetEventRelations{std::move(relations)}, event); + std::visit(SetEventRelations{std::move(relations)}, event); } std::string mtx::accessors::transaction_id(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventTransactionId{}, event); + return std::visit(EventTransactionId{}, event); } int64_t mtx::accessors::filesize(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventFilesize{}, event); + return std::visit(EventFilesize{}, event); } uint64_t mtx::accessors::media_height(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventMediaHeight{}, event); + return std::visit(EventMediaHeight{}, event); } uint64_t mtx::accessors::media_width(const mtx::events::collections::TimelineEvents &event) { - return std::visit(EventMediaWidth{}, event); + return std::visit(EventMediaWidth{}, event); } nlohmann::json mtx::accessors::serialize_event(const mtx::events::collections::TimelineEvents &event) { - return std::visit([](const auto &e) { return nlohmann::json(e); }, event); + return std::visit([](const auto &e) { return nlohmann::json(e); }, event); } bool mtx::accessors::is_state_event(const mtx::events::collections::TimelineEvents &event) { - return std::visit(IsStateEvent{}, event); + return std::visit(IsStateEvent{}, event); }