diff --git a/CMakeLists.txt b/CMakeLists.txt index c7f3a07fc25422042390840d30f0dc0741ea7607..3eb451687c8ee1e2491242b92ae37057992c73b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -595,7 +595,7 @@ if(USE_BUNDLED_MTXCLIENT) FetchContent_Declare( MatrixClient GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git - GIT_TAG f878e29420c037f45b575fbd29a11cabce3c010a + GIT_TAG 9876a75f46cc829beaa630d49dc8c5279a940b0d ) set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "") set(BUILD_LIB_TESTS OFF CACHE INTERNAL "") diff --git a/im.nheko.Nheko.yaml b/im.nheko.Nheko.yaml index 8014f055fff8268ace42a286372ca36a78b61f27..4a6107351056bf962f93155a0dccbcf90ab0e0c9 100644 --- a/im.nheko.Nheko.yaml +++ b/im.nheko.Nheko.yaml @@ -214,7 +214,7 @@ modules: buildsystem: cmake-ninja name: mtxclient sources: - - commit: 6e01c75fccc2724fcdfe7a7b1a13547522eb8753 + - commit: 9876a75f46cc829beaa630d49dc8c5279a940b0d #tag: v0.9.2 type: git url: https://github.com/Nheko-Reborn/mtxclient.git diff --git a/src/AliasEditModel.cpp b/src/AliasEditModel.cpp index c6dc35c6d4a032f66266e0f427aae6935152d323..cc6ea137444ab202f36fe8ef50c5e9083ea9c164 100644 --- a/src/AliasEditModel.cpp +++ b/src/AliasEditModel.cpp @@ -10,7 +10,6 @@ #include <mtx/responses/common.hpp> -#include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" #include "Logging.h" diff --git a/src/AliasEditModel.h b/src/AliasEditModel.h index 04de50161e25e646b426409240b70c9e2093c61e..62771c8e673c81fa088a7bff34cd9a87bdc166c8 100644 --- a/src/AliasEditModel.h +++ b/src/AliasEditModel.h @@ -10,8 +10,6 @@ #include <mtx/events/canonical_alias.hpp> -#include "CacheStructs.h" - class FetchPublishedAliasesJob final : public QObject { Q_OBJECT diff --git a/src/AvatarProvider.cpp b/src/AvatarProvider.cpp index b7dc3306b49a4a75c1b846ab490dd9c7f2cbc41a..0e4195db39bf579e156493046d641602f0f53297 100644 --- a/src/AvatarProvider.cpp +++ b/src/AvatarProvider.cpp @@ -6,14 +6,10 @@ #include <QPixmapCache> #include <QPointer> #include <memory> -#include <unordered_map> #include "AvatarProvider.h" #include "Cache.h" -#include "Logging.h" -#include "MatrixClient.h" #include "MxcImageProvider.h" -#include "Utils.h" static QPixmapCache avatar_cache; diff --git a/src/AvatarProvider.h b/src/AvatarProvider.h index 454ce95705474b09da28a9620306e69a3a379c4a..b73b1ad611bd86f737b7a582aeb6ff11ce0c0bbc 100644 --- a/src/AvatarProvider.h +++ b/src/AvatarProvider.h @@ -4,7 +4,9 @@ #pragma once +#include <QObject> #include <QPixmap> + #include <functional> using AvatarCallback = std::function<void(QPixmap)>; diff --git a/src/BlurhashProvider.cpp b/src/BlurhashProvider.cpp index 7ca491dee206e2fdb208e87cbf790c3caa30f865..d44824192afbdc971da87edd55b3edf17463ed22 100644 --- a/src/BlurhashProvider.cpp +++ b/src/BlurhashProvider.cpp @@ -4,8 +4,6 @@ #include "BlurhashProvider.h" -#include <algorithm> - #include <QUrl> #include "blurhash.hpp" diff --git a/src/Cache.cpp b/src/Cache.cpp index 25904e53e9809c37a91dac7e0cbf50d94aa3c86e..d7cd113b795eb897aeb363f9404b4cef713f8a60 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -24,6 +24,8 @@ #include <qt6keychain/keychain.h> #endif +#include <nlohmann/json.hpp> + #include <mtx/responses/common.hpp> #include <mtx/responses/messages.hpp> @@ -532,8 +534,8 @@ Cache::loadSecretsFromStore( name, toLoad, job, - name_ = name_, - internal = internal, + name__ = name_, + internal_ = internal, callback, databaseReadyOnFinished](QKeychain::Job *) mutable { nhlog::db()->debug("Finished reading '{}'", toLoad.begin()->first); @@ -549,7 +551,7 @@ Cache::loadSecretsFromStore( if (secret.isEmpty()) { nhlog::db()->debug("Restored empty secret '{}'.", name.toStdString()); } else { - callback(name_, internal, secret.toStdString()); + callback(name__, internal_, secret.toStdString()); } // load next secret @@ -2042,6 +2044,213 @@ isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallHangUp> &) // } } +template<typename T> +std::optional<mtx::events::StateEvent<T>> +Cache::getStateEvent(lmdb::txn &txn, const std::string &room_id, std::string_view state_key) +{ + try { + constexpr auto type = mtx::events::state_content_to_type<T>; + static_assert(type != mtx::events::EventType::Unsupported, + "Not a supported type in state events."); + + if (room_id.empty()) + return std::nullopt; + const auto typeStr = to_string(type); + + std::string_view value; + if (state_key.empty()) { + auto db = getStatesDb(txn, room_id); + if (!db.get(txn, typeStr, value)) { + return std::nullopt; + } + } else { + auto db = getStatesKeyDb(txn, room_id); + // we can search using state key, since the compare functions defaults to the whole + // string, when there is no nullbyte + std::string_view data = state_key; + std::string_view typeStrV = typeStr; + + auto cursor = lmdb::cursor::open(txn, db); + if (!cursor.get(typeStrV, data, MDB_GET_BOTH)) + return std::nullopt; + + try { + auto eventsDb = getEventsDb(txn, room_id); + auto eventid = data; + if (auto sep = data.rfind('\0'); sep != std::string_view::npos) { + if (!eventsDb.get(txn, eventid.substr(sep + 1), value)) + return std::nullopt; + } else { + return std::nullopt; + } + + } catch (std::exception &) { + return std::nullopt; + } + } + + return nlohmann::json::parse(value).get<mtx::events::StateEvent<T>>(); + } catch (std::exception &) { + return std::nullopt; + } +} + +template<typename T> +std::vector<mtx::events::StateEvent<T>> +Cache::getStateEventsWithType(lmdb::txn &txn, + const std::string &room_id, + mtx::events::EventType type) + +{ + if (room_id.empty()) + return {}; + + std::vector<mtx::events::StateEvent<T>> events; + + { + auto db = getStatesKeyDb(txn, room_id); + auto eventsDb = getEventsDb(txn, room_id); + const auto typeStr = to_string(type); + std::string_view typeStrV = typeStr; + std::string_view data; + std::string_view value; + + auto cursor = lmdb::cursor::open(txn, db); + bool first = true; + if (cursor.get(typeStrV, data, MDB_SET)) { + while (cursor.get(typeStrV, data, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) { + first = false; + + try { + auto eventid = data; + if (auto sep = data.rfind('\0'); sep != std::string_view::npos) { + if (eventsDb.get(txn, eventid.substr(sep + 1), value)) + events.push_back( + nlohmann::json::parse(value).get<mtx::events::StateEvent<T>>()); + } + } catch (std::exception &e) { + nhlog::db()->warn("Failed to parse state event: {}", e.what()); + } + } + } + } + + return events; +} + +template<class T> +void +Cache::saveStateEvents(lmdb::txn &txn, + lmdb::dbi &statesdb, + lmdb::dbi &stateskeydb, + lmdb::dbi &membersdb, + lmdb::dbi &eventsDb, + const std::string &room_id, + const std::vector<T> &events) +{ + for (const auto &e : events) + saveStateEvent(txn, statesdb, stateskeydb, membersdb, eventsDb, room_id, e); +} + +template<class T> +void +Cache::saveStateEvent(lmdb::txn &txn, + lmdb::dbi &statesdb, + lmdb::dbi &stateskeydb, + lmdb::dbi &membersdb, + lmdb::dbi &eventsDb, + const std::string &room_id, + const T &event) +{ + using namespace mtx::events; + using namespace mtx::events::state; + + if (auto e = std::get_if<StateEvent<Member>>(&event); e != nullptr) { + switch (e->content.membership) { + // + // We only keep users with invite or join membership. + // + case Membership::Invite: + case Membership::Join: { + auto display_name = + e->content.display_name.empty() ? e->state_key : e->content.display_name; + + std::string inviter = ""; + if (e->content.membership == mtx::events::state::Membership::Invite) { + inviter = e->sender; + } + + // Lightweight representation of a member. + MemberInfo tmp{ + display_name, + e->content.avatar_url, + inviter, + e->content.reason, + e->content.is_direct, + }; + + membersdb.put(txn, e->state_key, nlohmann::json(tmp).dump()); + break; + } + default: { + membersdb.del(txn, e->state_key, ""); + break; + } + } + } else if (auto encr = std::get_if<StateEvent<Encryption>>(&event)) { + if (!encr->state_key.empty()) + return; + + setEncryptedRoom(txn, room_id); + + std::string_view temp; + // ensure we don't replace the event in the db + if (statesdb.get(txn, to_string(encr->type), temp)) { + return; + } + } + + std::visit( + [&txn, &statesdb, &stateskeydb, &eventsDb, &membersdb](const auto &e) { + if constexpr (isStateEvent_<decltype(e)>) { + eventsDb.put(txn, e.event_id, nlohmann::json(e).dump()); + + if (e.type != EventType::Unsupported) { + if (std::is_same_v<std::remove_cv_t<std::remove_reference_t<decltype(e)>>, + StateEvent<mtx::events::msg::Redacted>>) { + // apply the redaction event + if (e.type == EventType::RoomMember) { + // membership is not revoked, but names are yeeted (so we set the name + // to the mxid) + MemberInfo tmp{e.state_key, ""}; + membersdb.put(txn, e.state_key, nlohmann::json(tmp).dump()); + } else if (e.state_key.empty()) { + // strictly speaking some stuff in those events can be redacted, but + // this is close enough. Ref: + // https://spec.matrix.org/v1.6/rooms/v10/#redactions + if (e.type != EventType::RoomCreate && + e.type != EventType::RoomJoinRules && + e.type != EventType::RoomPowerLevels && + e.type != EventType::RoomHistoryVisibility) + statesdb.del(txn, to_string(e.type)); + } else + stateskeydb.del(txn, to_string(e.type), e.state_key + '\0' + e.event_id); + } else if (e.state_key.empty()) { + statesdb.put(txn, to_string(e.type), nlohmann::json(e).dump()); + } else { + auto data = e.state_key + '\0' + e.event_id; + auto key = to_string(e.type); + + // Work around https://bugs.openldap.org/show_bug.cgi?id=8447 + stateskeydb.del(txn, key, data); + stateskeydb.put(txn, key, data); + } + } + } + }, + event); +} + void Cache::saveState(const mtx::responses::Sync &res) { @@ -6004,3 +6213,33 @@ secret(const std::string &name) return instance_->secret(name); } } // namespace cache + +#define NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(Content) \ + template std::optional<mtx::events::StateEvent<Content>> Cache::getStateEvent( \ + lmdb::txn &txn, const std::string &room_id, std::string_view state_key); \ + \ + template std::vector<mtx::events::StateEvent<Content>> Cache::getStateEventsWithType( \ + lmdb::txn &txn, const std::string &room_id, mtx::events::EventType type); + +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Aliases) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Avatar) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::CanonicalAlias) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Create) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Encryption) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::GuestAccess) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::HistoryVisibility) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::JoinRules) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Member) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Name) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::PinnedEvents) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::PowerLevels) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Tombstone) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::ServerAcl) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Topic) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::Widget) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::policy_rule::UserRule) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::policy_rule::RoomRule) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::policy_rule::ServerRule) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::space::Child) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::state::space::Parent) +NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(mtx::events::msc2545::ImagePack) diff --git a/src/Cache_p.h b/src/Cache_p.h index e59796ed54793afc44424abe9850ecdb13b41799..d1316ae5e6038acd17595a625e8a6546dc88857a 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -4,7 +4,6 @@ #pragma once -#include <limits> #include <optional> #include <QDateTime> @@ -15,8 +14,8 @@ #else #include <lmdb++.h> #endif -#include <nlohmann/json.hpp> +#include <mtx/events/collections.hpp> #include <mtx/responses/notifications.hpp> #include <mtx/responses/sync.hpp> #include <mtxclient/crypto/types.hpp> @@ -24,7 +23,6 @@ #include "CacheCryptoStructs.h" #include "CacheStructs.h" -#include "Logging.h" namespace mtx::responses { struct Messages; @@ -364,8 +362,6 @@ private: mtx::events::collections::TimelineEvents e, const std::string &room_id); - //! Remove a room from the cache. - // void removeLeftRoom(lmdb::txn &txn, const std::string &room_id); template<class T> void saveStateEvents(lmdb::txn &txn, lmdb::dbi &statesdb, @@ -373,11 +369,7 @@ private: lmdb::dbi &membersdb, lmdb::dbi &eventsDb, const std::string &room_id, - const std::vector<T> &events) - { - for (const auto &e : events) - saveStateEvent(txn, statesdb, stateskeydb, membersdb, eventsDb, room_id, e); - } + const std::vector<T> &events); template<class T> void saveStateEvent(lmdb::txn &txn, @@ -386,191 +378,18 @@ private: lmdb::dbi &membersdb, lmdb::dbi &eventsDb, const std::string &room_id, - const T &event) - { - using namespace mtx::events; - using namespace mtx::events::state; - - if (auto e = std::get_if<StateEvent<Member>>(&event); e != nullptr) { - switch (e->content.membership) { - // - // We only keep users with invite or join membership. - // - case Membership::Invite: - case Membership::Join: { - auto display_name = - e->content.display_name.empty() ? e->state_key : e->content.display_name; - - std::string inviter = ""; - if (e->content.membership == mtx::events::state::Membership::Invite) { - inviter = e->sender; - } - - // Lightweight representation of a member. - MemberInfo tmp{ - display_name, - e->content.avatar_url, - inviter, - e->content.reason, - e->content.is_direct, - }; - - membersdb.put(txn, e->state_key, nlohmann::json(tmp).dump()); - break; - } - default: { - membersdb.del(txn, e->state_key, ""); - break; - } - } - } else if (auto encr = std::get_if<StateEvent<Encryption>>(&event)) { - if (!encr->state_key.empty()) - return; - - setEncryptedRoom(txn, room_id); - - std::string_view temp; - // ensure we don't replace the event in the db - if (statesdb.get(txn, to_string(encr->type), temp)) { - return; - } - } - - std::visit( - [&txn, &statesdb, &stateskeydb, &eventsDb, &membersdb](const auto &e) { - if constexpr (isStateEvent_<decltype(e)>) { - eventsDb.put(txn, e.event_id, nlohmann::json(e).dump()); - - if (e.type != EventType::Unsupported) { - if (std::is_same_v<std::remove_cv_t<std::remove_reference_t<decltype(e)>>, - StateEvent<mtx::events::msg::Redacted>>) { - // apply the redaction event - if (e.type == EventType::RoomMember) { - // membership is not revoked, but names are yeeted (so we set the name - // to the mxid) - MemberInfo tmp{e.state_key, ""}; - membersdb.put(txn, e.state_key, nlohmann::json(tmp).dump()); - } else if (e.state_key.empty()) { - // strictly speaking some stuff in those events can be redacted, but - // this is close enough. Ref: - // https://spec.matrix.org/v1.6/rooms/v10/#redactions - if (e.type != EventType::RoomCreate && - e.type != EventType::RoomJoinRules && - e.type != EventType::RoomPowerLevels && - e.type != EventType::RoomHistoryVisibility) - statesdb.del(txn, to_string(e.type)); - } else - stateskeydb.del( - txn, to_string(e.type), e.state_key + '\0' + e.event_id); - } else if (e.state_key.empty()) { - statesdb.put(txn, to_string(e.type), nlohmann::json(e).dump()); - } else { - auto data = e.state_key + '\0' + e.event_id; - auto key = to_string(e.type); - - // Work around https://bugs.openldap.org/show_bug.cgi?id=8447 - stateskeydb.del(txn, key, data); - stateskeydb.put(txn, key, data); - } - } - } - }, - event); - } + const T &event); template<typename T> std::optional<mtx::events::StateEvent<T>> - getStateEvent(lmdb::txn &txn, const std::string &room_id, std::string_view state_key = "") - { - try { - constexpr auto type = mtx::events::state_content_to_type<T>; - static_assert(type != mtx::events::EventType::Unsupported, - "Not a supported type in state events."); - - if (room_id.empty()) - return std::nullopt; - const auto typeStr = to_string(type); - - std::string_view value; - if (state_key.empty()) { - auto db = getStatesDb(txn, room_id); - if (!db.get(txn, typeStr, value)) { - return std::nullopt; - } - } else { - auto db = getStatesKeyDb(txn, room_id); - // we can search using state key, since the compare functions defaults to the whole - // string, when there is no nullbyte - std::string_view data = state_key; - std::string_view typeStrV = typeStr; - - auto cursor = lmdb::cursor::open(txn, db); - if (!cursor.get(typeStrV, data, MDB_GET_BOTH)) - return std::nullopt; - - try { - auto eventsDb = getEventsDb(txn, room_id); - auto eventid = data; - if (auto sep = data.rfind('\0'); sep != std::string_view::npos) { - if (!eventsDb.get(txn, eventid.substr(sep + 1), value)) - return std::nullopt; - } else { - return std::nullopt; - } - - } catch (std::exception &) { - return std::nullopt; - } - } - - return nlohmann::json::parse(value).get<mtx::events::StateEvent<T>>(); - } catch (std::exception &) { - return std::nullopt; - } - } + getStateEvent(lmdb::txn &txn, const std::string &room_id, std::string_view state_key = ""); template<typename T> std::vector<mtx::events::StateEvent<T>> getStateEventsWithType(lmdb::txn &txn, const std::string &room_id, - mtx::events::EventType type = mtx::events::state_content_to_type<T>) + mtx::events::EventType type = mtx::events::state_content_to_type<T>); - { - if (room_id.empty()) - return {}; - - std::vector<mtx::events::StateEvent<T>> events; - - { - auto db = getStatesKeyDb(txn, room_id); - auto eventsDb = getEventsDb(txn, room_id); - const auto typeStr = to_string(type); - std::string_view typeStrV = typeStr; - std::string_view data; - std::string_view value; - - auto cursor = lmdb::cursor::open(txn, db); - bool first = true; - if (cursor.get(typeStrV, data, MDB_SET)) { - while (cursor.get(typeStrV, data, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) { - first = false; - - try { - auto eventid = data; - if (auto sep = data.rfind('\0'); sep != std::string_view::npos) { - if (eventsDb.get(txn, eventid.substr(sep + 1), value)) - events.push_back( - nlohmann::json::parse(value).get<mtx::events::StateEvent<T>>()); - } - } catch (std::exception &e) { - nhlog::db()->warn("Failed to parse state event: {}", e.what()); - } - } - } - } - - return events; - } void saveInvites(lmdb::txn &txn, const std::map<std::string, mtx::responses::InvitedRoom> &rooms); @@ -723,3 +542,33 @@ namespace cache { Cache * client(); } + +#define NHEKO_CACHE_GET_STATE_EVENT_FORWARD(Content) \ + extern template std::optional<mtx::events::StateEvent<Content>> Cache::getStateEvent( \ + lmdb::txn &txn, const std::string &room_id, std::string_view state_key); \ + \ + extern template std::vector<mtx::events::StateEvent<Content>> Cache::getStateEventsWithType( \ + lmdb::txn &txn, const std::string &room_id, mtx::events::EventType type); + +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Aliases) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Avatar) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::CanonicalAlias) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Create) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Encryption) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::GuestAccess) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::HistoryVisibility) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::JoinRules) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Member) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Name) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::PinnedEvents) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::PowerLevels) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Tombstone) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::ServerAcl) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Topic) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::Widget) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::policy_rule::UserRule) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::policy_rule::RoomRule) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::policy_rule::ServerRule) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::space::Child) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::state::space::Parent) +NHEKO_CACHE_GET_STATE_EVENT_FORWARD(mtx::events::msc2545::ImagePack) diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp index db5cbbe8fa99fd37f6964d7269463f50faa81d29..03144faf2e99d0dd5f9532b7eec7b368bb7c5d78 100644 --- a/src/ChatPage.cpp +++ b/src/ChatPage.cpp @@ -9,6 +9,8 @@ #include <algorithm> #include <unordered_set> +#include <nlohmann/json.hpp> + #include <mtx/responses.hpp> #include "AvatarProvider.h" @@ -282,8 +284,8 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent) continue; mtx::events::collections::TimelineEvents te{event}; - std::visit([room_id = room_id](auto &event_) { event_.room_id = room_id; }, - te); + std::visit( + [room_id_ = room_id](auto &event_) { event_.room_id = room_id_; }, te); if (auto encryptedEvent = std::get_if<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>( @@ -342,14 +344,14 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent) roomModel->roomAvatarUrl(), 96, this, - [this, te = te, room_id = room_id, actions = actions](QPixmap image) { + [this, te_ = te, room_id_ = room_id, actions_ = actions](QPixmap image) { notificationsManager->postNotification( mtx::responses::Notification{ - .actions = actions, - .event = std::move(te), + .actions = actions_, + .event = std::move(te_), .read = false, .profile_tag = "", - .room_id = room_id, + .room_id = room_id_, .ts = 0, }, image.toImage()); diff --git a/src/CompletionProxyModel.cpp b/src/CompletionProxyModel.cpp index eea1e6aabe9057e601fefedf7a66c0117e930045..bce873e7974152b5790603bc29d515bdc731de3c 100644 --- a/src/CompletionProxyModel.cpp +++ b/src/CompletionProxyModel.cpp @@ -9,7 +9,6 @@ #include "CompletionModelRoles.h" #include "Logging.h" -#include "Utils.h" CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model, int max_mistakes, diff --git a/src/EventAccessors.cpp b/src/EventAccessors.cpp index 62969ed1a9ef4ea5daed01f0e6bcc94354069c11..a8ba9e22720d80afba0f8a0d2f31ce5f17ee9c29 100644 --- a/src/EventAccessors.cpp +++ b/src/EventAccessors.cpp @@ -8,7 +8,6 @@ #include <algorithm> #include <cctype> -#include <concepts> #include <type_traits> namespace { diff --git a/src/InviteesModel.cpp b/src/InviteesModel.cpp index 76f37fada37d95ffeb0c4ee2968643b3f96d7267..ecb9e66cf53bb40ca79c392546b1a94134a86d69 100644 --- a/src/InviteesModel.cpp +++ b/src/InviteesModel.cpp @@ -4,7 +4,6 @@ #include "InviteesModel.h" -#include "Cache.h" #include "Logging.h" #include "MatrixClient.h" #include "mtx/responses/profile.hpp" diff --git a/src/JdenticonProvider.cpp b/src/JdenticonProvider.cpp index ef0830746554c6131cbe850b7c2705d3759535d0..f34275c9afa3f485f5395460911b776c9eac3ef3 100644 --- a/src/JdenticonProvider.cpp +++ b/src/JdenticonProvider.cpp @@ -12,10 +12,7 @@ #include <mtxclient/crypto/client.hpp> -#include "Cache.h" #include "Logging.h" -#include "MatrixClient.h" -#include "Utils.h" #include "jdenticoninterface.h" namespace Jdenticon { diff --git a/src/JdenticonProvider.h b/src/JdenticonProvider.h index da4d73e1e658925a00e1a30f5ca40d92d31c433a..1c2c06653211a137377532e21f9e8c24a08d7462 100644 --- a/src/JdenticonProvider.h +++ b/src/JdenticonProvider.h @@ -11,8 +11,6 @@ #include <mtx/common.hpp> -#include "jdenticoninterface.h" - class JdenticonRunnable final : public QObject , public QRunnable diff --git a/src/Logging.cpp b/src/Logging.cpp index e7a99458e3d6cb9d610db73f3d7bf08285be1db5..35fea1d4f66de52e5f563620c20bc4d7f120f339 100644 --- a/src/Logging.cpp +++ b/src/Logging.cpp @@ -9,7 +9,6 @@ #include "spdlog/sinks/rotating_file_sink.h" #include "spdlog/sinks/stdout_color_sinks.h" #include "spdlog/spdlog.h" -#include <iostream> #include <QString> #include <QtGlobal> diff --git a/src/Logging.h b/src/Logging.h index 9b9926602235afea1b8df82766dd646e2c1fe181..56f4de8f910bb36ece42b68c5636de6e1045e7c1 100644 --- a/src/Logging.h +++ b/src/Logging.h @@ -5,7 +5,6 @@ #pragma once #include <memory> -#include <string> #include <QString> diff --git a/src/LoginPage.cpp b/src/LoginPage.cpp index afc660a801d4ec331553f2eea1251840ce503c13..c4e9319c8ca3e2f5fdb357cbee545dd5210df279 100644 --- a/src/LoginPage.cpp +++ b/src/LoginPage.cpp @@ -11,7 +11,6 @@ #include <mtx/responses/login.hpp> #include <mtx/responses/version.hpp> -#include "Config.h" #include "Logging.h" #include "LoginPage.h" #include "MainWindow.h" diff --git a/src/MainWindow.h b/src/MainWindow.h index fc06e183ffc716d0333520ac041072f3edf57ef5..c493b5b2523f77c98545f2464dbc3b20a9661637 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -14,8 +14,6 @@ #include "UserSettingsPage.h" #include "dock/Dock.h" -#include "jdenticoninterface.h" - class ChatPage; class RegisterPage; class WelcomePage; diff --git a/src/MatrixClient.cpp b/src/MatrixClient.cpp index 2fd2eac96771100a58abbc07de3c2f3b579da1c9..05ec6a92b72872dae4440fd617256dd6e9029f53 100644 --- a/src/MatrixClient.cpp +++ b/src/MatrixClient.cpp @@ -5,14 +5,12 @@ #include "MatrixClient.h" #include <memory> -#include <set> #include <QMetaType> #include <QObject> #include <QStandardPaths> #include <QString> -#include "nlohmann/json.hpp" #include <mtx/responses.hpp> namespace http { diff --git a/src/MemberList.cpp b/src/MemberList.cpp index 036ef9d41c9da9a549ba9de2745ebc6d439dc34d..a5e6565ea381527b3501eff6249160cc19fcc92c 100644 --- a/src/MemberList.cpp +++ b/src/MemberList.cpp @@ -7,9 +7,7 @@ #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" -#include "Config.h" #include "Logging.h" -#include "Utils.h" #include "timeline/TimelineViewManager.h" MemberListBackend::MemberListBackend(const QString &room_id, QObject *parent) diff --git a/src/PowerlevelsEditModels.h b/src/PowerlevelsEditModels.h index c9d262d8a617196c5bc2814fa6f3267782892cd2..6e17079cd66d83b4e762bc8165b3efdca0a3053c 100644 --- a/src/PowerlevelsEditModels.h +++ b/src/PowerlevelsEditModels.h @@ -8,10 +8,9 @@ #include <QQmlEngine> #include <QSortFilterProxyModel> +#include <mtx/events/event_type.hpp> #include <mtx/events/power_levels.hpp> -#include "CacheStructs.h" - class PowerlevelsTypeListModel final : public QAbstractListModel { Q_OBJECT diff --git a/src/RegisterPage.cpp b/src/RegisterPage.cpp index 3b1ba6588e087e3283e04c7083ab5c794fd157a7..2c0a5b07cae25829af4045f15b4b17205b4745d9 100644 --- a/src/RegisterPage.cpp +++ b/src/RegisterPage.cpp @@ -10,7 +10,6 @@ #include <mtx/responses/well-known.hpp> #include <mtxclient/http/client.hpp> -#include "Config.h" #include "Logging.h" #include "LoginPage.h" #include "MainWindow.h" diff --git a/src/RoomsModel.cpp b/src/RoomsModel.cpp index 32dce4f624855061461f3c34b90f774c26452855..7481eb514bef26209b99eb06277e139bf6a0911a 100644 --- a/src/RoomsModel.cpp +++ b/src/RoomsModel.cpp @@ -6,7 +6,6 @@ #include <QUrl> -#include "Cache.h" #include "Cache_p.h" #include "CompletionModelRoles.h" #include "UserSettingsPage.h" diff --git a/src/SingleImagePackModel.cpp b/src/SingleImagePackModel.cpp index 686184dac5591f7b818e308fe3bcfe5841e3ffa4..1adfdaa23f271b2d1c645c42a9974dcf60b2deeb 100644 --- a/src/SingleImagePackModel.cpp +++ b/src/SingleImagePackModel.cpp @@ -8,6 +8,8 @@ #include <QFileInfo> #include <QMimeDatabase> +#include <nlohmann/json.hpp> + #include <unordered_set> #include <mtx/responses/media.hpp> diff --git a/src/UserDirectoryModel.cpp b/src/UserDirectoryModel.cpp index ae8e19b1636f1681961900fd9db35a3503fcbf54..72a5a13e17aea2c6bea8b2fc9c22c6d71f89dd9d 100644 --- a/src/UserDirectoryModel.cpp +++ b/src/UserDirectoryModel.cpp @@ -8,7 +8,6 @@ #include <mtx/responses/users.hpp> -#include "Cache.h" #include "Logging.h" #include "MatrixClient.h" diff --git a/src/UsersModel.cpp b/src/UsersModel.cpp index 453ef137f4dfbf5fb8577b7daf7d46ec7cc28ca8..a017aa84184c5fb297fa7d337411b90e27b3d503 100644 --- a/src/UsersModel.cpp +++ b/src/UsersModel.cpp @@ -9,6 +9,7 @@ #include "Cache.h" #include "Cache_p.h" #include "CompletionModelRoles.h" +#include "Logging.h" #include "UserSettingsPage.h" UsersModel::UsersModel(const std::string &roomId, QObject *parent) diff --git a/src/Utils.cpp b/src/Utils.cpp index bb4df7d3ecd65cfa7b47e87f6f7eca0994f48c4f..7a4871014232da5faf5dadafb0912fe8563b8961 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -4,6 +4,11 @@ #include "Utils.h" +#include <array> +#include <cmath> +#include <unordered_set> +#include <variant> + #include <QApplication> #include <QBuffer> #include <QComboBox> @@ -20,14 +25,12 @@ #include <QWindow> #include <QXmlStreamReader> -#include <array> -#include <cmath> -#include <mtx/responses/messages.hpp> -#include <unordered_set> -#include <variant> +#include <nlohmann/json.hpp> #include <cmark.h> +#include <mtx/responses/messages.hpp> + #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" @@ -36,7 +39,6 @@ #include "Logging.h" #include "MatrixClient.h" #include "UserSettingsPage.h" -#include "timeline/Permissions.h" template<class T, class Event> static DescInfo diff --git a/src/Utils.h b/src/Utils.h index 83f2cad16093318b35b0e92464e3d537efae7e84..2c75cb5c0340753f3e00a0929b2ea9f15b121c1a 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -4,8 +4,6 @@ #pragma once -#include <variant> - #include <CacheStructs.h> #include <QCoreApplication> #include <QDateTime> diff --git a/src/dbus/NhekoDBusBackend.cpp b/src/dbus/NhekoDBusBackend.cpp index 9690cdfa5f1d8cf04340276b22e5cd4e3cb7ac4d..5e0f8418b639407065587f98e7ce16eff081cb0a 100644 --- a/src/dbus/NhekoDBusBackend.cpp +++ b/src/dbus/NhekoDBusBackend.cpp @@ -6,7 +6,6 @@ #include <mutex> -#include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" #include "Logging.h" diff --git a/src/encryption/DeviceVerificationFlow.cpp b/src/encryption/DeviceVerificationFlow.cpp index 1e7ed7bcc7683ede74b127065f720095f939f6c7..f0c7ed52c34c6bedc3af00bd6cc630c75717a632 100644 --- a/src/encryption/DeviceVerificationFlow.cpp +++ b/src/encryption/DeviceVerificationFlow.cpp @@ -4,6 +4,13 @@ #include "DeviceVerificationFlow.h" +#include <tuple> + +#include <QDateTime> +#include <QTimer> + +#include <nlohmann/json.hpp> + #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" @@ -11,11 +18,6 @@ #include "Utils.h" #include "timeline/TimelineModel.h" -#include <QDateTime> -#include <QTimer> -#include <iostream> -#include <tuple> - static constexpr int TIMEOUT = 2 * 60 * 1000; // 2 minutes static mtx::events::msg::KeyVerificationMac diff --git a/src/encryption/DeviceVerificationFlow.h b/src/encryption/DeviceVerificationFlow.h index 50818883d34b347c71aba1e4552d7eca62d81533..6b1776e0bee65679e4968f0f9e844854477ac6df 100644 --- a/src/encryption/DeviceVerificationFlow.h +++ b/src/encryption/DeviceVerificationFlow.h @@ -11,7 +11,6 @@ #include "CacheCryptoStructs.h" #include "Logging.h" #include "MatrixClient.h" -#include "Olm.h" #include "timeline/TimelineModel.h" class QTimer; diff --git a/src/encryption/Olm.cpp b/src/encryption/Olm.cpp index 7fa176b02c9e1af130b97531c3dc26ec2a0e4cc9..aaa7e43f91b256350dedbd52f42c8ada8c160a2f 100644 --- a/src/encryption/Olm.cpp +++ b/src/encryption/Olm.cpp @@ -22,7 +22,6 @@ #include "Logging.h" #include "MatrixClient.h" #include "UserSettingsPage.h" -#include "Utils.h" namespace { auto client_ = std::make_unique<mtx::crypto::OlmClient>(); diff --git a/src/encryption/Olm.h b/src/encryption/Olm.h index 726b9590f09133901fe01bbf02e91afb63442aaa..252d08b4da10f9a5b4977a1b6ed6042bb82e6ffc 100644 --- a/src/encryption/Olm.h +++ b/src/encryption/Olm.h @@ -4,7 +4,6 @@ #pragma once -#include <memory> #include <mtx/events.hpp> #include <mtx/events/encrypted.hpp> #include <mtxclient/crypto/client.hpp> diff --git a/src/encryption/SelfVerificationStatus.cpp b/src/encryption/SelfVerificationStatus.cpp index e54cbc2dde05a19406440a39556e1737053fcc41..8981244d44135db8858e5c0eba543b597840a478 100644 --- a/src/encryption/SelfVerificationStatus.cpp +++ b/src/encryption/SelfVerificationStatus.cpp @@ -6,6 +6,10 @@ #include <QApplication> +#include <nlohmann/json.hpp> + +#include <mtx/responses/common.hpp> + #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" @@ -16,8 +20,6 @@ #include "timeline/TimelineViewManager.h" #include "ui/UIA.h" -#include <mtx/responses/common.hpp> - SelfVerificationStatus::SelfVerificationStatus(QObject *o) : QObject(o) { diff --git a/src/notifications/Manager.cpp b/src/notifications/Manager.cpp index ed5c0670934055f2c068c9821d8c229d12463f88..5790d43e47dcc841dabea92cae31bd994e88b6ed 100644 --- a/src/notifications/Manager.cpp +++ b/src/notifications/Manager.cpp @@ -6,7 +6,6 @@ #include "Cache.h" #include "EventAccessors.h" -#include "Logging.h" #include "Utils.h" QString diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp index c47a3426824decdddef82ab36758def43164248a..04e548f0465c667d2ebda636f4c6c186f7947447 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp @@ -7,6 +7,8 @@ #include <QThread> #include <QTimer> +#include <nlohmann/json.hpp> + #include <mtx/responses/common.hpp> #include "Cache.h" diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index fcec8e9c367c3fb8577ea530313c25252933211d..bcb30aa0ce0aa5b5bcfef9133977e53e1ac1f0ed 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -14,20 +14,20 @@ #include <QMediaPlayer> #include <QMimeData> #include <QMimeDatabase> +#include <QRegularExpression> #include <QStandardPaths> #include <QTextBoundaryFinder> #include <QVideoFrame> #include <QVideoSink> -#include <QRegularExpression> +#include <nlohmann/json.hpp> + #include <mtx/responses/common.hpp> #include <mtx/responses/media.hpp> #include "Cache.h" #include "Cache_p.h" #include "ChatPage.h" -#include "CombinedImagePackModel.h" -#include "Config.h" #include "EventAccessors.h" #include "Logging.h" #include "MatrixClient.h" diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index aefdc860dd7e0a32f93b18953a242b1455fd8911..490641a691bb6dc45b36482051fcb47c6c0035e2 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -7,6 +7,7 @@ #include <algorithm> #include <thread> #include <type_traits> +#include <utility> #include <QClipboard> #include <QDesktopServices> @@ -17,7 +18,8 @@ #include <QRegularExpression> #include <QStandardPaths> #include <QVariant> -#include <utility> + +#include <nlohmann/json.hpp> #include "Cache.h" #include "Cache_p.h" diff --git a/src/ui/MxcMediaProxy.h b/src/ui/MxcMediaProxy.h index d245dcae3025b256c76336d24deb19267d6f8f42..64c61c4f9f73a0af18366fa98d1093540f3d5283 100644 --- a/src/ui/MxcMediaProxy.h +++ b/src/ui/MxcMediaProxy.h @@ -13,8 +13,6 @@ #include <QUrl> #include <QVideoSink> -#include "Logging.h" - class TimelineModel; // I failed to get my own buffer into the MediaPlayer in qml, so just make our own. For that we just diff --git a/src/ui/NhekoDropArea.cpp b/src/ui/NhekoDropArea.cpp index 348ef5d8ac18d8feffbb868cbef5d2b7cacea28e..571ccf696b5e68c8e6455370613477f37872204d 100644 --- a/src/ui/NhekoDropArea.cpp +++ b/src/ui/NhekoDropArea.cpp @@ -11,8 +11,6 @@ #include "timeline/TimelineModel.h" #include "timeline/TimelineViewManager.h" -#include "Logging.h" - NhekoDropArea::NhekoDropArea(QQuickItem *parent) : QQuickItem(parent) { diff --git a/src/ui/RoomSettings.cpp b/src/ui/RoomSettings.cpp index 5f4184b38bb7049c7c24b150e62d16c20f40d672..073b27d037342ddb5c82c5fc64a62502d189d059 100644 --- a/src/ui/RoomSettings.cpp +++ b/src/ui/RoomSettings.cpp @@ -15,7 +15,6 @@ #include "Cache.h" #include "Cache_p.h" -#include "Config.h" #include "Logging.h" #include "MatrixClient.h" #include "Utils.h"