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