From 00cc0dfd645cce97c120111f5e5fd4c02ed021c1 Mon Sep 17 00:00:00 2001 From: Shane Synan Date: Thu, 25 Jun 2020 15:37:24 -0400 Subject: [PATCH] client: Fix backlog requests with 0 initial fetch If no available messages in a buffer exist, try fetching the newest messages. This fixes requesting additional backlog for a buffer when the initial backlog fetching has been disabled (set to zero). --- src/client/messagemodel.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index 76914bff..6c887216 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -393,17 +393,35 @@ void MessageModel::requestBacklog(BufferId bufferId) BacklogSettings backlogSettings; int requestCount = backlogSettings.dynamicBacklogAmount(); + // Assume there's no available messages + MsgId oldestAvailableMsgId{-1}; + + // Try to find the oldest (lowest ID) message belonging to this buffer for (int i = 0; i < messageCount(); i++) { if (messageItemAt(i)->bufferId() == bufferId) { - _messagesWaiting[bufferId] = requestCount; - Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") - .arg(requestCount) - .arg(Client::networkModel()->networkName(bufferId)) - .arg(Client::networkModel()->bufferName(bufferId))); - Client::backlogManager()->requestBacklog(bufferId, -1, messageItemAt(i)->msgId(), requestCount); - return; + // Match found, use this message ID for requesting more backlog + oldestAvailableMsgId = messageItemAt(i)->msgId(); + break; } } + + // Prepare to fetch messages + _messagesWaiting[bufferId] = requestCount; + Client::backlogManager()->emitMessagesRequested(tr("Requesting %1 messages from backlog for buffer %2:%3") + .arg(requestCount) + .arg(Client::networkModel()->networkName(bufferId)) + .arg(Client::networkModel()->bufferName(bufferId))); + + if (oldestAvailableMsgId.isValid()) { + // Request messages from backlog starting from this message ID, going into the past + Client::backlogManager()->requestBacklog(bufferId, -1, oldestAvailableMsgId, requestCount); + } + else { + // No existing messages could be found. Try to fetch the newest available messages instead. + // This may happen when initial backlog fetching is set to zero, or if no messages exist in + // a buffer. + Client::backlogManager()->requestBacklog(bufferId, -1, -1, requestCount); + } } void MessageModel::messagesReceived(BufferId bufferId, int count) -- 2.20.1