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(`