[network/ruqola] src/core: Fix load history (broken with previous commit)

Laurent Montel <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit b6998cd51eb1d1fb5382f4e255c17564f9189bc8 by Laurent Montel.
Committed on 28/07/2026 at 19:11.
Pushed by mlaurent into branch 'master'.

Fix load history (broken with previous commit)

M  +29   -13   src/core/managelocaldatabase.cpp

https://invent.kde.org/network/ruqola/-/commit/b6998cd51eb1d1fb5382f4e255c17564f9189bc8

diff --git a/src/core/managelocaldatabase.cpp b/src/core/managelocaldatabase.cpp
index 53eb5ef5b3..4a3dd444dd 100644
--- a/src/core/managelocaldatabase.cpp
+++ b/src/core/managelocaldatabase.cpp
@@ -21,6 +21,7 @@
 #include "ruqolaglobalconfig.h"
 #include "ruqolaserverconfig.h"
 #include <QJsonArray>
+#include <algorithm>
 
 using namespace Qt::Literals::StringLiterals;
 #define USE_LOCALDATABASE
@@ -83,6 +84,7 @@ void ManageLocalDatabase::loadMessagesHistory(const ManageLocalDatabase::ManageL
     Q_ASSERT(info.roomModel);
 
     qint64 endDateTime = info.roomModel->lastTimestamp();
+    qint64 oldestLoadedDateTime = info.roomModel->firstTimestamp();
     qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " ManageLocalDatabase::loadMessagesHistory endDateTime " << QDateTime::fromMSecsSinceEpoch(endDateTime);
     QJsonArray params;
     params.append(QJsonValue(QString::fromLatin1(info.roomId)));
@@ -155,30 +157,44 @@ void ManageLocalDatabase::loadMessagesHistory(const ManageLocalDatabase::ManageL
         if (RuqolaGlobalConfig::self()->storeMessageInDataBase()) {
 #ifdef USE_LOCALDATABASE
             const QString accountName{mRocketChatAccount->accountName()};
-            const QList<Message> lstMessages =
-                mRocketChatAccount->localDatabaseManager()->loadMessages(accountName, info.roomId, -1, endDateTime, 50, mRocketChatAccount->emojiManager());
+            const QList<Message> lstMessages = mRocketChatAccount->localDatabaseManager()
+                                                   ->loadMessages(accountName, info.roomId, -1, oldestLoadedDateTime, 50, mRocketChatAccount->emojiManager());
+            QList<Message> messagesFromDatabase = lstMessages;
+            messagesFromDatabase.erase(std::remove_if(messagesFromDatabase.begin(),
+                                                      messagesFromDatabase.end(),
+                                                      [&info](const Message &message) {
+                                                          return info.roomModel->indexForMessage(message.messageId()).isValid();
+                                                      }),
+                                       messagesFromDatabase.end());
             qCDebug(RUQOLA_LOAD_HISTORY_LOG) << "startDateTime " << -1 << " accountName " << accountName << " roomID " << info.roomId << " info.roomName "
                                              << info.roomName << " number of message " << lstMessages.count();
-            if (lstMessages.count() == downloadMessage) {
-                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from database: nb messages:" << lstMessages.count();
-                mRocketChatAccount->rocketChatBackend()->addMessagesFromLocalDataBase(lstMessages);
+            if (messagesFromDatabase.count() != lstMessages.count()) {
+                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " database overlap with already loaded messages:" << (lstMessages.count() - messagesFromDatabase.count());
+            }
+            if (messagesFromDatabase.count() == downloadMessage) {
+                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from database: nb messages:" << messagesFromDatabase.count();
+                mRocketChatAccount->rocketChatBackend()->addMessagesFromLocalDataBase(messagesFromDatabase);
                 return;
-            } else if (!lstMessages.isEmpty()) {
-                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from database list is not empty" << lstMessages.count();
-                mRocketChatAccount->rocketChatBackend()->addMessagesFromLocalDataBase(lstMessages);
-                downloadMessage -= lstMessages.count();
+            } else if (!messagesFromDatabase.isEmpty()) {
+                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from database list is not empty" << messagesFromDatabase.count();
+                mRocketChatAccount->rocketChatBackend()->addMessagesFromLocalDataBase(messagesFromDatabase);
+                downloadMessage -= messagesFromDatabase.count();
                 // Update lastTimeStamp
-                endDateTime = info.roomModel->lastTimestamp();
+                oldestLoadedDateTime = info.roomModel->firstTimestamp();
                 // TODO load diff messages => 50 - lstMessages.count()
             } else {
-                qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from network";
+                if (!lstMessages.isEmpty()) {
+                    qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " database page only contains already loaded messages, load remaining history from network";
+                } else {
+                    qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " load from network";
+                }
             }
 
 #endif
         }
         QJsonObject dateObjectEnd;
-        dateObjectEnd["$date"_L1] = QJsonValue(endDateTime);
-        const qint64 startDateTime = info.roomModel->generateNewStartTimeStamp(endDateTime);
+        dateObjectEnd["$date"_L1] = QJsonValue(oldestLoadedDateTime);
+        const qint64 startDateTime = info.roomModel->generateNewStartTimeStamp(oldestLoadedDateTime);
 
         // qCDebug(RUQOLA_LOAD_HISTORY_LOG) << " QDATE TIME END" << QDateTime::fromMSecsSinceEpoch(endDateTime) << " START "  <<
         // QDateTime::fromMSecsSinceEpoch(startDateTime) << " ROOMID" << roomID;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.