From 931e61fd88c1de98cab7ce115d8e7459fe295b02 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Thu, 28 Oct 2021 18:49:35 +0800 Subject: [PATCH] opt chat --- base/aaa/role.go | 4 +- base/cli/daemon.go | 4 +- base/cli/system.go | 2 +- base/ctx/command.go | 6 +- base/lex/lex.go | 2 +- base/nfs/cat.go | 6 +- base/nfs/dir.go | 1 + base/nfs/save.go | 12 +- base/ssh/scripts.go | 7 +- base/web/render.go | 2 +- base/web/serve.go | 11 +- base/web/share.go | 2 +- base/web/space.go | 19 +-- base/web/spide.go | 10 +- base/web/web.go | 2 +- conf.go | 8 ++ core/chat/action.go | 243 ++++++++++++++++---------------- core/chat/chat.shy | 18 ++- core/chat/cmd.go | 152 ++++++++------------ core/chat/div.go | 40 +++--- core/chat/files.go | 48 +++---- core/chat/footer.go | 36 ++--- core/chat/header.go | 91 ++++++------ core/chat/location.go | 37 ++--- core/chat/{user.go => ocean.go} | 30 ++-- core/chat/paste.go | 42 +++--- core/chat/pod.go | 51 +++---- core/chat/river.go | 212 +++++++++++++--------------- core/chat/scan.go | 44 +++--- core/chat/scan.js | 18 +++ core/chat/search.go | 13 +- core/chat/{tool.go => storm.go} | 98 ++++++------- core/code/binpack.go | 4 +- core/code/inner.go | 10 +- core/code/vimer.go | 2 +- core/code/webpack.go | 13 +- exec.go | 8 +- init.go | 2 + logs.go | 36 +++-- meta.go | 18 ++- misc.go | 4 +- misc/bash/sess.go | 4 +- misc/lark/home.go | 4 +- misc/ssh/service.go | 8 +- misc/ssh/service_linux.go | 4 +- misc/trash/web/_favor.go | 4 +- misc/vim/sess.go | 6 +- misc/wework/bot.go | 5 +- misc/wx/access.go | 2 +- misc/wx/login.go | 4 +- render.go | 17 +++ type.go | 48 +++++-- 52 files changed, 752 insertions(+), 722 deletions(-) rename core/chat/{user.go => ocean.go} (50%) create mode 100644 core/chat/scan.js rename core/chat/{tool.go => storm.go} (50%) diff --git a/base/aaa/role.go b/base/aaa/role.go index 64978f9f..d510b344 100644 --- a/base/aaa/role.go +++ b/base/aaa/role.go @@ -60,7 +60,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) { } } - if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) { + if m.Warn(!ok, ice.ErrNotRight, keys, USERROLE, userrole) { return } if userrole == TECH { @@ -75,7 +75,7 @@ func _role_right(m *ice.Message, userrole string, keys ...string) (ok bool) { } } - if m.Warn(!ok, ice.ErrNotRight, userrole, ice.OF, keys) { + if m.Warn(!ok, ice.ErrNotRight, keys, USERROLE, userrole) { return } // 普通用户 diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 8a05974d..c9195d86 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -21,7 +21,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) { } // 启动进程 - if e := cmd.Start(); m.Warn(e != nil, cmd.Args, ice.SP, e) { + if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) { return // 启动失败 } m.Echo("%d", cmd.Process.Pid) @@ -33,7 +33,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) { m.OptionSimple(CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT), ) - if e := cmd.Wait(); m.Warn(e != nil, cmd.Args, ice.SP, e) { + if e := cmd.Wait(); m.Warn(e, ice.ErrNotStart, cmd.Args) { if m.Conf(DAEMON, kit.Keys(kit.MDB_HASH, h, kit.Keym(kit.MDB_STATUS))) == START { m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, kit.MDB_HASH, h, kit.MDB_STATUS, ERROR, ERROR, e) } diff --git a/base/cli/system.go b/base/cli/system.go index 8c09ab9f..a479cf09 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -68,7 +68,7 @@ func _system_exec(m *ice.Message, cmd *exec.Cmd) { } // 执行命令 - if e := cmd.Run(); !m.Warn(e != nil, cmd.Args, ice.SP, e) { + if e := cmd.Run(); !m.Warn(e, ice.ErrNotFound, cmd.Args) { m.Cost(kit.MDB_CODE, cmd.ProcessState.ExitCode(), kit.MDB_ARGS, cmd.Args) } diff --git a/base/ctx/command.go b/base/ctx/command.go index c067db9c..2385cdc7 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -56,7 +56,7 @@ func CmdAction(fields ...string) map[string]*ice.Action { } }}, ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - if !m.PodCmd(arg) { + if m.Right(arg) && !m.PodCmd(arg) { m.Cmdy(arg) } }}, @@ -80,7 +80,9 @@ func init() { } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _command_list(m, kit.Keys(arg)) + for _, key := range arg { + _command_list(m, key) + } }}, }}) } diff --git a/base/lex/lex.go b/base/lex/lex.go index 8ebc7d64..7e9be7ce 100644 --- a/base/lex/lex.go +++ b/base/lex/lex.go @@ -8,4 +8,4 @@ const LEX = "lex" var Index = &ice.Context{Name: LEX, Help: "词法模块"} -func init() { ice.Index.Register(Index, nil) } +func init() { ice.Index.Register(Index, nil, SPLIT) } diff --git a/base/nfs/cat.go b/base/nfs/cat.go index a4da9e03..73e91c71 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -36,12 +36,12 @@ func _cat_right(m *ice.Message, name string) bool { case ice.USR: switch kit.Select("", ls, 1) { case "local": - if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, ice.OF, name) { + if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, name) { return false } } case ice.ETC, ice.VAR: - if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, ice.OF, name) { + if m.Warn(m.Option(ice.MSG_USERROLE) == aaa.VOID, ice.ErrNotRight, name) { return false } } @@ -99,7 +99,7 @@ func _cat_list(m *ice.Message, name string) { default: buf := make([]byte, ice.MOD_BUFS) for begin := 0; true; { - if n, e := f.Read(buf[begin:]); !m.Warn(e != nil && e != io.EOF, e) { + if n, e := f.Read(buf[begin:]); !m.Warn(e, ice.ErrNotFound, name) { m.Log_IMPORT(kit.MDB_FILE, name, kit.MDB_SIZE, n) if begin += n; begin < len(buf) { buf = buf[:begin] diff --git a/base/nfs/dir.go b/base/nfs/dir.go index bcb7a9b4..1448b734 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -206,6 +206,7 @@ func init() { m.Cmdy(TRASH, m.Option(kit.MDB_PATH)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Info("dir_root: %v", m.Option(DIR_ROOT)) _dir_list(m, kit.Select("./", m.Option(DIR_ROOT)), kit.Select("", arg, 0), 0, m.Option(DIR_DEEP) == ice.TRUE, kit.Select(TYPE_BOTH, m.Option(DIR_TYPE)), kit.Regexp(m.Option(DIR_REG)), kit.Split(kit.Select(kit.Select("time,path,size,action", m.OptionFields()), kit.Join(kit.Slice(arg, 1))))) diff --git a/base/nfs/save.go b/base/nfs/save.go index b4b909e0..31391140 100644 --- a/base/nfs/save.go +++ b/base/nfs/save.go @@ -49,10 +49,10 @@ func _copy_file(m *ice.Message, name string, from ...string) { defer f.Close() for _, v := range from { - if s, e := os.Open(v); !m.Warn(e != nil, e) { + if s, e := os.Open(v); !m.Warn(e, ice.ErrNotFound, name) { defer s.Close() - if n, e := io.Copy(f, s); !m.Warn(e != nil, e) { + if n, e := io.Copy(f, s); !m.Warn(e, ice.ErrNotFound, name) { m.Log_IMPORT(kit.MDB_FILE, v, kit.MDB_SIZE, n) m.Log_EXPORT(kit.MDB_FILE, p, kit.MDB_SIZE, n) } @@ -67,7 +67,7 @@ func _link_file(m *ice.Message, name string, from string) { } os.Remove(name) os.MkdirAll(path.Dir(name), ice.MOD_DIR) - m.Warn(os.Link(from, name) != nil, "link err of", from) + m.Warn(os.Link(from, name), ice.ErrNotFound, from) m.Echo(name) } @@ -95,7 +95,11 @@ func init() { _push_file(m, arg[0], arg[1:]...) }}, COPY: {Name: "copy file from...", Help: "复制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _copy_file(m, arg[0], arg[1:]...) + for _, file := range arg[1:] { + if _, e := os.Stat(file); e == nil { + _copy_file(m, arg[0], arg[1:]...) + } + } }}, LINK: {Name: "link file from", Help: "链接", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _link_file(m, arg[0], arg[1]) diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 3dab68b7..99736eb3 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -163,9 +163,12 @@ func (f *Frame) scan(m *ice.Message, h, line string) *Frame { ps = f.ps2 continue // 多行 } - if line = kit.Split(line, "#", "#", "#")[0]; len(line) == 0 { - continue // 注释 + if strings.HasPrefix(strings.TrimSpace(line), "#") { + continue } + // if line = strings.Split(line, " # ")[0]; len(line) == 0 { + // continue // 注释 + // } if ps = f.ps1; f.stdout == os.Stdout { f.printf(m, "\033[0m") // 清空格式 } diff --git a/base/web/render.go b/base/web/render.go index 7cead980..f8243892 100644 --- a/base/web/render.go +++ b/base/web/render.go @@ -62,7 +62,7 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { msg.Echo(kit.Format(cmd, args...)) } msg.W.Header().Set(ContentType, ContentJSON) - fmt.Fprint(msg.W, msg.FormatMeta()) + fmt.Fprint(msg.W, msg.FormatsMeta()) } } func RenderHeader(msg *ice.Message, key, value string) { diff --git a/base/web/serve.go b/base/web/serve.go index d35f1e19..cbd5a728 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -99,7 +99,6 @@ func _serve_params(msg *ice.Message, path string) { } func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.ResponseWriter, r *http.Request) { // 环境变量 - msg.Option(ice.CACHE_LIMIT, "10") msg.Option(ice.MSG_OUTPUT, "") msg.Option(ice.MSG_SESSID, "") for _, v := range r.Cookies() { @@ -130,7 +129,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon switch r.Header.Get(ContentType) { case ContentJSON: var data interface{} - if e := json.NewDecoder(r.Body).Decode(&data); !msg.Warn(e != nil, e) { + if e := json.NewDecoder(r.Body).Decode(&data); !msg.Warn(e, ice.ErrNotFound, data) { msg.Log_IMPORT(kit.MDB_VALUE, kit.Format(data)) msg.Optionv(ice.MSG_USERDATA, data) } @@ -170,7 +169,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon } // 执行命令 - if cmds, ok := _serve_login(msg, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok { + if cmds, ok := _serve_login(msg, key, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok { msg.Option(ice.MSG_OPTS, msg.Optionv(ice.MSG_OPTION)) msg.Target().Cmd(msg, key, cmds...) msg.Cost(kit.Format("%s %v %v", r.URL.Path, cmds, msg.FormatSize())) @@ -180,7 +179,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon _args, _ := msg.Optionv(ice.MSG_ARGS).([]interface{}) Render(msg, msg.Option(ice.MSG_OUTPUT), _args...) } -func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) { +func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWriter, r *http.Request) ([]string, bool) { msg.Option(ice.MSG_USERROLE, aaa.VOID) msg.Option(ice.MSG_USERNAME, "") @@ -196,7 +195,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 权限检查 - msg.Target().Cmd(msg, WEB_LOGIN, cmds...) + msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...) return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE } @@ -219,7 +218,7 @@ func _serve_login(msg *ice.Message, cmds []string, w http.ResponseWriter, r *htt msg.Render(STATUS, http.StatusUnauthorized, ice.ErrNotLogin) return cmds, false // 未登录 } - if msg.Warn(!msg.Right(r.URL.Path)) { + if !msg.Right(r.URL.Path) { msg.Render(STATUS, http.StatusForbidden, ice.ErrNotRight) return cmds, false // 未授权 } diff --git a/base/web/share.go b/base/web/share.go index a6022113..2c9a6310 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -123,7 +123,7 @@ func init() { SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{ mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)), - aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), + aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg) m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result())) }}, diff --git a/base/web/space.go b/base/web/space.go index 53978895..188ea76c 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -50,11 +50,11 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { for i := 0; i >= 0 && i < kit.Int(redial["c"]); i++ { msg := m.Spawn() msg.Option(kit.Keycb(tcp.DIAL), func(s net.Conn, e error) { - if msg.Warn(e != nil, e) { + if msg.Warn(e) { return } - if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e != nil, e) { + if s, _, e := websocket.NewClient(s, u, nil, kit.Int(redial["r"]), kit.Int(redial["w"])); !msg.Warn(e) { msg.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TYPE, MASTER, kit.MDB_NAME, dev, kit.MDB_TEXT, host)) msg.Log_CREATE(SPACE, dev, "retry", i, "uri", uri) @@ -69,7 +69,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { // 断线重连 sleep := time.Duration(rand.Intn(kit.Int(redial["a"])*i+2)+kit.Int(redial["b"])) * time.Millisecond - msg.Cost("order", i, "sleep", sleep, "reconnect", u) + msg.Cost("order", i, "sleep", sleep, "reconnect", dev) time.Sleep(sleep) } }) @@ -77,7 +77,7 @@ func _space_dial(m *ice.Message, dev, name string, arg ...string) { } func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *websocket.Conn, name string) bool { for running := true; running; { - if _, b, e := c.ReadMessage(); m.Warn(e != nil, e) { + if _, b, e := c.ReadMessage(); m.Warn(e, "space", name) { break } else { socket, msg := c, m.Spawn(b) @@ -101,21 +101,21 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w return // 转发报文 } - if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound) { + if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound, "already handled") { // 回复失败 } else { // 下发失败 - msg.Warn(true, ice.ErrNotFound) + msg.Warn(true, ice.ErrNotFound, target) source, target = []string{}, kit.Revert(source)[1:] } }) != nil { // 转发成功 } else if res, ok := send[msg.Option(ice.MSG_TARGET)]; len(target) != 1 || !ok { - if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound) { + if msg.Warn(msg.Option(ice.MSG_HANDLE) == ice.TRUE, ice.ErrNotFound, target) { // 回复失败 } else { // 下发失败 - msg.Warn(true, ice.ErrNotFound) + msg.Warn(true, ice.ErrNotFound, target) source, target = []string{}, kit.Revert(source)[1:] } @@ -128,7 +128,7 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w return false } func _space_exec(msg *ice.Message, source, target []string, c *websocket.Conn, name string) { - if !msg.Warn(!msg.Right(msg.Detailv()), ice.ErrNotRight) { + if msg.Right(msg.Detailv()) { msg = msg.Cmd() } @@ -272,6 +272,7 @@ func init() { // 添加节点 args := append([]string{kit.MDB_TYPE, kind, kit.MDB_NAME, name}, m.OptionSimple(SHARE, RIVER)...) h := m.Rich(SPACE, nil, kit.Dict(SOCKET, s, kit.MDB_TEXT, s.RemoteAddr().String(), args)) + m.Log_CREATE(SPACE, name, "type", kind) m.Go(func() { defer m.Confv(SPACE, kit.Keys(kit.MDB_HASH, h), "") diff --git a/base/web/spide.go b/base/web/spide.go index 1b1d55dc..a15e2ec6 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -76,7 +76,7 @@ func _spide_list(m *ice.Message, arg ...string) { // 构造请求 req, e := http.NewRequest(method, kit.MergeURL2(kit.Format(client["url"]), uri, arg), body) - if m.Warn(e != nil, ice.ErrNotFound, e) { + if m.Warn(e, ice.ErrNotFound, uri) { return } @@ -85,7 +85,7 @@ func _spide_list(m *ice.Message, arg ...string) { // 发送请求 res, e := _spide_send(m, req, kit.Format(client[kit.MDB_TIMEOUT])) - if m.Warn(e != nil, ice.ErrNotFound, e) { + if m.Warn(e, ice.ErrNotFound, uri) { return } @@ -106,13 +106,13 @@ func _spide_list(m *ice.Message, arg ...string) { } // 错误信息 - if m.Warn(res.StatusCode != http.StatusOK, res.Status) { + if m.Warn(res.StatusCode != http.StatusOK, ice.ErrNotFound, uri, "status", res.Status) { switch m.Set(ice.MSG_RESULT); res.StatusCode { case http.StatusNotFound: - m.Warn(true, ice.ErrNotFound, ice.OF, uri) + m.Warn(true, ice.ErrNotFound, uri) return case http.StatusUnauthorized: - m.Warn(true, ice.ErrNotRight, ice.OF, uri) + m.Warn(true, ice.ErrNotRight, uri) return } } diff --git a/base/web/web.go b/base/web/web.go index e8a6ae48..baafdefe 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -80,7 +80,7 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool { defer m.Cmd(mdb.MODIFY, SERVE, "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_STATUS, tcp.STOP) // 启动服务 - m.Warn(true, SERVE, ": ", web.Server.Serve(l)) + m.Warn(web.Server.Serve(l)) }) m.Cmd(tcp.SERVER, tcp.LISTEN, kit.MDB_TYPE, WEB, kit.MDB_NAME, m.Option(kit.MDB_NAME), diff --git a/conf.go b/conf.go index 31d40575..dd0c116e 100644 --- a/conf.go +++ b/conf.go @@ -22,6 +22,10 @@ const ( SAVE = "save" EXIT = "exit" + BASE = "base" + CORE = "core" + MISC = "misc" + SHY = "shy" DEV = "dev" OPS = "ops" @@ -107,6 +111,8 @@ const ( // DIR ETC_PATH = "etc/path" SRC_HELP = "src/help" + SRC_DEBUG = "src/debug" + SRC_RELEASE = "src/release" SRC_MAIN_GO = "src/main.go" SRC_MAIN_SHY = "src/main.shy" SRC_VERSION_GO = "src/version.go" @@ -204,9 +210,11 @@ const ( // Err ErrWarn = "warn: " ErrExists = "exists: " ErrExpire = "expire: " + ErrTimeout = "timeout: " ErrNotLogin = "not login: " ErrNotFound = "not found: " ErrNotRight = "not right: " + ErrNotStart = "not start: " ErrNotImplement = "not implement: " ) const ( // LOG diff --git a/core/chat/action.go b/core/chat/action.go index 49e79c8e..e7622088 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -12,21 +12,114 @@ import ( kit "shylinux.com/x/toolkits" ) +func _action_right(m *ice.Message, river string, storm string) (ok bool) { + if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID { + m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) { + if ok = m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), nil) != nil; ok { + m.Log_AUTH(RIVER, river, STORM, storm) + } + }) + } + return ok +} +func _action_key(m *ice.Message, arg ...string) string { + return kit.Keys(kit.MDB_HASH, kit.Select(m.Option(RIVER), arg, 0), STORM, kit.MDB_HASH, kit.Select(m.Option(STORM), arg, 1)) +} +func _action_list(m *ice.Message, river, storm string) { + m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Table(func(index int, value map[string]string, head []string) { + m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD])) + }) +} +func _action_exec(m *ice.Message, river, storm, index string, arg ...string) { + m.Option(ice.MSG_RIVER, river) + m.Option(ice.MSG_STORM, storm) + + cmds := []string{index} + if m.Grows(RIVER, _action_key(m, river, storm), kit.MDB_ID, index, func(index int, value map[string]interface{}) { + if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" { + m.Option(ice.POD, value[ice.POD]) // 远程节点 + } + }) == nil && !m.Right(cmds) { + return // 没有授权 + } + + if _action_domain(m, cmds[0]); m.Option(ice.MSG_UPLOAD) != "" { + _action_upload(m) // 上传文件 + } + + if !m.PodCmd(cmds, arg) { + m.Cmdy(cmds, arg) // 执行命令 + } +} +func _action_share(m *ice.Message, arg ...string) { + switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(kit.MDB_TYPE) { + case web.STORM: + if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire, arg) { + break // 分享超时 + } + if len(arg) == 1 { + _action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM)) + break // 命令列表 + } + + m.Log_AUTH( + aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)), + aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)), + aaa.USERNICK, m.Option(ice.MSG_USERNICK, msg.Append(aaa.USERNICK)), + RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)), + STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)), + ) + if !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) { + break // 没有授权 + } + + // 执行命令 + _action_exec(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...) + + case web.FIELD: + if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire, arg) { + break // 分享超时 + } + if arg[0] = msg.Append(kit.MDB_NAME); len(arg) == 1 { + m.Push("title", msg.Append(kit.MDB_TITLE)) + m.Push("index", msg.Append(kit.MDB_NAME)) + m.Push("args", msg.Append(kit.MDB_TEXT)) + break // 命令列表 + } + + m.Log_AUTH( + aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)), + aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)), + aaa.USERNICK, m.Option(ice.MSG_USERNICK, msg.Append(aaa.USERNICK)), + RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)), + STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)), + ) + if !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) { + break // 没有授权 + } + + if _action_domain(m, arg[1]); m.Option(ice.MSG_UPLOAD) != "" { + _action_upload(m) // 上传文件 + } + + m.Cmdy(arg[1:]) // 执行命令 + } +} func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { m.Option(ice.MSG_LOCAL, "") m.Option(ice.MSG_DOMAIN, "") - if m.Conf(ACTION, kit.Keym(DOMAIN, cmd)) != ice.TRUE { + if m.Config(kit.Keys(DOMAIN, cmd)) != ice.TRUE { return "" // 公有命令 } - storm := kit.Select(m.Option(ice.MSG_STORM), arg, 0) - river := kit.Select(m.Option(ice.MSG_RIVER), arg, 1) + river := kit.Select(m.Option(ice.MSG_RIVER), arg, 0) + storm := kit.Select(m.Option(ice.MSG_STORM), arg, 1) m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) { switch kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { case PUBLIC: // 公有群 return case PROTECTED: // 共有群 - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, river, TOOL), storm, func(key string, value map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, river, STORM), storm, func(key string, value map[string]interface{}) { switch r := "R" + river; kit.Value(kit.GetMeta(value), kit.MDB_TYPE) { case PUBLIC: // 公有组 domain = m.Option(ice.MSG_DOMAIN, kit.Keys(r)) @@ -39,103 +132,15 @@ func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { case PRIVATE: // 私有群 domain = m.Option(ice.MSG_DOMAIN, kit.Keys("U"+m.Option(ice.MSG_USERNAME))) } - m.Option(ice.MSG_LOCAL, path.Join(m.Conf(RIVER, kit.META_PATH), domain)) + m.Option(ice.MSG_LOCAL, path.Join(m.Config(kit.MDB_PATH), domain)) }) m.Log_AUTH(RIVER, river, STORM, storm, DOMAIN, domain) return } -func _action_right(m *ice.Message, river string, storm string) (ok bool) { - if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID { - m.Richs(RIVER, "", river, func(key string, value map[string]interface{}) { - if ok = m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USERS), m.Option(ice.MSG_USERNAME), nil) != nil; ok { - m.Log_AUTH(RIVER, river, STORM, storm) - } - }) - } - return ok -} - -func _action_list(m *ice.Message, river, storm string) { - m.Option(ice.MSG_RIVER, river) - m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) { - m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD])) - }) - m.SortInt(kit.MDB_ID) -} -func _action_show(m *ice.Message, river, storm, index string, arg ...string) { - m.Option(ice.MSG_RIVER, river) - m.Option(ice.MSG_STORM, storm) - - cmds := []string{index} - prefix := kit.Keys(kit.MDB_HASH, river, TOOL, kit.MDB_HASH, storm) - if m.Grows(RIVER, prefix, kit.MDB_ID, index, func(index int, value map[string]interface{}) { - if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" { - m.Option(ice.POD, value[ice.POD]) // 远程节点 - } - }) == nil && m.Warn(!m.Right(cmds), ice.ErrNotRight) { - return // 没有授权 - } - - if _action_domain(m, cmds[0]); m.Option(ice.MSG_UPLOAD) != "" { - _action_upload(m) // 上传文件 - } - - if !m.PodCmd(cmds, arg) { - m.Cmdy(cmds, arg) // 执行命令 - } -} func _action_upload(m *ice.Message) { msg := m.Cmd(web.CACHE, web.UPLOAD) m.Option(ice.MSG_UPLOAD, msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE)) } -func _action_share(m *ice.Message, arg ...string) { - switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(kit.MDB_TYPE) { - case web.STORM: - if len(arg) == 1 { - _action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM)) - break // 命令列表 - } - - if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) { - break // 分享超时 - } - m.Log_AUTH( - aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)), - aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)), - ) - if !_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)) { - break // 没有授权 - } - - // 执行命令 - _action_show(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...) - - case web.FIELD: - if arg[0] = msg.Append(kit.MDB_NAME); len(arg) == 1 { - m.Push("title", msg.Append(kit.MDB_TITLE)) - m.Push("index", msg.Append(kit.MDB_NAME)) - m.Push("args", msg.Append(kit.MDB_TEXT)) - break // 命令列表 - } - - if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) { - break // 分享超时 - } - m.Log_AUTH( - aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)), - aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)), - ) - if m.Warn(!m.Right(arg[1:]), ice.ErrNotRight) { - break // 没有授权 - } - - if m.Option(ice.MSG_UPLOAD) != "" { - _action_upload(m) // 上传文件 - } - - m.Cmdy(arg[1:]) // 执行命令 - } -} const ( DOMAIN = "domain" @@ -149,32 +154,32 @@ const ACTION = "action" func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ ACTION: {Name: ACTION, Help: "应用", Value: kit.Data( - MENUS, `[["help", "tutor", "manual", "service", "devops", "refer"]]`, + MENUS, kit.List(kit.List("help", "tutor", "manual", "service", "devops", "refer")), + kit.MDB_PATH, ice.USR_LOCAL_RIVER, )}, }, Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - for _, cmd := range []string{ - "web.chat.meet.miss", - "web.chat.meet.mate", - "web.chat.location", - "web.chat.paste", - "web.chat.scan", - "web.wiki.feel", - "web.wiki.draw", - "web.wiki.data", - "web.wiki.word", - "web.team.task", - "web.team.plan", - "web.mall.asset", - "web.mall.salary", - } { - m.Conf(ACTION, kit.Keym(DOMAIN, cmd), ice.TRUE) - } - }}, "/action": {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + for _, cmd := range []string{ + "web.chat.meet.miss", + "web.chat.meet.mate", + "web.chat.location", + "web.chat.paste", + "web.chat.scan", + "web.wiki.feel", + "web.wiki.draw", + "web.wiki.data", + "web.wiki.word", + "web.team.task", + "web.team.plan", + "web.mall.asset", + "web.mall.salary", + } { + m.Config(kit.Keys(DOMAIN, cmd), ice.TRUE) + } + }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, RIVER, kit.Keys(kit.MDB_HASH, m.Option(RIVER), TOOL, kit.MDB_HASH, m.Option(STORM)), mdb.LIST, - m.OptionSimple(kit.MDB_ID), arg) + m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg) }}, ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { for _, k := range arg { @@ -188,21 +193,21 @@ func init() { _action_share(m, arg...) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { + if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) { return // 没有登录 } - if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) { + if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight, arg) { return // 没有授权 } if len(arg) == 2 { - m.Option(MENUS, m.Conf(ACTION, kit.Keym(MENUS))) + m.Option(MENUS, m.Config(MENUS)) _action_list(m, arg[0], arg[1]) return //命令列表 } // 执行命令 - _action_show(m, arg[0], arg[1], arg[2], arg[3:]...) + _action_exec(m, arg[0], arg[1], arg[2], arg[3:]...) }}, }}) } diff --git a/core/chat/chat.shy b/core/chat/chat.shy index 7660735b..87b456de 100644 --- a/core/chat/chat.shy +++ b/core/chat/chat.shy @@ -4,14 +4,24 @@ chat.go chat.shy header.go -river.go -action.go - search.go +river.go +storm.go +ocean.go +action.go footer.go + +pod.go +cmd.go +div.go + scan.go +scan.js paste.go files.go location.go -meet.go +info.go +node.go +meet.go +room.go diff --git a/core/chat/cmd.go b/core/chat/cmd.go index c521d423..e6eff316 100644 --- a/core/chat/cmd.go +++ b/core/chat/cmd.go @@ -6,107 +6,75 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) -func _cmd_render(m *ice.Message, cmd string, args ...interface{}) { - list := []interface{}{kit.Dict("index", cmd, "args", kit.Simple(args))} - m.RenderResult(kit.Format(m.Conf(CMD, kit.Keym(kit.MDB_TEMPLATE)), kit.Format(list))) -} - const CMD = "cmd" func init() { - Index.Merge(&ice.Context{ - Commands: map[string]*ice.Command{ - "/cmd/": {Name: "/cmd/", Help: "命令", Action: map[string]*ice.Action{ - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 0 { - m.Push("index", CMD) - m.Push("args", "") - return - } - m.Cmdy(ctx.COMMAND, arg[0]) - }}, - ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(arg) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if strings.HasSuffix(m.R.URL.Path, "/") { - m.RenderIndex(web.SERVE, ice.VOLCANOS, "page/cmd.html") - return // 目录 - } + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + CMD: {Name: CMD, Help: "命令", Value: kit.Data( + kit.MDB_SHORT, "type", kit.MDB_PATH, "./", + )}, + }, Commands: map[string]*ice.Command{ + "/cmd/": {Name: "/cmd/", Help: "命令", Action: ice.MergeAction(map[string]*ice.Action{ + ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "go", kit.MDB_NAME, "web.code.inner") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "mod", kit.MDB_NAME, "web.code.inner") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "sum", kit.MDB_NAME, "web.code.inner") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "shy", kit.MDB_NAME, "web.wiki.word") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "svg", kit.MDB_NAME, "web.wiki.draw") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "csv", kit.MDB_NAME, "web.wiki.data") + m.Cmdy(CMD, mdb.CREATE, kit.MDB_TYPE, "json", kit.MDB_NAME, "web.wiki.json") + }}, + }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if strings.HasSuffix(m.R.URL.Path, ice.PS) { + m.RenderCmd(CMD) + return // 目录 + } - switch p := path.Join(m.Conf(CMD, kit.META_PATH), path.Join(arg...)); kit.Ext(p) { - case "svg": - _cmd_render(m, "web.wiki.draw", p) - case "csv": - _cmd_render(m, "web.wiki.data", p) - case "json": - _cmd_render(m, "web.wiki.json", p) - case "shy": - _cmd_render(m, "web.wiki.word", p) - case "go", "mod", "sum": - _cmd_render(m, "web.code.inner", path.Dir(p)+"/", path.Base(p)) - default: - if m.Option(ice.POD) != "" { - if m.PodCmd(ctx.COMMAND, arg[0]); m.Append("meta") != "" { - _cmd_render(m, arg[0], arg[1:]) - return // 远程命令 - } - } else { - if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Append("meta") != "" { - _cmd_render(m, arg[0], arg[1:]) - return // 本地命令 - } - } - m.RenderDownload(p) + p := path.Join(m.Config(kit.MDB_PATH), path.Join(arg...)) + if mdb.HashSelect(m, kit.Ext(m.R.URL.Path)).Table(func(index int, value map[string]string, head []string) { + m.RenderCmd(value[kit.MDB_NAME], p) + }).Length() > 0 { + return // 插件 + } + + if m.PodCmd(ctx.COMMAND, arg[0]) && m.Length() > 0 { + m.RenderCmd(arg[0], arg[1:]) // 远程命令 + } else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 { + m.RenderCmd(arg[0], arg[1:]) // 本地命令 + } else { + m.RenderDownload(p) // 文件 + } + }}, + CMD: {Name: "cmd path auto upload up home", Help: "命令", Action: ice.MergeAction(map[string]*ice.Action{ + web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { + m.Upload(path.Join(m.Config(kit.MDB_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd"))) + }}, + + "home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) { + m.ProcessLocation("/chat/cmd/") + }}, + "up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) { + if strings.TrimPrefix(m.R.URL.Path, "/cmd") == ice.PS { + m.Cmdy(CMD) + } else if strings.HasSuffix(m.R.URL.Path, ice.PS) { + m.ProcessLocation("../") + } else { + m.ProcessLocation("./") } }}, - CMD: {Name: "cmd path auto upload up home", Help: "命令", Action: map[string]*ice.Action{ - web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { - _action_upload(m) - m.Upload(path.Join(m.Conf(CMD, kit.META_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd"))) - }}, - "home": {Name: "home", Help: "根目录", Hand: func(m *ice.Message, arg ...string) { - m.ProcessLocation("/chat/cmd/") - }}, - "up": {Name: "up", Help: "上一级", Hand: func(m *ice.Message, arg ...string) { - if strings.TrimPrefix(m.R.URL.Path, "/cmd") == "/" { - m.Cmdy(CMD) - return - } - if strings.HasSuffix(m.R.URL.Path, "/") { - m.ProcessLocation("../") - } else { - m.ProcessLocation("./") - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 { - m.ProcessLocation(arg[0]) - return - } - m.Option(nfs.DIR_ROOT, path.Join(m.Conf(CMD, kit.META_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd"))) - m.Cmdy(nfs.DIR, arg) - }}, - }, - Configs: map[string]*ice.Config{ - CMD: {Name: CMD, Help: "命令", Value: kit.Data( - kit.MDB_PATH, "./", kit.MDB_INDEX, "page/cmd.html", kit.MDB_TEMPLATE, ` - - - - - - - - - -`, - )}, - }, - }) + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 { + m.ProcessLocation(arg[0]) + return + } + m.Option(nfs.DIR_ROOT, path.Join(m.Config(kit.MDB_PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd"))) + m.Cmdy(nfs.DIR, arg) + }}, + }}) } diff --git a/core/chat/div.go b/core/chat/div.go index 399e153a..5d79af12 100644 --- a/core/chat/div.go +++ b/core/chat/div.go @@ -4,10 +4,10 @@ import ( "path" ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/lex" "shylinux.com/x/icebergs/base/mdb" - "shylinux.com/x/icebergs/base/web" + "shylinux.com/x/icebergs/base/nfs" kit "shylinux.com/x/toolkits" ) @@ -32,11 +32,12 @@ func _div_parse(m *ice.Message, root map[string]interface{}, list []string) int ls := kit.Split(list[i]) if ls[0] == "_span" { - ls = append([]string{"", "", "style", "span"}, ls[1:]...) + ls = append([]string{"", "", "style", kit.Select("span", ls, 1)}, kit.Slice(ls, 2)...) } meta := kit.Dict( "index", kit.Select("", ls, 0), "args", kit.Select("", ls, 1), + "name", "hi", ) for i := 2; i < len(ls); i += 2 { meta[ls[i]] = ls[i+1] @@ -57,30 +58,31 @@ func init() { )}, }, Commands: map[string]*ice.Command{ DIV: {Name: "div hash auto", Help: "定制", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.CREATE: {Name: "create type=page name=hi.html text", Help: "创建"}, - cli.MAKE: {Name: "make name=some line:textarea", Help: "生成", Hand: func(m *ice.Message, arg ...string) { + lex.SPLIT: {Name: "split name=some text", Help: "生成", Hand: func(m *ice.Message, arg ...string) { m.Fields(0) - node := kit.Dict("meta", kit.Dict("name", m.Option("name")), "list", []interface{}{}) - _div_parse(m, node, kit.Split(m.Option("line"), "\n", "\n", "\n")) + node := kit.Data(m.OptionSimple(kit.MDB_NAME)) + _div_parse(m, node, kit.Split(m.Option(kit.MDB_TEXT), ice.NL, ice.NL, ice.NL)) m.ProcessDisplay("/plugin/local/chat/div.js") - m.Push("text", kit.Formats(node)) + m.Push(kit.MDB_TEXT, kit.Formats(node)) }}, + mdb.CREATE: {Name: "create type=page name=hi.html text", Help: "创建"}, }, mdb.HashAction(), ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(DIV, kit.META_FIELD)) - m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, kit.MDB_HASH, arg) + if mdb.HashSelect(m, arg...); len(arg) > 0 { + if m.Option(ice.MSG_DISPLAY, "/plugin/local/chat/div.js"); m.Length() == 0 { + m.Cmdy(DIV, lex.SPLIT, ice.Option{kit.MDB_TEXT, m.Cmdx(nfs.CAT, arg[0])}) + return + } + m.Action("添加", "保存", "预览") + } else { + m.Action(lex.SPLIT, mdb.CREATE) + } m.Table(func(index int, value map[string]string, head []string) { m.PushAnchor("/" + path.Join(ice.PUBLISH, value[kit.MDB_NAME])) }) - if m.PushAction(cli.MAKE, mdb.REMOVE); len(arg) > 0 { - m.Option(ice.MSG_DISPLAY, "/plugin/local/chat/div.js") - m.Action("添加", "保存", "预览") - } else { - m.Action(mdb.CREATE, cli.MAKE) - } + m.PushAction(mdb.REMOVE) }}, - "/div": {Name: "/div", Help: "定制", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.RenderIndex(web.SERVE, ice.VOLCANOS, "page/div.html") + "/div/": {Name: "/div/", Help: "定制", Action: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.RenderCmd(m.Prefix(DIV), path.Join(arg...)) }}, }}) - } diff --git a/core/chat/files.go b/core/chat/files.go index b78a6efb..cad33872 100644 --- a/core/chat/files.go +++ b/core/chat/files.go @@ -10,29 +10,29 @@ import ( const FILES = "files" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - FILES: {Name: FILES, Help: "文件夹", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data", - )}, - }, - Commands: map[string]*ice.Command{ - FILES: {Name: "files hash auto upload", Help: "文件夹", Action: ice.MergeAction(map[string]*ice.Action{ - web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { - up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) - m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0]) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(FILES, kit.META_FIELD)) - m.Cmdy(mdb.SELECT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_HASH, arg) - m.Table(func(index int, value map[string]string, head []string) { - link := kit.MergeURL("/share/cache/"+value[kit.MDB_DATA], ice.POD, m.Option(ice.MSG_USERPOD)) - if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) { - m.PushImages(kit.MDB_IMAGE, link) - } - }) - m.PushAction(mdb.REMOVE) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + FILES: {Name: FILES, Help: "文件夹", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_DATA, kit.MDB_FIELD, "time,hash,type,name,size,data", + )}, + }, Commands: map[string]*ice.Command{ + FILES: {Name: "files hash auto upload", Help: "文件夹", Action: ice.MergeAction(map[string]*ice.Action{ + web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) { + up := kit.Simple(m.Optionv(ice.MSG_UPLOAD)) + if len(up) < 2 { + msg := m.Cmd(web.CACHE, web.UPLOAD) + up = kit.Simple(msg.Append(kit.MDB_HASH), msg.Append(kit.MDB_NAME), msg.Append(kit.MDB_SIZE)) + } + m.Cmdy(mdb.INSERT, m.Prefix(FILES), "", mdb.HASH, kit.MDB_TYPE, kit.Ext(up[1]), kit.MDB_NAME, up[1], kit.MDB_SIZE, up[2], kit.MDB_DATA, up[0]) }}, - }, - }) + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.HashSelect(m, arg...) + m.Table(func(index int, value map[string]string, head []string) { + link := "/share/cache/" + value[kit.MDB_DATA] + if m.PushDownload(kit.MDB_LINK, value[kit.MDB_NAME], link); len(arg) > 0 && kit.ExtIsImage(value[kit.MDB_NAME]) { + m.PushImages(kit.MDB_IMAGE, link) + } + }) + m.PushAction(mdb.REMOVE) + }}, + }}) } diff --git a/core/chat/footer.go b/core/chat/footer.go index 7f870318..4f4fe098 100644 --- a/core/chat/footer.go +++ b/core/chat/footer.go @@ -2,6 +2,7 @@ package chat import ( ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" kit "shylinux.com/x/toolkits" ) @@ -12,23 +13,22 @@ const ( const FOOTER = "footer" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict( - LEGAL, []interface{}{`shylinuxc@gmail.com`}, - )}, - }, - Commands: map[string]*ice.Command{ - "/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{ - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(ctx.COMMAND, arg) - }}, - ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(arg) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - kit.Fetch(m.Confv(FOOTER, LEGAL), func(index int, value string) { m.Echo(value) }) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict( + LEGAL, kit.List(`shylinuxc@gmail.com`), + )}, + }, Commands: map[string]*ice.Command{ + "/footer": {Name: "/footer", Help: "状态栏", Action: map[string]*ice.Action{ + ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(ctx.COMMAND, arg) }}, - }, - }) + ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { + if m.Cmdy(arg); m.Result(1) == ice.ErrNotFound { + m.Set(ice.MSG_RESULT).Cmdy(cli.SYSTEM, arg) + } + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) }) + }}, + }}) } diff --git a/core/chat/header.go b/core/chat/header.go index d78b6823..241d0229 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -1,8 +1,8 @@ package chat import ( - "os" "path" + "strings" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" @@ -15,12 +15,18 @@ import ( kit "shylinux.com/x/toolkits" ) +func _header_agent(m *ice.Message, arg ...string) { + if strings.Index(m.Option(ice.MSG_USERUA), "MicroMessenger") > -1 { + m.Cmdy("web.chat.wx.access", "config") + } +} func _header_check(m *ice.Message, arg ...string) { if m.Option(web.SHARE) != "" { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { - case web.LOGIN: // 扫码登录 + case web.LOGIN: if m.Option(ice.MSG_USERNAME) != msg.Append(aaa.USERNAME) { web.RenderCookie(m, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)))) + m.Option(ice.MSG_USERNICK, aaa.UserNick(m, msg.Append(aaa.USERNAME))) } case web.STORM: m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)) @@ -29,24 +35,11 @@ func _header_check(m *ice.Message, arg ...string) { } } - if m.Option(ice.MSG_USERNAME) == "" { // 单点登录 - m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO))) + if m.Option(ice.MSG_USERNAME) == "" { m.Option(web.LOGIN, m.Config(web.LOGIN)) + m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO))) } } -func _header_share(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_LINK) == "" { - m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) - } else { - m.Option(kit.MDB_LINK, tcp.ReplaceLocalhost(m, m.Option(kit.MDB_LINK))) - } - - m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(kit.MDB_LINK), RIVER, "", STORM, "")) - - m.Set("name,text") - m.Push(kit.MDB_NAME, m.Option(kit.MDB_LINK)) - m.PushQRCode(kit.MDB_TEXT, m.Option(kit.MDB_LINK)) -} func _header_grant(m *ice.Message, arg ...string) { if m.PodCmd(m.PrefixKey(), ctx.ACTION, GRANT, arg) { return // 下发命令 @@ -56,37 +49,54 @@ func _header_grant(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, kit.Select(aaa.TECH, aaa.VOID, m.Option(ice.MSG_USERROLE) == aaa.VOID), m.Option(ice.MSG_USERNAME)) m.Cmd(web.SPACE, m.Option(web.SPACE), ice.MSG_SESSID, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME))) } +func _header_share(m *ice.Message, arg ...string) { + if m.Option(kit.MDB_LINK) == "" { + m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) + } else { + m.Option(kit.MDB_LINK, tcp.ReplaceLocalhost(m, m.Option(kit.MDB_LINK))) + } + + m.Option(kit.MDB_LINK, kit.MergeURL(m.Option(kit.MDB_LINK), RIVER, "", STORM, "")) + m.PushQRCode(kit.MDB_TEXT, m.Option(kit.MDB_LINK)) + m.Push(kit.MDB_NAME, m.Option(kit.MDB_LINK)) +} func _header_users(m *ice.Message, key string, arg ...string) { m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME)) m.Cmdy(aaa.USER, ctx.ACTION, mdb.MODIFY, key, m.Option(key, arg[0])) } const ( - TOPIC = "topic" TITLE = "title" + TOPIC = "topic" MENUS = "menus" TRANS = "trans" AGENT = "agent" CHECK = "check" - SHARE = "share" GRANT = "grant" - LOGIN = "login" + SHARE = "share" ) const HEADER = "header" func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data( - TITLE, "shylinux.com/x/contexts", MENUS, `["header", ["setting", "black", "white", "print", "webpack", "unpack"]]`, - LOGIN, kit.List("登录", "扫码"), + TITLE, "shylinux.com/x/contexts", MENUS, kit.List("header", kit.List("setting", "black", "white", "print", "webpack", "devpack")), + aaa.LOGIN, kit.List("登录", "扫码"), )}, }, Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(web.SERVE, aaa.WHITE, HEADER, RIVER, ACTION, FOOTER) + web.WEB_LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + switch arg[0] { + case "/header": + switch kit.Select("", arg, 1) { + case AGENT, CHECK: + return // 非登录态 + } + } + m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) }}, "/header": {Name: "/header", Help: "标题栏", Action: map[string]*ice.Action{ - AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.chat.wx.access", "config") + AGENT: {Name: "agent", Help: "宿主应用", Hand: func(m *ice.Message, arg ...string) { + _header_agent(m, arg...) }}, CHECK: {Name: "check", Help: "登录检查", Hand: func(m *ice.Message, arg ...string) { _header_check(m, arg...) @@ -102,7 +112,6 @@ func init() { if aaa.UserLogin(m, arg[0], arg[1]) { web.RenderCookie(m, aaa.SessCreate(m, arg[0])) } - m.Echo(m.Option(ice.MSG_USERNAME)) }}, aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID))) @@ -110,6 +119,9 @@ func init() { aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) { _header_users(m, aaa.USERNICK, arg...) }}, + aaa.LANGUAGE: {Name: "language", Help: "语言地区", Hand: func(m *ice.Message, arg ...string) { + _header_users(m, aaa.LANGUAGE, arg...) + }}, aaa.BACKGROUND: {Name: "background", Help: "用户壁纸", Hand: func(m *ice.Message, arg ...string) { _header_users(m, aaa.BACKGROUND, arg...) }}, @@ -118,34 +130,29 @@ func init() { }}, code.WEBPACK: {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(nfs.COPY, ice.GO_MOD, path.Join(ice.SRC_RELEASE, ice.GO_MOD)) m.Cmdy(code.WEBPACK, mdb.CREATE, m.OptionSimple(kit.MDB_NAME)) - p := path.Join("src/release", ice.GO_MOD) - if _, e := os.Stat(p); e == nil { - m.Cmd(nfs.COPY, ice.GO_MOD, p) - } }}, - "unpack": {Name: "unpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.WEBPACK, "unpack") - - p := path.Join("src/debug", ice.GO_MOD) - if _, e := os.Stat(p); e == nil { - m.Cmd(nfs.COPY, ice.GO_MOD, p) - } + code.DEVPACK: {Name: "devpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(nfs.COPY, ice.GO_MOD, path.Join(ice.SRC_DEBUG, ice.GO_MOD)) + m.Cmdy(code.WEBPACK, mdb.REMOVE) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(TRANS, kit.Format(kit.Value(c.Commands[cmd].Meta, "_trans"))) - m.Option(MENUS, m.Conf(HEADER, kit.Keym(MENUS))) msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME)) - for _, k := range []string{aaa.USERNICK, aaa.BACKGROUND, aaa.AVATAR} { + for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE, aaa.BACKGROUND, aaa.AVATAR} { m.Option(k, msg.Append(k)) } - m.Echo(m.Conf(HEADER, kit.Keym(TITLE))) + + m.Option(TRANS, kit.Format(kit.Value(c.Commands[cmd].Meta, "_trans"))) + m.Option(MENUS, m.Config(MENUS)) + m.Echo(m.Config(TITLE)) }}, HEADER: {Name: "header", Help: "标题栏", Action: map[string]*ice.Action{ GRANT: {Name: "grant space", Help: "授权", Hand: func(m *ice.Message, arg ...string) { _header_grant(m, arg...) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }}, }}) } diff --git a/core/chat/location.go b/core/chat/location.go index 17e31df9..2eeeb9e6 100644 --- a/core/chat/location.go +++ b/core/chat/location.go @@ -22,7 +22,6 @@ func _trans(arg []string, tr map[string]string) { } const ( - ADDRESS = "address" LATITUDE = "latitude" LONGITUDE = "longitude" ) @@ -33,26 +32,18 @@ const ( const LOCATION = "location" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude", - )}, - }, - Commands: map[string]*ice.Command{ - LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{ - OPENLOCATION: {Name: "openLocation", Help: "地图", Hand: func(m *ice.Message, arg ...string) {}}, - GETLOCATION: {Name: "getLocation", Help: "打卡", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg) - }}, - mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(LOCATION), "", mdb.HASH, arg) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(LOCATION, kit.META_FIELD)) - m.Cmdy(mdb.SELECT, m.Prefix(LOCATION), "", mdb.HASH, kit.MDB_HASH, arg) - m.PushAction(OPENLOCATION, mdb.REMOVE) - }}, - }, - }) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text,longitude,latitude", + )}, + }, Commands: map[string]*ice.Command{ + LOCATION: {Name: "location hash auto getLocation", Help: "地理位置", Action: ice.MergeAction(map[string]*ice.Action{ + OPENLOCATION: {Name: "location", Help: "地图"}, + GETLOCATION: {Name: "location create", Help: "打卡"}, + mdb.CREATE: {Name: "create type=text name text latitude longitude", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.HashSelect(m, arg...) + m.PushAction(OPENLOCATION, mdb.REMOVE) + }}, + }}) } diff --git a/core/chat/user.go b/core/chat/ocean.go similarity index 50% rename from core/chat/user.go rename to core/chat/ocean.go index d419cb6b..560bb751 100644 --- a/core/chat/user.go +++ b/core/chat/ocean.go @@ -7,31 +7,29 @@ import ( kit "shylinux.com/x/toolkits" ) -const USERS = "users" +const OCEAN = "ocean" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - USERS: {Name: "users username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, USERS), mdb.HASH, arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, _river_key(m, USERS), mdb.HASH, m.OptionSimple(aaa.USERNAME)) - }}, + OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Action: map[string]*ice.Action{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERZONE, aaa.USERNICK)) + m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)) + }}, + mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, _river_key(m, OCEAN), mdb.HASH, arg) + }}, + mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Fields(len(arg), "time,username") - m.Cmdy(mdb.SELECT, RIVER, _river_key(m, USERS), mdb.HASH, aaa.USERNAME, arg) + m.Cmdy(mdb.SELECT, RIVER, _river_key(m, OCEAN), mdb.HASH, aaa.USERNAME, arg) m.Table(func(index int, value map[string]string, head []string) { - m.Richs(USERS, nil, value[aaa.USERNAME], func(key string, val map[string]interface{}) { - val = kit.GetMeta(val) - m.Push(aaa.USERNICK, val[aaa.USERNICK]) - m.PushImages(aaa.AVATAR, kit.Format(val[aaa.AVATAR]), kit.Select("60", "240", m.Option(mdb.FIELDS) == mdb.DETAIL)) - }) + msg := m.Cmd(aaa.USER, value[aaa.USERNAME]) + m.Push(aaa.USERNICK, msg.Append(aaa.USERNICK)) + m.PushImages(aaa.AVATAR, msg.Append(aaa.AVATAR), kit.Select("60", "240", m.FieldsIsDetail())) }) - m.PushAction(mdb.REMOVE) + m.PushAction(mdb.DELETE) }}, }}) } diff --git a/core/chat/paste.go b/core/chat/paste.go index 8cd1d1b4..e0d71660 100644 --- a/core/chat/paste.go +++ b/core/chat/paste.go @@ -11,30 +11,22 @@ import ( const PASTE = "paste" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - PASTE: {Name: PASTE, Help: "粘贴板", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", - )}, - }, - Commands: map[string]*ice.Command{ - PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴板", Action: ice.MergeAction(map[string]*ice.Action{ - "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) { - _trans(arg, map[string]string{"data": "text"}) - m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg) - }}, - mdb.CREATE: {Name: "create type=text name=hi data:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - _trans(arg, map[string]string{"data": "text"}) - m.Cmdy(mdb.INSERT, m.Prefix(PASTE), "", mdb.HASH, arg) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(PASTE, kit.META_FIELD)) - if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { - m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) - m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) - } - m.PushAction(mdb.REMOVE) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + PASTE: {Name: PASTE, Help: "粘贴", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", + )}, + }, Commands: map[string]*ice.Command{ + PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Action: ice.MergeAction(map[string]*ice.Action{ + "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(PASTE, mdb.CREATE, arg) }}, - }, - }) + mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if mdb.HashSelect(m, arg...); len(arg) > 0 { + m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) + m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) + } + m.PushAction(mdb.REMOVE) + }}, + }}) } diff --git a/core/chat/pod.go b/core/chat/pod.go index c947a5cb..43d5c99c 100644 --- a/core/chat/pod.go +++ b/core/chat/pod.go @@ -12,38 +12,23 @@ import ( const POD = "pod" func init() { - Index.Merge(&ice.Context{ - Commands: map[string]*ice.Command{ - "/pod/": {Name: "/pod/", Help: "节点", Action: map[string]*ice.Action{ - ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 0 { - m.Push("index", CMD) - m.Push("args", "") - return - } - if !m.PodCmd(ctx.COMMAND, arg[0]) { - m.Cmdy(ctx.COMMAND, arg[0]) - } - }}, - ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { - if !m.PodCmd(arg) { - m.Cmdy(arg) - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if kit.Select("", arg, 0) == "" { - _cmd_render(m, web.ROUTE) - return - } - if len(arg) == 1 { - m.RenderIndex(web.SERVE, ice.VOLCANOS) - return - } - m.Cmdy(m.Prefix("/cmd/"), path.Join(arg[2:]...)) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + POD: {Name: POD, Help: "节点", Value: kit.Data()}, + }, Commands: map[string]*ice.Command{ + "/pod/": {Name: "/pod/", Help: "节点", Action: ice.MergeAction(map[string]*ice.Action{ + ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) { }}, - }, - Configs: map[string]*ice.Config{ - POD: {Name: POD, Help: "节点", Value: kit.Data()}, - }, - }) + }, ctx.CmdAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if kit.Select("", arg, 0) == "" { + m.RenderCmd(web.ROUTE) + return // 节点列表 + } + if len(arg) == 1 { + m.RenderIndex(web.SERVE, ice.VOLCANOS) + return // 节点首页 + } + // 节点命令 + m.Cmdy("/cmd/", path.Join(arg[2:]...)) + }}, + }}) } diff --git a/core/chat/river.go b/core/chat/river.go index cb3036ca..4fdd0fb2 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -14,13 +14,7 @@ import ( func _river_key(m *ice.Message, key ...interface{}) string { return kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER), kit.Simple(key)) } -func _river_url(m *ice.Message, arg ...string) string { - return kit.MergeURL(m.Option(ice.MSG_USERWEB), RIVER, m.Option(ice.MSG_RIVER), arg) -} func _river_list(m *ice.Message) { - m.Set(ice.MSG_OPTION, kit.MDB_HASH) - m.Set(ice.MSG_OPTION, kit.MDB_NAME) - if m.Option(web.SHARE) != "" { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { case web.RIVER: // 共享群组 @@ -28,11 +22,11 @@ func _river_list(m *ice.Message) { m.Option(ice.MSG_RIVER, msg.Append(RIVER)) m.Option(ice.MSG_STORM, msg.Append(STORM)) - if m.Conf(RIVER, kit.Keys(kit.MDB_HASH, m.Option(ice.MSG_RIVER))) == "" { - break + if m.Conf(RIVER, _river_key(m)) == "" { + break // 虚拟群组 } - if msg.Cmd(USERS, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { - msg.Cmd(USERS, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组 + if msg.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { + msg.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组 } case web.STORM: // 共享应用 @@ -49,7 +43,7 @@ func _river_list(m *ice.Message) { } m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USERS), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { + m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Push(key, kit.GetMeta(value), []string{kit.MDB_HASH, kit.MDB_NAME}, kit.GetMeta(val)) }) }) @@ -58,142 +52,128 @@ func _river_list(m *ice.Message) { const RIVER = "river" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - RIVER: {Name: RIVER, Help: "群组", Value: kit.Data( - kit.MDB_PATH, ice.USR_LOCAL_RIVER, - MENUS, `["river", - ["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"], - ["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"] -]`, - )}, - }, - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Conf(RIVER, kit.Keym(kit.MDB_TEMPLATE), kit.Dict( + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + RIVER: {Name: RIVER, Help: "群组", Value: kit.Data( + MENUS, kit.List(RIVER, kit.List("create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"), kit.List("share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间")), + )}, + }, Commands: map[string]*ice.Command{ + "/river": {Name: "/river", Help: "小河流", Action: map[string]*ice.Action{ + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { + m.Config(kit.MDB_TEMPLATE, kit.Dict( "base", kit.Dict( - "info", []interface{}{ + "info", kit.List( "web.chat.info", "web.chat.user", "web.chat.tool", "web.chat.node", - }, - "scan", []interface{}{ + ), + "scan", kit.List( "web.chat.scan", "web.chat.paste", "web.chat.files", "web.chat.location", "web.chat.meet.miss", "web.wiki.feel", - }, - "task", []interface{}{ + ), + "task", kit.List( "web.team.task", "web.team.plan", "web.mall.asset", "web.mall.salary", "web.wiki.word", - }, - "draw", []interface{}{ + ), + "draw", kit.List( "web.wiki.draw", "web.wiki.data", "web.wiki.word", - }, + ), ), )) }}, - "/river": {Name: "/river", Help: "小河流", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { - m.Render(web.STATUS, 401) - return // 没有登录 - } - if len(arg) == 0 { - m.Option(MENUS, m.Conf(RIVER, kit.Keym(MENUS))) - _river_list(m) - return // 群组列表 - } - if len(arg) == 2 && arg[1] == TOOL { - m.Option(ice.MSG_RIVER, arg[0]) - m.Cmdy(arg[1], arg[2:]) - return // 应用列表 - } - if m.Warn(!m.Right(RIVER, arg), ice.ErrNotRight) { - return // 没有授权 + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) { + m.Render(web.STATUS, 401) + return // 没有登录 + } + if len(arg) == 0 { + m.Option(MENUS, m.Config(MENUS)) + _river_list(m) + return // 群组列表 + } + if len(arg) == 2 && arg[1] == STORM { + m.Option(ice.MSG_RIVER, arg[0]) + m.Cmdy(arg[1], arg[2:]) + return // 应用列表 + } + if !m.Right(RIVER, arg) { + return // 没有授权 + } + + switch kit.Select("", arg, 1) { + case OCEAN, NODE: + m.Option(ice.MSG_RIVER, arg[0]) + m.Cmdy(arg[1], arg[2:]) + + case ctx.ACTION, aaa.INVITE: + m.Option(ice.MSG_RIVER, arg[0]) + m.Cmdy(RIVER, arg[1:]) + + default: + m.Cmdy(RIVER, arg) + } + }}, + RIVER: {Name: "river hash auto create", Help: "群组", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch m.Option(ctx.ACTION) { + case cli.START: + m.Cmdy(web.DREAM, ctx.ACTION, mdb.INPUTS, arg) + return } - switch kit.Select("", arg, 1) { - case USERS, TOOL, NODE: - m.Option(ice.MSG_RIVER, arg[0]) - m.Cmdy(arg[1], arg[2:]) - - case ctx.ACTION, aaa.INVITE: - m.Option(ice.MSG_RIVER, arg[0]) - m.Cmdy(RIVER, arg[1:]) - + switch arg[0] { + case kit.MDB_TEMPLATE: + m.Push(kit.MDB_TEMPLATE, ice.BASE) + case aaa.USERROLE: + m.Push(aaa.USERROLE, aaa.VOID, aaa.TECH, aaa.ROOT) + case aaa.USERNAME: + m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE) default: - m.Cmdy(RIVER, arg) + m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg) } }}, - RIVER: {Name: "river hash auto create", Help: "群组", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg) - m.Option(ice.MSG_RIVER, h) - m.Echo(h) + mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + h := m.Cmdx(mdb.INSERT, RIVER, "", mdb.HASH, arg) + m.Option(ice.MSG_RIVER, h) + m.Echo(h) - m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, NODE, kit.MDB_META, kit.MDB_SHORT), kit.MDB_NAME) - m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, USERS, kit.MDB_META, kit.MDB_SHORT), aaa.USERNAME) - m.Cmd(USERS, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) + m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, NODE, kit.Keym(kit.MDB_SHORT)), kit.MDB_NAME) + m.Conf(RIVER, kit.Keys(kit.MDB_HASH, h, OCEAN, kit.Keym(kit.MDB_SHORT)), aaa.USERNAME) + m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) - kit.Fetch(m.Confv(RIVER, kit.Keym(kit.MDB_TEMPLATE, kit.Select("base", m.Option(kit.MDB_TEMPLATE)))), func(storm string, value interface{}) { - h := m.Cmdx(TOOL, mdb.CREATE, kit.MDB_TYPE, PUBLIC, kit.MDB_NAME, storm, kit.MDB_TEXT, storm) + kit.Fetch(m.Confv(RIVER, kit.Keym(kit.MDB_TEMPLATE, kit.Select("base", m.Option(kit.MDB_TEMPLATE)))), func(storm string, value interface{}) { + h := m.Cmdx(STORM, mdb.CREATE, kit.MDB_TYPE, PUBLIC, kit.MDB_NAME, storm, kit.MDB_TEXT, storm) - 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, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, kit.MDB_HELP, cmd.Help) - }) + 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(STORM, mdb.INSERT, kit.MDB_HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, kit.MDB_HELP, cmd.Help) }) }) - }}, - mdb.REMOVE: {Name: "remove", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(kit.MDB_HASH)) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch m.Option(ctx.ACTION) { - case cli.START: - m.Cmdy(web.DREAM, ctx.ACTION, mdb.INPUTS, arg) - return - } - - switch arg[0] { - case aaa.USERNAME: - m.Cmdy(aaa.USER) - m.Appendv(ice.MSG_APPEND, aaa.USERNAME, aaa.USERNICK, aaa.USERZONE) - case aaa.USERROLE: - m.Push(aaa.USERROLE, aaa.VOID) - m.Push(aaa.USERROLE, aaa.TECH) - m.Push(aaa.USERROLE, aaa.ROOT) - case kit.MDB_TEMPLATE: - m.Push(kit.MDB_TEMPLATE, "base") - default: - m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg) - } - }}, - - aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(code.PUBLISH, ice.CONTEXTS) - m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_SH) - m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_BIN) - }}, - cli.START: {Name: "start name=hi repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(m.Space(m.Option(ice.POD)), web.DREAM, cli.START, arg) - }}, - - SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { - _header_share(m, arg...) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, arg) - m.PushAction(mdb.REMOVE) + }) }}, - }, - }) + + cli.START: {Name: "start name=hi repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(m.Space(m.Option(ice.POD)), web.DREAM, cli.START, arg) + }}, + aaa.INVITE: {Name: "invite", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(code.PUBLISH, ice.CONTEXTS) + m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_SH) + m.Cmd(code.PUBLISH, mdb.CREATE, kit.MDB_FILE, ice.BIN_ICE_BIN) + }}, + SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { + _header_share(m, arg...) + }}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.HashSelect(m, arg...) + }}, + }}) } diff --git a/core/chat/scan.go b/core/chat/scan.go index 8cff6bad..24543c58 100644 --- a/core/chat/scan.go +++ b/core/chat/scan.go @@ -11,29 +11,23 @@ import ( const SCAN = "scan" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - SCAN: {Name: SCAN, Help: "二维码", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", - )}, - }, - Commands: map[string]*ice.Command{ - SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "二维码", Action: ice.MergeAction(map[string]*ice.Action{ - "scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}}, - "scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) - }}, - mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(SCAN), "", mdb.HASH, arg) - }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(SCAN, kit.META_FIELD)) - if m.Cmdy(mdb.SELECT, m.Prefix(SCAN), "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { - m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) - m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) - } - m.PushAction(mdb.REMOVE) - }}, - }, - }) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + SCAN: {Name: SCAN, Help: "扫码", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,hash,type,name,text", + )}, + }, Commands: map[string]*ice.Command{ + SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict( + ice.Display("scan.js"), + ), Action: ice.MergeAction(map[string]*ice.Action{ + "scanQRCode0": {Name: "scan create", Help: "本机扫码"}, + "scanQRCode": {Name: "scan create", Help: "扫码"}, + mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if mdb.HashSelect(m, arg...); len(arg) > 0 { + m.PushScript(ssh.SCRIPT, m.Append(kit.MDB_TEXT)) + m.PushQRCode(cli.QRCODE, m.Append(kit.MDB_TEXT)) + } + m.PushAction(mdb.REMOVE) + }}, + }}) } diff --git a/core/chat/scan.js b/core/chat/scan.js new file mode 100644 index 00000000..a8d85203 --- /dev/null +++ b/core/chat/scan.js @@ -0,0 +1,18 @@ +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { + can.onmotion.clear(can) + can.onappend.table(can, msg) + can.onappend.board(can, msg) + can.base.isFunc(cb) && cb(msg) + }, +}) +Volcanos("onaction", {help: "控件交互", list: [], + scanQRCode: function(event, can, button) { can.user.agent.scanQRCode(function(text, data) { + var msg = can.request(event, data) + can.run(event, can.base.Simple(ctx.ACTION, data.action||button, data), function(msg) { + can.user.toast(can, text, "添加成功"), can.Update() + }, true) + }, can) }, + scanQRCode0: function(event, can) { can.user.agent.scanQRCode() }, +}) +Volcanos("onexport", {help: "导出数据", list: []}) + diff --git a/core/chat/search.go b/core/chat/search.go index 7db85e4d..022d064e 100644 --- a/core/chat/search.go +++ b/core/chat/search.go @@ -7,19 +7,17 @@ import ( kit "shylinux.com/x/toolkits" ) -const P_SEARCH = "/search" - func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ - P_SEARCH: {Name: P_SEARCH, Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, + "search": {Name: "search", Help: "搜索", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME)}, }, Commands: map[string]*ice.Command{ - P_SEARCH: {Name: P_SEARCH, Help: "搜索引擎", Action: ice.MergeAction(map[string]*ice.Action{ + "/search": {Name: "/search", Help: "搜索引擎", Action: ice.MergeAction(map[string]*ice.Action{ mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - m.Richs(P_SEARCH, "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + m.Richs("/search", "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { if value = kit.GetMeta(value); arg[1] != "" && !kit.Contains(value[kit.MDB_NAME], arg[1]) { return } - m.PushSearch(ice.CMD, P_SEARCH, value) + m.PushSearch(ice.CMD, "/search", value) }) }}, mdb.RENDER: {Name: "render", Help: "渲染", Hand: func(m *ice.Message, arg ...string) { @@ -32,7 +30,8 @@ func init() { if m.Cmdy(m.Space(m.Option(ice.POD)), mdb.SEARCH, arg); arg[1] == "" { return } - m.Cmd(mdb.INSERT, m.Prefix(P_SEARCH), "", mdb.HASH, + m.StatusTimeCount() + m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_NAME, arg[1], kit.MDB_TYPE, arg[0], kit.MDB_TEXT, kit.Select("", arg, 2)) }}, }}) diff --git a/core/chat/tool.go b/core/chat/storm.go similarity index 50% rename from core/chat/tool.go rename to core/chat/storm.go index e461ce23..f89dc3f1 100644 --- a/core/chat/tool.go +++ b/core/chat/storm.go @@ -8,79 +8,81 @@ import ( kit "shylinux.com/x/toolkits" ) +func _storm_key(m *ice.Message, key ...interface{}) string { + return _river_key(m, STORM, kit.MDB_HASH, kit.Keys(key)) +} + const STORM = "storm" -const TOOL = "tool" func init() { Index.Merge(&ice.Context{Commands: map[string]*ice.Command{ - TOOL: {Name: "tool hash id auto insert create", 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, _river_key(m, TOOL), mdb.HASH, arg) - }}, - mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, TOOL, m.OptionSimple(kit.MDB_HASH)), mdb.LIST, arg[2:]) - }}, - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_ID) == "" { - m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, TOOL), mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg) - } else { - m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, TOOL, m.OptionSimple(kit.MDB_HASH)), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg) - } - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, _river_key(m, TOOL), mdb.HASH, m.OptionSimple(kit.MDB_HASH)) - }}, - mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_ID) != "" { - msg := m.Cmd(TOOL, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID)) - cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)) - - _action_domain(m, cmd, m.Option(kit.MDB_HASH)) - m.Cmdy(m.Space(msg.Append(ice.POD)), cmd, mdb.EXPORT) - } - }}, - mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - if m.Option(kit.MDB_ID) != "" { - msg := m.Cmd(TOOL, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID)) - cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)) - - _action_domain(m, cmd, m.Option(kit.MDB_HASH)) - m.Cmdy(m.Space(msg.Append(ice.POD)), cmd, mdb.IMPORT) - } - }}, + STORM: {Name: "storm hash id auto insert create", Help: "工具", Action: map[string]*ice.Action{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { if cli.Inputs(m, arg[0]) { return } - switch arg[0] { case kit.MDB_HASH: - m.Cmdy(TOOL, ice.OptionFields("hash,name")) + m.Cmdy(STORM, ice.OptionFields("hash,name")) } }}, + 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, _river_key(m, STORM), mdb.HASH, arg) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(kit.MDB_HASH)) + }}, + mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(kit.MDB_HASH)), mdb.LIST, arg[2:]) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + if m.Option(kit.MDB_ID) == "" { + m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(kit.MDB_HASH), arg) + } else { + m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(kit.MDB_HASH)), mdb.LIST, m.OptionSimple(kit.MDB_ID), arg) + } + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + if m.Option(kit.MDB_ID) == "" { + return + } + msg := m.Cmd(STORM, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID)) + cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)) + _action_domain(m, cmd, m.Option(kit.MDB_HASH)) + m.Cmdy(cmd, mdb.EXPORT) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + if m.Option(kit.MDB_ID) == "" { + return + } + msg := m.Cmd(STORM, m.Option(kit.MDB_HASH), m.Option(kit.MDB_ID)) + cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)) + _action_domain(m, cmd, m.Option(kit.MDB_HASH)) + m.Cmdy(cmd, mdb.IMPORT) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) == 0 { + if len(arg) == 0 { // 应用列表 m.OptionFields("time,hash,type,name,count") - m.Cmdy(mdb.SELECT, RIVER, _river_key(m, TOOL), mdb.HASH) + m.Cmdy(mdb.SELECT, RIVER, _river_key(m, STORM), mdb.HASH) m.PushAction(mdb.REMOVE) m.Sort(kit.MDB_NAME) - return // 应用列表 + return } m.OptionFields("time,id,pod,ctx,cmd,arg,display,style") - msg := m.Cmd(mdb.SELECT, RIVER, _river_key(m, TOOL, kit.MDB_HASH, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1)) - if len(msg.Appendv(ice.CMD)) == 0 && len(arg) > 1 { + msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, kit.MDB_ID, kit.Select("", arg, 1)) + if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组 msg.Push(ice.CMD, arg[1]) } - if len(arg) > 2 && arg[2] == ice.RUN { - m.Cmdy(m.Space(msg.Append(ice.POD)), kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:]) - return // 执行命令 + if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令 + m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), msg.Append(ice.POD))), + kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:]) + return } - if m.Copy(msg); len(arg) < 2 { + if m.Copy(msg); len(arg) == 1 { // 命令列表 m.PushAction(mdb.EXPORT, mdb.IMPORT) - return // 命令列表 } // 命令插件 diff --git a/core/code/binpack.go b/core/code/binpack.go index 3b6ae677..de72161f 100644 --- a/core/code/binpack.go +++ b/core/code/binpack.go @@ -115,8 +115,8 @@ func init() { if strings.HasPrefix(key, "/") { key = ice.USR_VOLCANOS + key } - m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR) != nil, "key: ", key) - m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE) != nil, "key: ", key) + m.Warn(os.MkdirAll(path.Dir(key), ice.MOD_DIR), "mkdir", key) + m.Warn(ioutil.WriteFile(key, value, ice.MOD_FILE), "write", key) } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/core/code/inner.go b/core/code/inner.go index 978896fc..e2f1c803 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -13,7 +13,7 @@ import ( ) func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { - if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { + if !m.Right(dir, file) { return // 没有权限 } if m.Cmdy(mdb.RENDER, ext, file, dir, arg); m.Result() != "" { @@ -25,7 +25,7 @@ func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { } } func _inner_show(m *ice.Message, ext, file, dir string, arg ...string) { - if m.Warn(!m.Right(dir, file), ice.ErrNotRight, path.Join(dir, file)) { + if !m.Right(dir, file) { return // 没有权限 } if m.Cmdy(mdb.ENGINE, ext, file, dir, arg); m.Result() != "" { @@ -95,6 +95,12 @@ func init() { nfs.Dir(m, kit.MDB_PATH) return } + if !strings.HasSuffix(arg[0], ice.PS) { + arg[1] = kit.Slice(strings.Split(arg[0], ice.PS), -1)[0] + arg[0] = strings.TrimSuffix(arg[0], arg[1]) + m.ProcessRewrite("path", arg[0], "file", arg[1]) + return + } _inner_list(m, kit.Ext(arg[1]), arg[1], arg[0]) }}, }, Configs: map[string]*ice.Config{ diff --git a/core/code/vimer.go b/core/code/vimer.go index b630a759..87a54be4 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -24,7 +24,7 @@ func init() { return } - if arg = kit.Split(strings.Join(arg, " ")); !m.Warn(!m.Right(arg)) { + if arg = kit.Split(strings.Join(arg, " ")); m.Right(arg) { if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 { m.Cmdy(cli.SYSTEM, arg) } diff --git a/core/code/webpack.go b/core/code/webpack.go index 58d4adde..c89e3b7f 100644 --- a/core/code/webpack.go +++ b/core/code/webpack.go @@ -18,6 +18,7 @@ func _publish(file ...string) string { return path.Join(ice.USR_PUBLISH, path.Join(file...)) } +const DEVPACK = "devpack" const WEBPACK = "webpack" func init() { @@ -85,15 +86,11 @@ func init() { } m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css")) - m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("page/cache.js")) + m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("frame.js"), _volcanos("page/cache.js")) }}, - mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.css"), "") - m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.js"), "") - }}, - "unpack": {Name: "unpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.js")) - m.Cmd(nfs.SAVE, path.Join(ice.USR_VOLCANOS, "page/cache.css")) + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(nfs.SAVE, _volcanos("page/cache.js")) + m.Cmd(nfs.SAVE, _volcanos("page/cache.css")) m.Cmd(nfs.COPY, _volcanos("page/cmd.css"), _volcanos("page/index.css"), _volcanos("page/cache.css")) m.Cmd(nfs.COPY, _volcanos("page/cmd.js"), _volcanos("proto.js"), _volcanos("page/cache.js")) }}, diff --git a/exec.go b/exec.go index 7dd8916e..173d87e3 100644 --- a/exec.go +++ b/exec.go @@ -81,7 +81,7 @@ func (m *Message) Call(sync bool, cb func(*Message) *Message) *Message { p := kit.Select("10s", m.Option(kit.MDB_TIMEOUT)) t := time.AfterFunc(kit.Duration(p), func() { - m.Warn(true, "timeout", p, "of", m.Detailv()) + m.Warn(true, ErrTimeout, m.Detailv()) m.Back(nil) wait <- false }) @@ -136,9 +136,9 @@ func (m *Message) Event(key string, arg ...string) *Message { return m } func (m *Message) Right(arg ...interface{}) bool { - return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right", - m.Option(MSG_USERROLE), strings.ReplaceAll(kit.Keys(arg...), PS, PT)) != OK, - ErrNotRight, m.Option(MSG_USERROLE), OF, kit.Join(kit.Simple(arg), PT), " at ", kit.FileLine(2, 3)) + key := strings.ReplaceAll(kit.Keys(arg...), PS, PT) + return m.Option(MSG_USERROLE) == "root" || !m.Warn(m.Cmdx("role", "right", m.Option(MSG_USERROLE), key) != OK, + ErrNotRight, kit.Join(kit.Simple(arg), PT), "userrole", m.Option(MSG_USERROLE), "fileline", kit.FileLine(2, 3)) } func (m *Message) Space(arg interface{}) []string { if arg == nil || arg == "" || kit.Format(arg) == m.Conf("runtime", "node.name") { diff --git a/init.go b/init.go index c7597b3f..0691d726 100644 --- a/init.go +++ b/init.go @@ -106,7 +106,9 @@ func Run(arg ...string) string { } Index.root, Pulse.root = Index, Pulse + Pulse.Option(CACHE_LIMIT, "10") + log.LogDisable = false switch Index.Merge(Index).Begin(Pulse.Spawn(), arg...); kit.Select("", arg, 0) { case "serve", "space": if log.LogDisable = false; Index.Start(Pulse, arg...) { diff --git a/logs.go b/logs.go index e35fc43b..8e54b6f5 100644 --- a/logs.go +++ b/logs.go @@ -1,6 +1,7 @@ package ice import ( + "io" "runtime" "strings" "time" @@ -52,12 +53,13 @@ func (m *Message) log(level string, str string, arg ...interface{}) *Message { return m } func (m *Message) join(arg ...interface{}) string { + args := kit.Simple(arg...) list := []string{} - for i := 0; i < len(arg); i += 2 { - if i == len(arg)-1 { - list = append(list, kit.Format(arg[i])) + for i := 0; i < len(args); i += 2 { + if i == len(args)-1 { + list = append(list, args[i]) } else { - list = append(list, kit.Format(arg[i])+":", kit.Format(arg[i+1])) + list = append(list, args[i]+kit.Select("", ":", !strings.HasSuffix(strings.TrimSpace(args[i]), ":")), args[i+1]) } } return kit.Join(list, SP) @@ -73,14 +75,23 @@ func (m *Message) Cost(arg ...interface{}) *Message { list := []string{m.FormatCost(), m.join(arg...)} return m.log(LOG_COST, kit.Join(list, SP)) } -func (m *Message) Warn(err bool, arg ...interface{}) bool { - if !err || len(m.meta[MSG_RESULT]) > 0 && m.meta[MSG_RESULT][0] == ErrWarn { - return err +func (m *Message) Warn(err interface{}, arg ...interface{}) bool { + switch err := err.(type) { + case error: + if err == io.EOF { + return false + } + arg = append(arg, "err", err) + case bool: + if !err { + return false + } + case nil: + return false } - - m.meta[MSG_RESULT] = kit.Simple(ErrWarn, arg) - m.log(LOG_WARN, m.join(kit.Simple(arg))) - return err + m.meta[MSG_RESULT] = kit.Simple(ErrWarn, kit.Simple(arg...)) + m.log(LOG_WARN, m.join(kit.Simple(arg...))) + return true } func (m *Message) Error(err bool, str string, arg ...interface{}) bool { if err { @@ -148,6 +159,9 @@ func (m *Message) FormatSize() string { func (m *Message) FormatMeta() string { return kit.Format(m.meta) } +func (m *Message) FormatsMeta() string { + return kit.Formats(m.meta) +} func (m *Message) FormatStack() string { pc := make([]uintptr, 100) frames := runtime.CallersFrames(pc[:runtime.Callers(5, pc)]) diff --git a/meta.go b/meta.go index 86074325..55a1ca85 100644 --- a/meta.go +++ b/meta.go @@ -55,12 +55,20 @@ func (m *Message) Add(key string, arg ...string) *Message { m.meta[key] = append(m.meta[key], arg...) case MSG_OPTION, MSG_APPEND: - if len(arg) > 0 { - if kit.IndexOf(m.meta[key], arg[0]) == -1 { - m.meta[key] = append(m.meta[key], arg[0]) - } - m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...) + if len(arg) == 0 { + break } + if key == MSG_APPEND { + if i := kit.IndexOf(m.meta[MSG_OPTION], arg[0]); i > -1 { + m.meta[MSG_OPTION][i] = "" + delete(m.meta, arg[0]) + } + } + + if kit.IndexOf(m.meta[key], arg[0]) == -1 { + m.meta[key] = append(m.meta[key], arg[0]) + } + m.meta[arg[0]] = append(m.meta[arg[0]], arg[1:]...) } return m } diff --git a/misc.go b/misc.go index 7477637c..6bc39c3c 100644 --- a/misc.go +++ b/misc.go @@ -185,7 +185,7 @@ func (m *Message) cmd(arg ...interface{}) *Message { }) } - m.Warn(!ok, ErrNotFound, list) + m.Warn(!ok, ErrNotFound, kit.Format(list)) return m } func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Message { @@ -219,7 +219,7 @@ func (c *Context) _cmd(m *Message, cmd *Command, key string, k string, h *Action return m } - if k == RUN && m.Warn(!m.Right(arg), ErrNotRight, arg) { + if k == RUN && !m.Right(arg) { return m } diff --git a/misc/bash/sess.go b/misc/bash/sess.go index e4e9c390..0388d625 100644 --- a/misc/bash/sess.go +++ b/misc/bash/sess.go @@ -41,7 +41,7 @@ func init() { return } - if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) { + if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin, arg) { return } @@ -49,7 +49,7 @@ func init() { ice.OptionFields(m.Conf(SESS, kit.META_FIELD))) m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) - m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin) + m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin, arg) }}, "/qrcode": {Name: "/qrcode", Help: "二维码", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmdy(cli.QRCODE, m.Option(kit.MDB_TEXT), m.Option(cli.FG), m.Option(cli.BG)) diff --git a/misc/lark/home.go b/misc/lark/home.go index 8b325d4e..c35a766d 100644 --- a/misc/lark/home.go +++ b/misc/lark/home.go @@ -21,7 +21,7 @@ func init() { text, link, list := kit.Select("", arg, 3), kit.MergeURL2(m.Conf(web.SHARE, kit.Keym(kit.MDB_DOMAIN)), "/chat/lark/sso"), []string{} if len(arg) == 0 { m.Cmd("web.chat./river").Table(func(index int, val map[string]string, head []string) { - m.Cmd("web.chat./river", val[kit.MDB_HASH], chat.TOOL).Table(func(index int, value map[string]string, head []string) { + m.Cmd("web.chat./river", val[kit.MDB_HASH], chat.STORM).Table(func(index int, value map[string]string, head []string) { list = append(list, kit.Keys(val[kit.MDB_NAME], value[kit.MDB_NAME]), ice.CMD, kit.Format([]string{HOME, val[kit.MDB_HASH], value[kit.MDB_HASH], val[kit.MDB_NAME] + "." + value[kit.MDB_NAME]})) }) @@ -30,7 +30,7 @@ func init() { m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_STORM, arg[1]) link = kit.MergeURL(link, chat.RIVER, arg[0], chat.STORM, arg[1]) - m.Cmd("web.chat./river", arg[0], chat.TOOL, arg[1]).Table(func(index int, value map[string]string, head []string) { + m.Cmd("web.chat./river", arg[0], chat.STORM, arg[1]).Table(func(index int, value map[string]string, head []string) { list = append(list, value[ice.CMD], ice.CMD, kit.Keys(value[ice.CTX], value[ice.CMD])) }) } diff --git a/misc/ssh/service.go b/misc/ssh/service.go index fec8573a..27d70d33 100644 --- a/misc/ssh/service.go +++ b/misc/ssh/service.go @@ -36,8 +36,8 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { if !strings.HasPrefix(value[kit.MDB_NAME], conn.User()+"@") { return } - if s, e := base64.StdEncoding.DecodeString(value[kit.MDB_TEXT]); !m.Warn(e != nil, e) { - if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e != nil, e) { + if s, e := base64.StdEncoding.DecodeString(value[kit.MDB_TEXT]); !m.Warn(e) { + if pub, e := ssh.ParsePublicKey([]byte(s)); !m.Warn(e) { if bytes.Compare(pub.Marshal(), key.Marshal()) == 0 { m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User(), tcp.HOSTNAME, value[kit.MDB_NAME]) @@ -72,7 +72,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { } func _ssh_accept(m *ice.Message, h string, c net.Conn) { conn, chans, reqs, err := ssh.NewServerConn(c, _ssh_config(m, h)) - if m.Warn(err != nil, err) { + if m.Warn(err) { return } @@ -80,7 +80,7 @@ func _ssh_accept(m *ice.Message, h string, c net.Conn) { for ch := range chans { channel, requests, err := ch.Accept() - if m.Warn(err != nil, err) { + if m.Warn(err) { continue } diff --git a/misc/ssh/service_linux.go b/misc/ssh/service_linux.go index 551963a5..d6911479 100644 --- a/misc/ssh/service_linux.go +++ b/misc/ssh/service_linux.go @@ -9,12 +9,12 @@ import ( "unsafe" "github.com/kr/pty" + "golang.org/x/crypto/ssh" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" - "golang.org/x/crypto/ssh" ) type Winsize struct{ Height, Width, x, y uint16 } @@ -38,7 +38,7 @@ func _ssh_handle(m *ice.Message, meta map[string]string, c net.Conn, channel ssh list := []string{cli.PATH + "=" + os.Getenv(cli.PATH)} pty, tty, err := pty.Open() - if m.Warn(err != nil, err) { + if m.Warn(err) { return } defer tty.Close() diff --git a/misc/trash/web/_favor.go b/misc/trash/web/_favor.go index 46bfc25b..3df2c71c 100644 --- a/misc/trash/web/_favor.go +++ b/misc/trash/web/_favor.go @@ -145,7 +145,7 @@ func _favor_modify(m *ice.Message, zone, id, pro, set, old string) { m.Richs(FAVOR, nil, zone, func(key string, val map[string]interface{}) { switch pro { case kit.MDB_ZONE, kit.MDB_ID, kit.MDB_TIME: - m.Warn(true, "deny modify %v", pro) + m.Warn(true, ice.ErrNotRight, pro) return } @@ -363,7 +363,7 @@ func init() { "/share/": {Name: "/share/", Help: "共享链", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Richs(SHARE, nil, kit.Select(m.Option(kit.SSH_SHARE), arg, 0), func(key string, value map[string]interface{}) { m.Log_SELECT(kit.MDB_META, SHARE, "arg", arg, "value", kit.Format(value)) - if m.Warn(m.Option(ice.MSG_USERROLE) != aaa.ROOT && kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()), "expired") { + if m.Warn(m.Option(ice.MSG_USERROLE) != aaa.ROOT && kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()), ice.ErrExpire, arg) { m.Echo("expired") return } diff --git a/misc/vim/sess.go b/misc/vim/sess.go index ed5ea17e..74af6d55 100644 --- a/misc/vim/sess.go +++ b/misc/vim/sess.go @@ -39,12 +39,12 @@ func init() { } } - switch m.RenderResult(); m.R.URL.String() { + switch m.RenderResult(); arg[0] { case "/qrcode", "/input", "/sess": // 登录入口 return } - if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin) { + if m.Warn(m.Option(SID, strings.TrimSpace(m.Option(SID))) == "", ice.ErrNotLogin, arg[0]) { return } @@ -52,7 +52,7 @@ func init() { ice.OptionFields(m.Conf(SESS, kit.META_FIELD))) m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME)) m.Option(tcp.HOSTNAME, msg.Append(tcp.HOSTNAME)) - m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin) + m.Warn(m.Option(aaa.USERNAME) == "", ice.ErrNotLogin, arg[0]) }}, "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{ aaa.LOGOUT: {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { diff --git a/misc/wework/bot.go b/misc/wework/bot.go index 2a231516..bc36fc5e 100644 --- a/misc/wework/bot.go +++ b/misc/wework/bot.go @@ -26,13 +26,10 @@ func init() { msg := m.Cmd(BOT, arg[0]) check := kit.Sort([]string{msg.Append("token"), m.Option("nonce"), m.Option("timestamp"), m.Option("echostr")}) sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))) - m.Debug("what %v", sig) - m.Debug("what %v", check) - if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight) { + if m.Warn(sig != m.Option("msg_signature"), ice.ErrNotRight, arg) { // return } - m.Debug("what %v", msg.Append("ekey")) aeskey, err := base64.RawURLEncoding.DecodeString(msg.Append("ekey")) m.Assert(err) diff --git a/misc/wx/access.go b/misc/wx/access.go index 73cf11be..bb4a84e3 100644 --- a/misc/wx/access.go +++ b/misc/wx/access.go @@ -45,7 +45,7 @@ const ACCESS = "access" func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data( - ssh.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js", + ssh.SCRIPT, "/plugin/local/chat/wx.js", tcp.SERVER, "https://api.weixin.qq.com", APPID, "", APPMM, "", "tokens", "", )}, diff --git a/misc/wx/login.go b/misc/wx/login.go index 7969ff8e..bea07166 100644 --- a/misc/wx/login.go +++ b/misc/wx/login.go @@ -13,7 +13,7 @@ import ( func _wx_check(m *ice.Message) bool { check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")}) - if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight) { + if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight, check) { return false // 验证失败 } if m.Option("echostr") != "" { @@ -74,7 +74,7 @@ func init() { case TEXT: // 文本 cmds := kit.Split(m.Option("Content")) - if m.Warn(!m.Right(cmds), ice.ErrNotRight) { + if !m.Right(cmds) { cmds = []string{MENU, mdb.CREATE} } m.Cmdy(TEXT, cmds) diff --git a/render.go b/render.go index 39f9f199..10c5091f 100644 --- a/render.go +++ b/render.go @@ -73,6 +73,23 @@ func (m *Message) RenderDownload(args ...interface{}) *Message { func (m *Message) RenderIndex(serve, repos string, file ...string) *Message { return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, kit.MDB_PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, kit.MDB_INDEX)), path.Join(file...)))) } +func (m *Message) RenderCmd(index string, args ...interface{}) { + list := index + if index != "" { + list = kit.Format(kit.List(kit.Dict("index", index, "args", kit.Simple(args)))) + } + m.RenderResult(kit.Format(` + + + + + + + + + +`, list)) +} func (m *Message) IsCliUA() bool { if m.Option(MSG_USERUA) == "" || !strings.HasPrefix(m.Option(MSG_USERUA), "Mozilla/5.0") { diff --git a/type.go b/type.go index 85fec25d..894cdd21 100644 --- a/type.go +++ b/type.go @@ -105,45 +105,65 @@ func (c *Context) Merge(s *Context) *Context { if c.Commands[CTX_EXIT] == nil { c.Commands[CTX_EXIT] = &Command{Hand: func(m *Message, c *Context, cmd string, arg ...string) { m.Save() }} } - for k, v := range s.Commands { - if p, ok := c.Commands[k]; ok && s != c { - switch last, next := p.Hand, v.Hand; k { + + for key, cmd := range s.Commands { + if p, ok := c.Commands[key]; ok && s != c { + switch last, next := p.Hand, cmd.Hand; key { case CTX_INIT: - v.Hand = func(m *Message, c *Context, key string, arg ...string) { + cmd.Hand = func(m *Message, c *Context, key string, arg ...string) { last(m, c, key, arg...) next(m, c, key, arg...) } case CTX_EXIT: - v.Hand = func(m *Message, c *Context, key string, arg ...string) { + cmd.Hand = func(m *Message, c *Context, key string, arg ...string) { next(m, c, key, arg...) last(m, c, key, arg...) } } } - if v.Meta == nil { - v.Meta = kit.Dict() + if cmd.Meta == nil { + cmd.Meta = kit.Dict() } - if c.Commands[k] = v; v.List == nil { - v.List = c.split(v.Name) + if c.Commands[key] = cmd; cmd.List == nil { + cmd.List = c.split(cmd.Name) } - for k, a := range v.Action { + for k, a := range cmd.Action { + if p, ok := c.Commands[k]; ok { + switch last, next := p.Hand, a.Hand; k { + case CTX_INIT: + p.Hand = func(m *Message, c *Context, _key string, arg ...string) { + last(m, c, _key, arg...) + m._key, m._cmd = key, cmd + next(m, arg...) + m._key, m._cmd = _key, p + } + case CTX_EXIT: + p.Hand = func(m *Message, c *Context, _key string, arg ...string) { + m._key, m._cmd = key, cmd + next(m, arg...) + m._key, m._cmd = _key, p + last(m, c, _key, arg...) + } + } + } + help := strings.SplitN(a.Help, ":", 2) if len(help) == 1 || help[1] == "" { help = strings.SplitN(help[0], ":", 2) } - if kit.Value(v.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 { - kit.Value(v.Meta, kit.Keys(kit.MDB_TITLE, k), help[1]) + if kit.Value(cmd.Meta, kit.Keys("_trans", k), help[0]); len(help) > 1 { + kit.Value(cmd.Meta, kit.Keys(kit.MDB_TITLE, k), help[1]) } if a.Hand == nil { - continue + continue // alias cmd } if a.List == nil { a.List = c.split(a.Name) } if len(a.List) > 0 { - v.Meta[k] = a.List + cmd.Meta[k] = a.List } } }