diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp index 2a3fab0ff7604f0b89f4b4d4c89558dc8a25b396..e897830df26a0550c3fc48ce2fd82ea82f7ad414 100644 --- a/src/libclient/conversationmodel.cpp +++ b/src/libclient/conversationmodel.cpp @@ -2312,9 +2312,11 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId, try { auto& conversation = getConversationForUid(conversationId).get(); - QString oldLast; // Used to detect loading loops just in case. - if (conversation.interactions->size() != 0) + QString oldLast, oldBegin; // Used to detect loading loops just in case. + if (conversation.interactions->size() != 0) { + oldBegin = conversation.interactions->begin()->first; oldLast = conversation.interactions->rbegin()->first; + } for (const auto& message : messages) { if (message["type"].isEmpty()) { continue; @@ -2362,21 +2364,19 @@ ConversationModelPimpl::slotConversationLoaded(uint32_t requestId, } } - for (int j = conversation.interactions->size() - 1; j >= 0; j--) { - if (conversation.interactions->atIndex(j).second.type != interaction::Type::MERGE) { - conversation.lastMessageUid = conversation.interactions->atIndex(j).first; - break; - } - } + conversation.lastMessageUid = conversation.interactions->lastMessageUid(); if (conversation.lastMessageUid.isEmpty() && !conversation.allMessagesLoaded && messages.size() != 0) { if (conversation.interactions->size() > 0) { - QString newLast; - if (conversation.interactions->size() > 0) + QString newLast, newBegin; + if (conversation.interactions->size() > 0) { + newBegin = conversation.interactions->begin()->first; newLast = conversation.interactions->rbegin()->first; - if (newLast == oldLast && !newLast.isEmpty()) { // [[unlikely]] in c++20 - qCritical() << "Loading loop detected for " << conversationId << "(" << newLast - << ")"; + } + if (newLast == oldLast && !newLast.isEmpty() && newBegin == oldBegin + && !newBegin.isEmpty()) { // [[unlikely]] in c++20 + qCritical() << "Loading loop detected for " << conversationId << "(" << newBegin + << " ; " << newLast << ")"; return; } } @@ -2473,7 +2473,7 @@ ConversationModelPimpl::slotMessageReceived(const QString& accountId, invalidateModel(); return; } - conversation.lastMessageUid = msgId; + conversation.lastMessageUid = conversation.interactions->lastMessageUid(); invalidateModel(); if (!interaction::isOutgoing(msg)) { Q_EMIT behaviorController.newUnreadInteraction(linked.owner.id, diff --git a/src/libclient/messagelistmodel.cpp b/src/libclient/messagelistmodel.cpp index 8e3f0b1cba0806950f4ca05081294cdfb9647eee..339ec2895cf9bc92f2e475d4c4cb0f2acdddd37d 100644 --- a/src/libclient/messagelistmodel.cpp +++ b/src/libclient/messagelistmodel.cpp @@ -541,4 +541,16 @@ MessageListModel::emitDataChanged(const QString& msgId, VectorInt roles) Q_EMIT dataChanged(modelIndex, modelIndex, roles); } +QString +MessageListModel::lastMessageUid() const +{ + for (auto it = interactions_.rbegin(); it != interactions_.rend(); ++it) { + auto lastType = it->second.type; + if (lastType != interaction::Type::MERGE and !it->second.body.isEmpty()) { + return it->first; + } + } + return {}; +} + } // namespace lrc diff --git a/src/libclient/messagelistmodel.h b/src/libclient/messagelistmodel.h index 2613276b73d4e5efe37b0012e45ce5851e5a140b..b3d494ac75e7de2fd3b2558138106707fd783eb8 100644 --- a/src/libclient/messagelistmodel.h +++ b/src/libclient/messagelistmodel.h @@ -130,6 +130,8 @@ public: Q_SIGNAL void timestampUpdate(); + QString lastMessageUid() const; + protected: using Role = MessageList::Role;