diff --git a/glist/glist.go b/glist/glist.go index 783efed..e912e17 100644 --- a/glist/glist.go +++ b/glist/glist.go @@ -34,29 +34,32 @@ func NewGList(chatID int, items ...string) *GList { return &g } -var reqs chan *GList +var PersistReqC chan<- *GList -func DoPersist() { - reqs = make(chan *GList, 50) +func startPersistenceGoR() { + reqs := make(chan *GList, 50) + PersistReqC = reqs go func() { - for range time.Tick(5 * time.Second) { - lists := map[*GList]struct{}{} - loop: - for { - select { - case g := <-reqs: - lists[g] = struct{}{} - default: - break loop - } + lists := map[*GList]struct{}{} + for g := range reqs { + lists[g] = struct{}{} + time.Sleep(5 * time.Second) + for len(reqs) > 0 { + g := <-reqs + lists[g] = struct{}{} } for g := range lists { g.persist() } + lists = make(map[*GList]struct{}, len(lists)) } }() } +func init() { + startPersistenceGoR() +} + func (g *GList) persist() { g.Mutex.Lock() defer g.Mutex.Unlock() @@ -80,14 +83,14 @@ outer: } g.Items = append(g.Items, Entry{text, false}) } - reqs <- g + PersistReqC <- g } func (g *GList) Toggle(text string) error { for i, item := range g.Items { if item.Text == text { g.Items[i].Checked = !g.Items[i].Checked - reqs <- g + PersistReqC <- g return nil } } @@ -102,7 +105,7 @@ func (g *GList) ClearChecked() { } } g.Items = remaining - reqs <- g + PersistReqC <- g } type button struct { diff --git a/glist/glist_test.go b/glist/glist_test.go index 36d3625..f96d300 100644 --- a/glist/glist_test.go +++ b/glist/glist_test.go @@ -23,7 +23,8 @@ func TestGList(t *testing.T) { func TestSplit(t *testing.T) { g := GList{} - reqs = make(chan *GList, 50) + //This resets the channel, so test does not try to persist + PersistReqC = make(chan *GList, 50) g.Add("foo") g.Add("bar\nfoo\nblah") g.Add("foo") diff --git a/main.go b/main.go index a9f529d..f9827e2 100644 --- a/main.go +++ b/main.go @@ -50,7 +50,6 @@ func main() { }() glist.DataPath = dataPath - glist.DoPersist() log.Printf("Grocery List bot starting with datapath:%s, port:%d\n", dataPath, port)