diff --git a/telegram/utils.go b/telegram/utils.go index e30bdb8..82bb870 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -2478,13 +2478,14 @@ func (c *Client) GetMessagesBetween(chatID, fromMessageId, lastMessageId int64, if firstMessage.Id > fromMessageId { complete = false } - } else { + } else if fromMessageId == 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 { complete = false } } + // for 0 one last message is already fetched as there is at least one, right? } } else { for _, message := range fetchedMessages { diff --git a/xmpp/handlers.go b/xmpp/handlers.go index e45edb1..a8b87e7 100644 --- a/xmpp/handlers.go +++ b/xmpp/handlers.go @@ -2344,18 +2344,10 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) } } - if rsmBefore != 0 && rsmAfter == 0 { - rsmLastPage = true - } - if rsmLimit == 0 && !justCount { rsmLimit = 100 } - if rsmLastPage { - rsmLimit = -rsmLimit // hacky, I know, and? :P - } - // check for mutual parameter compatibility, there's a lot of them, nah? if ((!startTime.IsZero() || !endTime.IsZero()) && (beforeId != 0 || afterId != 0 || ids != nil)) || ((beforeId != 0 || afterId != 0) && (!startTime.IsZero() || !endTime.IsZero() || ids != nil)) || @@ -2368,11 +2360,32 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) // dummy call to circumvent unexported type messages, _, err := session.GetMessagesBetween(toID, 0, 0, 0, false) + var order bool // false from start, true from end + // lower priority + if !endTime.IsZero() { + order = true + } + // higher priority + if beforeId != 0 { + order = false + } + if afterId != 0 { + order = true + } + if rsmAfter != 0 { + order = false + } + if rsmBefore != 0 || rsmLastPage { + order = true + } + if order { + rsmLimit = -rsmLimit // hacky, I know, and? :P + } + quotaTs := time.Now().AddDate(0, 0, -int(gateway.MAMThreshold)) var beyond, complete bool - canBeComplete := true - fromStart := !rsmLastPage - toEnd := rsmLastPage + fromStart := !order + toEnd := order var overallyFirstMessageId, overallyLastMessageId int64 reverse := query.GetFlipPage() != nil @@ -2454,7 +2467,6 @@ 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 @@ -2471,7 +2483,6 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) } if rsmBefore < beforeId { toEnd = false - canBeComplete = false } beforeId = rsmBefore } @@ -2486,11 +2497,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) } if !beyond { - var newComplete bool - messages, newComplete, err = session.GetMessagesBetween(toID, afterId, lastMessageId, rsmLimit, reverse) - if canBeComplete { - complete = newComplete - } + messages, complete, err = session.GetMessagesBetween(toID, afterId, lastMessageId, rsmLimit, reverse) } } else { // time limit or no limits at all // don't allow to fetch far beyond the quota @@ -2540,7 +2547,6 @@ 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 @@ -2567,7 +2573,6 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) newLastMessage, newLastMessageErr := session.GetPreviousMessage(toID, rsmBeforeMessage.Id) if newLastMessageErr == nil && newLastMessage != nil { if lastMessageId == 0 || lastMessageId != newLastMessage.Id { - canBeComplete = false toEnd = false lastMessageId = newLastMessage.Id } @@ -2584,11 +2589,7 @@ func handleSetQueryMAM(s xmpp.Sender, iq *stanza.IQ, query extensions.MAMQuery) } if !beyond { // yes🗿, twice - var newComplete bool - messages, newComplete, err = session.GetMessagesBetween(toID, fromMessageId, lastMessageId, rsmLimit, reverse) - if canBeComplete { - complete = newComplete - } + messages, complete, err = session.GetMessagesBetween(toID, fromMessageId, lastMessageId, rsmLimit, reverse) } } }