mirror of
https://github.com/xaionaro-go/streamctl.git
synced 2025-10-17 21:11:24 +08:00
Start implementing the chat widget for the dashboard
This commit is contained in:
56
pkg/chatmessagesstorage/sort_and_deduplicate.go
Normal file
56
pkg/chatmessagesstorage/sort_and_deduplicate.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package chatmessagesstorage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
|
||||
"github.com/facebookincubator/go-belt/tool/logger"
|
||||
"github.com/xaionaro-go/streamctl/pkg/streamd/api"
|
||||
)
|
||||
|
||||
func msgLess(ctx context.Context, a *api.ChatMessage, b *api.ChatMessage) bool {
|
||||
if a.CreatedAt.Before(b.CreatedAt) {
|
||||
return true
|
||||
}
|
||||
if a.Platform < b.Platform {
|
||||
return true
|
||||
}
|
||||
if a.Username < b.Username {
|
||||
return true
|
||||
}
|
||||
if a.MessageID < b.MessageID {
|
||||
return true
|
||||
}
|
||||
if a.Message < b.Message {
|
||||
return true
|
||||
}
|
||||
if a != b {
|
||||
logger.Errorf(ctx, "msgs A and B look equal, but are not: A:%#+v B:%#+v", a, b)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (s *ChatMessagesStorage) sortAndDeduplicateAndTruncate(ctx context.Context) {
|
||||
if len(s.Messages) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
sort.Slice(s.Messages, func(i, j int) bool {
|
||||
return msgLess(ctx, &s.Messages[i], &s.Messages[j])
|
||||
})
|
||||
s.IsSorted = true
|
||||
|
||||
dedup := make([]api.ChatMessage, 0, len(s.Messages))
|
||||
dedup = append(dedup, s.Messages[0])
|
||||
for _, msg := range s.Messages[1:] {
|
||||
if msg == dedup[len(dedup)-1] {
|
||||
continue
|
||||
}
|
||||
dedup = append(dedup, msg)
|
||||
}
|
||||
|
||||
s.Messages = dedup
|
||||
if len(s.Messages) > MaxMessages {
|
||||
s.Messages = s.Messages[len(s.Messages)-MaxMessages:]
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user