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 var newMessages *client.Messages
if limit == 0 { if limit == 0 {
complete = true
return return
} }
@ -2471,14 +2472,40 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
} else { } else {
messages = fetchedMessages 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 { } else {
complete = true
for _, message := range fetchedMessages { for _, message := range fetchedMessages {
if message.Id <= fromMessageId { if message.Id <= fromMessageId {
complete = true
break break
} }
messages = append(messages, message) 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 { if !reverse {

View file

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