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.
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package whappdc
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/hugot/go-deltachat/deltachat"
|
|
"github.com/hugot/whapp-deltachat/core"
|
|
)
|
|
|
|
func NewMessageTracker(
|
|
DB *core.Database,
|
|
flushInterval time.Duration,
|
|
logger deltachat.Logger,
|
|
) *MessageTracker {
|
|
tracker := &MessageTracker{
|
|
DB: DB,
|
|
logger: logger,
|
|
}
|
|
|
|
tracker.FlushWithInterval(flushInterval)
|
|
|
|
return tracker
|
|
}
|
|
|
|
// 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 *core.Database
|
|
logger deltachat.Logger
|
|
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)
|
|
}
|
|
|
|
func (t *MessageTracker) FlushWithInterval(interval time.Duration) {
|
|
go func() {
|
|
for {
|
|
time.Sleep(interval)
|
|
err := t.Flush()
|
|
|
|
if err != nil {
|
|
t.logger.Println(err)
|
|
}
|
|
}
|
|
}()
|
|
}
|