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
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)
|
|
}
|