Fix some MAM bugs

This commit is contained in:
Bohdan Horbeshko 2025-08-15 04:31:27 -04:00
parent 075f327275
commit 4fb3886aab
2 changed files with 24 additions and 35 deletions

View file

@ -2387,11 +2387,11 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
if limit < 0 { if limit < 0 {
reqFromMessageId = lastMessageId reqFromMessageId = lastMessageId
reqOffset = -1 reqOffset = -1
reqLimit = limit reqLimit = -limit + 1
} else { } else {
reqFromMessageId = fromMessageId reqFromMessageId = fromMessageId
reqOffset = -limit reqOffset = -limit - 1
reqLimit = limit reqLimit = limit + 1
} }
newMessages, err = c.client.GetChatHistory(&client.GetChatHistoryRequest{ newMessages, err = c.client.GetChatHistory(&client.GetChatHistoryRequest{
@ -2408,7 +2408,7 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
fromPos := -1 fromPos := -1
for i, message := range newMessages.Messages { for i, message := range newMessages.Messages {
if message.Id == fromMessageId { if message.Id == fromMessageId {
fromPos = i fromPos = i+1
break break
} }
} }
@ -2420,6 +2420,9 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64,
complete = true complete = true
} else { } else {
for _, message := range newMessages.Messages { for _, message := range newMessages.Messages {
if message.Id == fromMessageId {
continue
}
if lastMessageId != 0 { if lastMessageId != 0 {
if message.Id > lastMessageId { if message.Id > lastMessageId {
break break

View file

@ -2368,6 +2368,15 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
iqAnswerSetError(answer, 404) iqAnswerSetError(answer, 404)
return return
} }
overallyLastMessage, overallyLastMessageErr := session.GetPreviousMessage(toID, beforeId)
if overallyLastMessageErr == nil && overallyLastMessage != nil {
overallyLastMessageId = overallyLastMessage.Id
}
} else {
newestMessage, newestMessageErr := session.GetPreviousMessage(toID, 0)
if newestMessageErr == nil && newestMessage != nil {
overallyLastMessageId = newestMessage.Id
}
} }
if rsmAfter != 0 { if rsmAfter != 0 {
@ -2392,14 +2401,13 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
} }
if rsmBefore < beforeId { if rsmBefore < beforeId {
canBeComplete = false canBeComplete = false
overallyLastMessageId = beforeId
} }
beforeId = rsmBefore beforeId = rsmBefore
} }
var lastMessageId int64 var lastMessageId int64
// should be fine even with afterId=0 as it would mean the last as needed // should be fine even with beforeId=0 as it would mean the last as needed
lastMessage, lastMessageErr := session.GetPreviousMessage(toID, afterId) lastMessage, lastMessageErr := session.GetPreviousMessage(toID, beforeId)
if lastMessageErr == nil && lastMessage != nil { if lastMessageErr == nil && lastMessage != nil {
lastMessageId = lastMessage.Id lastMessageId = lastMessage.Id
} else { } else {
@ -2411,16 +2419,6 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
messages, newComplete, err = session.GetMessagesBetween(toID, afterId, lastMessageId, rsmLimit) messages, newComplete, err = session.GetMessagesBetween(toID, afterId, lastMessageId, rsmLimit)
if canBeComplete { if canBeComplete {
complete = newComplete complete = newComplete
if !complete {
if lastMessageId != 0 {
overallyLastMessageId = lastMessageId
} else {
newestMessage, newestMessageErr := session.GetPreviousMessage(toID, 0)
if newestMessageErr == nil && newestMessage != nil {
overallyLastMessageId = newestMessage.Id
}
}
}
} }
} }
} else { // time limit or no limits at all } else { // time limit or no limits at all
@ -2447,9 +2445,15 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
endMsg, endMsgErr := session.FindMessageByTime(toID, endTime) endMsg, endMsgErr := session.FindMessageByTime(toID, endTime)
if endMsgErr == nil && endMsg != nil { if endMsgErr == nil && endMsg != nil {
lastMessageId = endMsg.Id lastMessageId = endMsg.Id
overallyLastMessageId = lastMessageId
} else { } else {
beyond = true beyond = true
} }
} else {
newestMessage, newestMessageErr := session.GetPreviousMessage(toID, 0)
if newestMessageErr == nil && newestMessage != nil {
overallyLastMessageId = newestMessage.Id
}
} }
if rsmAfter != 0 { if rsmAfter != 0 {
@ -2486,14 +2490,6 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
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
if lastMessageId != 0 {
overallyLastMessageId = lastMessageId
} else {
newestMessage, newestMessageErr := session.GetPreviousMessage(toID, 0)
if newestMessageErr == nil && newestMessage != nil {
overallyLastMessageId = newestMessage.Id
}
}
lastMessageId = newLastMessage.Id lastMessageId = newLastMessage.Id
} }
} else { } else {
@ -2511,16 +2507,6 @@ func handleSetQueryMAM2(s xmpp.Sender, iq *stanza.IQ, query *extensions.MAM2Quer
messages, newComplete, err = session.GetMessagesBetween(toID, fromMessageId, lastMessageId, rsmLimit) messages, newComplete, err = session.GetMessagesBetween(toID, fromMessageId, lastMessageId, rsmLimit)
if canBeComplete { if canBeComplete {
complete = newComplete complete = newComplete
if !complete {
if lastMessageId != 0 {
overallyLastMessageId = lastMessageId
} else {
newestMessage, newestMessageErr := session.GetPreviousMessage(toID, 0)
if newestMessageErr == nil && newestMessage != nil {
overallyLastMessageId = newestMessage.Id
}
}
}
} }
} }
} }