Fix complete flag logic: it marks if RSM/result covers full range, not if the output range touches the end

This commit is contained in:
Bohdan Horbeshko 2025-09-18 16:51:08 -04:00
parent 6ceb4efe32
commit 15f62b619d
2 changed files with 34 additions and 2 deletions

View file

@ -2399,6 +2399,7 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
var newMessages *client.Messages
if limit == 0 {
complete = true
return
}
@ -2471,14 +2472,40 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
} else {
messages = fetchedMessages
}
if complete && len(messages) > 0 {
firstMessage := messages[len(messages)-1]
if fromMessageId > 1 {
if firstMessage.Id > fromMessageId {
complete = false
}
} else {
// try to fetch one more message to check if there are any other before
previousMessage, previousMessageErr := c.GetPreviousMessage(chatID, firstMessage.Id)
if previousMessageErr == nil && previousMessage != nil {
complete = false
}
}
}
} else {
complete = true
for _, message := range fetchedMessages {
if message.Id <= fromMessageId {
complete = true
break
}
messages = append(messages, message)
}
if len(messages) > 0 {
firstMessage := messages[len(messages)-1]
// try to fetch one more message to check if there are any other before
previousMessage, previousMessageErr := c.GetPreviousMessage(chatID, firstMessage.Id)
if previousMessageErr == nil && previousMessage != nil {
if previousMessage.Id == fromMessageId {
complete = true
}
} else {
complete = true
}
}
}
if !reverse {

View file

@ -2372,6 +2372,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
var beyond, complete bool
canBeComplete := true
fromStart := !rsmLastPage
toEnd := rsmLastPage
var overallyFirstMessageId, overallyLastMessageId int64
reverse := query.GetFlipPage() != nil
@ -2453,6 +2454,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
}
if rsmAfter != afterId {
fromStart = false
canBeComplete = false
overallyFirstMessage, overallyFirstMessageErr := session.GetNextMessage(toID, afterId)
if overallyFirstMessageErr == nil && overallyFirstMessage != nil {
overallyFirstMessageId = overallyFirstMessage.Id
@ -2468,6 +2470,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
return
}
if rsmBefore < beforeId {
toEnd = false
canBeComplete = false
}
beforeId = rsmBefore
@ -2537,6 +2540,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
if rsmAfterMessage.Id > fromMessageId && int64(rsmAfterMessage.Date) >= startTime.Unix() {
fromStart = false
canBeComplete = false
overallyFirstMessage, overallyFirstMessageErr := session.GetNextMessage(toID, fromMessageId)
if overallyFirstMessageErr == nil && overallyFirstMessage != nil {
overallyFirstMessageId = overallyFirstMessage.Id
@ -2564,6 +2568,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
if newLastMessageErr == nil && newLastMessage != nil {
if lastMessageId == 0 || lastMessageId != newLastMessage.Id {
canBeComplete = false
toEnd = false
lastMessageId = newLastMessage.Id
}
} else {
@ -2637,7 +2642,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery)
overallyFirstMessageId = firstMsgId
}
}
if complete {
if toEnd {
if reverse {
overallyLastMessageId = firstMsgId
} else {