summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--io.github.NhekoReborn.Nheko.json2
-rw-r--r--src/Cache.cpp77
-rw-r--r--src/timeline/TimelineViewManager.cpp19
4 files changed, 66 insertions, 34 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ead1c32b..6ba411ca 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -356,7 +356,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
- GIT_TAG ce8bc9c3dd6bba432e716f55136133111b0186e7
+ GIT_TAG cad81d1677a4845366b93112f8f2e267ee8c9ae0
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index 352ca648..49e92311 100644
--- a/io.github.NhekoReborn.Nheko.json
+++ b/io.github.NhekoReborn.Nheko.json
@@ -162,7 +162,7 @@
"name": "mtxclient",
"sources": [
{
- "commit": "ce8bc9c3dd6bba432e716f55136133111b0186e7",
+ "commit": "cad81d1677a4845366b93112f8f2e267ee8c9ae0",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}
diff --git a/src/Cache.cpp b/src/Cache.cpp
index dac0b23a..04046346 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -124,17 +124,15 @@ Cache::isHiddenEvent(lmdb::txn &txn,
EventType::Reaction, EventType::CallCandidates, EventType::Unsupported};
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, ""))
- hiddenEvents = std::move(
- std::get<
- mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
- *temp)
- .content);
+ hiddenEvents =
+ std::move(std::get<mtx::events::AccountDataEvent<
+ mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp)
+ .content);
if (auto temp = getAccountData(txn, mtx::events::EventType::NhekoHiddenEvents, room_id))
- hiddenEvents = std::move(
- std::get<
- mtx::events::Event<mtx::events::account_data::nheko_extensions::HiddenEvents>>(
- *temp)
- .content);
+ hiddenEvents =
+ std::move(std::get<mtx::events::AccountDataEvent<
+ mtx::events::account_data::nheko_extensions::HiddenEvents>>(*temp)
+ .content);
return std::visit(
[hiddenEvents](const auto &ev) {
@@ -1197,7 +1195,7 @@ void
Cache::saveState(const mtx::responses::Sync &res)
{
using namespace mtx::events;
- auto user_id = this->localUserId_.toStdString();
+ auto local_user_id = this->localUserId_.toStdString();
auto currentBatchToken = nextBatchToken();
@@ -1252,13 +1250,19 @@ Cache::saveState(const mtx::responses::Sync &res)
evt);
// for tag events
- if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
- auto tags_evt = std::get<Event<account_data::Tags>>(evt);
- has_new_tags = true;
+ if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(
+ evt)) {
+ auto tags_evt =
+ std::get<AccountDataEvent<account_data::Tags>>(evt);
+ has_new_tags = true;
for (const auto &tag : tags_evt.content.tags) {
updatedInfo.tags.push_back(tag.first);
}
}
+ if (auto fr = std::get_if<mtx::events::AccountDataEvent<
+ mtx::events::account_data::FullyRead>>(&evt)) {
+ nhlog::db()->debug("Fully read: {}", fr->content.event_id);
+ }
}
if (!has_new_tags) {
// retrieve the old tags, they haven't changed
@@ -1282,7 +1286,20 @@ Cache::saveState(const mtx::responses::Sync &res)
lmdb::dbi_put(
txn, roomsDb_, lmdb::val(room.first), lmdb::val(json(updatedInfo).dump()));
- updateReadReceipt(txn, room.first, room.second.ephemeral.receipts);
+ for (const auto &e : room.second.ephemeral.events) {
+ if (auto receiptsEv = std::get_if<
+ mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) {
+ Receipts receipts;
+
+ for (const auto &[event_id, userReceipts] :
+ receiptsEv->content.receipts) {
+ for (const auto &[user_id, receipt] : userReceipts.users) {
+ receipts[event_id][user_id] = receipt.ts;
+ }
+ }
+ updateReadReceipt(txn, room.first, receipts);
+ }
+ }
// Clean up non-valid invites.
removeInvite(txn, room.first);
@@ -1302,19 +1319,27 @@ Cache::saveState(const mtx::responses::Sync &res)
std::map<QString, bool> readStatus;
for (const auto &room : res.rooms.join) {
- if (!room.second.ephemeral.receipts.empty()) {
- std::vector<QString> receipts;
- for (const auto &receipt : room.second.ephemeral.receipts) {
- for (const auto &receiptUsersTs : receipt.second) {
- if (receiptUsersTs.first != user_id) {
- receipts.push_back(
- QString::fromStdString(receipt.first));
- break;
+ for (const auto &e : room.second.ephemeral.events) {
+ if (auto receiptsEv = std::get_if<
+ mtx::events::EphemeralEvent<mtx::events::ephemeral::Receipt>>(&e)) {
+ std::vector<QString> receipts;
+
+ for (const auto &[event_id, userReceipts] :
+ receiptsEv->content.receipts) {
+ for (const auto &[user_id, receipt] : userReceipts.users) {
+ (void)receipt;
+
+ if (user_id != local_user_id) {
+ receipts.push_back(
+ QString::fromStdString(event_id));
+ break;
+ }
}
}
+ if (!receipts.empty())
+ emit newReadReceipts(QString::fromStdString(room.first),
+ receipts);
}
- if (!receipts.empty())
- emit newReadReceipts(QString::fromStdString(room.first), receipts);
}
readStatus.emplace(QString::fromStdString(room.first),
calculateRoomReadStatus(room.first));
@@ -1440,7 +1465,7 @@ Cache::roomsWithTagUpdates(const mtx::responses::Sync &res)
for (const auto &room : res.rooms.join) {
bool hasUpdates = false;
for (const auto &evt : room.second.account_data.events) {
- if (std::holds_alternative<Event<account_data::Tags>>(evt)) {
+ if (std::holds_alternative<AccountDataEvent<account_data::Tags>>(evt)) {
hasUpdates = true;
}
}
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 03eb53fc..f31b5ea5 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -297,13 +297,20 @@ TimelineViewManager::sync(const mtx::responses::Rooms &rooms)
&CallManager::syncEvent);
if (ChatPage::instance()->userSettings()->typingNotifications()) {
- std::vector<QString> typing;
- typing.reserve(room.ephemeral.typing.size());
- for (const auto &user : room.ephemeral.typing) {
- if (user != http::client()->user_id().to_string())
- typing.push_back(QString::fromStdString(user));
+ for (const auto &ev : room.ephemeral.events) {
+ if (auto t = std::get_if<
+ mtx::events::EphemeralEvent<mtx::events::ephemeral::Typing>>(
+ &ev)) {
+ std::vector<QString> typing;
+ typing.reserve(t->content.user_ids.size());
+ for (const auto &user : t->content.user_ids) {
+ if (user != http::client()->user_id().to_string())
+ typing.push_back(
+ QString::fromStdString(user));
+ }
+ room_model->updateTypingUsers(typing);
+ }
}
- room_model->updateTypingUsers(typing);
}
}