picoclaw/pkg/channels/wecom/dedupe.go

33 lines
780 B
Go
Raw Normal View History

package wecom
import "sync"
const wecomMaxProcessedMessages = 1000
// markMessageProcessed marks msgID as processed and returns false for duplicates.
// All map reads/writes (including len) are protected by msgMu to avoid races.
func markMessageProcessed(msgMu *sync.RWMutex, processedMsgs *map[string]bool, msgID string, maxEntries int) bool {
if maxEntries <= 0 {
maxEntries = wecomMaxProcessedMessages
}
msgMu.Lock()
defer msgMu.Unlock()
if *processedMsgs == nil {
*processedMsgs = make(map[string]bool)
}
if (*processedMsgs)[msgID] {
return false
}
(*processedMsgs)[msgID] = true
// When over limit, reset dedupe map but keep the current message.
if len(*processedMsgs) > maxEntries {
*processedMsgs = map[string]bool{msgID: true}
}
return true
}