From d458130b505a26523756e2178071f56b003d01f9 Mon Sep 17 00:00:00 2001 From: shaoying Date: Thu, 5 Jul 2018 08:57:29 +0800 Subject: [PATCH] mac pro ctx.command --- etc/init.shy | 2 + src/contexts/ctx.go | 210 +++++++++++++++++++++------------------- src/contexts/web/web.go | 5 +- 3 files changed, 117 insertions(+), 100 deletions(-) diff --git a/etc/init.shy b/etc/init.shy index 8b545815..4ca10f21 100644 --- a/etc/init.shy +++ b/etc/init.shy @@ -2,3 +2,5 @@ var a = 0 source etc/local.shy ~aaa login root root +~web + command add get "https://chat.shylinux.com" diff --git a/src/contexts/ctx.go b/src/contexts/ctx.go index 3cd6bf85..abc394aa 100644 --- a/src/contexts/ctx.go +++ b/src/contexts/ctx.go @@ -1658,7 +1658,7 @@ func (m *Message) Cmd(arg ...interface{}) *Message { // {{{ m.Detail(0, arg...) } - if s := m.target.master; s != nil && s != m.source.master { + if s, t := m.source.master, m.target.master; t != nil && s != t { m.Post(s) } else { m.Exec(m.Meta["detail"][0], m.Meta["detail"][1:]...) @@ -2282,7 +2282,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心", "command_list_base": &Config{Name: "命令列表的起始位置", Value: "0", Help: "命令列表的起始位置"}, - "search_method": &Config{Name: "search_method(find/search)", Value: "find", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"}, + "search_method": &Config{Name: "search_method(find/search)", Value: "search", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"}, + "search_choice": &Config{Name: "search_choice(first/last/rand/magic)", Value: "magic", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"}, + "search_action": &Config{Name: "search_method(list/switch)", Value: "switch", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"}, + "search_root": &Config{Name: "search_root(true/false)", Value: "true", Help: "搜索方法, find: 模块名精确匹配, search: 模块名或帮助信息模糊匹配"}, "search_index": &Config{Name: "search_index", Value: "0", Help: "搜索索引"}, }, Commands: map[string]*Command{ @@ -2587,43 +2590,122 @@ var Index = &Context{Name: "ctx", Help: "模块中心", // }}} }}, "context": &Command{ - Name: "context back|[[home] [find|search] name] [info|lists|show|switch|[args]", + // Name: "context back|[[home] [find|search] name] [info|lists|show|switch|[args]", + Name: "context [[find [root|home]|search [root|home] [name|help] [magic|rand|first|last]] name] [list|info|cache|config|command|switch] [args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块,args:启动参数", - Form: map[string]int{ - "back": 0, "home": 0, - "find": 1, "search": 1, - "info": 1, "lists": 0, "show": 0, "switch": 0, - "cache": 0, "config": 0, "command": 0, - "module": 0, "domain": 0, - }, + Form: map[string]int{}, Hand: func(m *Message, c *Context, key string, arg ...string) { if m.Has("back") { // {{{ m.target = m.source return } - root := !m.Has("home") ms := []*Message{} - switch { - case m.Has("search"): - if s := m.Search(m.Get("search"), root); len(s) > 0 { - ms = append(ms, s...) - } - case m.Has("find"): - if msg := m.Find(m.Get("find"), root); msg != nil { - ms = append(ms, msg) - } - case m.Has("args"): - if s := m.Search(m.Get("args"), root); len(s) > 0 { - ms = append(ms, s...) + + action := m.Conf("search_action") + method := m.Conf("search_method") + if len(arg) > 0 { + switch arg[0] { + case "find", "search": + method = arg[0] arg = arg[1:] - break } - fallthrough - default: + } + + root := m.Confs("search_root") + if len(arg) > 0 { + switch arg[0] { + case "root": + root = true + arg = arg[1:] + case "home": + root = false + arg = arg[1:] + } + } + + if len(arg) > 0 { + switch method { + case "find": + if msg := m.Find(arg[0], root); msg != nil { + ms = append(ms, msg) + } + arg = arg[1:] + case "search": + choice := m.Conf("search_choice") + switch arg[0] { + case "magic", "rand", "first", "last": + choice = arg[0] + arg = arg[1:] + } + + if s := m.Search(arg[0], root); len(s) > 0 { + switch choice { + case "first": + ms = append(ms, s[0]) + case "last": + ms = append(ms, s[len(s)-1]) + case "rand": + ms = append(ms, s[rand.Intn(len(s))]) + case "magic": + ms = append(ms, s...) + } + } + arg = arg[1:] + } + } else { ms = append(ms, m) } + if len(arg) == 0 { + arg = []string{action} + } + + for _, msg := range ms { + switch arg[0] { + case "switch": + m.target = msg.target + case "list": + msg.Travel(msg.target, func(msg *Message) bool { + target := msg.target + m.Echo("%s(", target.Name) + + if target.context != nil { + m.Echo("%s", target.context.Name) + } + m.Echo(":") + + if target.master != nil { + m.Echo("%s", target.master.Name) + } + m.Echo(":") + + if target.Owner != nil { + m.Echo("%s", target.Owner.Name) + } + m.Echo(":") + + msg.target = msg.target.Owner + if msg.target != nil && msg.Check(msg.target, "caches", "username") && msg.Check(msg.target, "caches", "group") { + m.Echo("%s:%s", msg.Cap("username"), msg.Cap("group")) + } + m.Echo("): ") + msg.target = target + + if msg.Check(msg.target, "caches", "status") && msg.Check(msg.target, "caches", "stream") { + m.Echo("%s(%s) ", msg.Cap("status"), msg.Cap("stream")) + } + m.Echo("%s\n", target.Help) + return true + }) + default: + msg.Cmd(arg) + m.Meta["result"] = append(m.Meta["result"], msg.Meta["result"]...) + m.Copy(msg, "append") + } + } + return + for _, v := range ms { // v.Meta = m.Meta // v.Data = m.Data @@ -2763,8 +2845,8 @@ var Index = &Context{Name: "ctx", Help: "模块中心", // }}} }}, "server": &Command{ - Name: "server [spawn|begin|start|close|][args]", - Help: "服务启动停止切换", + Name: "server [spawn|begin|start|close][args]", + Help: "查看、新建、初始化、启动、停止服务", Hand: func(m *Message, c *Context, key string, arg ...string) { switch len(arg) { // {{{ case 0: @@ -2791,6 +2873,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", msg.target.Start(msg) case "close": msg := m.Spawn().Set("detail", arg...) + m.target = msg.target.context msg.target.Close(msg) } } @@ -2798,10 +2881,9 @@ var Index = &Context{Name: "ctx", Help: "模块中心", }}, "command": &Command{ Name: "command [all|add cmd arg...|list [begin [end]]|test [begin [end]]|delete cmd]", Help: "查看或修改命令", - Form: map[string]int{"delete": 0, "condition": -1}, + Form: map[string]int{"condition": -1}, Hand: func(m *Message, c *Context, key string, arg ...string) { - all := m.Has("all") // {{{ - if len(arg) == 0 { + if len(arg) == 0 { // {{{ keys := []string{} for k, _ := range m.target.Commands { keys = append(keys, k) @@ -2932,72 +3014,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心", delete(m.target.Commands, arg[1]) } } - - switch len(arg) { - case 0: - case 1: - switch { - case m.Has("delete"): - case m.Has("void"): - if x, ok := m.target.Commands[arg[0]]; ok { - if m.target.Owner == nil || m.master.Owner == m.target.Owner { - x.Hand = nil - } - } - default: - msg := m.Spawn(m.Target()).Cmd(arg) - msg.Option("nrecv", m.Option("nrecv")) - m.Meta = msg.Meta - } - return - - m.BackTrace(func(m *Message) bool { - if all { - m.Echo("%s commands:\n", m.target.Name) - } - if x, ok := m.target.Commands[arg[0]]; ok { - if all { - m.Echo(" ") - } - if m.Check(m.target, "commands", arg[0]) { - m.Echo("%s\n %s\n", x.Name, x.Help) - } - } - return all - }) - m.Assert(m.Has("result"), "%s 命令不存在", arg[0]) - default: - msg := m.Spawn(m.Target()).Cmd(arg) - msg.Option("nrecv", m.Option("nrecv")) - m.Meta = msg.Meta - /* - case 3: - cmd := &Command{} - m.BackTrace(func(m *Message) bool { - if x, ok := m.target.Commands[arg[0]]; ok && x.Hand != nil { - *cmd = *x - } - return all - }) - - if m.Check(m.target, "commands", arg[0]) { - if x, ok := m.target.Commands[arg[0]]; ok { - if m.target.Owner == nil || m.master.Owner == m.target.Owner { - x.Name = arg[1] - x.Help = arg[2] - m.Echo("%s\n %s\n", x.Name, x.Help) - } - } else { - if m.target.Commands == nil { - m.target.Commands = map[string]*Command{} - } - cmd.Name = arg[1] - cmd.Help = arg[2] - m.target.Commands[arg[0]] = cmd - } - } - */ - } // }}} }}, "config": &Command{ diff --git a/src/contexts/web/web.go b/src/contexts/web/web.go index 6fe246cc..23f48934 100644 --- a/src/contexts/web/web.go +++ b/src/contexts/web/web.go @@ -44,10 +44,9 @@ type WEB struct { *ctx.Context } -func (web *WEB) generate(m *ctx.Message, uri string, arg ...string) string { // {{{ +func (web *WEB) Merge(m *ctx.Message, uri string, arg ...string) string { // {{{ add, e := url.Parse(uri) m.Assert(e) - adds := []string{m.Confx("protocol", add.Scheme, "%s://"), m.Confx("hostname", add.Host)} if dir, file := path.Split(add.EscapedPath()); path.IsAbs(dir) { @@ -342,7 +341,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心", } method := m.Confx("method") - uri := web.generate(m, arg[0], arg[1:]...) + uri := web.Merge(m, arg[0], arg[1:]...) m.Log("info", nil, "GET %s", uri) m.Echo("%s: %s\n", method, uri)