forked from x/icebergs
66 lines
2.0 KiB
Go
66 lines
2.0 KiB
Go
package gdb
|
|
|
|
import (
|
|
"time"
|
|
|
|
ice "shylinux.com/x/icebergs"
|
|
"shylinux.com/x/icebergs/base/cli"
|
|
"shylinux.com/x/icebergs/base/mdb"
|
|
kit "shylinux.com/x/toolkits"
|
|
)
|
|
|
|
func _timer_action(m *ice.Message, arg ...string) {
|
|
now := time.Now().UnixNano()
|
|
m.OptionFields(m.Config(mdb.FIELD))
|
|
|
|
m.Richs(TIMER, "", mdb.FOREACH, func(key string, value ice.Map) {
|
|
if value = kit.GetMeta(value); value[cli.STATUS] == cli.STOP {
|
|
return
|
|
}
|
|
|
|
order := kit.Int(value[ORDER])
|
|
if n := kit.Time(kit.Format(value[NEXT])); now > n && order > 0 {
|
|
m.Logs(TIMER, mdb.KEY, key, ORDER, order)
|
|
|
|
msg := m.Cmd(value[ice.CMD])
|
|
m.Grow(TIMER, kit.Keys(mdb.HASH, key), kit.Dict(ice.RES, msg.Result()))
|
|
if value[ORDER] = kit.Format(order - 1); order > 1 {
|
|
value[NEXT] = msg.Time(value[INTERVAL])
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
const (
|
|
DELAY = "delay"
|
|
INTERVAL = "interval"
|
|
ORDER = "order"
|
|
NEXT = "next"
|
|
TICK = "tick"
|
|
)
|
|
const TIMER = "timer"
|
|
|
|
func init() {
|
|
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
|
|
TIMER: {Name: TIMER, Help: "定时器", Value: kit.Data(
|
|
mdb.FIELD, "time,hash,delay,interval,order,next,cmd", TICK, "1s",
|
|
)},
|
|
}, Commands: map[string]*ice.Command{
|
|
TIMER: {Name: "timer hash id auto create action prunes", Help: "定时器", Action: ice.MergeAction(map[string]*ice.Action{
|
|
mdb.CREATE: {Name: "create delay=10ms interval=10s order=3 cmd=runtime", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
|
|
m.Cmdy(mdb.INSERT, TIMER, "", mdb.HASH, DELAY, "10ms", INTERVAL, "10m", ORDER, 1, NEXT, m.Time(m.Option(DELAY)), arg)
|
|
}},
|
|
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
|
|
m.OptionFields(m.Config(mdb.FIELD))
|
|
m.Cmdy(mdb.PRUNES, TIMER, "", mdb.HASH, ORDER, 0)
|
|
}},
|
|
HAPPEN: {Name: "happen", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
|
|
_timer_action(m, arg...)
|
|
}},
|
|
}, mdb.ZoneAction()), Hand: func(m *ice.Message, arg ...string) {
|
|
m.Fields(len(arg), m.Config(mdb.FIELD), "time,id,res")
|
|
mdb.ZoneSelect(m, arg...)
|
|
}},
|
|
}})
|
|
}
|