diff --git a/telegram/utils.go b/telegram/utils.go index a7d9efa..e30bdb8 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -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 { diff --git a/xmpp/handlers.go b/xmpp/handlers.go index 3039ff6..e45edb1 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -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 {