forked from x/icebergs
add mdb.update
This commit is contained in:
parent
ab6bfe93d4
commit
75e0639f78
12
base.go
12
base.go
@ -26,10 +26,8 @@ func (f *Frame) Begin(m *Message, arg ...string) Server {
|
||||
func (f *Frame) Start(m *Message, arg ...string) bool {
|
||||
// 加载配置
|
||||
m.Travel(func(p *Context, s *Context) {
|
||||
if cmd, ok := s.Commands["_init"]; ok {
|
||||
msg := m.Spawns(s)
|
||||
msg.Log("_init", s.Name)
|
||||
cmd.Hand(msg, s, "_init", arg...)
|
||||
if _, ok := s.Commands["_init"]; ok {
|
||||
m.Spawns(s).Runs("_init", "_init", arg...)
|
||||
}
|
||||
})
|
||||
|
||||
@ -40,10 +38,8 @@ func (f *Frame) Start(m *Message, arg ...string) bool {
|
||||
func (f *Frame) Close(m *Message, arg ...string) bool {
|
||||
// 保存配置
|
||||
m.Travel(func(p *Context, s *Context) {
|
||||
if cmd, ok := s.Commands["_exit"]; ok {
|
||||
msg := m.Spawns(s)
|
||||
msg.Log("_exit", "some")
|
||||
cmd.Hand(msg, s, "_exit", arg...)
|
||||
if _, ok := s.Commands["_exit"]; ok {
|
||||
m.Spawns(s).Runs("_exit", "_exit", arg...)
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -70,7 +70,6 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块",
|
||||
"sess": {Name: "sess check|login", Help: "会话", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "check":
|
||||
|
||||
user := m.Conf("sess", "hash."+arg[1]+".username")
|
||||
if user != "" {
|
||||
m.Confm("user", "hash."+user, func(value map[string]interface{}) {
|
||||
|
@ -60,9 +60,6 @@ var Index = &ice.Context{Name: "cli", Help: "命令模块",
|
||||
}},
|
||||
"timer": {Name: "timer", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
}},
|
||||
"hi": {Name: "hi", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Echo("hello %s world", c.Name)
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -41,10 +41,7 @@ var Index = &ice.Context{Name: "ctx", Help: "元始模块",
|
||||
} else {
|
||||
switch arg[2] {
|
||||
case "run":
|
||||
m.Log("info", "run %s %s %v", s.Name, key, arg[3:])
|
||||
msg := m.Spawn(s)
|
||||
i.Hand(msg, s, key, arg[3:]...)
|
||||
m.Copy(msg)
|
||||
m.Copy(m.Spawns(s).Runs(key, key, arg[3:]...))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,14 +2,21 @@ package mdb
|
||||
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
"github.com/shylinux/toolkits"
|
||||
)
|
||||
|
||||
var Index = &ice.Context{Name: "mdb", Help: "数据模块",
|
||||
Caches: map[string]*ice.Cache{},
|
||||
Configs: map[string]*ice.Config{},
|
||||
Commands: map[string]*ice.Command{
|
||||
"hi": {Name: "hi", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Echo("hello %s world", c.Name)
|
||||
"update": {Name: "update config table index key value", Help: "修改数据", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
meta := m.Confm(arg[0], arg[1]+".meta")
|
||||
index := kit.Int(arg[2]) - kit.Int(meta["offset"]) - 1
|
||||
|
||||
data := m.Confm(arg[0], arg[1]+".list."+kit.Format(index))
|
||||
for i := 3; i < len(arg)-1; i += 2 {
|
||||
kit.Value(data, arg[i], arg[i+1])
|
||||
}
|
||||
}},
|
||||
},
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import (
|
||||
_ "github.com/shylinux/icebergs/base/ctx"
|
||||
_ "github.com/shylinux/icebergs/base/gdb"
|
||||
_ "github.com/shylinux/icebergs/base/log"
|
||||
_ "github.com/shylinux/icebergs/base/mdb"
|
||||
_ "github.com/shylinux/icebergs/base/nfs"
|
||||
_ "github.com/shylinux/icebergs/base/web"
|
||||
)
|
||||
|
@ -40,9 +40,11 @@ func Cookie(msg *ice.Message, sessid string) string {
|
||||
func (web *WEB) Login(msg *ice.Message, w http.ResponseWriter, r *http.Request) bool {
|
||||
if msg.Options("sessid") {
|
||||
sub := msg.Cmd("aaa.sess", "check", msg.Option("sessid"))
|
||||
msg.Log("info", "user %s %s", msg.Option("userrole", sub.Append("userrole")),
|
||||
msg.Log("info", "role: %s user: %s", msg.Option("userrole", sub.Append("userrole")),
|
||||
msg.Option("username", sub.Append("username")))
|
||||
}
|
||||
|
||||
msg.Runs("_login", msg.Option("path"), kit.Simple(msg.Optionv("cmds"))...)
|
||||
return true
|
||||
}
|
||||
func (web *WEB) HandleWSS(m *ice.Message, safe bool, c *websocket.Conn) {
|
||||
@ -270,6 +272,7 @@ func (web *WEB) Start(m *ice.Message, arg ...string) bool {
|
||||
port := kit.Select(m.Conf("spide", "self.port"), arg, 0)
|
||||
web.m = m
|
||||
web.Server = &http.Server{Addr: port, Handler: web}
|
||||
m.Log("serve", "node %v", m.Conf("cli.runtime", "node"))
|
||||
m.Log("serve", "listen %s", port)
|
||||
m.Log("serve", "listen %s", web.Server.ListenAndServe())
|
||||
return true
|
||||
@ -311,6 +314,7 @@ var Index = &ice.Context{Name: "web", Help: "网页模块",
|
||||
}},
|
||||
"serve": {Name: "hi", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Conf("cli.runtime", "node.type", "server")
|
||||
m.Conf("cli.runtime", "node.name", m.Conf("cli.runtime", "boot.hostname"))
|
||||
m.Run(arg...)
|
||||
}},
|
||||
"/space": &ice.Command{Name: "/space", Help: "", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
|
@ -22,11 +22,29 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
m.Cmd("ctx.config", "load", "var/conf/aaa.json")
|
||||
m.Cmd("ctx.config", "load", "var/conf/chat.json")
|
||||
}},
|
||||
"_login": {Name: "_login", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if cmd != "/login" {
|
||||
if !m.Options("sessid") || !m.Options("username") {
|
||||
m.Option("path", "")
|
||||
m.Log("warn", "not login")
|
||||
m.Echo("error").Echo("not login")
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(arg) > 0 && m.Confs("group", "hash."+arg[0]) {
|
||||
m.Option("sess.river", arg[0])
|
||||
if len(arg) > 1 && m.Confs("group", "hash."+arg[0]+".tool.hash."+arg[1]) {
|
||||
m.Option("sess.storm", arg[1])
|
||||
}
|
||||
}
|
||||
m.Log("info", "river: %s storm: %s", m.Option("sess.river"), m.Option("sess.storm"))
|
||||
}},
|
||||
"_exit": {Name: "_init", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmd("ctx.config", "save", "var/conf/chat.json", "web.chat.group")
|
||||
m.Cmd("ctx.config", "save", "var/conf/aaa.json", "aaa.role", "aaa.user", "aaa.sess")
|
||||
m.Cmd("ctx.config", "save", "var/conf/cli.json", "cli.runtime")
|
||||
}},
|
||||
|
||||
"/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
switch arg[0] {
|
||||
case "check":
|
||||
@ -40,6 +58,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
"/favor": {Name: "/favor", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
m.Cmdy("cli.system", arg)
|
||||
}},
|
||||
|
||||
"/ocean": {Name: "/ocean", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 0 {
|
||||
m.Confm("aaa.user", "hash", func(key string, value map[string]interface{}) {
|
||||
@ -98,6 +117,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
}},
|
||||
"/action": {Name: "/action", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) == 2 {
|
||||
m.Set("option")
|
||||
m.Confm("group", "hash."+arg[0]+".tool.hash."+arg[1]+".list", func(index int, value map[string]interface{}) {
|
||||
m.Push("river", arg[0])
|
||||
m.Push("storm", arg[1])
|
||||
@ -130,6 +150,8 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
}},
|
||||
"/steam": {Name: "/steam", Help: "hello", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
|
||||
if len(arg) < 2 {
|
||||
m.Push("user", m.Conf("cli.runtime", "boot.username"))
|
||||
m.Push("node", m.Conf("cli.runtime", "node.name"))
|
||||
m.Confm("web.space", "hash", func(key string, value map[string]interface{}) {
|
||||
m.Push("user", m.Conf("cli.runtime", "boot.username"))
|
||||
m.Push("node", value["name"])
|
||||
@ -140,6 +162,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
case "spawn":
|
||||
list := []interface{}{}
|
||||
for i := 3; i < len(arg)-3; i += 4 {
|
||||
if arg[i] == m.Conf("cli.runtime", "node.name") {
|
||||
arg[i] = ""
|
||||
}
|
||||
list = append(list, map[string]interface{}{
|
||||
"pod": arg[i],
|
||||
"ctx": arg[i+1],
|
||||
@ -157,6 +182,9 @@ var Index = &ice.Context{Name: "chat", Help: "聊天模块",
|
||||
|
||||
m.Log("info", "steam spawn %v %v %v", arg[0], arg[2], list)
|
||||
default:
|
||||
if arg[2] == m.Conf("cli.runtime", "node.name") {
|
||||
arg[2] = ""
|
||||
}
|
||||
m.Cmdy("web.space", arg[2], "ctx.command")
|
||||
}
|
||||
}},
|
||||
|
@ -95,7 +95,6 @@ func (b *Chain) Init(m *ice.Message, arg ...string) Chart {
|
||||
b.LineSize = kit.Int(kit.Select("12", arg, 4))
|
||||
b.Padding = kit.Int(kit.Select("8", arg, 5))
|
||||
b.Margin = kit.Int(kit.Select("8", arg, 6))
|
||||
m.Log("info", "data %v", kit.Formats(b.data))
|
||||
|
||||
// 计算尺寸
|
||||
b.max = map[int]int{}
|
||||
|
@ -3,6 +3,7 @@ package main
|
||||
import (
|
||||
"github.com/shylinux/icebergs"
|
||||
_ "github.com/shylinux/icebergs/core/chat"
|
||||
_ "github.com/shylinux/icebergs/core/team"
|
||||
_ "github.com/shylinux/icebergs/core/wiki"
|
||||
)
|
||||
|
||||
|
132
type.go
132
type.go
@ -115,8 +115,27 @@ type Message struct {
|
||||
cb func(*Message) *Message
|
||||
}
|
||||
|
||||
func (m *Message) Time() string {
|
||||
return m.time.Format("2006-01-02 15:04:05")
|
||||
func (m *Message) Time(args ...interface{}) string {
|
||||
t := m.time
|
||||
if len(args) > 0 {
|
||||
switch arg := args[0].(type) {
|
||||
case string:
|
||||
if d, e := time.ParseDuration(arg); e == nil {
|
||||
t, args = t.Add(d), args[1:]
|
||||
}
|
||||
}
|
||||
}
|
||||
f := "2006-01-02 15:04:05"
|
||||
if len(args) > 0 {
|
||||
switch arg := args[0].(type) {
|
||||
case string:
|
||||
f = arg
|
||||
if len(args) > 1 {
|
||||
f = fmt.Sprintf(f, args[1:]...)
|
||||
}
|
||||
}
|
||||
}
|
||||
return t.Format(f)
|
||||
}
|
||||
func (m *Message) Target() *Context {
|
||||
return m.target
|
||||
@ -129,6 +148,51 @@ func (m *Message) Format(key interface{}) string {
|
||||
return time.Now().Sub(m.time).String()
|
||||
case "meta":
|
||||
return kit.Format(m.meta)
|
||||
case "time":
|
||||
return m.Time()
|
||||
case "ship":
|
||||
return fmt.Sprintf("%s->%s", m.source.Name, m.target.Name)
|
||||
case "prefix":
|
||||
return fmt.Sprintf("%s %d %s->%s", m.Time(), m.code, m.source.Name, m.target.Name)
|
||||
case "chain":
|
||||
ms := []*Message{}
|
||||
for msg := m; msg != nil; msg = msg.message {
|
||||
ms = append(ms, msg)
|
||||
}
|
||||
|
||||
meta := append([]string{}, "\n\n")
|
||||
for i := len(ms) - 1; i >= 0; i-- {
|
||||
msg := ms[i]
|
||||
|
||||
meta = append(meta, fmt.Sprintf("%s ", msg.Format("prefix")))
|
||||
if len(msg.meta["detail"]) > 0 {
|
||||
meta = append(meta, fmt.Sprintf("detail:%d %v", len(msg.meta["detail"]), msg.meta["detail"]))
|
||||
}
|
||||
|
||||
if len(msg.meta["option"]) > 0 {
|
||||
meta = append(meta, fmt.Sprintf("option:%d %v\n", len(msg.meta["option"]), msg.meta["option"]))
|
||||
for _, k := range msg.meta["option"] {
|
||||
if v, ok := msg.meta[k]; ok {
|
||||
meta = append(meta, fmt.Sprintf(" %s: %d %v\n", k, len(v), v))
|
||||
}
|
||||
}
|
||||
} else {
|
||||
meta = append(meta, "\n")
|
||||
}
|
||||
|
||||
if len(msg.meta["append"]) > 0 {
|
||||
meta = append(meta, fmt.Sprintf(" append:%d %v\n", len(msg.meta["append"]), msg.meta["append"]))
|
||||
for _, k := range msg.meta["append"] {
|
||||
if v, ok := msg.meta[k]; ok {
|
||||
meta = append(meta, fmt.Sprintf(" %s: %d %v\n", k, len(v), v))
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(msg.meta["result"]) > 0 {
|
||||
meta = append(meta, fmt.Sprintf(" result:%d %v\n", len(msg.meta["result"]), msg.meta["result"]))
|
||||
}
|
||||
}
|
||||
return strings.Join(meta, "")
|
||||
case "stack":
|
||||
pc := make([]uintptr, 100)
|
||||
pc = pc[:runtime.Callers(5, pc)]
|
||||
@ -238,7 +302,23 @@ func (m *Message) Copy(msg *Message) *Message {
|
||||
}
|
||||
return m
|
||||
}
|
||||
func (m *Message) Push(key string, value interface{}) *Message {
|
||||
func (m *Message) Push(key string, value interface{}, arg ...interface{}) *Message {
|
||||
switch value := value.(type) {
|
||||
case map[string]interface{}:
|
||||
list := []string{}
|
||||
if len(arg) > 0 {
|
||||
list = kit.Simple(arg[0])
|
||||
} else {
|
||||
for k := range value {
|
||||
list = append(list, k)
|
||||
}
|
||||
sort.Strings(list)
|
||||
}
|
||||
for _, k := range list {
|
||||
m.Add("append", k, kit.Format(value[k]))
|
||||
}
|
||||
return m
|
||||
}
|
||||
return m.Add("append", key, kit.Format(value))
|
||||
}
|
||||
func (m *Message) Echo(str string, arg ...interface{}) *Message {
|
||||
@ -268,10 +348,10 @@ func (m *Message) Optionv(key string, arg ...interface{}) interface{} {
|
||||
}
|
||||
|
||||
for msg := m; msg != nil; msg = msg.message {
|
||||
if list, ok := m.meta[key]; ok {
|
||||
if list, ok := msg.meta[key]; ok {
|
||||
return list
|
||||
}
|
||||
if list, ok := m.data[key]; ok {
|
||||
if list, ok := msg.data[key]; ok {
|
||||
return list
|
||||
}
|
||||
}
|
||||
@ -288,7 +368,18 @@ func (m *Message) Result(arg ...interface{}) string {
|
||||
}
|
||||
|
||||
func (m *Message) Log(level string, str string, arg ...interface{}) *Message {
|
||||
fmt.Fprintf(os.Stderr, "%s %d %s->%s %s %s\n", time.Now().Format("2006-01-02 15:04:05"), m.code, m.source.Name, m.target.Name, level, fmt.Sprintf(str, arg...))
|
||||
prefix, suffix := "", ""
|
||||
switch level {
|
||||
case "cmd":
|
||||
prefix, suffix = "\033[32m", "\033[0m"
|
||||
case "cost":
|
||||
prefix, suffix = "\033[33m", "\033[0m"
|
||||
case "warn":
|
||||
prefix, suffix = "\033[31m", "\033[0m"
|
||||
}
|
||||
fmt.Fprintf(os.Stderr, "%s %d %s->%s %s%s %s%s\n",
|
||||
time.Now().Format("2006-01-02 15:04:05"), m.code, m.source.Name, m.target.Name,
|
||||
prefix, level, fmt.Sprintf(str, arg...), suffix)
|
||||
return m
|
||||
}
|
||||
func (m *Message) Assert(arg interface{}) bool {
|
||||
@ -372,6 +463,14 @@ func (m *Message) Run(arg ...string) *Message {
|
||||
m.target.server.Start(m, arg...)
|
||||
return m
|
||||
}
|
||||
func (m *Message) Runs(key string, cmd string, arg ...string) *Message {
|
||||
if s, ok := m.Target().Commands[key]; ok {
|
||||
m.meta["detail"] = append([]string{cmd}, arg...)
|
||||
m.Log("cmd", "%s.%s %s %v", m.Target().Name, key, cmd, arg)
|
||||
s.Hand(m, m.Target(), cmd, arg...)
|
||||
}
|
||||
return m
|
||||
}
|
||||
func (m *Message) Call(sync bool, cb func(*Message) *Message) *Message {
|
||||
if sync {
|
||||
wait := make(chan bool)
|
||||
@ -390,7 +489,7 @@ func (m *Message) Back(sub *Message) *Message {
|
||||
return m
|
||||
}
|
||||
|
||||
func (m *Message) Grow(key string, args interface{}, data interface{}) interface{} {
|
||||
func (m *Message) Grow(key string, args interface{}, data interface{}) map[string]interface{} {
|
||||
cache := m.Confm(key, args)
|
||||
if cache == nil {
|
||||
cache = map[string]interface{}{}
|
||||
@ -401,7 +500,12 @@ func (m *Message) Grow(key string, args interface{}, data interface{}) interface
|
||||
}
|
||||
list, _ := cache["list"].([]interface{})
|
||||
|
||||
// 添加数据
|
||||
list = append(list, data)
|
||||
meta["count"] = kit.Int(meta["count"]) + 1
|
||||
kit.Value(data, "id", meta["count"])
|
||||
|
||||
// 保存数据
|
||||
if len(list) > kit.Int(kit.Select(m.Conf("cache", "limit"), meta["limit"])) {
|
||||
least := kit.Int(kit.Select(m.Conf("cache", "least"), meta["least"]))
|
||||
|
||||
@ -415,7 +519,7 @@ func (m *Message) Grow(key string, args interface{}, data interface{}) interface
|
||||
s, e := f.Stat()
|
||||
m.Assert(e)
|
||||
|
||||
// 保存数据
|
||||
// 保存表头
|
||||
keys := []string{}
|
||||
w := csv.NewWriter(f)
|
||||
if s.Size() == 0 {
|
||||
@ -431,7 +535,7 @@ func (m *Message) Grow(key string, args interface{}, data interface{}) interface
|
||||
keys, e = r.Read()
|
||||
}
|
||||
|
||||
// 保存状态
|
||||
// 保存记录
|
||||
count := len(list) - least
|
||||
offset := kit.Int(meta["offset"])
|
||||
record, _ := meta["record"].([]interface{})
|
||||
@ -467,6 +571,8 @@ func (m *Message) Grow(key string, args interface{}, data interface{}) interface
|
||||
list = list[:least]
|
||||
w.Flush()
|
||||
}
|
||||
|
||||
// 更新数据
|
||||
cache["meta"] = meta
|
||||
cache["list"] = list
|
||||
if args == nil {
|
||||
@ -474,7 +580,7 @@ func (m *Message) Grow(key string, args interface{}, data interface{}) interface
|
||||
} else {
|
||||
m.Conf(key, args, cache)
|
||||
}
|
||||
return list
|
||||
return meta
|
||||
}
|
||||
func (m *Message) Grows(key string, args interface{}, cb interface{}) map[string]interface{} {
|
||||
cache := m.Confm(key, args)
|
||||
@ -566,9 +672,8 @@ func (m *Message) Grows(key string, args interface{}, cb interface{}) map[string
|
||||
data = append(data, list[i])
|
||||
}
|
||||
}
|
||||
val := map[string]interface{}{"meta": meta, "list": data}
|
||||
kit.Fetch(val, cb)
|
||||
return val
|
||||
kit.Fetch(data, cb)
|
||||
return meta
|
||||
}
|
||||
|
||||
func (m *Message) Cmdy(arg ...interface{}) *Message {
|
||||
@ -596,6 +701,7 @@ func (m *Message) Cmd(arg ...interface{}) *Message {
|
||||
for c := s; c != nil; c = c.context {
|
||||
if cmd, ok := c.Commands[key]; ok {
|
||||
msg = m.Spawns(s).Log("cmd", "%s.%s %v", c.Name, key, list[1:])
|
||||
msg.meta["detail"] = list
|
||||
msg.TryCatch(msg, true, func(msg *Message) {
|
||||
cmd.Hand(msg, c, key, list[1:]...)
|
||||
})
|
||||
|
Loading…
x
Reference in New Issue
Block a user