Speed up compilation a bit

pull/1614/head
Nicolas Werner 1 year ago
parent 3f5c8929c3
commit 99a3e8bcf2
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
  1. 2
      CMakeLists.txt
  2. 2
      im.nheko.Nheko.yaml
  3. 1
      src/AliasEditModel.cpp
  4. 2
      src/AliasEditModel.h
  5. 4
      src/AvatarProvider.cpp
  6. 2
      src/AvatarProvider.h
  7. 2
      src/BlurhashProvider.cpp
  8. 245
      src/Cache.cpp
  9. 221
      src/Cache_p.h
  10. 14
      src/ChatPage.cpp
  11. 1
      src/CompletionProxyModel.cpp
  12. 1
      src/EventAccessors.cpp
  13. 1
      src/InviteesModel.cpp
  14. 3
      src/JdenticonProvider.cpp
  15. 2
      src/JdenticonProvider.h
  16. 1
      src/Logging.cpp
  17. 1
      src/Logging.h
  18. 1
      src/LoginPage.cpp
  19. 2
      src/MainWindow.h
  20. 2
      src/MatrixClient.cpp
  21. 2
      src/MemberList.cpp
  22. 3
      src/PowerlevelsEditModels.h
  23. 1
      src/RegisterPage.cpp
  24. 1
      src/RoomsModel.cpp
  25. 2
      src/SingleImagePackModel.cpp
  26. 1
      src/UserDirectoryModel.cpp
  27. 1
      src/UsersModel.cpp
  28. 14
      src/Utils.cpp
  29. 2
      src/Utils.h
  30. 1
      src/dbus/NhekoDBusBackend.cpp
  31. 12
      src/encryption/DeviceVerificationFlow.cpp
  32. 1
      src/encryption/DeviceVerificationFlow.h
  33. 1
      src/encryption/Olm.cpp
  34. 1
      src/encryption/Olm.h
  35. 6
      src/encryption/SelfVerificationStatus.cpp
  36. 1
      src/notifications/Manager.cpp
  37. 2
      src/timeline/EventStore.cpp
  38. 6
      src/timeline/InputBar.cpp
  39. 4
      src/timeline/TimelineModel.cpp
  40. 2
      src/ui/MxcMediaProxy.h
  41. 2
      src/ui/NhekoDropArea.cpp
  42. 1
      src/ui/RoomSettings.cpp

@ -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 "")

@ -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

@ -10,7 +10,6 @@
#include <mtx/responses/common.hpp>
#include "Cache.h"
#include "Cache_p.h"
#include "ChatPage.h"
#include "Logging.h"

@ -10,8 +10,6 @@
#include <mtx/events/canonical_alias.hpp>
#include "CacheStructs.h"
class FetchPublishedAliasesJob final : public QObject
{
Q_OBJECT

@ -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;

@ -4,7 +4,9 @@
#pragma once
#include <QObject>
#include <QPixmap>
#include <functional>
using AvatarCallback = std::function<void(QPixmap)>;

@ -4,8 +4,6 @@
#include "BlurhashProvider.h"
#include <algorithm>
#include <QUrl>
#include "blurhash.hpp"

@ -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)

@ -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>)
{
if (room_id.empty())
return {};
std::vector<mtx::events::StateEvent<T>> events;
mtx::events::EventType type = mtx::events::state_content_to_type<T>);
{
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)

@ -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());

@ -9,7 +9,6 @@
#include "CompletionModelRoles.h"
#include "Logging.h"
#include "Utils.h"
CompletionProxyModel::CompletionProxyModel(QAbstractItemModel *model,
int max_mistakes,

@ -8,7 +8,6 @@
#include <algorithm>
#include <cctype>
#include <concepts>
#include <type_traits>
namespace {

@ -4,7 +4,6 @@
#include "InviteesModel.h"
#include "Cache.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "mtx/responses/profile.hpp"

@ -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 {

@ -11,8 +11,6 @@
#include <mtx/common.hpp>
#include "jdenticoninterface.h"
class JdenticonRunnable final
: public QObject
, public QRunnable

@ -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>

@ -5,7 +5,6 @@
#pragma once
#include <memory>
#include <string>
#include <QString>

@ -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"

@ -14,8 +14,6 @@
#include "UserSettingsPage.h"
#include "dock/Dock.h"
#include "jdenticoninterface.h"
class ChatPage;
class RegisterPage;
class WelcomePage;

@ -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 {

@ -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)

@ -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

@ -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"

@ -6,7 +6,6 @@
#include <QUrl>
#include "Cache.h"
#include "Cache_p.h"
#include "CompletionModelRoles.h"
#include "UserSettingsPage.h"

@ -8,6 +8,8 @@
#include <QFileInfo>
#include <QMimeDatabase>
#include <nlohmann/json.hpp>
#include <unordered_set>
#include <mtx/responses/media.hpp>

@ -8,7 +8,6 @@
#include <mtx/responses/users.hpp>
#include "Cache.h"
#include "Logging.h"
#include "MatrixClient.h"

@ -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)

@ -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

@ -4,8 +4,6 @@
#pragma once
#include <variant>
#include <CacheStructs.h>
#include <QCoreApplication>
#include <QDateTime>

@ -6,7 +6,6 @@
#include <mutex>
#include "Cache.h"
#include "Cache_p.h"
#include "ChatPage.h"
#include "Logging.h"

@ -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

@ -11,7 +11,6 @@
#include "CacheCryptoStructs.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "Olm.h"
#include "timeline/TimelineModel.h"
class QTimer;

@ -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>();

@ -4,7 +4,6 @@
#pragma once
#include <memory>
#include <mtx/events.hpp>
#include <mtx/events/encrypted.hpp>
#include <mtxclient/crypto/client.hpp>

@ -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)
{

@ -6,7 +6,6 @@
#include "Cache.h"
#include "EventAccessors.h"
#include "Logging.h"
#include "Utils.h"
QString

@ -7,6 +7,8 @@
#include <QThread>
#include <QTimer>
#include <nlohmann/json.hpp>
#include <mtx/responses/common.hpp>
#include "Cache.h"

@ -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"

@ -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"

@ -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

@ -11,8 +11,6 @@
#include "timeline/TimelineModel.h"
#include "timeline/TimelineViewManager.h"
#include "Logging.h"
NhekoDropArea::NhekoDropArea(QQuickItem *parent)
: QQuickItem(parent)
{

@ -15,7 +15,6 @@
#include "Cache.h"
#include "Cache_p.h"
#include "Config.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "Utils.h"

Loading…
Cancel
Save