1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00

opt dream

This commit is contained in:
harveyshao 2022-11-18 21:59:26 +08:00
parent 6c10855648
commit db4ecebd45
10 changed files with 206 additions and 209 deletions

View File

@ -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))
}

View File

@ -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...)
}

View File

@ -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 {

View File

@ -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)
}})
`

View File

@ -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"))

View File

@ -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)

View File

@ -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)

View File

@ -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])))

View File

@ -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)

View File

@ -20,14 +20,28 @@ func Render(m *Message, cmd string, args ...Any) string {
p := kit.Select(arg[0], arg, 1)
return kit.Format(`<a href="%s" target="_blank">%s</a>`, p, arg[0])
case RENDER_BUTTON: // name...
if strings.HasPrefix(kit.Join(arg), "<input") {
return kit.Join(arg)
}
case RENDER_BUTTON:
list := []string{}
for _, k := range kit.Split(kit.Join(arg)) {
list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`, 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, "<input") {
list = append(list, k)
break
}
for _, k := range kit.Split(k) {
list = append(list, kit.Format(`<input type="button" name="%s" value="%s">`, 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(`<input type="button" name="%s" value="%s">`, 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(`<video src="%s" height=%s controls>`, arg[0], kit.Select("120", arg, 1))
case RENDER_IFRAME: // src
case RENDER_IFRAME:
return kit.Format(`<iframe src="%s"></iframe>`, arg[0])
default:
return arg[0]
@ -145,13 +159,13 @@ func (m *Message) PushAnchor(arg ...Any) { // [name] link
m.Push(LINK, Render(m, RENDER_ANCHOR, arg...))
}
}
func (m *Message) PushButton(arg ...Any) { // name...
func (m *Message) PushButton(arg ...Any) *Message { // name...
if !m.IsCliUA() {
if m.FieldsIsDetail() {
for i, k := range m.meta[KEY] {
if k == ACTION {
m.meta[VALUE][i] = Render(m, RENDER_BUTTON, arg...)
return
return m
}
}
} else if len(m.meta[ACTION]) >= m.Length() {
@ -159,6 +173,7 @@ func (m *Message) PushButton(arg ...Any) { // name...
}
m.Push(ACTION, Render(m, RENDER_BUTTON, arg...))
}
return m
}
func (m *Message) PushImages(key, src string, arg ...string) { // key src [height]
if !m.IsCliUA() {