mirror of
https://github.com/xaionaro-go/streamctl.git
synced 2025-10-28 09:51:37 +08:00
50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package chatmessagesstorage
|
|
|
|
import (
|
|
"context"
|
|
"slices"
|
|
"sort"
|
|
"time"
|
|
|
|
"github.com/facebookincubator/go-belt/tool/logger"
|
|
"github.com/xaionaro-go/streamctl/pkg/streamd/api"
|
|
"github.com/xaionaro-go/xsync"
|
|
)
|
|
|
|
func (s *ChatMessagesStorage) GetMessagesSince(
|
|
ctx context.Context,
|
|
since time.Time,
|
|
) ([]api.ChatMessage, error) {
|
|
return xsync.DoA2R2(ctx, &s.Mutex, s.getMessagesSinceLocked, ctx, since)
|
|
}
|
|
|
|
func (s *ChatMessagesStorage) getMessagesSinceLocked(
|
|
ctx context.Context,
|
|
since time.Time,
|
|
) (_ret []api.ChatMessage, _err error) {
|
|
logger.Tracef(ctx, "getMessagesSinceLocked(ctx, %v)", since)
|
|
defer func() { logger.Tracef(ctx, "/getMessagesSinceLocked(ctx, %v): len:%d, %v", since, len(_ret), _err) }()
|
|
|
|
if len(s.Messages) == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
if !s.IsSorted {
|
|
s.sortAndDeduplicateAndTruncate(ctx)
|
|
}
|
|
|
|
idx := sort.Search(len(s.Messages), func(i int) bool {
|
|
m := &s.Messages[i]
|
|
return !m.CreatedAt.After(since)
|
|
})
|
|
|
|
if idx >= len(s.Messages) {
|
|
if !since.Before(s.Messages[0].CreatedAt) {
|
|
return nil, nil
|
|
}
|
|
idx = 0
|
|
}
|
|
|
|
return slices.Clone(s.Messages[idx:]), nil
|
|
}
|