picoclaw/pkg/channels/wecom/dedupe.go

29 lines
712 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)[msgID] {
return false
}
(*processedMsgs)[msgID] = true
// Keep the newest message marker when rotating to bound memory growth.
if len(*processedMsgs) > maxEntries {
*processedMsgs = map[string]bool{msgID: true}
}
return true
}