Prevent sending duplicate messages and improve username determination
parent
eb0a653195
commit
3bccb1cf61
@ -0,0 +1,55 @@
|
||||
package main
|
||||
|
||||
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)
|
||||
}
|
Loading…
Reference in New Issue