-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathcommander.go
99 lines (79 loc) · 1.64 KB
/
commander.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package lili
import (
"errors"
"log"
"time"
. "github.com/bearyinnovative/lili/model"
. "github.com/bearyinnovative/lili/util"
)
type Commander struct {
cmds []CommandType
}
func NewCommander(cmds []CommandType) *Commander {
return &Commander{
cmds: cmds,
}
}
func (c *Commander) Run() error {
if len(c.cmds) == 0 {
return errors.New("no commands")
}
for i := 0; i < len(c.cmds); i++ {
// fmt.Printf("%+v\n", cmds[i])
start(c.cmds[i])
}
// wait forever
select {}
}
func start(c CommandType) {
// trigger once
go func() {
fetchAndNotify(c)
}()
ticker := time.NewTicker(c.GetInterval())
// schedule run
go func() {
for _ = range ticker.C {
fetchAndNotify(c)
}
}()
}
func fetchAndNotify(c CommandType) {
items, err := c.Fetch()
if LogIfErr(err) {
return
}
notifiedCount := 0
for _, item := range items {
created, keyChanged := false, false
var err error
if item.NeedSaveToDB() {
created, keyChanged, err = dbContext.UpsertItem(item)
if LogIfErr(err) {
continue
}
}
notifiers := item.GetValidNotifiers(created, keyChanged)
if len(notifiers) == 0 {
continue
}
notifiedCount += 1
// notify text
text := item.GetNotifyText(created, keyChanged)
// notify
for _, n := range notifiers {
if IsDebug() {
log.Println("[DEBUG NOTIFY]", text, item.Images)
continue
}
err = n.Notify(item.Identifier, text, item.Images)
LogIfErr(err)
// TODO: need handle multi notifiers
if item.NeedSaveToDB() {
err = dbContext.MarkNotified(item, err == nil)
LogIfErr(err)
}
}
}
log.Printf("[%s] fetched %d items, notified %d", c.GetName(), len(items), notifiedCount)
}