fix: sync Android cursor tolerance fixes

This commit is contained in:
A 2026-07-04 23:45:27 +08:00
parent ca79562fd8
commit 2d5a6236c2
5 changed files with 198 additions and 8 deletions

View file

@ -77,6 +77,13 @@ func (r *Router) onStoriesGetAllStories(ctx context.Context, req *tg.StoriesGetA
now := int(r.clock.Now().Unix())
var cursor domain.StoryListCursor
if next {
if digest, ok := storyAllStoriesDigestFromCompleteState(requestState, hidden); ok {
list := domain.StoryList{Hidden: hidden, Count: digest.Count, State: requestState}
if r.deps.Stories == nil || userID == 0 {
return tgStoriesAllStories(userID, list), nil
}
return r.tgStoriesAllStories(ctx, userID, list), nil
}
cursor, err = storyAllStoriesCursorFromState(requestState, hidden)
if err != nil {
return nil, offsetInvalidErr()
@ -135,7 +142,16 @@ func validateStoriesGetAllStoriesRequest(req *tg.StoriesGetAllStoriesRequest) er
next := storyAllStoriesNext(req)
hidden := storyAllStoriesHidden(req)
if next {
if !hasState || state == "" || !storyAllStoriesCursorStateToken(state) {
if !hasState || state == "" {
return offsetInvalidErr()
}
if storyAllStoriesCompleteState(state) {
if !storyAllStoriesCompleteStateForHidden(state, hidden) {
return offsetInvalidErr()
}
return nil
}
if !storyAllStoriesCursorStateToken(state) {
return offsetInvalidErr()
}
if _, err := storyAllStoriesCursorFromState(state, hidden); err != nil {
@ -172,6 +188,22 @@ func storyAllStoriesCompleteState(state string) bool {
return strings.HasPrefix(state, "ts1:")
}
func storyAllStoriesDigestFromCompleteState(state string, hidden bool) (domain.StoryListDigest, bool) {
if !storyAllStoriesCompleteStateForHidden(state, hidden) {
return domain.StoryListDigest{}, false
}
parts := strings.Split(state, ":")
count, err := strconv.Atoi(parts[2])
if err != nil || count < 0 {
return domain.StoryListDigest{}, false
}
hash, err := strconv.ParseUint(parts[3], 16, 64)
if err != nil {
return domain.StoryListDigest{}, false
}
return domain.StoryListDigest{Count: count, Hash: hash}, true
}
func storyAllStoriesCompleteStateForHidden(state string, hidden bool) bool {
parts := strings.Split(state, ":")
if len(parts) != 4 || parts[0] != "ts1" {