From a942ae9b93c1a8c8b55f46e340ecb592eb737957 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 6 May 2020 19:21:31 +0200 Subject: [PATCH] Fix messages being immediately read again --- src/Cache.cpp | 12 +++++++++--- src/timeline/TimelineModel.cpp | 12 ++++++++++-- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/Cache.cpp b/src/Cache.cpp index 016ba371..8cfc4b55 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -960,9 +960,15 @@ Cache::saveState(const mtx::responses::Sync &res) for (const auto &room : res.rooms.join) { if (!room.second.ephemeral.receipts.empty()) { std::vector receipts; - for (const auto &receipt : room.second.ephemeral.receipts) - if (receipt.first != user_id) - receipts.push_back(QString::fromStdString(receipt.first)); + 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; + } + } + } if (!receipts.empty()) emit newReadReceipts(QString::fromStdString(room.first), receipts); } diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 1c0abd17..df2051e6 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -321,16 +321,24 @@ TimelineModel::data(const QString &id, int role) const } case Id: return id; - case State: + case State: { + auto containsOthers = [](const auto &vec) { + for (const auto &e : vec) + if (e.second != http::client()->user_id().to_string()) + return true; + return false; + }; + // only show read receipts for messages not from us if (acc::sender(event) != http::client()->user_id().to_string()) return qml_mtx_events::Empty; else if (pending.contains(id)) return qml_mtx_events::Sent; - else if (read.contains(id) || cache::readReceipts(id, room_id_).size() > 1) + else if (read.contains(id) || containsOthers(cache::readReceipts(id, room_id_))) return qml_mtx_events::Read; else return qml_mtx_events::Received; + } case IsEncrypted: { return std::holds_alternative< mtx::events::EncryptedEvent>(events[id]);