mirror of
https://dev.narayana.im/narayana/telegabber.git
synced 2026-08-05 04:07:07 +00:00
Yet another MAM logic rewrite: assume request order by RSM before/after, do not consider RSM limitation themselves as incompleteness
This commit is contained in:
parent
15f62b619d
commit
89d368abbb
2 changed files with 28 additions and 26 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue