You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.1 KiB
Go

package core
import (
"sync"
)
// MessageTracker will keep track of encountered whatsapp messages to prevent sending them
// twice. It's storage is buffered to prevent continuous locks on the database. This means
// that calling WasSent immediately after calling MarkSent will most likely not return an
// up to date answer.
type MessageTracker struct {
DB *Database
delivered [80]*string
deliveredMutex sync.RWMutex
deliveredIdx int
}
func (t *MessageTracker) MarkSent(ID *string) error {
t.deliveredMutex.Lock()
defer t.deliveredMutex.Unlock()
t.delivered[t.deliveredIdx] = ID
if t.deliveredIdx == len(t.delivered)-1 {
err := t.flush()
if err != nil {
return err
}
}
t.deliveredIdx += 1
return nil
}
// Flush without lock
func (t *MessageTracker) flush() error {
err := t.DB.MarkWhappMessagesSent(t.delivered[:])
t.deliveredIdx = 0
return err
}
// Flush with lock
func (t *MessageTracker) Flush() error {
t.deliveredMutex.Lock()
defer t.deliveredMutex.Unlock()
return t.flush()
}
func (t *MessageTracker) WasSent(ID string) (bool, error) {
return t.DB.WhappMessageWasSent(ID)
}