mirror of
https://github.com/xaionaro-go/streamctl.git
synced 2025-10-05 15:37:00 +08:00
41 lines
953 B
Go
41 lines
953 B
Go
package chatmessagesstorage
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/facebookincubator/go-belt/tool/logger"
|
|
"github.com/xaionaro-go/streamctl/pkg/streamd/api"
|
|
"github.com/xaionaro-go/xsync"
|
|
)
|
|
|
|
func (s *ChatMessagesStorage) AddMessage(
|
|
ctx context.Context,
|
|
msg api.ChatMessage,
|
|
) error {
|
|
xsync.DoA2(ctx, &s.Mutex, s.addMessageLocked, ctx, msg)
|
|
return nil
|
|
}
|
|
|
|
func (s *ChatMessagesStorage) addMessageLocked(
|
|
ctx context.Context,
|
|
msg api.ChatMessage,
|
|
) {
|
|
logger.Tracef(ctx, "addMessageLocked(ctx, %#+v)", msg)
|
|
defer func() { logger.Tracef(ctx, "/addMessageLocked(ctx, %#+v)", msg) }()
|
|
|
|
if len(s.Messages) > 0 && !msg.CreatedAt.After(s.Messages[len(s.Messages)-1].CreatedAt) {
|
|
s.IsSorted = false
|
|
}
|
|
msg.IsLive = false
|
|
s.Messages = append(s.Messages, msg)
|
|
s.IsChanged = true
|
|
if len(s.Messages) <= MaxMessages {
|
|
return
|
|
}
|
|
if s.IsSorted {
|
|
s.Messages = s.Messages[len(s.Messages)-MaxMessages:]
|
|
return
|
|
}
|
|
s.sortAndDeduplicateAndTruncate(ctx)
|
|
}
|