diff --git a/base/web/dream.go b/base/web/dream.go index 54a173ab..143d91df 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -17,38 +17,24 @@ import ( func _dream_list(m *ice.Message) *ice.Message { list := m.CmdMap(SPACE, mdb.NAME) - m.Cmdy(nfs.DIR, ice.USR_LOCAL_WORK+ice.PS, "time,size,name", func(value ice.Maps) { - if dream, ok := list[value[mdb.NAME]]; ok { - m.Push(mdb.TYPE, dream[mdb.TYPE]) + m.Cmdy(nfs.DIR, ice.USR_LOCAL_WORK, "time,size,name").Tables(func(value ice.Maps) { + if space, ok := list[value[mdb.NAME]]; ok { + msg := gdb.Event(m.Spawn(), DREAM_TABLES, mdb.NAME, value[mdb.NAME], mdb.TYPE, space[mdb.TYPE]).Copy(m.Spawn().PushButton(cli.STOP)) + m.Push(mdb.TYPE, space[mdb.TYPE]) m.Push(cli.STATUS, cli.START) - m.PushButton(cli.OPEN, "xterm", "vimer", cli.STOP) - m.PushAnchor(strings.Split(MergePod(m, value[mdb.NAME]), "?")[0]) - text := []string{} - for _, line := range kit.Split(m.Cmdx(SPACE, value[mdb.NAME], cli.SYSTEM, "git", "diff", "--shortstat"), ice.FS, ice.FS) { - if list := kit.Split(line); strings.Contains(line, "file") { - text = append(text, list[0]+" file") - } else if strings.Contains(line, "ins") { - text = append(text, list[0]+" +++") - } else if strings.Contains(line, "dele") { - text = append(text, list[0]+" ---") - } - } - m.Push(mdb.TEXT, strings.Join(text, ", ")) + m.Push(mdb.TEXT, msg.Append(mdb.TEXT)) + m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), "")) } else { m.Push(mdb.TYPE, WORKER) m.Push(cli.STATUS, cli.STOP) - m.PushButton(cli.START, nfs.TRASH) - m.PushAnchor("") m.Push(mdb.TEXT, "") + m.PushButton(cli.START, nfs.TRASH) } }) - m.Sort("status,type,name") - m.StatusTimeCount(cli.START, len(list)) - return m + return m.Sort("status,type,name").StatusTimeCount(cli.START, len(list)) } - func _dream_show(m *ice.Message, name string) { - if m.Warn(name == "") { + if m.Warn(name == "", ice.ErrNotValid) { return } if !strings.Contains(name, "-") || !strings.HasPrefix(name, "20") { @@ -59,59 +45,58 @@ func _dream_show(m *ice.Message, name string) { p := path.Join(ice.USR_LOCAL_WORK, name) if pid := m.Cmdx(nfs.CAT, path.Join(p, ice.Info.PidPath)); pid != "" && nfs.ExistsFile(m, "/proc/"+pid) { m.Info("already exists %v", pid) - return // 已经启动 + return } else if m.Cmd(SPACE, name).Length() > 0 { - return // 已经启动 + m.Info("already exists %v", name) + return } - if m.Option(nfs.REPOS) != "" { // 下载源码 - m.Cmd("web.code.git.repos", mdb.CREATE, m.OptionSimple(nfs.REPOS), nfs.PATH, p) - } else { // 创建目录 - nfs.MkdirAll(m, p) - } + nfs.MkdirAll(m, p) + _dream_template(m, p) - // 目录文件 - if m.Option(nfs.TEMPLATE) != "" { - for _, file := range []string{ - ice.ETC_MISS_SH, ice.SRC_MAIN_SHY, ice.SRC_MAIN_GO, - ice.GO_MOD, ice.MAKEFILE, ice.README_MD, - } { - if nfs.ExistsFile(m, path.Join(p, file)) { - continue - } - switch m.Cmdy(nfs.COPY, path.Join(p, file), path.Join(ice.USR_LOCAL_WORK, m.Option(nfs.TEMPLATE), file)); file { - case ice.GO_MOD: - kit.Rewrite(path.Join(p, file), func(line string) string { - return kit.Select(line, "module "+name, strings.HasPrefix(line, "module")) - }) - } - } - } - - // 环境变量 m.Optionv(cli.CMD_DIR, kit.Path(p)) m.Optionv(cli.CMD_ENV, kit.Simple( - cli.CTX_OPS, "http://:"+m.Cmd(SERVE, ice.OptionFields("")).Append(tcp.PORT), - cli.PATH, cli.BinPath(kit.Path(p, ice.BIN)), cli.HOME, kit.Env(cli.HOME), - cli.TERM, kit.Env(cli.TERM), cli.SHELL, kit.Env(cli.SHELL), - cli.USER, ice.Info.UserName, m.Configv(cli.ENV), + cli.CTX_OPS, "http://:"+m.CmdAppend(SERVE, tcp.PORT), + cli.PATH, cli.BinPath(kit.Path(p, ice.BIN)), cli.USER, ice.Info.UserName, + kit.EnvSimple(cli.HOME, cli.TERM, cli.SHELL), m.Configv(cli.ENV), )) m.Optionv(cli.CMD_OUTPUT, path.Join(p, ice.BIN_BOOT_LOG)) + defer m.OptionMulti(cli.CMD_DIR, "", cli.CMD_ENV, "", cli.CMD_OUTPUT, "") + gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.NAME, mdb.TYPE)) defer ToastProcess(m)() bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, nfs.PWD+path.Join(p, ice.BIN), nfs.PWD+ice.BIN)) - m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER), "daemon", "ops") - - defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME)) - m.Option(cli.CMD_OUTPUT, "") - m.Option(cli.CMD_ENV, "") + m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER), cli.DAEMON, ice.OPS) m.Sleep3s() } +func _dream_template(m *ice.Message, p string) { + if m.Option(nfs.TEMPLATE) == "" { + return + } + for _, file := range []string{ + ice.ETC_MISS_SH, ice.SRC_MAIN_SHY, ice.SRC_MAIN_GO, + ice.GO_MOD, ice.MAKEFILE, ice.README_MD, + } { + if nfs.ExistsFile(m, path.Join(p, file)) { + continue + } + switch m.Cmdy(nfs.COPY, path.Join(p, file), path.Join(ice.USR_LOCAL_WORK, m.Option(nfs.TEMPLATE), file)); file { + case ice.GO_MOD: + kit.Rewrite(path.Join(p, file), func(line string) string { + return kit.Select(line, "module "+m.Option(mdb.NAME), strings.HasPrefix(line, "module")) + }) + } + } +} const ( DREAM_CREATE = "dream.create" DREAM_START = "dream.start" DREAM_STOP = "dream.stop" + + DREAM_INPUTS = "dream.inputs" + DREAM_TABLES = "dream.tables" + DREAM_ACTION = "dream.action" ) const DREAM = "dream" @@ -120,56 +105,48 @@ func init() { DREAM: {Name: "dream name path auto create", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { switch arg[0] { - case nfs.REPOS: - m.Cmd("web.code.git.server", func(value ice.Maps) { - m.Push(nfs.PATH, MergeLink(m, path.Join("/x/", path.Clean(value[nfs.PATH])+".git"))) - }) - m.Sort(nfs.PATH) + case mdb.NAME, nfs.TEMPLATE: + _dream_list(m).Cut(arg[0], "status,time") default: - _dream_list(m).Cut("name,status,time") + gdb.Event(m, "", arg) } }}, - mdb.CREATE: {Name: "create name=hi repos", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - _dream_show(m, m.Option(mdb.NAME, kit.Select(path.Base(m.Option(nfs.REPOS)), m.Option(mdb.NAME)))) + mdb.CREATE: {Name: "create name=hi repos template", Hand: func(m *ice.Message, arg ...string) { + _dream_show(m, m.OptionDefault(mdb.NAME, path.Base(m.Option(nfs.REPOS)))) }}, - cli.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { + cli.START: {Hand: func(m *ice.Message, arg ...string) { _dream_show(m, m.Option(mdb.NAME)) }}, - cli.OPEN: {Name: "open", Help: "系统", Hand: func(m *ice.Message, arg ...string) { - m.ProcessOpen(MergePod(m, m.Option(mdb.NAME), "", "")) - }}, - "xterm": {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) { - ProcessWebsite(m, m.Option(mdb.NAME), "web.code.xterm", mdb.HASH, - m.Cmdx(SPACE, m.Option(mdb.NAME), "web.code.xterm", mdb.CREATE, mdb.TYPE, nfs.SH, m.OptionSimple(mdb.NAME), mdb.TEXT, "")) - }}, - "vimer": {Name: "vimer", Help: "编程", Hand: func(m *ice.Message, arg ...string) { - ProcessWebsite(m, m.Option(mdb.NAME), "web.code.vimer", "", "") - }}, - cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { + OPEN: {Hand: func(m *ice.Message, arg ...string) { ProcessIframe(m, MergePod(m, m.Option(mdb.NAME)), arg...) }}, + cli.STOP: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(SPACE, mdb.MODIFY, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) m.Go(func() { m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) }) ctx.ProcessRefresh(m, "1s") }}, - DREAM_STOP: {Name: "dream.stop type name", Help: "停止", Hand: func(m *ice.Message, arg ...string) { - if m.CmdAppend(SPACE, m.Option(mdb.NAME), mdb.STATUS) == cli.STOP { - m.Cmd(mdb.DELETE, m.Prefix(SPACE), "", mdb.HASH, m.OptionSimple(mdb.NAME)) - } else { - m.Cmd(mdb.DELETE, m.Prefix(SPACE), "", mdb.HASH, m.OptionSimple(mdb.NAME)) - m.Sleep3s(DREAM, cli.START, m.OptionSimple(mdb.NAME)) - } - }}, - nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.TRASH, mdb.CREATE, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME))) - ctx.ProcessRefresh(m) }}, - }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 0 { - if _dream_list(m); !m.IsMobileUA() { - ctx.DisplayTableCard(m) + DREAM_STOP: {Hand: func(m *ice.Message, arg ...string) { + if m.CmdAppend(SPACE, m.Option(mdb.NAME), mdb.STATUS) != cli.STOP { + m.Go(func() { m.Sleep3s(DREAM, cli.START, m.OptionSimple(mdb.NAME)) }) } + }}, + }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { + if len(arg) == 0 { + _dream_list(m) + } else if arg[0] == ctx.ACTION { + gdb.Event(m, DREAM_ACTION, arg) } else { m.Cmdy(nfs.CAT, arg[1:], kit.Dict(nfs.DIR_ROOT, path.Join(ice.USR_LOCAL_WORK, arg[0]))) } }}, }) } + +func DreamAction() ice.Actions { + return ice.MergeActions(ice.Actions{ + DREAM_INPUTS: {Hand: func(m *ice.Message, arg ...string) {}}, + DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {}}, + DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) {}}, + }, gdb.EventAction(DREAM_TABLES, DREAM_ACTION)) +} diff --git a/base/web/option.go b/base/web/option.go index dda54840..ebf53241 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -171,7 +171,7 @@ func ProcessWebsite(m *ice.Message, pod, cmd string, arg ...ice.Any) { } func ProcessIframe(m *ice.Message, link string, arg ...string) { if len(arg) == 0 || arg[0] != ice.RUN { - arg = []string{m.Cmdx("web.chat.iframe", mdb.CREATE, mdb.LINK, link)} + arg = []string{m.Cmdx("web.chat.iframe", mdb.CREATE, mdb.TYPE, LINK, mdb.NAME, "", LINK, link)} } ctx.ProcessField(m, "web.chat.iframe", arg, arg...) } diff --git a/base/web/space.go b/base/web/space.go index 001bc237..3e2dd285 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -12,7 +12,6 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" - "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" kit "shylinux.com/x/toolkits" "shylinux.com/x/websocket" @@ -21,19 +20,19 @@ import ( func _space_domain(m *ice.Message) (link string) { if link = ice.Info.Domain; link == "" { m.Optionv(ice.MSG_OPTS, ice.MSG_USERNAME) - link = m.Cmd(SPACE, ice.OPS, cli.PWD).Append(mdb.LINK) + link = m.CmdAppend(SPACE, ice.OPS, cli.PWD, mdb.LINK) } if link == "" { - link = m.Cmd(SPACE, ice.DEV, cli.PWD).Append(mdb.LINK) + link = m.CmdAppend(SPACE, ice.DEV, cli.PWD, mdb.LINK) } if link == "" { - link = m.Cmd(SPACE, ice.SHY, cli.PWD).Append(mdb.LINK) + link = m.CmdAppend(SPACE, ice.SHY, cli.PWD, mdb.LINK) } if link == "" { link = m.Option(ice.MSG_USERWEB) } if link == "" { - link = kit.Format("http://localhost:%s", kit.Select(m.Option(tcp.PORT), m.Cmd(SERVE).Append(tcp.PORT))) + link = kit.Format("http://localhost:%s", kit.Select(m.Option(tcp.PORT), m.CmdAppend(SERVE, tcp.PORT))) } return tcp.ReplaceLocalhost(m, link) } @@ -220,7 +219,7 @@ func _space_fork(m *ice.Message) { case WORKER: gdb.Event(m, DREAM_START, args) defer gdb.Event(m, DREAM_STOP, args) - if m.Option("daemon") == "ops" { + if m.Option(cli.DAEMON) == ice.OPS { defer m.Cmd(DREAM, DREAM_STOP, args) } } @@ -228,28 +227,6 @@ func _space_fork(m *ice.Message) { }) } } -func _space_search(m *ice.Message, kind, name, text string, arg ...string) { - m.Cmd(SPACE, ice.OptionFields(""), func(value ice.Maps) { - if !strings.Contains(value[mdb.NAME], name) { - return - } - switch value[mdb.TYPE] { - case CHROME: - case MASTER: - m.PushSearch(mdb.TEXT, m.CmdAppend(SPIDE, value[mdb.NAME], CLIENT_URL), value) - default: - m.PushSearch(mdb.TEXT, MergePod(m, value[mdb.NAME]), value) - } - }) - if name != "" { - return - } - m.Cmd(SERVE, ice.OptionFields(""), func(val ice.Maps) { - m.Cmd(tcp.HOST, ice.OptionFields(""), func(value ice.Maps) { - m.PushSearch(kit.SimpleKV("", MYSELF, value[mdb.NAME], kit.Format("http://%s:%s", value[aaa.IP], val[tcp.PORT]))) - }) - }) -} const ( CHROME = "chrome" @@ -272,85 +249,68 @@ const ( const SPACE = "space" func init() { - Index.Merge(&ice.Context{Configs: ice.Configs{ - SPACE: {Name: SPACE, Help: "空间站", Value: kit.Data( - mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text", - BUFFER, kit.Dict("r", ice.MOD_BUFS, "w", ice.MOD_BUFS), - REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"), - )}, - }, Commands: ice.Commands{ + Index.MergeCommands(ice.Commands{ + PP(SPACE): {Hand: func(m *ice.Message, arg ...string) { _space_fork(m) }}, SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelectClose(m) - m.Conf("", mdb.HASH, "") + ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf("", mdb.HASH, "") }}, + tcp.DIAL: {Name: "dial dev=ops name", Hand: func(m *ice.Message, arg ...string) { + _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) - defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) - m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) - }}, - mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - _space_search(m, arg[0], arg[1], kit.Select("", arg, 2)) - }}, - aaa.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + aaa.INVITE: {Help: "添加", Hand: func(m *ice.Message, arg ...string) { for _, k := range []string{ice.MISC, ice.CORE, ice.BASE} { m.Cmdy("web.code.publish", ice.CONTEXTS, k) } - m.EchoScript("shell", "# 共享环境", m.Option(ice.MSG_USERWEB)) m.EchoAnchor(m.Option(ice.MSG_USERWEB)).Echo(ice.NL) m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }}, - tcp.DIAL: {Name: "dial dev=ops name", Help: "连接", Hand: func(m *ice.Message, arg ...string) { - _space_dial(m, m.Option(ice.DEV), kit.Select(ice.Info.NodeName, m.Option(mdb.NAME)), arg...) + mdb.REMOVE: {Hand: func(m *ice.Message, arg ...string) { + mdb.HashModify(m, m.OptionSimple(mdb.NAME), mdb.STATUS, cli.STOP) + defer mdb.HashRemove(m, m.OptionSimple(mdb.NAME)) + m.Cmd(SPACE, m.Option(mdb.NAME), ice.EXIT) }}, - DOMAIN: {Name: "domain", Help: "域名", Hand: func(m *ice.Message, arg ...string) { - m.Echo(_space_domain(m)) - }}, - cli.OPEN: {Name: "open", Help: "系统", Hand: func(m *ice.Message, arg ...string) { - ProcessIframe(m, MergePod(m, m.Option(mdb.NAME), "", ""), arg...) - }}, - "xterm": {Name: "xterm", Help: "终端", Hand: func(m *ice.Message, arg ...string) { - ProcessIframe(m, MergePodCmd(m, m.Option(mdb.NAME), "web.code.xterm", mdb.HASH, - m.Cmdx(SPACE, m.Option(mdb.NAME), "web.code.xterm", mdb.CREATE, mdb.TYPE, nfs.SH, m.OptionSimple(mdb.NAME), mdb.TEXT, "")), arg...) - }}, - "vimer": {Name: "vimer", Help: "编程", Hand: func(m *ice.Message, arg ...string) { - ProcessIframe(m, MergePodCmd(m, m.Option(mdb.NAME), "web.code.vimer", "", ""), arg...) - }}, - "exit": {Name: "exit", Help: "关闭", Hand: func(m *ice.Message, arg ...string) { - m.Cmd("", m.Option(mdb.NAME), "close") - m.Cmd("", m.Option(mdb.NAME), "exit") - ctx.ProcessRefresh(m) - }}, - }, mdb.HashCloseAction()), Hand: func(m *ice.Message, arg ...string) { - if len(arg) < 2 { // 节点列表 - if mdb.HashSelect(m, arg...); len(arg) == 0 { - m.Tables(func(value ice.Maps) { - switch value[mdb.TYPE] { - case SERVER, WORKER: - m.PushButton(cli.OPEN, "xterm", "vimer") - case CHROME: - if value[mdb.NAME] == kit.Select("", kit.Split(m.Option(ice.MSG_DAEMON), ice.PT), 0) { - m.PushButton("") - } else { - m.PushButton("exit") - } - default: - m.PushButton("") - } - }) - m.Sort("type,name,text") + OPEN: {Hand: func(m *ice.Message, arg ...string) { ProcessIframe(m, MergePod(m, m.Option(mdb.NAME)), arg...) }}, + DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { + switch m.Option(mdb.TYPE) { + case CHROME: + if m.Option(mdb.NAME) != kit.Select("", kit.Split(m.Option(ice.MSG_DAEMON), ice.PT), 0) { + m.PushButton(mdb.REMOVE) + } + case WORKER, SERVER: + m.PushButton(OPEN) } + }}, + DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { + if arg[1] == m.CommandKey() { + ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) + } + }}, + DOMAIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_space_domain(m)) }}, + }, mdb.HashCloseAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text", + REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"), + BUFFER, kit.Dict("r", ice.MOD_BUFS, "w", ice.MOD_BUFS), + ), ctx.CmdAction(), DreamAction()), Hand: func(m *ice.Message, arg ...string) { + if len(arg) > 0 && arg[0] == ctx.ACTION { + gdb.Event(m, DREAM_ACTION, arg) return } - // 下发命令 - _space_send(m, strings.ToLower(arg[0]), arg[1:]...) + if len(arg) > 1 { + _space_send(m, strings.ToLower(arg[0]), kit.Simple(kit.Split(arg[1]), arg[2:])...) + return + } + if mdb.HashSelect(m, arg...); len(arg) > 0 { + m.Sort("type,name,text") + } + m.Tables(func(value ice.Maps) { + if msg := gdb.Event(m.Spawn(), DREAM_TABLES, mdb.NAME, value[mdb.NAME], mdb.TYPE, value[mdb.TYPE]); len(msg.Appendv(ctx.ACTION)) > 0 { + m.PushButton(strings.Join(msg.Appendv(ctx.ACTION), "")) + } else { + m.PushButton("") + } + }) }}, - PP(SPACE): {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, arg ...string) { - _space_fork(m) - }}, - }}) + }) } func Space(m *ice.Message, arg ice.Any) []string { if arg == nil || arg == "" || kit.Format(arg) == ice.Info.NodeName { diff --git a/core/code/js.go b/core/code/js.go index f8080d7d..1eb1e076 100644 --- a/core/code/js.go +++ b/core/code/js.go @@ -127,7 +127,7 @@ func init() { } var _js_template = ` -Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { +Volcanos(chat.ONIMPORT, {_init: function(can, msg) { msg.Echo("hello world").Dump(can) }}) ` diff --git a/core/code/vimer.go b/core/code/vimer.go index 65925e8d..b2e52550 100644 --- a/core/code/vimer.go +++ b/core/code/vimer.go @@ -11,7 +11,6 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" - "shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) @@ -117,12 +116,6 @@ func init() { }}, FAVOR: {Name: "favor", Help: "收藏"}, - "keyboard": {Name: "keyboard", Help: "远程控制", Hand: func(m *ice.Message, arg ...string) { - hash := m.Cmdx("web.chat.keyboard", mdb.CREATE, web.SPACE, m.Option(ice.MSG_DAEMON), ctx.INDEX, m.Option(ctx.INDEX), "input", "") - link := tcp.ReplaceLocalhost(m, web.MergePodCmd(m, "", "web.chat.keyboard", mdb.HASH, hash)) - m.PushQRCode(mdb.TEXT, link) - m.Push(mdb.NAME, link) - }}, "_open": {Name: "_open", Help: "打开", Hand: func(m *ice.Message, arg ...string) { m.Cmd(cli.DAEMON, cli.OPEN, "-a", kit.Split(arg[0], ice.PT, ice.PT)[0]) }}, @@ -170,9 +163,21 @@ func init() { PUBLISH: {Name: "publish", Help: "发布", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(PUBLISH, ice.CONTEXTS) }}, - }, aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { + web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { + switch m.Option(mdb.TYPE) { + case web.SERVER, web.WORKER: + m.PushButton(kit.Dict(m.CommandKey(), "源码")) + } + }}, + web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { + if arg[1] == m.CommandKey() { + // web.ProcessIframe(m, web.MergePodCmd(m, m.Option(mdb.NAME), m.PrefixKey()), arg...) + web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey()) + } + }}, + }, web.DreamAction(), aaa.RoleAction(ctx.COMMAND)), Hand: func(m *ice.Message, arg ...string) { if m.Cmdy(INNER, arg); arg[0] != ctx.ACTION { - m.Action(AUTOGEN, nfs.SCRIPT, web.WEBSITE, web.DREAM, nfs.SAVE, COMPILE) + m.Action(AUTOGEN, nfs.SCRIPT, web.DREAM, web.WEBSITE, nfs.SAVE, COMPILE) m.Option("tabs", m.Config("show.tabs")) m.Option("plug", m.Config("show.plug")) m.Option("exts", m.Config("show.exts")) diff --git a/core/code/xterm.go b/core/code/xterm.go index 59dab5d4..bea42a91 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -106,7 +106,19 @@ func init() { web.WEBSITE: {Name: "website", Help: "网页", Hand: func(m *ice.Message, arg ...string) { web.ProcessWebsite(m, "", "", m.OptionSimple(mdb.HASH)) }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,view", mdb.TOOLS, FAVOR), ctx.CmdAction(), ctx.ProcessAction()), Hand: func(m *ice.Message, arg ...string) { + web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { + switch m.Option(mdb.TYPE) { + case web.SERVER, web.WORKER: + m.PushButton(kit.Dict(m.CommandKey(), "终端")) + } + }}, + web.DREAM_ACTION: {Hand: func(m *ice.Message, arg ...string) { + if arg[1] == m.CommandKey() { + web.ProcessIframe(m, web.MergePodCmd(m, m.Option(mdb.NAME), m.PrefixKey(), mdb.HASH, m.Cmdx(SPACE, m.Option(mdb.NAME), m.PrefixKey(), mdb.CREATE, mdb.TYPE, nfs.SH, m.OptionSimple(mdb.NAME))), arg...) + // web.ProcessWebsite(m, m.Option(mdb.NAME), m.PrefixKey(), mdb.HASH, m.Cmdx(SPACE, m.Option(mdb.NAME), m.PrefixKey(), mdb.CREATE, mdb.TYPE, nfs.SH, m.OptionSimple(mdb.NAME))) + } + }}, + }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,view", mdb.TOOLS, FAVOR), ctx.CmdAction(), ctx.ProcessAction(), web.DreamAction()), Hand: func(m *ice.Message, arg ...string) { if mdb.HashSelect(m, arg...); len(arg) == 0 { m.PushAction(web.WEBSITE, mdb.REMOVE) m.Action(mdb.CREATE, mdb.PRUNES) diff --git a/misc/git/repos.go b/misc/git/repos.go index 6cd44e3c..c3f2f66a 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -8,6 +8,7 @@ import ( "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" + "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) @@ -75,6 +76,9 @@ func init() { _git_cmd(m, CLONE, "-b", kit.Select(MASTER, m.Option(BRANCH)), m.Option(REPOS), m.Option(nfs.PATH)) } }}, + web.DREAM_START: {Hand: func(m *ice.Message, arg ...string) { + m.Cmd("web.code.git.repos", mdb.CREATE, m.OptionSimple(nfs.REPOS), nfs.PATH, m.Option(nfs.PATH)) + }}, }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,branch,commit,remote")), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { // 仓库列表 mdb.HashSelect(m, arg...).Sort(mdb.NAME).RenameAppend(mdb.NAME, REPOS) diff --git a/misc/git/server.go b/misc/git/server.go index b8ee87d9..b6551e9c 100644 --- a/misc/git/server.go +++ b/misc/git/server.go @@ -14,6 +14,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/tcp" @@ -150,7 +151,7 @@ func init() { web.RenderStatus(m.W, http.StatusInternalServerError, err.Error()) } }}, - SERVER: {Name: "server path auto create import", Help: "服务器", Actions: ice.Actions{ + SERVER: {Name: "server path auto create import", Help: "服务器", Actions: ice.MergeActions(ice.Actions{ mdb.CREATE: {Name: "create name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Option(cli.CMD_DIR, ice.USR_LOCAL_REPOS) _git_cmd(m, INIT, "--bare", m.Option(mdb.NAME)) @@ -167,7 +168,16 @@ func init() { m.Assert(m.Option(nfs.PATH) != "") m.Cmd(nfs.TRASH, path.Join(ice.USR_LOCAL_REPOS, m.Option(nfs.PATH))) }}, - }, Hand: func(m *ice.Message, arg ...string) { + web.DREAM_INPUTS: {Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case nfs.REPOS: + m.Cmd("web.code.git.server", func(value ice.Maps) { + m.Push(nfs.PATH, web.MergeLink(m, path.Join("/x/", path.Clean(value[nfs.PATH])+".git"))) + }) + m.Sort(nfs.PATH) + } + }}, + }, gdb.EventAction(web.DREAM_INPUTS)), Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.DIR_ROOT, ice.USR_LOCAL_REPOS); len(arg) == 0 { m.Cmdy(nfs.DIR, nfs.PWD, func(value ice.Maps) { m.PushScript("git clone " + web.MergeLink(m, "/x/"+path.Clean(value[nfs.PATH]))) diff --git a/misc/git/status.go b/misc/git/status.go index cf87478b..b056f2d7 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -9,6 +9,7 @@ import ( "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" @@ -317,7 +318,20 @@ func init() { code.DEVPACK: {Name: "devpack", Help: "开发模式", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.VIMER, code.DEVPACK) }}, - }, aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { + web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) { + text := []string{} + for _, line := range kit.Split(m.Cmdx(web.SPACE, m.Option(mdb.NAME), cli.SYSTEM, "git", "diff", "--shortstat"), ice.FS, ice.FS) { + if list := kit.Split(line); strings.Contains(line, "file") { + text = append(text, list[0]+" file") + } else if strings.Contains(line, "ins") { + text = append(text, list[0]+" +++") + } else if strings.Contains(line, "dele") { + text = append(text, list[0]+" ---") + } + } + m.Push(mdb.TEXT, strings.Join(text, ", ")) + }}, + }, gdb.EventAction(web.DREAM_TABLES), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { if _configs_get(m, "user.email") == "" { m.Echo("please config user.email") m.Action(CONFIGS) diff --git a/render.go b/render.go index e76d4b80..128131c7 100644 --- a/render.go +++ b/render.go @@ -20,14 +20,28 @@ func Render(m *Message, cmd string, args ...Any) string { p := kit.Select(arg[0], arg, 1) return kit.Format(`%s`, p, arg[0]) - case RENDER_BUTTON: // name... - if strings.HasPrefix(kit.Join(arg), "`, k, - kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("_trans", k)), m.Option(MSG_LANGUAGE) != "en"))) + for _, k := range args { + switch k := k.(type) { + case []string: + for _, k := range k { + list = append(list, Render(m, RENDER_BUTTON, k)) + } + case string: + if strings.HasPrefix(k, "`, k, + kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("_trans", k)), m.Option(MSG_LANGUAGE) != "en"))) + } + case Map: + for k, v := range k { + list = append(list, kit.Format(``, k, kit.Select(k, v, m.Option(MSG_LANGUAGE) != "en"))) + } + } } return strings.Join(list, "") @@ -46,7 +60,7 @@ func Render(m *Message, cmd string, args ...Any) string { } return kit.Format(`