From a942ae9b93c1a8c8b55f46e340ecb592eb737957 Mon Sep 17 00:00:00 2001
From: Nicolas Werner <nicolas.werner@hotmail.de>
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 016ba3715..8cfc4b55e 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<QString> 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 1c0abd175..df2051e66 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<mtx::events::msg::Encrypted>>(events[id]);
-- 
GitLab