diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index e2273d09..cf9b486f 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -287,6 +287,7 @@ const ( RENAME = "rename" REMOVE = "remove" COMMIT = "commit" + INVITE = "invite" INSERT = "insert" DELETE = "delete" diff --git a/base/ssh/script.go b/base/ssh/script.go index 4bfcd65c..5301452f 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -258,6 +258,7 @@ func (f *Frame) parse(m *ice.Message, line string) string { return "" } func (f *Frame) scan(m *ice.Message, file, line string, r io.Reader) *Frame { + m.Option("ssh.return", func() { f.exit = true }) f.ps1 = kit.Simple(m.Confv("prompt", "meta.PS1")) f.ps2 = kit.Simple(m.Confv("prompt", "meta.PS2")) ps := f.ps1 @@ -423,8 +424,10 @@ var Index = &ice.Context{Name: "ssh", Help: "终端模块", f.printf(m, m.Cmdx(cli.PYTHON, "qrcode", strings.Join(arg, ""))) }}, RETURN: {Name: "return", Help: "结束脚本", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - f := m.Target().Server().(*Frame) - f.exit = true + switch cb := m.Optionv("ssh.return").(type) { + case func(): + cb() + } }}, REMOTE: {Name: "remote user remote port local", Help: "远程连接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/base/web/route.go b/base/web/route.go index 30d83d12..e224f175 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -82,10 +82,9 @@ func init() { return } if len(arg) > 2 && arg[0] != "" { - // m.Cmdy(SPACE, arg[0], kit.Split(kit.Keys(arg[1], strings.Join(arg[2:], " ")))) m.Cmdy(SPACE, arg[0], "context", arg[1], "command", arg[2]) - m.Option("_process", "_field") m.Option("_prefix", arg[0], arg[1], arg[2], "run") + m.Option("_process", "_field") return } if len(arg) > 1 && arg[0] != "" { diff --git a/base/web/serve.go b/base/web/serve.go index c3adaee7..3f997b24 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -29,12 +29,12 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt if !msg.Options(ice.MSG_USERNAME) && tcp.IPIsLocal(msg, msg.Option(ice.MSG_USERIP)) { // 自动认证 - // if aaa.UserLogin(msg, cli.UserName, cli.PassWord) { - // if strings.HasPrefix(msg.Option(ice.MSG_USERUA), "Mozilla/5.0") { - // // msg.Option(ice.MSG_SESSID, aaa.SessCreate(msg, msg.Option(ice.MSG_USERNAME), msg.Option(ice.MSG_USERROLE))) - // // Render(msg, "cookie", msg.Option(ice.MSG_SESSID)) - // } - // } + if aaa.UserLogin(msg, cli.UserName, cli.PassWord) { + if strings.HasPrefix(msg.Option(ice.MSG_USERUA), "Mozilla/5.0") { + // msg.Option(ice.MSG_SESSID, aaa.SessCreate(msg, msg.Option(ice.MSG_USERNAME), msg.Option(ice.MSG_USERROLE))) + // Render(msg, "cookie", msg.Option(ice.MSG_SESSID)) + } + } } if _, ok := msg.Target().Commands[LOGIN]; ok { diff --git a/base/web/space.go b/base/web/space.go index bb1f2d8a..04a6a6dd 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -175,6 +175,7 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w // 下发失败 msg.Warn(true, "space error") source, target = []string{}, kit.Revert(source)[1:] + continue } _space_echo(msg, source, target, socket, name) @@ -266,7 +267,8 @@ func init() { m.Event(SPACE_START, "type", kind, "name", name, "share", share, "river", river) defer m.Event(SPACE_CLOSE, "type", kind, "name", name, "share", share, "river", river) } - _space_handle(m, false, m.Target().Server().(*Frame).send, s, name) + frame := m.Target().Server().(*Frame) + _space_handle(m, false, frame.send, s, name) m.Log(ice.LOG_CLOSE, "%s: %s", name, kit.Format(m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h)))) m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") return nil diff --git a/core/chat/chat.go b/core/chat/chat.go index 65320db7..a7222f42 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -16,10 +16,10 @@ var Index = &ice.Context{Name: CHAT, Help: "聊天中心", "base", kit.Dict( "info", []interface{}{ "web.chat.info", - "web.chat.code", - "web.chat.node", - "web.chat.tool", + "web.chat.auth", "web.chat.user", + "web.chat.tool", + "web.chat.node", }, "miss", []interface{}{ "web.team.task", diff --git a/core/chat/river.go b/core/chat/river.go index 0dea85d8..f91b6d86 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -6,15 +6,18 @@ import ( "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/web" + "github.com/shylinux/icebergs/core/code" + "github.com/shylinux/icebergs/core/wiki" kit "github.com/shylinux/toolkits" ) func _river_list(m *ice.Message) { if m.Option("share") != "" && m.Option("share") != "" { m.Option(ice.MSG_RIVER, m.Option("river")) - if m.Cmd(CODE, m.Option("share")).Append(kit.MDB_TYPE) == USER { + if m.Cmd(AUTH, m.Option("share")).Append(kit.MDB_TYPE) == USER { if m.Cmd(USER, m.Option(ice.MSG_USERNAME)).Append(ice.MSG_USERNAME) == "" { m.Cmd(USER, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) + // 加入群组 } } } @@ -24,19 +27,27 @@ func _river_list(m *ice.Message) { if p := m.Option(POD); p != "" { m.Option(POD, "") - // 代理列表 m.Cmdy(web.SPACE, p, "web.chat./river") + // 代理列表 } + m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Push(key, value[kit.MDB_META], []string{kit.MDB_HASH, kit.MDB_NAME}, val[kit.MDB_META]) }) }) } +func _river_proxy(m *ice.Message, pod string) (proxy []string) { + if p := kit.Select(m.Option(POD), pod); p != "" { + proxy = append(proxy, web.SPACE, p) + m.Option(POD, "") + } + return proxy +} const ( INFO = "info" - CODE = "code" + AUTH = "auth" NODE = "node" TOOL = "tool" USER = "user" @@ -57,51 +68,43 @@ func init() { m.Option(mdb.FIELDS, mdb.DETAIL) m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, m.Option(ice.MSG_RIVER)) }}, - CODE: {Name: "code hash auto 添加", Help: "共享", Action: map[string]*ice.Action{ + AUTH: {Name: "auth hash auto 添加", Help: "授权", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create type=node,user name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, + m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), AUTH), mdb.HASH, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), kit.MDB_TIME, m.Time("72h"), arg) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), AUTH), mdb.HASH, + kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, + m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), AUTH), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, "time,hash,userrole,username,type,name,text") - m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), CODE), mdb.HASH, kit.MDB_HASH, arg) + m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), AUTH), mdb.HASH, kit.MDB_HASH, arg) m.PushAction("删除") }}, NODE: {Name: "node name ctx cmd auto 邀请", Help: "设备", Action: map[string]*ice.Action{ - "invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { - m.Option(web.SHARE, m.Cmdx(CODE, mdb.CREATE, "type", NODE)) - m.Cmdy("web.code.publish", "contexts", "tool") + mdb.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + m.Option(web.SHARE, m.Cmdx(AUTH, mdb.CREATE, kit.MDB_TYPE, NODE)) + m.Cmdy(code.PUBLISH, "contexts", "tool") }}, web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { return } - if msg := m.Cmd(CODE, m.Option("share")); msg.Append(kit.MDB_TYPE) == NODE { + if msg := m.Cmd(AUTH, m.Option("share")); msg.Append(kit.MDB_TYPE) == NODE { m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, arg) } }}, web.SPACE_CLOSE: {Name: "close", Help: "关闭", Hand: func(m *ice.Message, arg ...string) { }}, - - // mdb.INSERT: {Name: "insert route", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - // m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, arg) - // }}, - // mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - // m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), NODE), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) - // }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.ROUTE) - }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)) + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), NODE), mdb.HASH, + kit.MDB_NAME, m.Option(kit.MDB_NAME)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { @@ -112,7 +115,7 @@ func init() { } m.Cmdy(web.ROUTE, arg) }}, - TOOL: {Name: "tool hash auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{ + TOOL: {Name: "tool hash id auto 添加 创建", Help: "工具", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, arg) }}, @@ -121,33 +124,36 @@ func init() { }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { if m.Option(kit.MDB_ID) != "" { - m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, m.Option(kit.MDB_HASH)), mdb.LIST, + kit.MDB_ID, m.Option(kit.MDB_ID), arg) } else { - m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, + kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) } }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) + m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL), mdb.HASH, + kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { switch arg[0] { - case "hash": + case kit.MDB_HASH: m.Cmd(TOOL).Table(func(index int, value map[string]string, head []string) { - m.Push("hash", value["hash"]) - m.Push("name", value["name"]) + m.Push(kit.MDB_HASH, value[kit.MDB_HASH]) + m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) }) case POD: m.Cmdy(web.ROUTE) case CTX: m.Cmd(ctx.CONTEXT, "web").Table(func(index int, value map[string]string, head []string) { - m.Push(CTX, kit.Keys(kit.Select("", value["ups"], value["ups"] != "shy"), value["name"])) - m.Push("help", value["help"]) + m.Push(CTX, kit.Keys(kit.Select("", value["ups"], value["ups"] != "shy"), value[kit.MDB_NAME])) + m.Push(kit.MDB_HELP, value[kit.MDB_HELP]) }) case CMD, "help": m.Cmd(ctx.CONTEXT, m.Option(CTX), ctx.COMMAND).Table(func(index int, value map[string]string, head []string) { - m.Push(CMD, value["key"]) - m.Push("name", value["name"]) - m.Push("help", value["help"]) + m.Push(CMD, value[kit.MDB_KEY]) + m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) + m.Push(kit.MDB_HELP, value[kit.MDB_HELP]) }) } }}, @@ -160,22 +166,36 @@ func init() { } m.Option(mdb.FIELDS, "time,id,pod,ctx,cmd,help") - m.Cmdy(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, arg[1:]) - if len(m.Appendv(CMD)) == 0 && len(arg) > 1 { - m.Push("cmd", arg[1]) + msg := m.Cmd(mdb.SELECT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1)) + if len(msg.Appendv(CMD)) == 0 && len(arg) > 1 { + msg.Push(CMD, arg[1]) } + + if len(arg) > 2 && arg[2] == "run" { + m.Cmdy(_river_proxy(m, msg.Append(POD)), kit.Keys(msg.Append(CTX), msg.Append(CMD)), arg[3:]) + return + } + if m.Copy(msg); len(arg) < 2 { + return + } + + m.Option("_process", "_field") + m.Option("_prefix", arg[0], arg[1], "run") + m.Table(func(index int, value map[string]string, head []string) { + m.Cmdy(web.SPACE, value[POD], ctx.CONTEXT, value[CTX], ctx.COMMAND, value[CMD]) + }) }}, USER: {Name: "user username auto 邀请", Help: "用户", Action: map[string]*ice.Action{ - "invite": {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { - share := m.Option(web.SHARE, m.Cmdx(CODE, mdb.CREATE, kit.MDB_TYPE, USER)) - m.Cmdy("web.wiki.spark", "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share)) - m.Cmdy("web.wiki.image", "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share)) + mdb.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { + share := m.Option(web.SHARE, m.Cmdx(AUTH, mdb.CREATE, kit.MDB_TYPE, USER)) + m.Cmdy(wiki.SPARK, "inner", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share)) + m.Cmdy(wiki.IMAGE, "qrcode", kit.MergeURL(m.Option(ice.MSG_USERWEB), "river", m.Option(ice.MSG_RIVER), "share", share)) m.Render("") }}, mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, arg) }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.DELETE, RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), USER), mdb.HASH, aaa.USERNAME, m.Option(aaa.USERNAME)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -202,7 +222,7 @@ func init() { kit.Fetch(value, func(index int, value string) { m.Search(value, func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { - m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, "ctx", s.Cap(ice.CTX_FOLLOW), "cmd", key, "help", kit.Simple(cmd.Help)[0]) + m.Cmd(TOOL, mdb.INSERT, kit.MDB_HASH, h, CTX, s.Cap(ice.CTX_FOLLOW), CMD, key, kit.MDB_HELP, kit.Simple(cmd.Help)[0]) }) }) }) diff --git a/misc/alpha/alpha.go b/misc/alpha/alpha.go index eec16909..29fac0c4 100644 --- a/misc/alpha/alpha.go +++ b/misc/alpha/alpha.go @@ -7,64 +7,31 @@ import ( "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/wiki" kit "github.com/shylinux/toolkits" - "github.com/shylinux/toolkits/task" - "io/ioutil" "os" "path" "strings" - "sync" ) func _alpha_find(m *ice.Message, method, word string) { // 搜索方法 switch word = strings.TrimSpace(word); method { - case LINE: - case WORD: + case "line": + case "word": word = "," + word + "$" } // 搜索词汇 msg := m.Cmd(cli.SYSTEM, "grep", "-rh", word, m.Conf(ALPHA, "meta.store")) - msg.CSV(msg.Result(), kit.Simple(m.Confv(ALPHA, "meta.field"))...).Table(func(index int, line map[string]string, head []string) { - if method == WORD && index == 0 { - // 添加收藏 - m.Cmd(web.FAVOR, m.Conf(ALPHA, "meta.favor"), ALPHA, line["word"], line["translation"], - "id", line["id"], "definition", line["definition"]) + msg.CSV(msg.Result(), kit.Simple(m.Confv(ALPHA, "meta.field"))...).Table(func(index int, value map[string]string, head []string) { + if value["word"] == "" { + return } for _, k := range []string{"id", "word", "translation", "definition"} { - // 输出词汇 - m.Push(k, line[k]) + m.Push(k, value[k]) } }) } -func _alpha_find2(m *ice.Message, method, word string) { - p := path.Join(m.Conf(ALPHA, "meta.store"), ALPHA+".ecdict") - if ls, e := ioutil.ReadDir(p); m.Assert(e) { - args := []interface{}{} - for _, v := range ls { - args = append(args, v) - } - - var mu sync.Mutex - task.Wait(args, func(task *task.Task, lock *task.Lock) error { - info := task.Arg.(os.FileInfo) - file := path.Join(p, info.Name()) - kit.CSV(file, 100000, func(index int, value map[string]string, head []string) { - if value["word"] != word { - return - } - - mu.Lock() - defer mu.Unlock() - m.Push("word", value["word"]) - m.Push("translation", value["translation"]) - m.Push("definition", value["definition"]) - }) - return nil - }) - } -} func _alpha_load(m *ice.Message, file, name string) { // 清空数据 meta := m.Confm(ALPHA, "meta") @@ -89,36 +56,25 @@ func _alpha_load(m *ice.Message, file, name string) { } const ALPHA = "alpha" -const ( - WORD = "word" - LINE = "line" -) -var Index = &ice.Context{Name: "alpha", Help: "英汉词典", +var Index = &ice.Context{Name: ALPHA, Help: "英汉词典", Configs: map[string]*ice.Config{ - ALPHA: {Name: "alpha", Help: "英汉词典", Value: kit.Data( - kit.MDB_STORE, "usr/export/alpha", kit.MDB_FSIZE, "2000000", + ALPHA: {Name: ALPHA, Help: "英汉词典", Value: kit.Data( kit.MDB_LIMIT, "50000", kit.MDB_LEAST, "1000", - "repos", "word-dict", "local", "person", - "field", []interface{}{"audio", "bnc", "collins", "definition", "detail", "exchange", "frq", "id", "oxford", "phonetic", "pos", "tag", "time", "translation", "word"}, - web.FAVOR, "alpha.word", + kit.MDB_STORE, "usr/export/alpha", kit.MDB_FSIZE, "2000000", + kit.MDB_REPOS, "word-dict", kit.MDB_FIELD, []interface{}{"audio", "bnc", "collins", "definition", "detail", "exchange", "frq", "id", "oxford", "phonetic", "pos", "tag", "time", "translation", "word"}, )}, }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(ALPHA) }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, - "find": {Name: "find word=hi method auto", Help: "查找词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _alpha_find(m, kit.Select("word", arg, 1), arg[0]) - }}, - "find2": {Name: "find word=hi method auto", Help: "查找词汇", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _alpha_find2(m, kit.Select("word", arg, 1), arg[0]) - }}, - "load": {Name: "load file [name]", Help: "加载词库", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if meta := m.Confm(ALPHA, "meta"); len(arg) == 0 { - arg = append(arg, path.Join("usr", kit.Format(meta["repos"]), "ecdict")) - } - _alpha_load(m, arg[0], kit.Select(path.Base(arg[0]), arg, 1)) + ALPHA: {Name: "alpha method=word,line word auto", Help: "英汉", Action: map[string]*ice.Action{ + mdb.IMPORT: {Name: "import file=usr/word-dict/ecdict name", Help: "加载词库", Hand: func(m *ice.Message, arg ...string) { + _alpha_load(m, m.Option(kit.MDB_FILE), kit.Select(path.Base(m.Option(kit.MDB_FILE)), m.Option(kit.MDB_NAME))) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + _alpha_find(m, arg[0], arg[1]) }}, }, } diff --git a/misc/input/input.go b/misc/input/input.go index 344469b0..99d7d114 100644 --- a/misc/input/input.go +++ b/misc/input/input.go @@ -74,7 +74,7 @@ func _input_find(m *ice.Message, method, word, limit string) { } else { // 输出词汇 - m.Push(FILE, path.Base(line[0])) + // m.Push(FILE, path.Base(line[0])) m.Push(kit.MDB_ID, line[3]) m.Push(CODE, line[2]) m.Push(TEXT, line[4]) @@ -149,9 +149,9 @@ const ( LINE = "line" ) const ( - INPUT = "input" - WUBI = "wubi" + WUBI = "wubi" ) +const INPUT = "input" var Index = &ice.Context{Name: INPUT, Help: "输入法", Configs: map[string]*ice.Config{ @@ -165,13 +165,10 @@ var Index = &ice.Context{Name: INPUT, Help: "输入法", ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save(INPUT) }}, - WUBI: {Name: "wubi path=auto auto 添加 导入", Help: "五笔", Action: map[string]*ice.Action{ + WUBI: {Name: "wubi method=word,line code= auto", Help: "五笔", Action: map[string]*ice.Action{ mdb.INSERT: {Name: "insert zone=person text= code= weight=", Help: "添加", Hand: func(m *ice.Message, arg ...string) { _input_push(m, kit.Select("person", m.Option("zone")), m.Option("text"), m.Option("code"), m.Option("weight")) }}, - mdb.SELECT: {Name: "select method=word code= ", Help: "查找", Hand: func(m *ice.Message, arg ...string) { - _input_find(m, kit.Select("word", m.Option("method")), m.Option("code"), m.Option("cache.limit")) - }}, mdb.EXPORT: {Name: "export file=usr/wubi-dict/person zone=person", Help: "导出", Hand: func(m *ice.Message, arg ...string) { // _input_save(m, kit.Select("usr/wubi-dict/person", m.Option("file")), m.Option("zone")) }}, @@ -179,12 +176,7 @@ var Index = &ice.Context{Name: INPUT, Help: "输入法", _input_load(m, kit.Select("usr/wubi-dict/person", m.Option("file")), m.Option("zone")) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(nfs.DIR_ROOT, m.Conf(INPUT, "meta.store")) - if len(arg) > 0 && strings.HasSuffix(arg[0], "csv") { - m.CSV(m.Cmdx(nfs.CAT, arg[0])) - } else { - m.Cmdy(nfs.DIR, kit.Select("./", arg, 0)) - } + _input_find(m, arg[0], arg[1], m.Option("cache.limit")) }}, }, } diff --git a/misc/vim/input.go b/misc/vim/input.go index cab69134..ed569bee 100644 --- a/misc/vim/input.go +++ b/misc/vim/input.go @@ -57,7 +57,7 @@ func init() { } // 词汇列表 - m.Cmd("web.code.input.wubi", "select", "code", arg[0]).Table(func(index int, value map[string]string, head []string) { + m.Cmd("web.code.input.wubi", "word", arg[0]).Table(func(index int, value map[string]string, head []string) { m.Echo("%s\n", value["text"]) }) diff --git a/type.go b/type.go index 5400edd6..72080501 100644 --- a/type.go +++ b/type.go @@ -587,19 +587,19 @@ func (m *Message) Search(key interface{}, cb interface{}) *Message { break } - for _, p := range []*Context{m.target, p, m.source} { - for c := p; c != nil; c = c.context { - if cmd, ok := c.Commands[key]; ok { - cb(c, p, key, cmd) + for _, p := range []*Context{p, m.target, m.source} { + for s := p; s != nil; s = s.context { + if cmd, ok := s.Commands[key]; ok { + cb(s.context, s, key, cmd) return m } } } case func(p *Context, s *Context, key string, conf *Config): - for _, p := range []*Context{m.target, p, m.source} { - for c := p; c != nil; c = c.context { - if cmd, ok := c.Configs[key]; ok { - cb(c.context, c, key, cmd) + for _, p := range []*Context{p, m.target, m.source} { + for s := p; s != nil; s = s.context { + if cmd, ok := s.Configs[key]; ok { + cb(s.context, s, key, cmd) return m } } @@ -626,9 +626,9 @@ func (m *Message) Cmd(arg ...interface{}) *Message { return m } - m.Search(list[0], func(p *Context, c *Context, key string, cmd *Command) { - m.TryCatch(m.Spawns(c), true, func(msg *Message) { - m = p.cmd(msg, cmd, key, list[1:]...) + m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) { + m.TryCatch(m.Spawns(s), true, func(msg *Message) { + m = s.cmd(msg, cmd, key, list[1:]...) }) })