diff --git a/base/aaa/role.go b/base/aaa/role.go
index 8cd38baa..ba760d32 100644
--- a/base/aaa/role.go
+++ b/base/aaa/role.go
@@ -93,7 +93,7 @@ const ROLE = "role"
func init() {
Index.MergeCommands(ice.Commands{
- ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeAction(ice.Actions{
+ ROLE: {Name: "role role auto insert", Help: "角色", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, TECH, BLACK, kit.Dict(), WHITE, kit.Dict()))
mdb.Rich(m, ROLE, nil, kit.Dict(mdb.NAME, VOID, WHITE, kit.Dict(), BLACK, kit.Dict()))
diff --git a/base/aaa/sess.go b/base/aaa/sess.go
index 239bf8ae..2b33531a 100644
--- a/base/aaa/sess.go
+++ b/base/aaa/sess.go
@@ -12,7 +12,7 @@ func _sess_check(m *ice.Message, sessid string) {
m.Option(ice.MSG_USERROLE, VOID)
m.Option(ice.MSG_USERNAME, "")
m.Option(ice.MSG_USERNICK, "")
- if m.Warn(sessid == "", ice.ErrNotValid, sessid) {
+ if sessid == "" {
return
}
@@ -34,9 +34,9 @@ func _sess_create(m *ice.Message, username string) (h string) {
return
}
if msg := m.Cmd(USER, username); msg.Length() > 0 {
- h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
+ h = mdb.HashCreate(m, msg.AppendSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
} else {
- h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA)).Result()
+ h = mdb.HashCreate(m, m.OptionSimple(USERROLE, USERNAME, USERNICK), IP, m.Option(ice.MSG_USERIP), UA, m.Option(ice.MSG_USERUA))
}
gdb.Event(m, SESS_CREATE, SESS, h, USERNAME, username)
return h
@@ -60,7 +60,7 @@ const SESS = "sess"
func init() {
Index.MergeCommands(ice.Commands{
- SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeAction(ice.Actions{
+ SESS: {Name: "sess hash auto prunes", Help: "会话", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_sess_create(m, m.Option(USERNAME))
}},
@@ -77,3 +77,6 @@ func SessCreate(m *ice.Message, username string) string {
func SessCheck(m *ice.Message, sessid string) bool {
return m.Cmdy(SESS, CHECK, sessid).Option(ice.MSG_USERNAME) != ""
}
+func UserLogout(m *ice.Message) {
+ m.Cmd(SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
+}
diff --git a/base/aaa/totp.go b/base/aaa/totp.go
index b82ab344..602acfe8 100644
--- a/base/aaa/totp.go
+++ b/base/aaa/totp.go
@@ -54,7 +54,7 @@ const TOTP = "totp"
func init() {
Index.MergeCommands(ice.Commands{
- TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeAction(ice.Actions{
+ TOTP: {Name: "totp name auto create", Help: "令牌", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name=hi secret period=30 number=6", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
if m.Option(SECRET) == "" { // 创建密钥
m.Option(SECRET, _totp_gen(kit.Int64(m.Option(PERIOD))))
diff --git a/base/aaa/user.go b/base/aaa/user.go
index 16c38b3c..f1ac5556 100644
--- a/base/aaa/user.go
+++ b/base/aaa/user.go
@@ -71,7 +71,7 @@ const USER = "user"
func init() {
Index.MergeCommands(ice.Commands{
- USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeAction(ice.Actions{
+ USER: {Name: "user username auto create", Help: "用户", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create username password userrole=void,tech", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_user_create(m, m.Option(USERNAME), m.Option(PASSWORD), m.OptionSimple(USERROLE)...)
}},
diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index df180798..5e6ed01c 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -26,7 +26,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
h := mdb.HashCreate(m, ice.CMD, kit.Join(cmd.Args, ice.SP),
STATUS, START, DIR, cmd.Dir, ENV, kit.Select("", cmd.Env),
m.OptionSimple(CMD_INPUT, CMD_OUTPUT, CMD_ERRPUT, mdb.CACHE_CLEAR_ON_EXIT),
- ).Result()
+ )
// 启动服务
if e := cmd.Start(); m.Warn(e, ice.ErrNotStart, cmd.Args) {
@@ -108,7 +108,7 @@ const DAEMON = "daemon"
func init() {
Index.MergeCommands(ice.Commands{
- DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeAction(ice.Actions{
+ DAEMON: {Name: "daemon hash auto start prunes", Help: "守护进程", Actions: ice.MergeActions(ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.CACHE_CLEAR_ON_EXIT, ice.TRUE)
}},
diff --git a/base/cli/mirrors.go b/base/cli/mirrors.go
index 844c7887..d6960595 100644
--- a/base/cli/mirrors.go
+++ b/base/cli/mirrors.go
@@ -21,7 +21,7 @@ const MIRRORS = "mirrors"
func init() {
Index.MergeCommands(ice.Commands{
- MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeAction(ice.Actions{
+ MIRRORS: {Name: "mirrors cli auto", Help: "软件镜像", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
m.Sleep300ms() // after runtime init
diff --git a/base/ctx/command.go b/base/ctx/command.go
index b699fbad..18f9b90a 100644
--- a/base/ctx/command.go
+++ b/base/ctx/command.go
@@ -79,6 +79,7 @@ const (
STYLE = "style"
DISPLAY = "display"
ACTION = "action"
+ TRANS = "trans"
CAN_PLUGIN = "can.plugin"
)
@@ -119,6 +120,10 @@ func CmdAction(args ...ice.Any) ice.Actions {
m.Cmd(CONFIG, "reset", arg[0])
return
}
+ if len(arg) > 3 && arg[1] == ACTION && arg[2] == CONFIG && arg[3] == "select" {
+ m.Cmdy(CONFIG, arg[0])
+ return
+ }
if aaa.Right(m, arg) && !PodCmd(m, arg) {
m.Cmdy(arg)
}
diff --git a/base/ctx/config.go b/base/ctx/config.go
index 25f7dcc4..9ad2ce83 100644
--- a/base/ctx/config.go
+++ b/base/ctx/config.go
@@ -152,3 +152,6 @@ func Load(m *ice.Message, arg ...string) *ice.Message {
}
return m.Cmd(CONFIG, ice.LOAD, m.Prefix(nfs.JSON), arg)
}
+func ConfAction(args ...ice.Any) ice.Actions {
+ return ice.Actions{ice.CTX_INIT: mdb.AutoConfig(args...)}
+}
diff --git a/base/ctx/context.go b/base/ctx/context.go
index 2c43aaa3..3410123d 100644
--- a/base/ctx/context.go
+++ b/base/ctx/context.go
@@ -26,7 +26,7 @@ const CONTEXT = "context"
func init() {
Index.MergeCommands(ice.Commands{
- CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeAction(ice.Actions{
+ CONTEXT: {Name: "context name=web action=context,command,config key auto spide", Help: "模块", Actions: ice.MergeActions(ice.Actions{
"spide": {Name: "spide", Help: "架构图", Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 || arg[1] == CONTEXT { // 模块列表
m.Cmdy(CONTEXT, kit.Select(ice.ICE, arg, 0), CONTEXT)
diff --git a/base/gdb/event.go b/base/gdb/event.go
index db391786..a2380b17 100644
--- a/base/gdb/event.go
+++ b/base/gdb/event.go
@@ -10,13 +10,13 @@ const EVENT = "event"
func init() {
Index.MergeCommands(ice.Commands{
- EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeAction(ice.Actions{
+ EVENT: {Name: "event event id auto listen happen", Help: "事件流", Actions: ice.MergeActions(ice.Actions{
LISTEN: {Name: "listen event cmd", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneInsert(m, m.OptionSimple(EVENT, ice.CMD))
}},
HAPPEN: {Name: "happen event arg", Help: "触发", Hand: func(m *ice.Message, arg ...string) {
- mdb.ZoneSelect(m, m.Option(EVENT)).Tables(func(value ice.Maps) {
- m.Cmd(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:]).Cost()
+ mdb.ZoneSelect(m.Spawn(), m.Option(EVENT)).Tables(func(value ice.Maps) {
+ m.Cmdy(kit.Split(value[ice.CMD]), m.Option(EVENT), arg[2:], ice.OptionFields("")).Cost()
})
}},
}, mdb.ZoneAction(mdb.SHORT, EVENT, mdb.FIELD, "time,id,cmd"))},
@@ -24,10 +24,10 @@ func init() {
}
func Watch(m *ice.Message, key string, arg ...string) *ice.Message {
if len(arg) == 0 {
- arg = append(arg, m.Prefix(ice.AUTO))
+ arg = append(arg, m.PrefixKey())
}
return m.Cmd(EVENT, LISTEN, EVENT, key, ice.CMD, kit.Join(arg, ice.SP))
}
-func Event(m *ice.Message, key string, arg ...string) *ice.Message {
- return m.Cmd(EVENT, HAPPEN, EVENT, key, arg)
+func Event(m *ice.Message, key string, arg ...ice.Any) *ice.Message {
+ return m.Cmdy(EVENT, HAPPEN, EVENT, key, arg)
}
diff --git a/base/gdb/routine.go b/base/gdb/routine.go
index 29c3dea2..f9c2621b 100644
--- a/base/gdb/routine.go
+++ b/base/gdb/routine.go
@@ -11,11 +11,11 @@ const ROUTINE = "routine"
func init() {
Index.MergeCommands(ice.Commands{
- ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeAction(ice.Actions{
+ ROUTINE: {Name: "routine hash auto prunes", Help: "协程池", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
cb := m.OptionCB("")
- h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100)).Result()
+ h := mdb.HashCreate(m, m.OptionSimple(mdb.NAME), mdb.STATUS, START, ice.CMD, logs.FileLine(cb, 100))
defer func() {
if e := recover(); e == nil {
mdb.HashModify(m, mdb.HASH, h, mdb.STATUS, STOP)
diff --git a/base/gdb/signal.go b/base/gdb/signal.go
index 3f4a969f..3ecd836f 100644
--- a/base/gdb/signal.go
+++ b/base/gdb/signal.go
@@ -9,6 +9,7 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
+ "shylinux.com/x/toolkits/file"
"shylinux.com/x/toolkits/logs"
)
@@ -25,7 +26,8 @@ func _signal_action(m *ice.Message, arg ...string) {
}
func _signal_process(m *ice.Message, p string, s os.Signal) {
if p == "" {
- p = logs.ReadFile(ice.Info.PidPath)
+ b, _ := file.ReadFile(ice.Info.PidPath)
+ p = string(b)
}
if p == "" {
p = kit.Format(os.Getpid())
@@ -52,7 +54,7 @@ const SIGNAL = "signal"
func init() {
Index.MergeCommands(ice.Commands{
- SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeAction(ice.Actions{
+ SIGNAL: {Name: "signal signal auto listen", Help: "信号器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
_signal_listen(m, 2, mdb.NAME, "重启", ice.CMD, "exit 1")
_signal_listen(m, 3, mdb.NAME, "退出", ice.CMD, "exit 0")
diff --git a/base/gdb/timer.go b/base/gdb/timer.go
index ff785fc1..533be227 100644
--- a/base/gdb/timer.go
+++ b/base/gdb/timer.go
@@ -30,7 +30,7 @@ const TIMER = "timer"
func init() {
Index.MergeCommands(ice.Commands{
- TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeAction(ice.Actions{
+ TIMER: {Name: "timer hash auto create prunes", Help: "定时器", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name=hi delay=10ms interval=10s count=3 cmd=runtime", Help: "创建"},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
mdb.HashPrunesValue(m, mdb.COUNT, "0")
diff --git a/base/mdb/hash.go b/base/mdb/hash.go
index f904be29..11c95975 100644
--- a/base/mdb/hash.go
+++ b/base/mdb/hash.go
@@ -42,7 +42,7 @@ func _hash_insert(m *ice.Message, prefix, chain string, arg ...string) string {
if expire := m.Conf(prefix, kit.Keys(chain, kit.Keym(EXPIRE))); expire != "" {
arg = kit.Simple(TIME, m.Time(expire), arg)
}
- if m.Optionv(TARGET) != nil {
+ if m.Optionv(TARGET) != nil && m.Option(TARGET) != "" {
m.Echo(Rich(m, prefix, chain, kit.Data(arg, TARGET, m.Optionv(TARGET))))
} else {
m.Echo(Rich(m, prefix, chain, kit.Data(arg)))
@@ -170,7 +170,7 @@ func HashAction(args ...Any) ice.Actions {
}
}
func HashCloseAction(args ...Any) ice.Actions {
- return ice.MergeAction(HashAction(args...), ice.Actions{
+ return ice.MergeActions(HashAction(args...), ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
})
}
@@ -186,7 +186,7 @@ func HashStatusAction(args ...Any) ice.Actions {
return list
}
func HashStatusCloseAction(args ...Any) ice.Actions {
- return ice.MergeAction(HashStatusAction(args...), ice.Actions{
+ return ice.MergeActions(HashStatusAction(args...), ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { HashSelectClose(m) }},
})
}
@@ -201,8 +201,9 @@ func HashArgs(m *ice.Message, arg ...Any) []string {
func HashInputs(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, HashArgs(m, arg))
}
-func HashCreate(m *ice.Message, arg ...Any) *ice.Message {
- return m.Cmdy(INSERT, m.PrefixKey(), "", HASH, HashArgs(m, arg...))
+func HashCreate(m *ice.Message, arg ...Any) string {
+ msg := m.Spawn()
+ return m.Echo(msg.Cmdx(INSERT, m.PrefixKey(), "", HASH, HashArgs(msg, arg...))).Result()
}
func HashRemove(m *ice.Message, arg ...Any) *ice.Message {
return m.Cmdy(DELETE, m.PrefixKey(), "", HASH, m.OptionSimple(HashShort(m)), arg)
@@ -291,6 +292,7 @@ func HashSelectValue(m *ice.Message, cb Any) *ice.Message {
func HashSelectClose(m *ice.Message) *ice.Message {
HashSelectValue(m, func(target ice.Any) {
if c, ok := target.(io.Closer); ok {
+ m.Logs(DELETE, TARGET, m.PrefixKey())
c.Close()
}
})
@@ -315,5 +317,8 @@ func Rich(m *ice.Message, prefix string, chain Any, data Any) string {
cache = kit.Data()
m.Confv(prefix, chain, cache)
}
+ if m.Option(SHORT) != "" {
+ kit.Value(cache, kit.Keym(SHORT), m.Option(SHORT))
+ }
return miss.Rich(path.Join(prefix, kit.Keys(chain)), cache, data)
}
diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go
index 7e14e27f..ca49e1ce 100644
--- a/base/mdb/mdb.go
+++ b/base/mdb/mdb.go
@@ -274,7 +274,7 @@ func init() {
}
func AutoConfig(args ...ice.Any) *ice.Action {
return &ice.Action{Hand: func(m *ice.Message, arg ...string) {
- if cs := m.Target().Configs; cs[m.CommandKey()] == nil && len(args) > 0 {
+ if cs := m.Target().Configs; len(args) > 0 {
cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
ice.Info.Load(m, m.CommandKey())
}
diff --git a/base/mdb/render.go b/base/mdb/render.go
index 1254193a..627409bc 100644
--- a/base/mdb/render.go
+++ b/base/mdb/render.go
@@ -12,10 +12,18 @@ func init() {
}
func RenderAction(args ...ice.Any) ice.Actions {
- return ice.MergeAction(ice.Actions{
+ return ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ if len(args) == 0 {
+ args = append(args, SHORT, TYPE, FIELD, "time,type,name,text")
+ }
if cs := m.Target().Configs; cs[m.CommandKey()] == nil {
- cs[m.CommandKey()] = &ice.Config{Value: kit.Data(SHORT, TYPE)}
+ cs[m.CommandKey()] = &ice.Config{Value: kit.Data(args...)}
+ } else {
+ ls := kit.Simple(args)
+ for i := 0; i < len(ls); i += 2 {
+ m.Config(ls[i], ls[i+1])
+ }
}
}},
CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
diff --git a/base/mdb/search.go b/base/mdb/search.go
index 4f3e5fda..87940690 100644
--- a/base/mdb/search.go
+++ b/base/mdb/search.go
@@ -16,7 +16,7 @@ func SearchAction() ice.Actions {
}
}
func HashSearchAction(arg ...Any) ice.Actions {
- return ice.MergeAction(HashAction(arg...), SearchAction())
+ return ice.MergeActions(HashAction(arg...), SearchAction())
}
func HashSelectSearch(m *ice.Message, args []string, keys ...string) *ice.Message {
if len(keys) == 0 {
diff --git a/base/mdb/zone.go b/base/mdb/zone.go
index d866a768..59835d62 100644
--- a/base/mdb/zone.go
+++ b/base/mdb/zone.go
@@ -215,6 +215,10 @@ func ZoneSelectPage(m *ice.Message, arg ...string) *ice.Message {
OptionPages(m, kit.Slice(arg, 2)...)
return ZoneSelect(m, arg...)
}
+func ZoneSelects(m *ice.Message, arg ...string) *ice.Message {
+ m.OptionFields(m.Config(FIELD))
+ return ZoneSelect(m, arg...)
+}
func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
m.Option(CACHE_LIMIT, "-1")
return ZoneSelect(m, arg...)
diff --git a/base/nfs/dir.go b/base/nfs/dir.go
index 73d38da2..7b7964ca 100644
--- a/base/nfs/dir.go
+++ b/base/nfs/dir.go
@@ -34,14 +34,14 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d
}
list, e := ReadDir(m, path.Join(root, name))
- if e != nil { // 单个文件
+ if e != nil || len(list) == 0 { // 单个文件
ls, _ := ReadDir(m, path.Dir(path.Join(root, name)))
for _, s := range ls {
if s.Name() == path.Base(name) {
list = append(list, s)
}
}
- name = path.Dir(name)
+ name, deep = path.Dir(name), false
}
for _, f := range list {
@@ -178,7 +178,7 @@ func init() {
m.Cmdy("web.cache", "upload_watch", m.Option(PATH))
}},
TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(TRASH, m.Option(PATH))
+ m.Cmdy(TRASH, mdb.CREATE, m.Option(PATH))
}},
}, Hand: func(m *ice.Message, arg ...string) {
if m.Option(DIR_ROOT) != "" {
diff --git a/base/nfs/pack.go b/base/nfs/pack.go
index e2387195..4722c1a4 100644
--- a/base/nfs/pack.go
+++ b/base/nfs/pack.go
@@ -165,3 +165,6 @@ func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser
func NewReadCloser(r io.Reader) io.ReadCloser {
return file.NewReadCloser(r)
}
+func NewCloser(c func() error) io.WriteCloser {
+ return file.NewWriteCloser(func(buf []byte) (int, error) { return 0, nil }, c)
+}
diff --git a/base/nfs/tail.go b/base/nfs/tail.go
index 2183cd96..384a8332 100644
--- a/base/nfs/tail.go
+++ b/base/nfs/tail.go
@@ -37,7 +37,7 @@ const TAIL = "tail"
func init() {
Index.MergeCommands(ice.Commands{
- TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeAction(ice.Actions{
+ TAIL: {Name: "tail name id auto page filter:text create", Help: "日志流", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.Richs(m, TAIL, "", mdb.FOREACH, func(key string, value ice.Map) {
value, _ = kit.GetMeta(value), m.Option(mdb.HASH, key)
diff --git a/base/nfs/trash.go b/base/nfs/trash.go
index 323af83f..08b535b8 100644
--- a/base/nfs/trash.go
+++ b/base/nfs/trash.go
@@ -34,7 +34,7 @@ const TRASH = "trash"
func init() {
Index.MergeCommands(ice.Commands{
- TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeAction(ice.Actions{
+ TRASH: {Name: "trash hash auto prunes", Help: "回收站", Actions: ice.MergeActions(ice.Actions{
mdb.REVERT: {Name: "revert", Help: "恢复", Hand: func(m *ice.Message, arg ...string) {
Rename(m, m.Option(FILE), m.Option(FROM))
mdb.HashRemove(m, m.OptionSimple(mdb.HASH))
diff --git a/base/tcp/client.go b/base/tcp/client.go
index 228c3264..8fff3a33 100644
--- a/base/tcp/client.go
+++ b/base/tcp/client.go
@@ -66,7 +66,7 @@ const CLIENT = "client"
func init() {
Index.MergeCommands(ice.Commands{
- CLIENT: {Name: "client hash auto prunes", Help: "客户端", Actions: ice.MergeAction(ice.Actions{
+ CLIENT: {Name: "client hash auto prunes", 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) {}},
DIAL: {Name: "dial type name port=9010 host=", Help: "连接", Hand: func(m *ice.Message, arg ...string) {
diff --git a/base/tcp/host.go b/base/tcp/host.go
index 6ca828c1..72552c55 100644
--- a/base/tcp/host.go
+++ b/base/tcp/host.go
@@ -67,7 +67,7 @@ const HOST = "host"
func init() {
Index.MergeCommands(ice.Commands{
- HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeAction(ice.Actions{
+ HOST: {Name: "host name auto", Help: "主机", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(HOST).Tables(func(value ice.Maps) { m.Cmd(HOST, aaa.WHITE, value[aaa.IP]) })
}},
diff --git a/base/tcp/port.go b/base/tcp/port.go
index 32a5dc8f..f1afaff8 100644
--- a/base/tcp/port.go
+++ b/base/tcp/port.go
@@ -46,7 +46,7 @@ const PORT = "port"
func init() {
Index.MergeCommands(ice.Commands{
- PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeAction(ice.Actions{
+ PORT: {Name: "port port path auto", Help: "端口", Actions: ice.MergeActions(ice.Actions{
aaa.RIGHT: {Name: "right", Help: "分配", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_port_right(m, arg...))
}},
diff --git a/base/tcp/server.go b/base/tcp/server.go
index 41eabca1..a397d67c 100644
--- a/base/tcp/server.go
+++ b/base/tcp/server.go
@@ -28,7 +28,7 @@ func (l Listener) Close() error {
func _server_listen(m *ice.Message, arg ...string) {
l, e := net.Listen(TCP, m.Option(HOST)+":"+m.Option(PORT))
- l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)).Result(), s: &Stat{}, Listener: l}
+ l = &Listener{m: m, h: mdb.HashCreate(m, arg, kit.Dict(mdb.TARGET, l), STATUS, kit.Select(ERROR, OPEN, e == nil), ERROR, kit.Format(e)), s: &Stat{}, Listener: l}
if e == nil {
defer l.Close()
}
@@ -62,7 +62,7 @@ const SERVER = "server"
func init() {
Index.MergeCommands(ice.Commands{
- SERVER: {Name: "server hash auto prunes", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
+ SERVER: {Name: "server hash auto prunes", 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) }},
LISTEN: {Name: "listen type name port=9030 host=", Help: "监听", Hand: func(m *ice.Message, arg ...string) {
diff --git a/base/web/broad.go b/base/web/broad.go
index 5536206d..adf644fb 100644
--- a/base/web/broad.go
+++ b/base/web/broad.go
@@ -66,7 +66,7 @@ const BROAD = "broad"
func init() {
Index.MergeCommands(ice.Commands{
- BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeAction(ice.Actions{
+ BROAD: {Name: "broad hash auto serve", Help: "广播", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
_broad_search(m, arg[0], arg[1], kit.Select("", arg, 2))
}},
diff --git a/base/web/cache.go b/base/web/cache.go
index 7abceef2..b0469c4b 100644
--- a/base/web/cache.go
+++ b/base/web/cache.go
@@ -29,7 +29,7 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi
size := kit.Int(kit.Select(kit.Format(len(text)), arg, 1))
file := kit.Select("", arg, 0)
text = kit.Select(file, text)
- h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size).Result()
+ h := mdb.HashCreate(m, kit.SimpleKV("", kind, name, text), nfs.FILE, file, nfs.SIZE, size)
// 返回结果
m.Push(mdb.TIME, m.Time())
@@ -61,7 +61,7 @@ func _cache_catch(m *ice.Message, name string) (file, size string) {
return "", "0"
}
func _cache_upload(m *ice.Message, r *http.Request) (kind, name, file, size string) {
- if b, h, e := r.FormFile(UPLOAD); e == nil {
+ if b, h, e := r.FormFile(UPLOAD); m.Assert(e) {
defer b.Close()
// 创建文件
@@ -126,7 +126,7 @@ const CACHE = "cache"
func init() {
Index.MergeCommands(ice.Commands{
- CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeAction(ice.Actions{
+ CACHE: {Name: "cache hash auto", Help: "缓存池", Actions: ice.MergeActions(ice.Actions{
WATCH: {Name: "watch key file", Help: "释放", Hand: func(m *ice.Message, arg ...string) {
_cache_watch(m, arg[0], arg[1])
}},
diff --git a/base/web/dream.go b/base/web/dream.go
index 702874d7..1667db22 100644
--- a/base/web/dream.go
+++ b/base/web/dream.go
@@ -102,7 +102,7 @@ func _dream_show(m *ice.Message, name string) {
bin := kit.Select(os.Args[0], cli.SystemFind(m, ice.ICE_BIN, kit.Path(path.Join(p, ice.BIN)), kit.Path(ice.BIN)))
m.Cmd(cli.DAEMON, bin, SPACE, tcp.DIAL, ice.DEV, ice.OPS, m.OptionSimple(mdb.NAME, RIVER))
- defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME)...)
+ defer gdb.Event(m, DREAM_CREATE, m.OptionSimple(mdb.TYPE, mdb.NAME))
m.Option(cli.CMD_OUTPUT, "")
m.Option(cli.CMD_ENV, "")
m.Sleep3s()
@@ -117,7 +117,7 @@ const DREAM = "dream"
func init() {
Index.MergeCommands(ice.Commands{
- DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeAction(ice.Actions{
+ DREAM: {Name: "dream name path auto start", Help: "梦想家", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.SCRIPT, _dream_script) }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
diff --git a/base/web/option.go b/base/web/option.go
index 5977cd18..575bbd10 100644
--- a/base/web/option.go
+++ b/base/web/option.go
@@ -2,7 +2,6 @@ package web
import (
"net/url"
- "path"
"strings"
"time"
@@ -10,10 +9,19 @@ import (
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
+ "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/file"
)
+func Upload(m *ice.Message) []string { // hash name size
+ up := kit.Simple(m.Optionv(ice.MSG_UPLOAD))
+ if len(up) < 2 {
+ msg := m.Cmdy(CACHE, UPLOAD)
+ up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
+ }
+ return up
+}
func PushNotice(m *ice.Message, arg ...ice.Any) {
m.Optionv(ice.MSG_OPTS, m.Optionv(ice.MSG_OPTION))
if m.Option(ice.MSG_USERPOD) == "" {
@@ -104,6 +112,14 @@ func PushPodCmd(m *ice.Message, cmd string, arg ...string) {
})
}
+func OptionAgentIs(m *ice.Message, arg ...string) bool {
+ for _, k := range arg {
+ if strings.HasPrefix(m.Option(ice.MSG_USERUA), k) {
+ return true
+ }
+ }
+ return false
+}
func OptionUserWeb(m *ice.Message) *url.URL {
return kit.ParseURL(m.Option(ice.MSG_USERWEB))
}
@@ -116,17 +132,3 @@ func MergeLink(m *ice.Message, url string, arg ...ice.Any) string {
func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
}
-func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
- return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
-}
-func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
- return mergeurl(m, path.Join(WEBSITE, web), arg...)
-}
-func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
- if m.Option(ice.MSG_USERPOD) == "" {
- p = path.Join("/", p)
- } else {
- p = path.Join("/chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
- }
- return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
-}
diff --git a/base/web/render.go b/base/web/render.go
index c2ef1e88..8a04364d 100644
--- a/base/web/render.go
+++ b/base/web/render.go
@@ -70,7 +70,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
default:
for _, k := range []string{
"_option", "_handle", "_output",
- "cmds", "fields", "sessid", "river", "storm",
+ "cmds", "fields", "sessid",
} {
msg.Set(k)
}
@@ -86,7 +86,7 @@ func Render(msg *ice.Message, cmd string, args ...ice.Any) {
func RenderType(w http.ResponseWriter, name, mime string) {
if mime == "" {
switch kit.Ext(name) {
- case nfs.HTML:
+ case "", nfs.HTML:
mime = "text/html"
case nfs.CSS:
mime = "text/css; charset=utf-8"
@@ -139,16 +139,14 @@ func CookieName(url string) string {
return ice.MSG_SESSID + "_" + kit.ParseURLMap(url)[tcp.PORT]
}
-func RenderIndex(m *ice.Message, serve, repos string, file ...string) *ice.Message {
- return m.RenderDownload(path.Join(m.Conf(serve, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(serve, kit.Keym(repos, INDEX)), path.Join(file...))))
+func RenderIndex(m *ice.Message, repos string, file ...string) *ice.Message {
+ if repos == "" {
+ repos = kit.Select(ice.VOLCANOS, ice.INTSHELL, m.IsCliUA())
+ }
+ return m.RenderDownload(path.Join(m.Conf(SERVE, kit.Keym(repos, nfs.PATH)), kit.Select(m.Conf(SERVE, kit.Keym(repos, INDEX)), path.Join(file...))))
}
func RenderWebsite(m *ice.Message, pod string, dir string, arg ...string) *ice.Message {
- args := []string{}
- if pod != "" {
- args = append(args, SPACE, pod)
- }
- m.Echo(m.Cmdx(args, "web.chat.website", lex.PARSE, dir, arg))
- return m.RenderResult()
+ return m.Echo(m.Cmdx(Space(m, pod), "web.chat.website", lex.PARSE, dir, arg)).RenderResult()
}
func RenderCmd(m *ice.Message, index string, args ...ice.Any) {
list := index
diff --git a/base/web/route.go b/base/web/route.go
index 9515bf85..faba581f 100644
--- a/base/web/route.go
+++ b/base/web/route.go
@@ -63,7 +63,7 @@ const ROUTE = "route"
func init() {
Index.MergeCommands(ice.Commands{
- ROUTE: {Name: "route route ctx cmd auto invite spide", Help: "路由器", Actions: ice.Actions{
+ ROUTE: {Name: "route route index auto invite spide", Help: "路由器", Actions: ice.Actions{
aaa.INVITE: {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), SPACE, aaa.INVITE, arg).ProcessInner()
}},
@@ -71,7 +71,7 @@ func init() {
m.Cmdy(SPACE, m.Option(ROUTE), DREAM, tcp.START, arg).ProcessInner()
}},
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(SPACE, m.Option(ROUTE), kit.Keys(m.Option(ice.CTX), m.Option(ice.CMD)), arg)
+ m.Cmdy(SPACE, m.Option(ROUTE), m.Option(ctx.INDEX), arg)
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SPACE, m.Option(ROUTE), arg)
@@ -99,19 +99,12 @@ func init() {
}
} else if len(arg) == 1 || arg[1] == "" { // 模块列表
- m.Cmd(SPACE, arg[0], ctx.CONTEXT, ice.ICE).Tables(func(value ice.Maps) {
- m.Push(ice.CTX, kit.Keys(value["ups"], value[mdb.NAME]))
- m.Push("", value, kit.List(ice.CTX_STATUS, ice.CTX_STREAM, mdb.HELP))
- })
-
- } else if len(arg) == 2 || arg[2] == "" { // 命令列表
- m.Cmd(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND).Tables(func(value ice.Maps) {
- m.Push(ice.CMD, value[mdb.KEY])
- m.Push("", value, kit.List(mdb.NAME, mdb.HELP))
+ m.Cmd(SPACE, arg[0], ctx.COMMAND, mdb.SEARCH, ctx.COMMAND, ice.OptionFields(ctx.INDEX, mdb.NAME, mdb.HELP)).Table(func(index int, value ice.Maps, head []string) {
+ m.Push("", value, head)
})
} else { // 命令详情
- m.Cmdy(SPACE, arg[0], ctx.CONTEXT, arg[1], ctx.COMMAND, arg[2])
+ m.Cmdy(SPACE, arg[0], ctx.COMMAND, arg[1])
m.ProcessField(ctx.ACTION, ctx.COMMAND)
}
}},
diff --git a/base/web/serve.go b/base/web/serve.go
index a360294a..0d716001 100644
--- a/base/web/serve.go
+++ b/base/web/serve.go
@@ -300,7 +300,7 @@ func _serve_login(msg *ice.Message, key string, cmds []string, w http.ResponseWr
if _, ok := msg.Target().Commands[WEB_LOGIN]; ok { // 单点认证
msg.Target().Cmd(msg, WEB_LOGIN, kit.Simple(key, cmds)...)
- return cmds, msg.Result(0) != ice.ErrWarn && msg.Result(0) != ice.FALSE
+ return cmds, !msg.IsErr() && msg.Result(0) != ice.FALSE
}
if aaa.Right(msg, key, cmds) {
@@ -329,7 +329,7 @@ const SERVE = "serve"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(
- mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,port,dev",
+ mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev",
DOMAIN, "", tcp.LOCALHOST, ice.TRUE, LOGHEADERS, ice.FALSE,
nfs.PATH, kit.Dict(ice.PS, ice.USR_VOLCANOS),
ice.VOLCANOS, kit.Dict(nfs.PATH, ice.USR_VOLCANOS, INDEX, "page/index.html",
@@ -340,7 +340,7 @@ func init() {
),
)},
}, Commands: ice.Commands{
- SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeAction(ice.Actions{
+ SERVE: {Name: "serve name auto start spide", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
cli.NodeInfo(m, WORKER, ice.Info.PathName)
for _, p := range []string{LOGIN, SHARE, SPACE, ice.VOLCANOS, ice.INTSHELL, ice.PUBLISH, ice.REQUIRE, ice.HELP, ice.CMD} {
@@ -360,13 +360,13 @@ func init() {
cli.START: {Name: "start dev proto=http host port=9020 nodename password username userrole staffname", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
_serve_start(m)
}},
- }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,status,name,proto,host,port,dev"))},
+ }, mdb.HashAction())},
PP(ice.INTSHELL): {Name: "/intshell/", Help: "命令行", Hand: func(m *ice.Message, arg ...string) {
- RenderIndex(m, SERVE, ice.INTSHELL, arg...)
+ RenderIndex(m, ice.INTSHELL, arg...)
}},
PP(ice.VOLCANOS): {Name: "/volcanos/", Help: "浏览器", Hand: func(m *ice.Message, arg ...string) {
- RenderIndex(m, SERVE, ice.VOLCANOS, arg...)
+ RenderIndex(m, ice.VOLCANOS, arg...)
}},
PP(ice.PUBLISH): {Name: "/publish/", Help: "定制化", Hand: func(m *ice.Message, arg ...string) {
_share_local(aaa.UserRoot(m), ice.USR_PUBLISH, path.Join(arg...))
@@ -374,10 +374,10 @@ func init() {
PP(ice.REQUIRE): {Name: "/require/shylinux.com/x/volcanos/proto.js", Help: "代码库", Hand: func(m *ice.Message, arg ...string) {
_share_repos(m, path.Join(arg[0], arg[1], arg[2]), arg[3:]...)
}},
- PP(ice.REQUIRE, ice.NODE_MODULES): {Name: "/require/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
- p := path.Join(ice.USR_VOLCANOS, ice.NODE_MODULES, path.Join(arg...))
+ PP(ice.REQUIRE, ice.LIB, ice.NODE_MODULES): {Name: "/require/lib/node_modules/", Help: "依赖库", Hand: func(m *ice.Message, arg ...string) {
+ p := path.Join(ice.USR_VOLCANOS, ice.LIB, ice.NODE_MODULES, path.Join(arg...))
if !nfs.ExistsFile(m, p) {
- m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, ice.USR_VOLCANOS))
+ m.Cmd(cli.SYSTEM, "npm", "install", arg[0], kit.Dict(cli.CMD_DIR, path.Join(ice.USR_VOLCANOS, ice.LIB)))
}
m.RenderDownload(p)
}},
diff --git a/base/web/share.go b/base/web/share.go
index d6a45894..c3b86856 100644
--- a/base/web/share.go
+++ b/base/web/share.go
@@ -78,7 +78,7 @@ func _share_local(m *ice.Message, arg ...string) {
}
// 上传文件
- if p == "bin/ice.bin" {
+ if p == ice.BIN_ICE_BIN {
aaa.UserRoot(m).Cmd(SPACE, m.Option(ice.POD), SPIDE, "submit", MergeURL2(m, SHARE_PROXY, nfs.PATH, ""), m.Option(ice.POD), p, size, cache.Format(ice.MOD_TIME))
} else {
m.Cmd(SPACE, m.Option(ice.POD), SPIDE, ice.DEV, SPIDE_RAW, MergeURL2(m, SHARE_PROXY, nfs.PATH, ""),
@@ -88,6 +88,10 @@ func _share_local(m *ice.Message, arg ...string) {
p = pp
}
+ if m.Warn(!file.ExistsFile(p)) {
+ m.RenderStatusNotFound()
+ return
+ }
m.RenderDownload(p)
}
func _share_proxy(m *ice.Message) {
@@ -132,7 +136,7 @@ const SHARE = "share"
func init() {
Index.MergeCommands(ice.Commands{
- SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeAction(ice.Actions{
+ SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _share_render(m) }},
mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK),
@@ -167,7 +171,7 @@ func init() {
case LOGIN:
m.RenderRedirect(ice.PS, ice.MSG_SESSID, aaa.SessCreate(m, msg.Append(aaa.USERNAME)))
default:
- RenderIndex(m, SERVE, ice.VOLCANOS)
+ RenderIndex(m, ice.VOLCANOS)
}
}},
diff --git a/base/web/space.go b/base/web/space.go
index 2b9d0674..fe6776fc 100644
--- a/base/web/space.go
+++ b/base/web/space.go
@@ -216,8 +216,8 @@ func _space_fork(m *ice.Message) {
switch kind {
case CHROME: // 交互节点
- gdb.Event(m, SPACE_OPEN, args...)
- defer gdb.Event(m, SPACE_CLOSE, args...)
+ gdb.Event(m, SPACE_OPEN, args)
+ defer gdb.Event(m, SPACE_CLOSE, args)
defer mdb.HashRemove(m, mdb.NAME, name)
m.Go(func(msg *ice.Message) {
switch m.Option(ice.CMD) {
@@ -234,12 +234,12 @@ func _space_fork(m *ice.Message) {
}
})
case WORKER: // 工作节点
- gdb.Event(m, DREAM_START, args...)
- defer gdb.Event(m, DREAM_STOP, args...)
+ gdb.Event(m, DREAM_START, args)
+ defer gdb.Event(m, DREAM_STOP, args)
defer m.Cmd(DREAM, DREAM_STOP, args)
default: // 服务节点
- gdb.Event(m, SPACE_START, args...)
- defer gdb.Event(m, SPACE_STOP, args...)
+ gdb.Event(m, SPACE_START, args)
+ defer gdb.Event(m, SPACE_STOP, args)
defer mdb.HashRemove(m, mdb.NAME, name)
}
_space_handle(m, false, m.Target().Server().(*Frame), s, name)
@@ -297,8 +297,12 @@ func init() {
REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000), TIMEOUT, kit.Dict("c", "180s"),
)},
}, Commands: ice.Commands{
- SPACE: {Name: "space name cmd auto invite", Help: "空间站", Actions: ice.MergeAction(ice.Actions{
+ 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, "")
+ }},
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))
diff --git a/base/web/spide.go b/base/web/spide.go
index d48d1342..629dffa5 100644
--- a/base/web/spide.go
+++ b/base/web/spide.go
@@ -38,6 +38,7 @@ func _spide_create(m *ice.Message, name, address string) {
}
}
func _spide_list(m *ice.Message, arg ...string) {
+ msg := mdb.HashSelects(m.Spawn(), arg[0])
cache, save := "", ""
switch arg[1] { // 缓存方法
case SPIDE_RAW:
@@ -50,7 +51,6 @@ func _spide_list(m *ice.Message, arg ...string) {
cache, arg = arg[1], arg[1:]
}
- msg := mdb.HashSelect(m.Spawn(), arg[0])
method := kit.Select(SPIDE_POST, msg.Append(CLIENT_METHOD))
switch arg = arg[1:]; arg[0] { // 请求方法
case SPIDE_GET:
@@ -77,6 +77,8 @@ func _spide_list(m *ice.Message, arg ...string) {
})
// 发送请求
+ m.Debug("what %v", msg.Append(CLIENT_NAME))
+ m.Debug("what %v", msg.FormatsMeta())
res, e := _spide_send(m, msg.Append(CLIENT_NAME), req, kit.Format(msg.Append(CLIENT_TIMEOUT)))
if m.Warn(e, ice.ErrNotFound, uri) {
return
@@ -349,7 +351,7 @@ const SPIDE = "spide"
func init() {
Index.MergeCommands(ice.Commands{
- SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeAction(ice.Actions{
+ SPIDE: {Name: "spide client.name action=raw,msg,save,cache method=GET,PUT,POST,DELETE url format=form,part,json,data,file arg run create", Help: "蜘蛛侠", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
conf := m.Confm(cli.RUNTIME, cli.CONF)
m.Cmd(SPIDE, mdb.CREATE, ice.OPS, kit.Select("http://127.0.0.1:9020", conf[cli.CTX_OPS]))
@@ -387,3 +389,16 @@ func init() {
}},
})
}
+
+func SpideGet(m *ice.Message, arg ...ice.Any) ice.Any {
+ return kit.UnMarshal(m.Cmdx(SPIDE_GET, arg))
+}
+func SpidePut(m *ice.Message, arg ...ice.Any) ice.Any {
+ return kit.UnMarshal(m.Cmdx(SPIDE_PUT, arg))
+}
+func SpidePost(m *ice.Message, arg ...ice.Any) ice.Any {
+ return kit.UnMarshal(m.Cmdx(SPIDE_POST, arg))
+}
+func SpideDelete(m *ice.Message, arg ...ice.Any) ice.Any {
+ return kit.UnMarshal(m.Cmdx(SPIDE_DELETE, arg))
+}
diff --git a/base/web/web.go b/base/web/web.go
index d60f3952..0cadf780 100644
--- a/base/web/web.go
+++ b/base/web/web.go
@@ -131,5 +131,8 @@ func init() {
)
}
+func ApiAction(arg ...string) ice.Actions {
+ return ice.Actions{kit.Select(ice.PS, path.Join(arg...)+ice.PS): {}}
+}
func P(arg ...string) string { return path.Join(ice.PS, path.Join(arg...)) }
func PP(arg ...string) string { return P(arg...) + ice.PS }
diff --git a/conf.go b/conf.go
index 900c982f..27e000dd 100644
--- a/conf.go
+++ b/conf.go
@@ -89,6 +89,11 @@ const ( // DIR
CSV = "csv"
JSON = "json"
+ LIB = "lib"
+ PAGE = "page"
+ PANEL = "panel"
+ PLUGIN = "plugin"
+
FAVICON = "favicon.ico"
PROTO_JS = "proto.js"
FRAME_JS = "frame.js"
diff --git a/core/chat/action.go b/core/chat/action.go
index f4a6ed62..e0370b39 100644
--- a/core/chat/action.go
+++ b/core/chat/action.go
@@ -11,33 +11,23 @@ import (
)
func _action_right(m *ice.Message, river string, storm string) (ok bool) {
- if ok = true; m.Option(ice.MSG_USERROLE) == aaa.VOID {
- mdb.Richs(m, RIVER, "", river, func(key string, value ice.Map) {
- if ok = mdb.Richs(m, RIVER, kit.Keys(mdb.HASH, key, OCEAN), m.Option(ice.MSG_USERNAME), nil) != nil; ok {
- m.Logs(ice.LOG_AUTH, RIVER, river, STORM, storm)
- }
- })
- }
- return ok
+ return m.Option(ice.MSG_USERROLE) != aaa.VOID || m.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Length() > 0
}
func _action_key(m *ice.Message, arg ...string) string {
- return kit.Keys(mdb.HASH, kit.Select(m.Option(RIVER), arg, 0), STORM, mdb.HASH, kit.Select(m.Option(STORM), arg, 1))
+ return kit.KeyHash(kit.Select(m.Option(RIVER), arg, 0), STORM, kit.KeyHash(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}).Tables(func(value ice.Maps) {
- m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD]))
- })
+ m.Cmdy(STORM, storm, kit.Dict(ice.MSG_RIVER, river))
}
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 mdb.Grows(m, RIVER, _action_key(m, river, storm), mdb.ID, index, func(index int, value ice.Map) {
- if cmds = kit.Simple(kit.Keys(value[ice.CTX], value[ice.CMD])); kit.Format(value[ice.POD]) != "" {
- m.Option(ice.POD, value[ice.POD]) // 远程节点
+ if m.Cmd(STORM, storm, index, func(value ice.Maps) {
+ if index = value[ctx.INDEX]; value[web.SPACE] != "" {
+ m.Option(ice.POD, value[web.SPACE])
}
- }) == nil && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, cmds) {
+ }).Length() == 0 && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, index) {
return // 没有授权
}
@@ -45,13 +35,15 @@ func _action_exec(m *ice.Message, river, storm, index string, arg ...string) {
_action_upload(m) // 上传文件
}
- if cmds[0] == "web.chat.node" || !ctx.PodCmd(m, cmds, arg) {
- m.Cmdy(cmds, arg) // 执行命令
+ if index == m.Prefix(NODES) || !ctx.PodCmd(m, index, arg) {
+ m.Cmdy(index, arg) // 执行命令
}
}
-func _action_auth(m, msg *ice.Message) bool {
- if m.Warn(kit.Time() > kit.Time(msg.Append(mdb.TIME)), ice.ErrNotValid) {
- return false
+func _action_auth(m *ice.Message, share string) *ice.Message {
+ msg := m.Cmd(web.SHARE, share)
+ if m.Warn(kit.Time(msg.Append(mdb.TIME)) < kit.Time(m.Time()), ice.ErrNotValid) {
+ msg.Append(mdb.TYPE, "")
+ return msg // 共享过期
}
m.Logs(ice.LOG_AUTH,
aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)),
@@ -60,15 +52,15 @@ func _action_auth(m, msg *ice.Message) bool {
RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)),
STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)),
)
- return _action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM))
+ if m.Warn(!_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)), ice.ErrNotRight) {
+ msg.Append(mdb.TYPE, "")
+ return msg // 没有权限
+ }
+ return msg
}
func _action_share(m *ice.Message, arg ...string) {
- switch msg := m.Cmd(web.SHARE, arg[0]); msg.Append(mdb.TYPE) {
+ switch msg := _action_auth(m, arg[0]); msg.Append(mdb.TYPE) {
case web.STORM:
- if !_action_auth(m, msg) {
- break // 没有授权
- }
-
if len(arg) == 1 {
_action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM))
break // 命令列表
@@ -78,22 +70,16 @@ func _action_share(m *ice.Message, arg ...string) {
_action_exec(m, msg.Append(web.RIVER), msg.Append(web.STORM), arg[1], arg[2:]...)
case web.FIELD:
- if !_action_auth(m, msg) {
- break // 没有授权
- }
-
- if arg[0] = msg.Append(mdb.NAME); len(arg) == 1 {
+ if len(arg) == 1 {
m.Push(TITLE, msg.Append(TITLE))
m.Push(TOPIC, msg.Append(TOPIC))
m.Push(ctx.INDEX, msg.Append(mdb.NAME))
m.Push(ctx.ARGS, msg.Append(mdb.TEXT))
break // 命令列表
}
-
- if m.Option(ice.MSG_UPLOAD) != "" {
+ if arg[1] = msg.Append(mdb.NAME); m.Option(ice.MSG_UPLOAD) != "" {
_action_upload(m) // 上传文件
}
-
m.Cmdy(arg[1:]) // 执行命令
}
}
@@ -103,7 +89,6 @@ func _action_upload(m *ice.Message) {
}
const (
- DOMAIN = "domain"
PUBLIC = "public"
PROTECTED = "protected"
PRIVATE = "private"
@@ -113,33 +98,11 @@ const ACTION = "action"
func init() {
Index.MergeCommands(ice.Commands{
- web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeAction(ice.Actions{
- 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)
- }
- }},
+ web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}},
- SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
- _header_share(m, arg...)
- }},
- "_share": {Name: "_share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
+ web.SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
_action_share(m, arg...)
}},
}, ctx.CmdAction(nfs.PATH, ice.USR_LOCAL_RIVER)), Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/chat/chat.go b/core/chat/chat.go
index 243a2f13..34688d57 100644
--- a/core/chat/chat.go
+++ b/core/chat/chat.go
@@ -1,18 +1,37 @@
package chat
import (
+ "path"
+
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/web"
+ kit "shylinux.com/x/toolkits"
)
const CHAT = "chat"
var Index = &ice.Context{Name: CHAT, Help: "聊天中心"}
-func init() {
- web.Index.Register(Index, &web.Frame{},
- HEADER, RIVER, STORM, ACTION, FOOTER,
- SCAN, PASTE, FILES, LOCATION,
- WEBSITE,
- )
+func init() { web.Index.Register(Index, &web.Frame{}) }
+
+func MergePod(m *ice.Message, pod string, arg ...ice.Any) string {
+ return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...)
+}
+func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string {
+ return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...)
+}
+func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string {
+ if m.Option(ice.MSG_USERPOD) == "" {
+ return mergeurl(m, path.Join(ice.PS, "chat", WEBSITE, web), arg...)
+ } else {
+ return mergeurl(m, path.Join(WEBSITE, web), arg...)
+ }
+}
+func mergeurl(m *ice.Message, p string, arg ...ice.Any) string {
+ if m.Option(ice.MSG_USERPOD) == "" {
+ p = path.Join(ice.PS, p)
+ } else {
+ p = path.Join(ice.PS, "chat", ice.POD, m.Option(ice.MSG_USERPOD), p)
+ }
+ return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...)
}
diff --git a/core/chat/chat.shy b/core/chat/chat.shy
index 61c34881..81385e85 100644
--- a/core/chat/chat.shy
+++ b/core/chat/chat.shy
@@ -1,31 +1,34 @@
chapter "组织"
-
-header.go
-footer.go
-river.go
-storm.go
-ocean.go
-action.go
-search.go
-info.go
-node.go
chat.go
chat.shy
+header.go
+footer.go
+action.go
+search.go
+river.go
+storm.go
+ocean.go
+nodes.go
+
+sso.go
pod.go
cmd.go
div.go
-sso.go
-grant.go
+topic.go
website.go
-room.go
-meet.go
scan.go
scan.js
paste.go
files.go
trans.go
location.go
+location.shy
+
+room.go
+meet.go
+grant.go
+oauth
diff --git a/core/chat/cmd.go b/core/chat/cmd.go
index 3984fff9..dafaef85 100644
--- a/core/chat/cmd.go
+++ b/core/chat/cmd.go
@@ -5,6 +5,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@@ -52,67 +53,25 @@ const CMD = "cmd"
func init() {
Index.MergeCommands(ice.Commands{
- CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeAction(ice.Actions{
- web.UPLOAD: {Name: "upload", Help: "上传", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(web.CACHE, web.UPLOAD_WATCH, path.Join(m.Config(nfs.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(nfs.PWD)
- }
- }},
- }, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD)), Hand: func(m *ice.Message, arg ...string) {
- if _cmd_file(m, arg...) {
- return
- }
- if msg := m.Cmd(ctx.COMMAND, arg[0]); msg.Length() > 0 {
- web.RenderCmd(m, arg[0])
- return
- }
-
- if len(arg) > 0 {
- m.ProcessLocation(arg[0])
- return
- }
- m.Option(nfs.DIR_ROOT, path.Join(m.Config(nfs.PATH), strings.TrimPrefix(path.Dir(m.R.URL.Path), "/cmd")))
- m.Cmdy(nfs.DIR, arg)
- }},
- "/cmd/": {Name: "/cmd/", Help: "命令", Actions: ice.MergeAction(ice.Actions{
- ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "shy", mdb.NAME, "web.wiki.word")
- m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "svg", mdb.NAME, "web.wiki.draw")
- m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "csv", mdb.NAME, "web.wiki.data")
- m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, "json", mdb.NAME, "web.wiki.json")
-
+ CMD: {Name: "cmd path auto upload up home", Help: "命令", Actions: ice.MergeActions(ice.Actions{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ m.Cmd(aaa.ROLE, aaa.WHITE, CMD)
+ m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SHY, mdb.NAME, "web.wiki.word")
+ m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, "web.wiki.draw")
+ m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.CSV, mdb.NAME, "web.wiki.data")
+ m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, nfs.JSON, mdb.NAME, "web.wiki.json")
for _, k := range []string{"mod", "sum"} {
m.Cmdy(CMD, mdb.CREATE, mdb.TYPE, k, mdb.NAME, "web.code.inner")
}
}},
- }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
- if strings.HasSuffix(m.R.URL.Path, ice.PS) {
- web.RenderCmd(m, CMD)
- return // 目录
- }
+ }, mdb.HashAction(mdb.SHORT, "type", nfs.PATH, nfs.PWD), ctx.CmdAction(), web.ApiAction("/cmd/")), Hand: func(m *ice.Message, arg ...string) {
if _cmd_file(m, arg...) {
return
}
-
- if ctx.PodCmd(m, ctx.COMMAND, arg[0]) {
- if !m.IsErr() {
- web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
- }
+ if ctx.PodCmd(m, ctx.COMMAND, arg[0]) && !m.IsErr() {
+ web.RenderCmd(m, arg[0], arg[1:]) // 远程命令
} else if m.Cmdy(ctx.COMMAND, arg[0]); m.Length() > 0 {
web.RenderCmd(m, arg[0], arg[1:]) // 本地命令
- } else {
- m.RenderDownload(path.Join(m.Config(nfs.PATH), path.Join(arg...))) // 文件
}
}},
})
diff --git a/core/chat/div.go b/core/chat/div.go
index 592e19cc..1d12c9e1 100644
--- a/core/chat/div.go
+++ b/core/chat/div.go
@@ -31,7 +31,7 @@ func init() {
nfs.TEMPLATE, _div_template,
)},
}, Commands: ice.Commands{
- "/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeAction(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
+ "/div/": {Name: "/div/", Help: "定制", Actions: ice.MergeActions(ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
switch p := path.Join(arg...); kit.Ext(kit.Select("", p)) {
case nfs.HTML:
m.RenderDownload(p)
@@ -45,7 +45,7 @@ func init() {
web.RenderCmd(m, m.PrefixKey(), p)
}
}},
- DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeAction(ice.Actions{
+ DIV: {Name: "div hash auto import", Help: "定制", Actions: ice.MergeActions(ice.Actions{
lex.SPLIT: {Name: "split name=hi text", Help: "生成", Hand: func(m *ice.Message, arg ...string) {
m.ProcessRewrite(mdb.HASH, m.Cmdx(DIV, mdb.CREATE, m.OptionSimple(mdb.NAME), mdb.TEXT, _div_parse(m, m.Option(mdb.TEXT))))
}},
diff --git a/core/chat/files.go b/core/chat/files.go
index 788633c4..49a480b3 100644
--- a/core/chat/files.go
+++ b/core/chat/files.go
@@ -12,18 +12,13 @@ const FILES = "files"
func init() {
Index.MergeCommands(ice.Commands{
- FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeAction(ice.Actions{
+ FILES: {Name: "files hash auto upload", Help: "文件夹", Actions: ice.MergeActions(ice.Actions{
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.Cmdy(web.CACHE, web.UPLOAD)
- up = kit.Simple(msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE))
- }
- m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
+ up := web.Upload(m)
+ mdb.HashCreate(m, mdb.TYPE, kit.Ext(up[1]), mdb.NAME, up[1], nfs.SIZE, up[2], mdb.DATA, up[0])
}},
}, mdb.HashAction(mdb.SHORT, mdb.DATA, mdb.FIELD, "time,hash,type,name,size,data")), Hand: func(m *ice.Message, arg ...string) {
- mdb.HashSelect(m, arg...)
- m.Tables(func(value ice.Maps) {
+ mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
link := web.SHARE_CACHE + value[mdb.DATA]
if m.PushDownload(mdb.LINK, value[mdb.NAME], link); len(arg) > 0 && kit.ExtIsImage(value[mdb.NAME]) {
m.PushImages("image", link)
diff --git a/core/chat/footer.go b/core/chat/footer.go
index 3b049314..c2b57ee1 100644
--- a/core/chat/footer.go
+++ b/core/chat/footer.go
@@ -2,29 +2,29 @@ package chat
import (
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/web"
- kit "shylinux.com/x/toolkits"
)
const (
- LEGAL = "legal"
+ EMAIL = "email"
)
const FOOTER = "footer"
func init() {
- Index.Merge(&ice.Context{Configs: ice.Configs{
- FOOTER: {Name: FOOTER, Help: "状态栏", Value: kit.Dict(LEGAL, kit.List(`shylinuxc@gmail.com`))},
- }, Commands: ice.Commands{
- web.P(FOOTER): {Name: "/footer", Help: "状态栏", Actions: ice.MergeAction(ice.Actions{
+ Index.MergeCommands(ice.Commands{
+ FOOTER: {Name: "footer", Help: "状态栏", Actions: ice.MergeActions(ice.Actions{
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)
+ if aaa.Right(m, arg) {
+ if m.Cmdy(arg); m.IsErrNotFound() {
+ m.SetResult().Cmdy(cli.SYSTEM, arg)
+ }
}
}},
- }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
- m.Confm(FOOTER, LEGAL, func(index int, value string) { m.Echo(value) })
+ }, ctx.CmdAction(EMAIL, `shylinuxc@gmail.com`), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
+ m.Echo(m.Config(EMAIL))
}},
- }})
+ })
}
diff --git a/core/chat/grant.go b/core/chat/grant.go
index e746a5fc..8d84bc08 100644
--- a/core/chat/grant.go
+++ b/core/chat/grant.go
@@ -11,7 +11,7 @@ const GRANT = "grant"
func init() {
Index.MergeCommands(ice.Commands{
- GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeAction(ice.Actions{
+ GRANT: {Name: "grant space id auto insert", Help: "授权", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case web.SPACE:
diff --git a/core/chat/header.go b/core/chat/header.go
index 3c4606a0..f6a8e11a 100644
--- a/core/chat/header.go
+++ b/core/chat/header.go
@@ -1,27 +1,20 @@
package chat
import (
- "strings"
-
ice "shylinux.com/x/icebergs"
"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/tcp"
"shylinux.com/x/icebergs/base/web"
- "shylinux.com/x/icebergs/core/code"
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) bool {
if m.Option(web.SHARE) != "" {
- m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields("")).Tables(func(value ice.Maps) {
+ m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) {
switch value[mdb.TYPE] {
case web.FIELD, web.STORM:
m.Option(ice.MSG_USERNAME, value[aaa.USERNAME])
@@ -33,10 +26,10 @@ func _header_check(m *ice.Message, arg ...string) bool {
return true
}
+ m.Option(web.SSO, m.Config(web.SSO))
m.Option(web.LOGIN, m.Config(web.LOGIN))
- m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO)))
- if m.Option("login.dev", m.Cmd(web.SPACE, ice.DEV).Append(mdb.TEXT)) == "" {
- m.Option("login.dev", m.Cmd(web.SPACE, ice.SHY).Append(mdb.TEXT))
+ if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" {
+ m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT))
}
return false
}
@@ -46,63 +39,48 @@ func _header_share(m *ice.Message, arg ...string) {
} else {
m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK)))
}
-
m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, ""))
m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK))
m.Push(mdb.NAME, m.Option(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]))
+ m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0]))
}
const (
TITLE = "title"
MENUS = "menus"
TRANS = "trans"
- AGENT = "agent"
- CHECK = "check"
- SHARE = "share"
+
+ HEADER_AGENT = "header.agent"
)
const HEADER = "header"
func init() {
- Index.Merge(&ice.Context{Configs: ice.Configs{
- HEADER: {Name: HEADER, Help: "标题栏", Value: kit.Data(aaa.LOGIN, kit.List("登录", "扫码"))},
- }, Commands: ice.Commands{
+ Index.MergeCommands(ice.Commands{
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
- case "/header":
- if kit.Select("", arg, 1) == "" {
+ case web.P(HEADER):
+ switch kit.Select("", arg, 1) {
+ case "", aaa.LOGIN:
return // 免登录
}
- if kit.Select("", arg, 1) == aaa.LOGIN {
+ default:
+ if aaa.Right(m, arg) {
return // 免登录
}
- case "/pod/", "/cmd/", "/topic/":
- return // 免登录
- case "/sso":
- return // 免登录
}
m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg)
}},
- web.P(HEADER): {Name: "/header", Help: "标题栏", Actions: ice.Actions{
- 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...)
- }},
- SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
- _header_share(m, arg...)
- }},
+ HEADER: {Name: "header", Help: "标题栏", Actions: ice.MergeActions(ice.Actions{
aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) {
if aaa.UserLogin(m, arg[0], arg[1]) {
web.RenderCookie(m, aaa.SessCreate(m, arg[0]))
}
}},
aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(aaa.SESS, mdb.REMOVE, kit.Dict(mdb.HASH, m.Option(ice.MSG_SESSID)))
+ aaa.UserLogout(m)
}},
aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) {
_header_users(m, m.ActionKey(), arg...)
@@ -120,16 +98,18 @@ func init() {
_header_users(m, m.ActionKey(), arg...)
}},
ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), CHECK, arg)
+ m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), "check", arg)
}},
- code.WEBPACK: {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(code.WEBPACK, cli.BUILD, m.OptionSimple(mdb.NAME))
+ "webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmdy("webpack", cli.BUILD, m.OptionSimple(mdb.NAME))
}},
- }, Hand: func(m *ice.Message, arg ...string) {
+ web.SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) {
+ _header_share(m, arg...)
+ }},
+ }, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
if !_header_check(m, arg...) {
return
}
- _header_agent(m, arg...)
msg := m.Cmd(aaa.USER, m.Option(ice.MSG_USERNAME))
for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} {
@@ -142,10 +122,10 @@ func init() {
m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname")))
}
+ gdb.Event(m, HEADER_AGENT)
m.Option(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans")))
m.Option(MENUS, m.Config(MENUS))
m.Echo(m.Config(TITLE))
- // m.Cmdy(WEBSITE)
}},
- }})
+ })
}
diff --git a/core/chat/info.go b/core/chat/info.go
deleted file mode 100644
index 7ee72946..00000000
--- a/core/chat/info.go
+++ /dev/null
@@ -1,21 +0,0 @@
-package chat
-
-import (
- ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/mdb"
-)
-
-const INFO = "info"
-
-func init() {
- Index.MergeCommands(ice.Commands{
- INFO: {Name: "info auto", Help: "信息", Actions: ice.Actions{
- mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.MODIFY, RIVER, "", mdb.HASH, mdb.HASH, m.Option(ice.MSG_RIVER), arg)
- }},
- }, Hand: func(m *ice.Message, arg ...string) {
- m.OptionFields(mdb.DETAIL)
- m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, mdb.HASH, m.Option(ice.MSG_RIVER))
- }},
- })
-}
diff --git a/core/chat/location.go b/core/chat/location.go
index 5fe3b6fe..65dd3ef5 100644
--- a/core/chat/location.go
+++ b/core/chat/location.go
@@ -37,7 +37,7 @@ func init() {
}
Index.MergeCommands(ice.Commands{
- LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeAction(ice.Actions{
+ LOCATION: {Name: "location hash auto", Help: "地理位置", Actions: ice.MergeActions(ice.Actions{
"explore": {Name: "explore", Help: "周边", Hand: func(m *ice.Message, arg ...string) {
m.Echo(get(m, "place/v1/explore", m.OptionSimple("boundary,page_index")))
}},
diff --git a/core/chat/meet.go b/core/chat/meet.go
index 543a4fdf..a5b01792 100644
--- a/core/chat/meet.go
+++ b/core/chat/meet.go
@@ -17,7 +17,7 @@ func init() {
mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,照片,性别,年龄,身高,体重,籍贯,户口,学历,学校,职业,公司,年薪,资产,家境",
)},
}, Commands: ice.Commands{
- "monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
+ "monkey": {Name: "monkey total=888 count=9 run", Help: "猴子开箱子", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
total := kit.Int(arg[0])
@@ -38,7 +38,7 @@ func init() {
}
m.StatusTimeCount()
}},
- MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeAction(ice.Actions{
+ MISS: {Name: "miss name auto create", Help: "资料", Meta: kit.Dict("_trans", kit.Dict("name", "姓名")), Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
msg := m.Spawn()
diff --git a/core/chat/node.go b/core/chat/node.go
deleted file mode 100644
index 4f00bb23..00000000
--- a/core/chat/node.go
+++ /dev/null
@@ -1,65 +0,0 @@
-package chat
-
-import (
- ice "shylinux.com/x/icebergs"
- "shylinux.com/x/icebergs/base/aaa"
- "shylinux.com/x/icebergs/base/gdb"
- "shylinux.com/x/icebergs/base/mdb"
- "shylinux.com/x/icebergs/base/web"
- "shylinux.com/x/icebergs/core/code"
- kit "shylinux.com/x/toolkits"
-)
-
-const NODE = "node"
-
-func init() {
- Index.MergeCommands(ice.Commands{
- NODE: {Name: "node pod ctx cmd auto insert invite", Help: "设备", Actions: ice.Actions{
- ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- gdb.Watch(m, web.DREAM_START, m.PrefixKey())
- gdb.Watch(m, web.SPACE_START, m.PrefixKey())
- }},
- web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" {
- return
- }
- if msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(mdb.TYPE) == RIVER {
- m.Cmdy(NODE, mdb.INSERT, arg)
- } else {
- msg.Debug(msg.FormatMeta())
- }
- }},
- web.DREAM_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" {
- return
- }
- m.Cmdy(NODE, mdb.INSERT, arg)
- }},
- mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(web.SPACE)
- }},
- mdb.INSERT: {Name: "insert type name share river", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.INSERT, RIVER, _river_key(m, NODE), mdb.HASH, arg)
- }},
- mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.DELETE, RIVER, _river_key(m, NODE), mdb.HASH, mdb.NAME, m.Option(ice.POD))
- }},
- aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) {
- m.Option(web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, RIVER))
- m.Cmdy(code.PUBLISH, ice.CONTEXTS, "tool")
- }},
- }, Hand: func(m *ice.Message, arg ...string) {
- if len(arg) == 0 {
- m.OptionFields("time,type,name,share")
- m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH)
- m.Tables(func(value ice.Maps) {
- m.PushAnchor(value[mdb.NAME], web.MergeURL2(m, "/chat/pod/"+kit.Keys(m.Option(ice.POD), value[mdb.NAME])))
- })
- m.RenameAppend("name", "pod")
- m.PushAction(mdb.REMOVE)
- return
- }
- m.Cmdy(web.ROUTE, arg)
- }},
- })
-}
diff --git a/core/chat/oauth/oauth.go b/core/chat/oauth/oauth.go
index 2ff42d40..9e507626 100644
--- a/core/chat/oauth/oauth.go
+++ b/core/chat/oauth/oauth.go
@@ -57,7 +57,7 @@ const (
const OAUTH = "oauth"
var Index = &ice.Context{Name: OAUTH, Help: "认证授权", Commands: ice.Commands{
- OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeAction(ice.Actions{
+ OAUTH: {Name: "oauth hash auto prunes", Help: "权限", Actions: ice.MergeActions(ice.Actions{
CHECK: {Name: "check scope domain", Help: "检查", Hand: func(m *ice.Message, arg ...string) {
m.Echo(_merge_url(m, kit.Select(ice.Info.Make.Domain, m.Option(web.DOMAIN)), APPLY, m.OptionSimple(SCOPE), REDIRECT_URI, _merge_url(m, "", REPLY)))
}},
diff --git a/core/chat/ocean.go b/core/chat/ocean.go
index b89b83b3..092e71c6 100644
--- a/core/chat/ocean.go
+++ b/core/chat/ocean.go
@@ -3,6 +3,7 @@ package chat
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/aaa"
+ "shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
)
@@ -12,14 +13,21 @@ const OCEAN = "ocean"
func init() {
Index.MergeCommands(ice.Commands{
OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ gdb.Watch(m, RIVER_CREATE)
+ }},
+ RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) {
+ m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
+ }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
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)
+ m.Option(mdb.SHORT, aaa.USERNAME)
+ m.Cmdy(mdb.INSERT, m.Prefix(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))
+ m.Cmdy(mdb.DELETE, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME))
}},
}, Hand: func(m *ice.Message, arg ...string) {
m.Fields(len(arg), "time,username")
diff --git a/core/chat/paste.go b/core/chat/paste.go
index a109bf18..f58ef179 100644
--- a/core/chat/paste.go
+++ b/core/chat/paste.go
@@ -11,7 +11,7 @@ const PASTE = "paste"
func init() {
Index.MergeCommands(ice.Commands{
- PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeAction(ice.Actions{
+ PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴", Actions: ice.MergeActions(ice.Actions{
"getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(PASTE, mdb.CREATE, arg)
}},
diff --git a/core/chat/pod.go b/core/chat/pod.go
index 8e63fc46..d7ffb392 100644
--- a/core/chat/pod.go
+++ b/core/chat/pod.go
@@ -17,32 +17,33 @@ const POD = "pod"
func init() {
Index.MergeCommands(ice.Commands{
- "/pod/": {Name: "/pod/", Help: "节点", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
- if strings.HasPrefix(m.R.Header.Get("User-Agent"), "curl") || strings.HasPrefix(m.R.Header.Get("User-Agent"), "Wget") {
- m.Option(ice.MSG_USERNAME, "root")
- m.Option(ice.MSG_USERROLE, "root")
+ POD: {Name: "pod", Help: "节点", Actions: ice.MergeActions(ice.Actions{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, POD) }},
+ }, ctx.CmdAction(), web.ApiAction("/pod/")), Hand: func(m *ice.Message, arg ...string) {
+ if web.OptionAgentIs(m, "curl", "Wget") {
+ aaa.UserRoot(m)
m.Option(ice.POD, kit.Select("", arg, 0))
- m.Cmdy(web.SHARE_LOCAL, "bin/ice.bin")
- return // 下载文件
+ m.Cmdy(web.SHARE_LOCAL, ice.BIN_ICE_BIN)
+ return // 下载程序
}
- if len(arg) == 0 || kit.Select("", arg, 0) == "" { // 节点列表
- web.RenderCmd(m, web.ROUTE)
+ if len(arg) == 0 || kit.Select("", arg, 0) == "" {
+ web.RenderCmd(m, web.ROUTE) // 节点列表
- } else if len(arg) == 1 { // 节点首页
+ } else if len(arg) == 1 {
if m.Cmd(web.SPACE, arg[0]).Length() == 0 && !strings.Contains(arg[0], ice.PT) {
- m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0])
+ m.Cmd(web.DREAM, cli.START, mdb.NAME, arg[0]) // 启动节点
}
aaa.UserRoot(m)
- if web.RenderWebsite(m, arg[0], "index.iml", "Header", "", "River", "", "Footer", ""); m.Result() == "" {
- web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
+ if web.RenderWebsite(m, arg[0], ice.INDEX_IML, "Header", "", "River", "", "Footer", ""); m.Result() == "" {
+ web.RenderIndex(m, ice.VOLCANOS) // 节点首页
}
- } else if arg[1] == WEBSITE { // 节点网页
- web.RenderWebsite(m, arg[0], path.Join(arg[2:]...))
+ } else if arg[1] == WEBSITE {
+ web.RenderWebsite(m, arg[0], path.Join(arg[2:]...)) // 节点网页
- } else if arg[1] == "cmd" { // 节点命令
- m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...))
+ } else if arg[1] == CMD {
+ m.Cmdy(web.SPACE, arg[0], m.Prefix(CMD), path.Join(arg[2:]...)) // 节点命令
} else {
m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+strings.TrimPrefix(path.Join(arg[1:]...), "chat/"))
// m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), "web.chat."+ice.PS+path.Join(arg[1:]...))
diff --git a/core/chat/river.go b/core/chat/river.go
index 29b6eabd..b34d3063 100644
--- a/core/chat/river.go
+++ b/core/chat/river.go
@@ -5,10 +5,10 @@ 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"
- "shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits"
)
@@ -50,12 +50,14 @@ func _river_list(m *ice.Message) {
})
}
+const (
+ RIVER_CREATE = "river.create"
+)
const RIVER = "river"
func init() {
Index.MergeCommands(ice.Commands{
- RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeAction(ice.Actions{
- ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Config(nfs.TEMPLATE, _river_template) }},
+ RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case cli.START, "创建空间":
@@ -71,38 +73,22 @@ func init() {
case aaa.USERNAME:
m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)
default:
- m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg)
+ mdb.HashInputs(m, arg)
}
}},
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(mdb.HASH, h, NODE, kit.Keym(mdb.SHORT)), mdb.NAME)
- m.Conf(RIVER, kit.Keys(mdb.HASH, h, OCEAN, kit.Keym(mdb.SHORT)), aaa.USERNAME)
- m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME))
-
- kit.Fetch(m.Confv(RIVER, kit.Keym(nfs.TEMPLATE, kit.Select("base", m.Option(nfs.TEMPLATE)))), func(storm string, value ice.Any) {
- h := m.Cmdx(STORM, mdb.CREATE, mdb.TYPE, PUBLIC, mdb.NAME, storm, 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(STORM, mdb.INSERT, mdb.HASH, h, ice.CTX, s.Cap(ice.CTX_FOLLOW), ice.CMD, key, mdb.HELP, cmd.Help)
- })
- })
- })
+ h := mdb.HashCreate(m, arg)
+ gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg)
+ m.Result(h)
}},
cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), web.DREAM, cli.START, arg)
}},
aaa.INVITE: {Name: "invite", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(code.PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
- m.Cmdy(code.PUBLISH, ice.CONTEXTS)
+ m.Cmdy("publish", ice.CONTEXTS)
}},
- }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"))},
- web.P(RIVER): {Name: "/river", Help: "群组", Hand: func(m *ice.Message, arg ...string) {
- if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, RIVER) {
+ }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) {
+ if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) {
m.RenderStatusUnauthorized()
return // 没有登录
}
@@ -121,49 +107,17 @@ func init() {
return // 没有授权
}
- switch kit.Select("", arg, 1) {
- case STORM, OCEAN, NODE:
+ if command := m.Commands(kit.Select("", arg, 1)); command != nil {
m.Option(ice.MSG_RIVER, arg[0])
m.Cmdy(arg[1], arg[2:])
- case ctx.ACTION, aaa.INVITE:
+ } else if action := m.Actions(kit.Select("", arg, 1)); action != nil {
m.Option(ice.MSG_RIVER, arg[0])
- m.Cmdy(RIVER, arg[1:])
+ m.Cmdy("", arg[1:])
- default:
+ } else {
m.Cmdy(RIVER, arg)
}
}},
})
}
-
-var _river_template = kit.Dict(
- "base", kit.Dict(
- "info", kit.List(
- "web.chat.info",
- "web.chat.ocean",
- "web.chat.storm",
- "web.chat.node",
- ),
- "scan", kit.List(
- "web.chat.scan",
- "web.chat.paste",
- "web.chat.files",
- "web.chat.location",
- "web.chat.meet.miss",
- "web.wiki.feel",
- ),
- "task", kit.List(
- "web.team.task",
- "web.team.plan",
- "web.mall.asset",
- "web.mall.salary",
- "web.wiki.word",
- ),
- "draw", kit.List(
- "web.wiki.draw",
- "web.wiki.data",
- "web.wiki.word",
- ),
- ),
-)
diff --git a/core/chat/room.go b/core/chat/room.go
index 4cdcc22f..18e7ba39 100644
--- a/core/chat/room.go
+++ b/core/chat/room.go
@@ -22,7 +22,7 @@ func init() {
mdb.SHORT, "space", mdb.FIELD, "time,hash,username,socket",
)},
}, Commands: ice.Commands{
- ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeAction(ice.Actions{
+ ROOM: {Name: "room zone id auto", Help: "room", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
}},
@@ -50,7 +50,7 @@ func init() {
m.Action(mdb.INSERT, JOIN)
}
}},
- JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeAction(ice.Actions{
+ JOIN: {Name: "join space zone auto", Help: "join", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
// m.Watch(web.SPACE_START, m.PrefixKey())
}},
diff --git a/core/chat/scan.go b/core/chat/scan.go
index 82d67fc6..d2110125 100644
--- a/core/chat/scan.go
+++ b/core/chat/scan.go
@@ -12,9 +12,7 @@ const SCAN = "scan"
func init() {
Index.MergeCommands(ice.Commands{
- SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(
- ice.Display("scan.js"),
- ), Actions: ice.MergeAction(ice.Actions{
+ SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Meta: kit.Dict(ice.Display("")), Actions: ice.MergeActions(ice.Actions{
"scanQRCode0": {Name: "scan create", Help: "本机扫码"},
"scanQRCode": {Name: "scan create", Help: "扫码"},
mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加"},
diff --git a/core/chat/scan.js b/core/chat/scan.js
index a8d85203..6a8aac48 100644
--- a/core/chat/scan.js
+++ b/core/chat/scan.js
@@ -1,18 +1,15 @@
-Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
- can.onmotion.clear(can)
+Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
+ can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onappend.table(can, msg)
can.onappend.board(can, msg)
- can.base.isFunc(cb) && cb(msg)
},
})
-Volcanos("onaction", {help: "控件交互", list: [],
+Volcanos(chat.ONACTION, {help: "控件交互",
+ scanQRCode0: function(event, can) { can.user.agent.scanQRCode() },
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()
+ can.runAction(can.request(event, data), data.action||button [], function(msg) {
+ can.user.toastSuccess(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 12b5a454..2500584d 100644
--- a/core/chat/search.go
+++ b/core/chat/search.go
@@ -11,7 +11,7 @@ const SEARCH = "search"
func init() {
Index.MergeCommands(ice.Commands{
- web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(mdb.SHORT, mdb.NAME), Hand: func(m *ice.Message, arg ...string) {
+ web.P(SEARCH): {Name: "/search", Help: "搜索引擎", Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.Space(m, m.Option(ice.POD)), mdb.SEARCH, arg).StatusTimeCount()
}},
})
diff --git a/core/chat/sso.go b/core/chat/sso.go
index d4d8bcc1..5142673d 100644
--- a/core/chat/sso.go
+++ b/core/chat/sso.go
@@ -13,9 +13,14 @@ const SSO = "sso"
func init() {
Index.MergeCommands(ice.Commands{
- "/sso": {Name: "/sso", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
+ "/sso": {Name: "/sso", Help: "登录", Actions: ice.Actions{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, SSO) }},
+ }, Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_USERNAME) == "" {
- web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
+ web.RenderIndex(m, ice.VOLCANOS)
+ return
+ }
+ if m.Warn(m.Option(cli.BACK) == "") {
return
}
sessid := m.Cmdx(web.SPACE, m.Option(web.SPACE), aaa.SESS, mdb.CREATE,
@@ -24,11 +29,6 @@ func init() {
aaa.USERNICK, m.Option(ice.MSG_USERNICK),
)
m.RenderRedirect(kit.MergeURL(m.Option(cli.BACK), ice.MSG_SESSID, sessid))
-
- // m.Cmdy(GRANT, mdb.INSERT, web.SPACE, m.Option(web.SPACE),
- // aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK))
- // web.RenderCookie(m, sessid, web.CookieName(m.Option("back")))
- // m.RenderRedirect(kit.MergeURL(m.Option("back")))
}},
})
}
diff --git a/core/chat/storm.go b/core/chat/storm.go
index 3a437117..8a0239b6 100644
--- a/core/chat/storm.go
+++ b/core/chat/storm.go
@@ -23,7 +23,7 @@ func init() {
}
switch arg[0] {
case mdb.HASH:
- m.Cmdy(STORM, ice.OptionFields("hash,name"))
+ m.Cmdy("", ice.OptionFields("hash,name"))
}
}},
mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
@@ -32,7 +32,7 @@ func init() {
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(mdb.HASH))
}},
- mdb.INSERT: {Name: "insert hash pod ctx cmd help", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ mdb.INSERT: {Name: "insert hash space index", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, arg[2:])
}},
mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) {
@@ -42,23 +42,6 @@ func init() {
m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, m.OptionSimple(mdb.ID), arg)
}
}},
- mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(mdb.ID) == "" {
- return
- }
- msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
- cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
- m.Cmdy(cmd, mdb.EXPORT)
- }},
- mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(mdb.ID) == "" {
- return
- }
- msg := m.Cmd(STORM, m.Option(mdb.HASH), m.Option(mdb.ID))
- cmd := kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD))
- m.Cmdy(cmd, mdb.IMPORT)
- }},
- SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }},
}, Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 { // 应用列表
m.OptionFields("time,hash,type,name,count")
@@ -67,24 +50,20 @@ func init() {
return
}
- m.OptionFields("time,id,pod,ctx,cmd,arg,display,style")
+ m.OptionFields("time,id,space,index,args,style,display")
msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1))
if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组
- msg.Push(ice.CMD, arg[1])
+ msg.Push(ctx.INDEX, arg[1])
}
if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令
- m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(ice.POD))), kit.Keys(msg.Append(ice.CTX), msg.Append(ice.CMD)), arg[3:])
+ m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:])
return
}
if m.Copy(msg); len(arg) > 1 { // 命令插件
+ m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) })
m.ProcessField(arg[0], arg[1], ice.RUN)
- m.Tables(func(value ice.Maps) {
- m.Cmdy(web.Space(m, value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD])
- })
- } else {
- m.PushAction(mdb.EXPORT, mdb.IMPORT)
}
}},
})
diff --git a/core/chat/topic.go b/core/chat/topic.go
index ffe0b66a..98978f6f 100644
--- a/core/chat/topic.go
+++ b/core/chat/topic.go
@@ -4,6 +4,7 @@ import (
"path"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
@@ -23,7 +24,10 @@ func init() {
},
}
Index.MergeCommands(ice.Commands{
- TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeAction(ice.Actions{
+ TOPIC: {Name: "topic zone id auto create insert", Help: "主题", Actions: ice.MergeActions(ice.Actions{
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ m.Cmd(aaa.ROLE, aaa.WHITE, TOPIC)
+ }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch arg[0] {
case "tags":
diff --git a/core/chat/trans.go b/core/chat/trans.go
index b822f942..ed39b119 100644
--- a/core/chat/trans.go
+++ b/core/chat/trans.go
@@ -12,23 +12,21 @@ import (
kit "shylinux.com/x/toolkits"
)
-const (
- SEND = "send"
- FROM = "from"
- TO = "to"
-)
-
func init() {
+ const (
+ SEND = "send"
+ FROM = "from"
+ TO = "to"
+ )
Index.MergeCommands(ice.Commands{
- TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeAction(ice.Actions{
+ TRANS: {Name: "trans from to auto", Help: "传输", Actions: ice.MergeActions(ice.Actions{
SEND: {Name: "send", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPACE, m.Option(TO), web.SPIDE, ice.DEV, web.SPIDE_SAVE, kit.Select(nfs.PWD, m.Option("to_path")),
web.MergeURL2(m, path.Join(web.SHARE_LOCAL, m.Option("from_path")), ice.POD, m.Option(FROM),
web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN),
),
- )
- web.Toast(m, ice.SUCCESS, SEND)
- m.ProcessHold()
+ ).ProcessHold()
+ web.ToastSuccess(m, SEND)
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.POD, m.Option("_pod"))
diff --git a/core/chat/website.go b/core/chat/website.go
index 6dfb6b85..bd8075ba 100644
--- a/core/chat/website.go
+++ b/core/chat/website.go
@@ -7,6 +7,7 @@ import (
"strings"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/lex"
"shylinux.com/x/icebergs/base/mdb"
@@ -16,7 +17,7 @@ import (
)
func _website_url(m *ice.Message, file string) string {
- return strings.Split(web.MergeWebsite(m, file), "?")[0]
+ return strings.Split(MergeWebsite(m, file), "?")[0]
}
func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) {
if text == "" {
@@ -120,6 +121,7 @@ func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool)
}
func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kind, text, name string) bool {
msg := m.Spawn(w, r)
+ m.Debug("what %v", kind)
switch kind {
case nfs.ZML:
web.RenderCmd(msg, "can.parse", text, name)
@@ -149,7 +151,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin
}
func _website_search(m *ice.Message, kind, name, text string, arg ...string) {
m.Cmd(m.PrefixKey(), ice.OptionFields("")).Tables(func(value ice.Maps) {
- m.PushSearch(value, mdb.TEXT, web.MergeWebsite(m, value[nfs.PATH]))
+ m.PushSearch(value, mdb.TEXT, MergeWebsite(m, value[nfs.PATH]))
})
}
@@ -160,74 +162,58 @@ const (
const WEBSITE = "website"
func init() {
- Index.MergeCommands(ice.Commands{"/website/": {Name: "/website/", Help: "网站", Actions: ctx.CmdAction()},
- WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeAction(ice.Actions{
+ Index.MergeCommands(ice.Commands{
+ WEBSITE: {Name: "website path auto create import", Help: "网站", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.TXT, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.TXT, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.IML, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.IML, m.PrefixKey())
+ m.Cmd(aaa.ROLE, aaa.WHITE, WEBSITE)
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if r.Method != http.MethodGet {
return false
}
- if ok := true; mdb.Richs(m, WEBSITE, nil, r.URL.Path, func(key string, value ice.Map) {
- value = kit.GetMeta(value)
- ok = _website_render(m, w, r, kit.Format(value[mdb.TYPE]), kit.Format(value[mdb.TEXT]), path.Base(r.URL.Path))
- }) != nil && ok {
- return true
- }
if strings.HasPrefix(r.URL.Path, CHAT_WEBSITE) {
_website_render(m, w, r, kit.Ext(r.URL.Path), m.Cmdx(nfs.CAT, strings.Replace(r.URL.Path, CHAT_WEBSITE, SRC_WEBSITE, 1)), path.Base(r.URL.Path))
return true
}
+ if m.Cmd(WEBSITE, r.URL.Path, func(value ice.Maps) {
+ _website_render(m, w, r, value[mdb.TYPE], value[mdb.TEXT], path.Base(r.URL.Path))
+ }).Length() > 0 {
+ return true
+ }
return false
})
}},
lex.PARSE: {Hand: func(m *ice.Message, arg ...string) {
switch kit.Ext(arg[0]) {
- case nfs.ZML:
+ case nfs.ZML: // 前端解析
web.RenderCmd(m, "can.parse", m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])))
- case nfs.IML:
+ case nfs.IML: // 文件解析
if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, arg[0])), arg[1:]...); ok {
m.Echo(_website_template2, kit.Format(res))
}
- default:
- if text := m.Cmd(m.PrefixKey(), ice.PS+arg[0]).Append(mdb.TEXT); text != "" {
+ default: // 缓存解析
+ if text := m.CmdAppend("", path.Join(ice.PS, arg[0]), mdb.TEXT); text != "" {
if res, ok := _website_parse(m, text, arg[1:]...); ok {
m.Echo(_website_template2, kit.Format(res))
}
}
}
}},
- mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
- if arg[0] == mdb.FOREACH && arg[1] == "" {
- _website_search(m, arg[0], arg[1], kit.Select("", arg, 2))
- }
- }},
- mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
- m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
- }},
- mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
- if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
- m.Echo(kit.Formats(res))
- ctx.DisplayStoryJSON(m)
- } else {
- m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
- }
- }},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(ctx.ACTION) {
case mdb.CREATE:
- m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
- default:
- switch arg[0] {
- case nfs.PATH:
- m.Cmdy(nfs.DIR, arg[1:]).ProcessAgain()
- }
+ mdb.HashInputs(m, arg)
+ return
+ }
+ switch arg[0] {
+ case nfs.PATH:
+ m.Cmdy(nfs.DIR, arg[1:]).ProcessAgain()
}
}},
mdb.CREATE: {Name: "create path type=iml,zml,json,js,html name text", Help: "创建"},
@@ -235,14 +221,24 @@ func init() {
m.Cmd(nfs.DIR, kit.Dict(nfs.DIR_ROOT, m.Option(nfs.PATH)), func(p string) {
switch name := strings.TrimPrefix(p, m.Option(nfs.PATH)); kit.Ext(p) {
case nfs.HTML, nfs.JS, nfs.JSON, nfs.ZML, nfs.IML, nfs.TXT:
- m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
+ m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, m.Cmdx(nfs.CAT, p))
default:
- m.Cmd(m.PrefixKey(), mdb.CREATE, nfs.PATH, ice.PS+name, mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
+ m.Cmd("", mdb.CREATE, nfs.PATH, path.Join(ice.PS, name), mdb.TYPE, kit.Ext(p), mdb.NAME, name, mdb.TEXT, p)
}
})
}},
- }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
- mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergeWebsite(m, value[nfs.PATH])) })
+ mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
+ m.EchoIFrame(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
+ }},
+ mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) {
+ if res, ok := _website_parse(m, m.Cmdx(nfs.CAT, path.Join(arg[2], arg[1]))); ok {
+ ctx.DisplayStoryJSON(m.Echo(kit.Formats(res)))
+ } else {
+ m.Echo(_website_url(m, strings.TrimPrefix(path.Join(arg[2], arg[1]), SRC_WEBSITE)))
+ }
+ }},
+ }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text"), ctx.CmdAction(), web.ApiAction("/website/")), Hand: func(m *ice.Message, arg ...string) {
+ mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(MergeWebsite(m, value[nfs.PATH])) })
if len(arg) == 0 { // 文件列表
m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) {
m.Push("", kit.Dict(
@@ -253,13 +249,14 @@ func init() {
m.PushAnchor(web.MergeURL2(m, path.Join(CHAT_WEBSITE, strings.TrimPrefix(p, SRC_WEBSITE))))
}).Sort(nfs.PATH)
}
- if m.Length() == 0 && len(arg) > 0 { // 文件详情
- m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, path.Join(SRC_WEBSITE, path.Join(arg...))))
+ p := path.Join(SRC_WEBSITE, path.Join(arg...))
+ if m.Length() == 0 && len(arg) > 0 && !strings.HasSuffix(arg[0], ice.PS) && nfs.ExistsFile(m, p) { // 文件详情
+ m.Push(mdb.TYPE, kit.Ext(p))
+ m.Push(mdb.TEXT, m.Cmdx(nfs.CAT, p))
m.Push(nfs.PATH, path.Join(CHAT_WEBSITE, path.Join(arg...)))
m.PushAnchor(web.MergeLink(m, m.Append(nfs.PATH)))
}
-
- if len(arg) > 0 { // 文件预览
+ if m.Length() > 0 && len(arg) > 0 { // 文件预览
m.PushQRCode(mdb.SCAN, web.MergeURL2(m, m.Append(nfs.PATH)))
m.EchoIFrame(m.Append(nfs.PATH))
}
diff --git a/core/code/autogen.go b/core/code/autogen.go
index 7ea67d16..2826a633 100644
--- a/core/code/autogen.go
+++ b/core/code/autogen.go
@@ -9,34 +9,23 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh"
- "shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
)
-func _defs(m *ice.Message, args ...string) string {
- for i := 0; i < len(args); i += 2 {
- if m.Option(args[i]) == "" {
- m.Option(args[i], args[i+1])
- }
- }
- return m.Option(args[0])
-}
func _defs_list(m *ice.Message) string {
list := []string{mdb.LIST}
switch m.Option(mdb.TYPE) {
- case "Hash":
- list = append(list, "hash auto create")
case "Zone":
list = append(list, "zone id auto insert")
- case "Lists":
- list = append(list, "id auto insert")
+ case "Hash":
+ list = append(list, "hash auto create")
case "Data":
list = append(list, "path auto")
case "Code":
list = append(list, "port path auto start order build download")
}
- return _defs(m, mdb.LIST, kit.Join(list, ice.SP))
+ return m.OptionDefault(mdb.LIST, kit.Join(list, ice.SP))
}
func _autogen_module(m *ice.Message, dir string) {
m.Cmd(nfs.DEFS, dir, `package {{.Option "zone"}}
@@ -97,7 +86,7 @@ func _autogen_source(m *ice.Message, main, file string) {
m.Cmd(nfs.PUSH, main, ice.NL, "source "+strings.TrimPrefix(file, ice.SRC+ice.PS))
}
func _autogen_mod(m *ice.Message, file string) (mod string) {
- host := kit.ParseURLMap(m.Option(ice.MSG_USERWEB))[tcp.HOSTNAME]
+ host := web.OptionUserWeb(m).Hostname()
if host == "" {
host = path.Base(kit.Path(""))
} else {
@@ -134,7 +123,7 @@ func _autogen_gits(m *ice.Message, arg ...string) string {
return kit.Join(res, ice.NL)
}
func _autogen_version(m *ice.Message) {
- if mod := _autogen_mod(m, ice.GO_MOD); !kit.FileExists(".git") {
+ if mod := _autogen_mod(m, ice.GO_MOD); !nfs.ExistsFile(m, ".git") {
m.Cmdy(cli.SYSTEM, GIT, ice.INIT)
m.Cmd(cli.SYSTEM, GIT, "remote", "add", "origin", "https://"+mod)
m.Cmd("web.code.git.repos", mdb.CREATE, "repos", "https://"+mod, mdb.NAME, path.Base(mod), nfs.PATH, nfs.PWD)
@@ -182,17 +171,17 @@ func init() {
m.Cmdy(nfs.DIR, nfs.PWD, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go`)).RenameAppend(nfs.PATH, arg[0])
}
}},
- mdb.CREATE: {Name: "create name=hi help type=Hash,Zone,Lists,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
- _defs(m, mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
- _defs(m, mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
+ mdb.CREATE: {Name: "create name=hi help type=Zone,Hash,Data,Code main=main.go@key zone key", Help: "模块", Hand: func(m *ice.Message, arg ...string) {
+ m.OptionDefault(mdb.ZONE, m.Option(mdb.NAME), mdb.HELP, m.Option(mdb.NAME))
+ m.OptionDefault(mdb.KEY, kit.Keys("web.code", m.Option(mdb.ZONE), m.Option(mdb.NAME)))
m.Option(mdb.TEXT, kit.Format("`name:\"%s\" help:\"%s\"`", _defs_list(m), m.Option(mdb.HELP)))
nfs.OptionFiles(m, nfs.DiskFile)
- if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !kit.FileExists(p) {
+ if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), GO)); !nfs.ExistsFile(m, p) {
_autogen_module(m, p)
_autogen_import(m, path.Join(ice.SRC, m.Option(cli.MAIN)), m.Option(mdb.ZONE), _autogen_mod(m, ice.GO_MOD))
}
- if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !kit.FileExists(p) {
+ if p := path.Join(ice.SRC, m.Option(mdb.ZONE), kit.Keys(m.Option(mdb.NAME), SHY)); !nfs.ExistsFile(m, p) {
_autogen_script(m, p)
_autogen_source(m, path.Join(ice.SRC, m.Option(cli.MAIN)), p)
}
@@ -200,7 +189,7 @@ func init() {
_autogen_version(m.Spawn())
}},
ssh.SCRIPT: {Name: "script", Help: "脚本:生成 etc/miss.sh", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym("miss")))
+ m.Cmd(nfs.DEFS, ice.ETC_MISS_SH, m.Conf(web.DREAM, kit.Keym(nfs.SCRIPT)))
defer m.Cmdy(nfs.CAT, ice.ETC_MISS_SH)
m.Cmdy(nfs.DIR, ice.ETC_MISS_SH)
@@ -212,7 +201,7 @@ func init() {
}},
BINPACK: {Name: "binpack", Help: "打包:生成 src/binpack.go", Hand: func(m *ice.Message, arg ...string) {
_autogen_version(m)
- if m.Cmd(BINPACK, mdb.CREATE); kit.FileExists(ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
+ if m.Cmd(BINPACK, mdb.CREATE); nfs.ExistsFile(m, ice.USR_RELEASE) && m.Option(ice.MSG_USERPOD) == "" {
m.Cmd(nfs.COPY, path.Join(ice.USR_RELEASE, "conf.go"), path.Join(ice.USR_ICEBERGS, "conf.go"))
m.Cmd(cli.SYSTEM, "sh", "-c", `cat src/binpack.go|sed 's/package main/package ice/g' > usr/release/binpack.go`)
m.Cmdy(nfs.DIR, "usr/release/binpack.go")
diff --git a/core/code/bench.go b/core/code/bench.go
index ca6da038..016e4546 100644
--- a/core/code/bench.go
+++ b/core/code/bench.go
@@ -4,12 +4,12 @@ import (
"io"
"io/ioutil"
"net/http"
- "os"
"strings"
"sync/atomic"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
+ "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
"shylinux.com/x/toolkits/util/bench"
)
@@ -23,7 +23,7 @@ func _bench_http(m *ice.Message, target string, arg ...string) {
for _, v := range strings.Split(target, ice.NL) {
switch ls := kit.Split(v); ls[0] {
case http.MethodPost: // POST,url,file
- if f, e := os.Open(ls[2]); m.Assert(e) {
+ if f, e := nfs.OpenFile(m, ls[2]); m.Assert(e) {
defer f.Close()
if req, err := http.NewRequest(http.MethodPost, ls[1], f); m.Assert(err) {
@@ -62,7 +62,7 @@ const BENCH = "bench"
func init() {
Index.MergeCommands(ice.Commands{
- BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeAction(ice.Actions{
+ BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=some type=http,redis name=demo text='http://localhost:9020' nconn=3 nreqs=10", Help: "添加"},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
switch m.Option(mdb.TYPE) {
diff --git a/core/code/binpack.go b/core/code/binpack.go
index 5406c43b..8e1a7b77 100644
--- a/core/code/binpack.go
+++ b/core/code/binpack.go
@@ -3,8 +3,8 @@ package code
import (
"encoding/base64"
"fmt"
+ "io"
"io/ioutil"
- "os"
"path"
"strings"
@@ -14,72 +14,59 @@ import (
kit "shylinux.com/x/toolkits"
)
-func _binpack_file(m *ice.Message, arg ...string) string { // file name
- if f, e := os.Open(arg[0]); e == nil {
+func _binpack_file(m *ice.Message, w io.Writer, arg ...string) { // file name
+ if f, e := nfs.OpenFile(m, arg[0]); e == nil {
defer f.Close()
if b, e := ioutil.ReadAll(f); e == nil && len(b) > 0 {
- return fmt.Sprintf(" \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
+ fmt.Fprintf(w, " \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), base64.StdEncoding.EncodeToString(b))
+ return
}
}
- return fmt.Sprintf(" // \"%s\": \"%s\",", kit.Select(arg[0], arg, 1), "")
+ fmt.Fprintf(w, " // \"%s\": \"%s\",\n", kit.Select(arg[0], arg, 1), "")
}
-func _binpack_dir(m *ice.Message, f *os.File, dir string) {
+func _binpack_dir(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Cmd(nfs.DIR, nfs.PWD).Sort(nfs.PATH).Tables(func(value ice.Maps) {
switch path.Base(value[nfs.PATH]) {
- case "go.mod", "go.sum", "binpack.go", "version.go":
+ case ice.GO_MOD, ice.GO_SUM, "binpack.go", "version.go":
return
}
switch strings.Split(value[nfs.PATH], ice.PS)[0] {
- case "var", "polaris", "website":
+ case ice.BIN, ice.VAR, "website", "polaris":
return
}
- fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH])))
+ _binpack_file(m, w, path.Join(dir, value[nfs.PATH]))
})
- fmt.Fprintln(f)
+ fmt.Fprintln(w)
}
-func _binpack_can(m *ice.Message, f *os.File, dir string) {
+func _binpack_can(m *ice.Message, w io.Writer, dir string) {
m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
for _, k := range []string{ice.FAVICON, ice.PROTO_JS, ice.FRAME_JS} {
- // fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), ice.PS+k))
- fmt.Fprintln(f, _binpack_file(m, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k)))
+ _binpack_file(m, w, path.Join(dir, k), path.Join(ice.USR_VOLCANOS, k))
}
for _, k := range []string{LIB, PAGE, PANEL, PLUGIN, "publish/client/nodejs/"} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
- // fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), ice.PS+value[nfs.PATH]))
- fmt.Fprintln(f, _binpack_file(m, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH])))
+ _binpack_file(m, w, path.Join(dir, value[nfs.PATH]), path.Join(ice.USR_VOLCANOS, value[nfs.PATH]))
})
}
- fmt.Fprintln(f)
+ fmt.Fprintln(w)
}
-func _binpack_ctx(m *ice.Message, f *os.File) {
- _binpack_dir(m, f, ice.SRC)
+func _binpack_ctx(m *ice.Message, w io.Writer) {
+ _binpack_dir(m, w, ice.SRC)
}
+func _binpack_all(m *ice.Message) {
+ if w, p, e := nfs.CreateFile(m, ice.SRC_BINPACK_GO); m.Assert(e) {
+ defer w.Close()
+ defer m.Echo(p)
-const BINPACK = "binpack"
-
-func init() {
- Index.MergeCommands(ice.Commands{
- BINPACK: {Name: "binpack path auto create remove export", Help: "打包", Actions: ice.MergeAction(ice.Actions{
- ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- if kit.FileExists(path.Join(ice.USR_VOLCANOS, ice.PROTO_JS)) {
- m.Cmd(BINPACK, mdb.REMOVE)
- return
- }
- }},
- mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- if f, p, e := kit.Create(ice.SRC_BINPACK_GO); m.Assert(e) {
- defer f.Close()
- defer m.Echo(p)
-
- fmt.Fprintln(f, `package main
+ fmt.Fprintln(w, `package main
import (
"encoding/base64"
@@ -89,9 +76,9 @@ import (
func init() {
`)
- defer fmt.Fprintln(f, `}`)
+ defer fmt.Fprintln(w, `}`)
- defer fmt.Fprintln(f, `
+ defer fmt.Fprintln(w, `
for k, v := range pack {
if b, e := base64.StdEncoding.DecodeString(v); e == nil {
nfs.PackFile.WriteFile(k, b)
@@ -99,40 +86,50 @@ func init() {
}
`)
- fmt.Fprintln(f, ` pack := ice.Maps{`)
- defer fmt.Fprintln(f, ` }`)
+ fmt.Fprintln(w, ` pack := ice.Maps{`)
+ defer fmt.Fprintln(w, ` }`)
- if kit.FileExists(ice.USR_VOLCANOS) && kit.FileExists(ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
- _binpack_can(m, f, ice.USR_VOLCANOS)
- _binpack_dir(m, f, ice.USR_INTSHELL)
- }
- _binpack_ctx(m, f)
+ if nfs.ExistsFile(m, ice.USR_VOLCANOS) && nfs.ExistsFile(m, ice.USR_INTSHELL) && m.Option(ice.MSG_USERPOD) == "" {
+ _binpack_can(m, w, ice.USR_VOLCANOS)
+ _binpack_dir(m, w, ice.USR_INTSHELL)
+ }
+ _binpack_ctx(m, w)
- fmt.Fprintln(f, _binpack_file(m, ice.ETC_MISS_SH))
- fmt.Fprintln(f, _binpack_file(m, ice.ETC_INIT_SHY))
- fmt.Fprintln(f, _binpack_file(m, ice.ETC_EXIT_SHY))
- fmt.Fprintln(f)
+ _binpack_file(m, w, ice.ETC_MISS_SH)
+ _binpack_file(m, w, ice.ETC_INIT_SHY)
+ _binpack_file(m, w, ice.ETC_EXIT_SHY)
+ fmt.Fprintln(w)
- fmt.Fprintln(f, _binpack_file(m, ice.LICENSE))
- fmt.Fprintln(f, _binpack_file(m, ice.MAKEFILE))
- fmt.Fprintln(f, _binpack_file(m, ice.README_MD))
- fmt.Fprintln(f)
+ _binpack_file(m, w, ice.LICENSE)
+ _binpack_file(m, w, ice.MAKEFILE)
+ _binpack_file(m, w, ice.README_MD)
+ fmt.Fprintln(w)
- m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Tables(func(value ice.Maps) {
- if s, e := os.Stat(value[nfs.PATH]); e == nil {
- if s.IsDir() {
- _binpack_dir(m, f, value[nfs.PATH])
- } else {
- fmt.Fprintln(f, _binpack_file(m, value[nfs.PATH]))
- }
- }
- })
+ mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
+ if s, e := nfs.StatFile(m, value[nfs.PATH]); e == nil {
+ if s.IsDir() {
+ _binpack_dir(m, w, value[nfs.PATH])
+ } else {
+ _binpack_file(m, w, value[nfs.PATH])
}
+ }
+ })
+ }
+}
+
+const BINPACK = "binpack"
+
+func init() {
+ Index.MergeCommands(ice.Commands{
+ BINPACK: {Name: "binpack path auto create insert", Help: "打包", Actions: ice.MergeActions(ice.Actions{
+ mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
+ _binpack_all(m)
}},
- mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
+ mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
}},
}, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
+ mdb.HashSelect(m)
}},
})
}
diff --git a/core/code/c.go b/core/code/c.go
index a0bd76e8..19c99e82 100644
--- a/core/code/c.go
+++ b/core/code/c.go
@@ -49,7 +49,7 @@ const C = "c"
func init() {
Index.Register(&ice.Context{Name: C, Help: "系统", Commands: ice.Commands{
- C: {Name: C, Help: "系统", Actions: ice.MergeAction(ice.Actions{
+ C: {Name: C, Help: "系统", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{H, C, CC} {
@@ -79,7 +79,7 @@ func init() {
// _go_grep(m, kit.Select(cli.MAIN, arg, 1), arg[2])
}},
}, PlugAction())},
- MAN: {Name: MAN, Help: "手册", Actions: ice.MergeAction(ice.Actions{
+ MAN: {Name: MAN, Help: "手册", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.RENDER, mdb.PLUGIN} {
for _, k := range []string{MAN1, MAN2, MAN3, MAN8} {
diff --git a/core/code/case.go b/core/code/case.go
index 1717ae2e..b96a084f 100644
--- a/core/code/case.go
+++ b/core/code/case.go
@@ -16,7 +16,7 @@ const CASE = "case"
func init() {
Index.MergeCommands(ice.Commands{
- CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeAction(ice.Actions{
+ CASE: {Name: "case dev zone id auto", Help: "用例", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name address", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(web.SPIDE, mdb.CREATE, arg)
}},
diff --git a/core/code/code.go b/core/code/code.go
index 447e6078..f8b34152 100644
--- a/core/code/code.go
+++ b/core/code/code.go
@@ -11,8 +11,8 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心"}
func init() {
web.Index.Register(Index, &web.Frame{},
- WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE, INSTALL,
- INNER, VIMER, FAVOR, BENCH, PPROF,
+ INSTALL, WEBPACK, BINPACK, AUTOGEN, COMPILE, PUBLISH, UPGRADE,
+ XTERM, VIMER, INNER, FAVOR, BENCH, PPROF,
C, SH, SHY, GO, JS,
)
}
diff --git a/core/code/code.shy b/core/code/code.shy
index 1a0650c9..a54b733a 100644
--- a/core/code/code.shy
+++ b/core/code/code.shy
@@ -1,27 +1,33 @@
chapter "源码"
+code.go
+code.shy
+
+install.go
webpack.go
binpack.go
autogen.go
compile.go
publish.go
upgrade.go
-install.go
-favor.go
-inner.go
+xterm.shy
+xterm.go
vimer.go
+inner.go
+favor.go
bench.go
pprof.go
-case.go
+oauth.go
c.go
sh.go
+shy.go
go.go
js.go
-shy.go
+py.go
+zml.go
-code.go
-code.shy
-sess.go
template.go
+case.go
+
diff --git a/core/code/compile.go b/core/code/compile.go
index d65b3b3f..8d53902d 100644
--- a/core/code/compile.go
+++ b/core/code/compile.go
@@ -47,22 +47,10 @@ func init() {
cli.ENV, kit.Dict("GOPROXY", "https://goproxy.cn,direct", "GOPRIVATE", "shylinux.com,github.com", "CGO_ENABLED", "0"),
)},
}, Commands: ice.Commands{
- COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay install", Help: "编译", Actions: ice.Actions{
+ COMPILE: {Name: "compile arch=amd64,386,arm,arm64,mipsle os=linux,darwin,windows src=src/main.go@key run binpack relay", Help: "编译", Actions: ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, ice.SRC, nfs.DIR_CLI_FIELDS, kit.Dict(nfs.DIR_REG, `.*\.go$`)).Sort(nfs.PATH)
}},
- INSTALL: {Name: "compile", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
- if cli.IsAlpine(m) {
- web.PushStream(m)
- m.Cmd(cli.SYSTEM, "apk", "add", GIT, GO)
- return
- }
- if m.Cmdx(cli.SYSTEM, nfs.FIND, GIT) == "" {
- web.Toast(m, "please install git")
- m.Echo(ice.FALSE)
- return
- }
- }},
BINPACK: {Name: "binpack", Help: "打包", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(AUTOGEN, BINPACK)
}},
diff --git a/core/code/favor.go b/core/code/favor.go
index 55895e8c..2e7010a1 100644
--- a/core/code/favor.go
+++ b/core/code/favor.go
@@ -4,7 +4,6 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
- "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
)
@@ -12,22 +11,11 @@ const FAVOR = "favor"
func init() {
Index.MergeCommands(ice.Commands{
- FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
+ FAVOR: {Name: "favor zone id auto insert test page", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=数据结构 type=go name=hi text=hello path file line", Help: "添加"},
INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
ctx.ProcessCommand(m, INNER, m.OptionSplit("path,file,line"), arg...)
}},
- "test": {Name: "test zone=hi count=10", Help: "测试", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
- for i := 0; i < kit.Int(m.Option(mdb.COUNT)); i++ {
- m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, m.Option(mdb.ZONE), mdb.NAME, i)
- }
- m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LIMIT)), 20)
- m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.LEAST)), 10)
- m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, kit.Hashs(m.Option(mdb.ZONE)), kit.Keym(mdb.FSIZE)), 500)
- m.Cmdy(nfs.DIR, "var/data/", kit.Dict(nfs.DIR_DEEP, true))
- m.Echo(kit.Formats(m.Confv(m.PrefixKey())))
- }},
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line")), Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelectPage(m, arg...).PushAction(kit.Select(mdb.REMOVE, INNER, len(arg) > 0))
}},
diff --git a/core/code/go.go b/core/code/go.go
index 1187816c..394a7f19 100644
--- a/core/code/go.go
+++ b/core/code/go.go
@@ -242,20 +242,20 @@ func init() {
m.Cmd(mdb.PLUGIN, mdb.CREATE, k, m.Prefix(k))
}
}},
- GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeAction(ice.Actions{
+ GODOC: {Name: "godoc", Help: "文档", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], ice.PT+arg[0]), kit.Dict(cli.CMD_DIR, arg[2])).SetAppend()
}},
}, PlugAction())},
- SUM: {Name: "sum", Help: "版本", Actions: ice.MergeAction(ice.Actions{
+ SUM: {Name: "sum", Help: "版本", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _sum_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())},
- MOD: {Name: "mod", Help: "模块", Actions: ice.MergeAction(ice.Actions{
+ MOD: {Name: "mod", Help: "模块", Actions: ice.MergeActions(ice.Actions{
mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { _mod_show(m, path.Join(arg[2], arg[1])) }},
}, PlugAction())},
- GO: {Name: "go", Help: "后端", Actions: ice.MergeAction(ice.Actions{
+ GO: {Name: "go", Help: "后端", Actions: ice.MergeActions(ice.Actions{
mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) {
if arg[0] == GO {
_go_tags(m, kit.Select(cli.MAIN, arg, 1))
diff --git a/core/code/inner.go b/core/code/inner.go
index b2755806..4edce377 100644
--- a/core/code/inner.go
+++ b/core/code/inner.go
@@ -100,7 +100,7 @@ const INNER = "inner"
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
- INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
+ INNER: {Name: "inner path=src/@key file=main.go line=1 auto", Help: "源代码", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
mdb.PLUGIN: {Name: "plugin", Help: "插件", Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(mdb.PLUGIN, arg); m.Result() == "" {
m.Echo(kit.Select("{}", m.Config(kit.Keys(PLUG, arg[0]))))
diff --git a/core/code/install.go b/core/code/install.go
index e0e0399a..9f9ae2f0 100644
--- a/core/code/install.go
+++ b/core/code/install.go
@@ -13,18 +13,17 @@ import (
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
kit "shylinux.com/x/toolkits"
- "shylinux.com/x/toolkits/file"
)
func _install_path(m *ice.Message, link string) string {
link = kit.Select(m.Option(mdb.LINK), link)
- if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); kit.FileExists(p) {
+ if p := path.Join(ice.USR_INSTALL, kit.TrimExt(link)); nfs.ExistsFile(m, p) {
return p
}
- if p := path.Join(ice.USR_INSTALL, path.Base(link)); kit.FileExists(p) {
+ if p := path.Join(ice.USR_INSTALL, path.Base(link)); nfs.ExistsFile(m, p) {
return path.Join(ice.USR_INSTALL, strings.Split(m.Cmdx(cli.SYSTEM, "sh", "-c", kit.Format("tar tf %s| head -n1", p), ice.Option{cli.CMD_OUTPUT, ""}), ice.PS)[0])
}
- m.ErrorNotImplement(link)
+ m.Warn(true, ice.ErrNotFound, link)
return ""
}
func _install_download(m *ice.Message) {
@@ -32,34 +31,29 @@ func _install_download(m *ice.Message) {
name := path.Base(strings.Split(link, "?")[0])
file := path.Join(kit.Select(ice.USR_INSTALL, m.Option(nfs.PATH)), name)
- defer m.Cmdy(nfs.DIR, file)
- if kit.FileExists(file) {
+ if nfs.ExistsFile(m, file) {
+ web.ToastSuccess(m)
+ m.Cmdy(nfs.DIR, file)
return // 文件存在
}
- // 创建文件
m.Cmd(nfs.SAVE, file, "")
web.GoToast(m, web.DOWNLOAD, func(toast func(string, int, int)) {
- m.Cmd(mdb.INSERT, INSTALL, "", mdb.HASH, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
- defer web.ToastSuccess(m)
-
- // 下载进度
- mdb.Richs(m, INSTALL, "", name, func(key string, value ice.Map) {
- value = kit.GetMeta(value)
- m.OptionCB(web.SPIDE, func(count int, total int, step int) {
+ mdb.HashCreate(m, mdb.NAME, name, nfs.PATH, file, mdb.LINK, link)
+ m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link, func(count int, total int, step int) {
+ mdb.HashSelectUpdate(m, name, func(value ice.Map) {
value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, step
- toast(name, count, total)
})
+ toast(name, count, total)
})
-
- // 下载解压
- m.Cmd("web.spide", ice.DEV, web.SPIDE_SAVE, file, web.SPIDE_GET, link)
m.Cmd(nfs.TAR, mdb.EXPORT, name, kit.Dict(cli.CMD_DIR, path.Dir(file)))
+ web.PushNoticeRefresh(m)
+ web.ToastSuccess(m)
})
}
func _install_build(m *ice.Message, arg ...string) string {
p := m.Option(cli.CMD_DIR, _install_path(m, ""))
- pp := kit.Path(path.Join(p, "_install"))
+ pp := kit.Path(path.Join(p, _INSTALL))
// 推流
web.PushStream(m)
@@ -91,7 +85,7 @@ func _install_order(m *ice.Message, arg ...string) {
}
func _install_spawn(m *ice.Message, arg ...string) {
if kit.Int(m.Option(tcp.PORT)) >= 10000 {
- if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); kit.FileExists(p) {
+ if p := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT)); nfs.ExistsFile(m, p) {
m.Echo(p)
return
}
@@ -101,13 +95,13 @@ func _install_spawn(m *ice.Message, arg ...string) {
target := path.Join(ice.USR_LOCAL_DAEMON, m.Option(tcp.PORT))
source := _install_path(m, "")
- file.MkdirAll(target, ice.MOD_DIR)
+ nfs.MkdirAll(m, target)
defer m.Echo(target)
- if m.Option(INSTALL) == "" && kit.FileExists(kit.Path(source, "_install")) {
- m.Option(INSTALL, "_install")
+ if m.Option(INSTALL) == "" && nfs.ExistsFile(m, kit.Path(source, _INSTALL)) {
+ m.Option(INSTALL, _INSTALL)
}
- m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL))).Tables(func(value ice.Maps) {
+ m.Cmd(nfs.DIR, path.Join(source, m.Option(INSTALL)), func(value ice.Maps) {
m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[nfs.PATH], ice.PS), target+ice.PS)
})
}
@@ -120,6 +114,7 @@ func _install_start(m *ice.Message, arg ...string) {
args = append(args, cb(p)...)
case func(string):
cb(p)
+ case nil:
default:
m.ErrorNotImplement(cb)
}
@@ -129,7 +124,7 @@ func _install_start(m *ice.Message, arg ...string) {
}
}
func _install_stop(m *ice.Message, arg ...string) {
- m.Cmd(cli.DAEMON).Tables(func(value ice.Maps) {
+ m.Cmd(cli.DAEMON, func(value ice.Maps) {
if value[cli.PID] == m.Option(cli.PID) {
m.Cmd(cli.DAEMON, cli.STOP, kit.Dict(mdb.HASH, value[mdb.HASH]))
}
@@ -139,7 +134,7 @@ func _install_stop(m *ice.Message, arg ...string) {
func _install_service(m *ice.Message, arg ...string) {
arg = kit.Split(path.Base(arg[0]), "-.")[:1]
m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir")
- m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Tables(func(value ice.Maps) {
+ m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH, func(value ice.Maps) {
if strings.Contains(value[ice.CMD], path.Join(ice.BIN, arg[0])) {
m.Push("", value, kit.Split(m.OptionFields()))
}
@@ -149,23 +144,17 @@ func _install_service(m *ice.Message, arg ...string) {
}
const (
- PREPARE = "prepare"
+ PREPARE = "prepare"
+ _INSTALL = "_install"
)
const INSTALL = "install"
func init() {
Index.MergeCommands(ice.Commands{
- INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeAction(ice.Actions{
+ INSTALL: {Name: "install name port path auto download", Help: "安装", Meta: kit.Dict(), Actions: ice.MergeActions(ice.Actions{
web.DOWNLOAD: {Name: "download link path", Help: "下载", Hand: func(m *ice.Message, arg ...string) {
_install_download(m)
}},
- nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
- if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), "_install")); !kit.FileExists(m.Option(nfs.DIR_ROOT)) {
- m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
- }
- defer m.StatusTime(nfs.PATH, m.Option(nfs.DIR_ROOT))
- m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
- }},
cli.BUILD: {Name: "build link", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
if err := _install_build(m, arg...); err != "" {
web.ToastFailure(m, cli.BUILD)
@@ -186,7 +175,14 @@ func init() {
cli.STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) {
_install_stop(m, arg...)
}},
- }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link", nfs.PATH, ice.USR_INSTALL)), Hand: func(m *ice.Message, arg ...string) {
+ nfs.SOURCE: {Name: "source link path", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
+ if m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, ""), _INSTALL)); !nfs.ExistsFile(m, m.Option(nfs.DIR_ROOT)) {
+ m.Option(nfs.DIR_ROOT, path.Join(_install_path(m, "")))
+ }
+ m.Cmdy(nfs.DIR, m.Option(nfs.PATH))
+ m.StatusTimeCount(nfs.PATH, m.Option(nfs.DIR_ROOT))
+ }},
+ }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,name,path,link")), Hand: func(m *ice.Message, arg ...string) {
switch len(arg) {
case 0: // 源码列表
mdb.HashSelect(m, arg...)
@@ -211,23 +207,10 @@ func InstallAction(args ...ice.Any) ice.Actions {
m.Cmdy(INSTALL, cli.BUILD, m.Config(nfs.SOURCE))
}},
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), "_install/bin")
+ m.Cmdy(INSTALL, cli.ORDER, m.Config(nfs.SOURCE), path.Join(_INSTALL, ice.BIN))
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
}},
}
}
-func InstallSoftware(m *ice.Message, bin string, list ice.Any) (ok bool) {
- if cli.SystemFind(m, bin) != "" {
- return true
- }
- kit.Fetch(list, func(index int, value ice.Map) {
- if strings.Contains(m.Cmdx(cli.RUNTIME, kit.Keys(tcp.HOST, cli.OSID)), kit.Format(value[cli.OSID])) {
- web.PushStream(m)
- m.Cmd(cli.SYSTEM, value[ice.CMD])
- ok = true
- }
- })
- return ok
-}
diff --git a/core/code/js.go b/core/code/js.go
index 25ef5dd7..abee25a9 100644
--- a/core/code/js.go
+++ b/core/code/js.go
@@ -68,7 +68,7 @@ const NODE = "node"
func init() {
Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: ice.Commands{
- JS: {Name: "js", Help: "前端", Actions: ice.MergeAction(ice.Actions{
+ JS: {Name: "js", Help: "前端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, JSON, m.PrefixKey())
diff --git a/core/code/oauth.go b/core/code/oauth.go
index 6682378a..c14c4142 100644
--- a/core/code/oauth.go
+++ b/core/code/oauth.go
@@ -23,7 +23,7 @@ func init() {
API_GITHUB = "https://api.github.com/"
)
Index.MergeCommands(ice.Commands{
- OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeAction(ice.Actions{
+ OAUTH: {Name: "oauth hash auto", Help: "授权", Actions: ice.MergeActions(ice.Actions{
ctx.CONFIG: {Name: "config client_id client_secret redirect_uri", Help: "配置", Hand: func(m *ice.Message, arg ...string) {
for _, k := range []string{CLIENT_ID, CLIENT_SECRET, REDIRECT_URI} {
m.Config(k, kit.Select(m.Config(k), m.Option(k)))
@@ -34,31 +34,30 @@ func init() {
m.Cmdy(aaa.RSA).Cut("hash,title,public")
return
}
- m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
+ mdb.HashInputs(m, arg)
}},
mdb.CREATE: {Name: "create code", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(CODE))
+ mdb.HashCreate(m, m.OptionSimple(CODE))
}},
ACCESS_TOKEN: {Name: "access_token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON)
- data := kit.UnMarshal(m.Cmdx(web.SPIDE_POST, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE)))
- m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
+ data := web.SpidePost(m, kit.MergeURL2(LOGIN_OAUTH, ACCESS_TOKEN), m.ConfigSimple(CLIENT_ID, CLIENT_SECRET), m.OptionSimple(CODE))
+ mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(data))
}},
"public": {Name: "public hash", Help: "公钥", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
msg := m.Cmd(aaa.RSA, m.Option(mdb.HASH))
- m.PushDetail(m.Cmdx(web.SPIDE_POST, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
+ m.PushDetail(web.SpidePost(m, API_GITHUB+"user/keys", web.SPIDE_JSON, "key", msg.Append("public"), msg.AppendSimple("title")))
m.Echo("https://github.com/settings/keys")
}},
"user": {Name: "user", Help: "用户", Hand: func(m *ice.Message, arg ...string) {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Option(ACCESS_TOKEN))
- data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user"))
- m.Cmdy(mdb.MODIFY, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(mdb.HASH), kit.Simple(data))
+ mdb.HashModify(m, m.OptionSimple(mdb.HASH), kit.Simple(web.SpideGet(m, API_GITHUB+"user")))
}},
mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, m.Option(mdb.HASH))
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
- m.Cmd(web.SPIDE_DELETE, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
+ web.SpideDelete(m, API_GITHUB+"user/keys/"+m.Option(mdb.ID))
}},
}, mdb.HashAction(mdb.FIELD, "time,hash,code,access_token,scope,token_type")), Hand: func(m *ice.Message, arg ...string) {
if mdb.HashSelect(m, arg...).PushAction("user", "public", ACCESS_TOKEN, mdb.REMOVE); len(arg) == 0 {
@@ -67,17 +66,13 @@ func init() {
} else if len(arg) == 1 {
m.Option(web.SPIDE_HEADER, web.Accept, web.ContentJSON, web.Authorization, "token "+m.Append(ACCESS_TOKEN))
m.SetAppend()
- m.Debug("what %v", m.FormatMeta())
- data := kit.UnMarshal(m.Cmdx(web.SPIDE_GET, API_GITHUB+"user/keys"))
- m.Debug("what %v", data)
- kit.Fetch(data, func(index int, value ice.Map) {
+ kit.Fetch(web.SpideGet(m, API_GITHUB+"user/keys"), func(index int, value ice.Map) {
m.PushRecord(value, "created_at,title,id,key")
})
m.PushAction(mdb.DELETE)
- m.Debug("what %v", m.FormatMeta())
}
}},
- "/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeAction(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
+ "/oauth": {Name: "/oauth", Help: "授权", Actions: ice.MergeActions(ice.Actions{}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if m.Option(CODE) != "" {
web.RenderCmd(m, m.PrefixKey(), m.Cmdx(m.PrefixKey(), mdb.CREATE, m.OptionSimple(CODE)))
}
diff --git a/core/code/pprof.go b/core/code/pprof.go
index 081c2ae7..57b3078b 100644
--- a/core/code/pprof.go
+++ b/core/code/pprof.go
@@ -25,7 +25,7 @@ const PPROF = "pprof"
func init() {
Index.MergeCommands(ice.Commands{
- PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeAction(ice.Actions{
+ PPROF: {Name: "pprof zone id auto", Help: "性能分析", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
web.AddRewrite(func(w http.ResponseWriter, r *http.Request) bool {
if p := r.URL.Path; strings.HasPrefix(p, "/debug") {
@@ -41,7 +41,7 @@ func init() {
m.Cmdy(nfs.DIR, ice.BIN, nfs.DIR_CLI_FIELDS).RenameAppend(nfs.PATH, BINNARY)
case SERVICE:
m.Cmd(web.SPIDE).Tables(func(value ice.Maps) {
- m.Push(SERVICE, kit.MergeURL2(value["client.url"], "/debug/pprof/profile"))
+ m.Push(SERVICE, kit.MergeURL2(value[web.CLIENT_URL], "/debug/pprof/profile"))
})
}
}},
@@ -52,11 +52,11 @@ func init() {
cmd := kit.Simple(m.Configv(PPROF), "-text", m.Option(BINNARY), msg.Append(nfs.FILE))
m.Option(mdb.TEXT, strings.Join(kit.Slice(strings.Split(m.Cmdx(cli.SYSTEM, cmd), ice.NL), 0, 20), ice.NL))
m.Option(nfs.FILE, msg.Append(nfs.FILE))
- m.Cmd(mdb.INSERT, PPROF, "", m.OptionSimple("zone,text,file"))
+ mdb.ZoneInsert(m, m.OptionSimple("zone,text,file"))
m.Echo(m.Option(mdb.TEXT)).ProcessInner()
}},
web.SERVE: {Name: "serve", Help: "展示", Hand: func(m *ice.Message, arg ...string) {
- u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
+ u := web.OptionUserWeb(m)
p := u.Hostname() + ":" + m.Cmdx(tcp.PORT, aaa.RIGHT)
m.Cmd(cli.DAEMON, m.Configv(PPROF), "-http="+p, m.Option(BINNARY), m.Option(nfs.FILE))
m.Echo("http://%s/ui/top", p).ProcessInner()
diff --git a/core/code/publish.go b/core/code/publish.go
index 245573b9..3bd946d0 100644
--- a/core/code/publish.go
+++ b/core/code/publish.go
@@ -13,7 +13,6 @@ import (
"shylinux.com/x/icebergs/base/gdb"
"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"
)
@@ -23,22 +22,23 @@ func _publish_file(m *ice.Message, file string, arg ...string) string {
arg = kit.Simple(kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH))
file = cli.SystemFind(m, os.Args[0])
- } else if s, e := os.Stat(file); m.Assert(e) && s.IsDir() {
+ } else if s, e := nfs.StatFile(m, file); m.Assert(e) && s.IsDir() {
file = m.Cmdx(nfs.TAR, mdb.IMPORT, path.Base(file), file)
defer func() { os.Remove(file) }()
}
// 发布文件
- target := path.Join(m.Config(nfs.PATH), kit.Select(path.Base(file), arg, 0))
+ target := path.Join(ice.USR_PUBLISH, kit.Select(path.Base(file), arg, 0))
m.Logs(mdb.EXPORT, PUBLISH, target, cli.FROM, file)
m.Cmd(nfs.LINK, target, file)
return target
}
func _publish_list(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
- m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
+ m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Option(nfs.DIR_REG, kit.Select("", arg, 0))
m.Cmdy(nfs.DIR, nfs.PWD, kit.Select(nfs.DIR_WEB_FIELDS, arg, 1))
+ m.Debug("what %v", m.FormatsMeta())
}
func _publish_bin_list(m *ice.Message, dir string) {
p := m.Option(cli.CMD_DIR, dir)
@@ -62,11 +62,11 @@ const PUBLISH = "publish"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
- PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(nfs.PATH, ice.USR_PUBLISH, ice.CONTEXTS, _contexts)},
+ PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data(ice.CONTEXTS, _contexts)},
}, Commands: ice.Commands{
PUBLISH: {Name: "publish path auto create volcanos icebergs intshell", Help: "发布", Actions: ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.Config(nfs.PATH))
+ m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.USR_PUBLISH)
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey())
m.Config(ice.CONTEXTS, _contexts)
gdb.Watch(m, web.SERVE_START, m.PrefixKey())
@@ -74,12 +74,6 @@ func init() {
web.SERVE_START: {Name: "serve.start", Help: "服务启动", Hand: func(m *ice.Message, arg ...string) {
_publish_file(m, ice.ICE_BIN)
}},
- mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
- if arg[0] == mdb.FOREACH && arg[1] == "" {
- m.PushSearch(mdb.TYPE, ice.CONTEXTS, mdb.NAME, ice.CORE, mdb.TEXT, m.Cmdx(m.PrefixKey(), ice.CONTEXTS, ice.CORE))
- }
- }},
-
ice.VOLCANOS: {Name: "volcanos", Help: "火山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.EchoQRCode(m.Option(ice.MSG_USERWEB)) }()
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
@@ -87,17 +81,16 @@ func init() {
}},
ice.ICEBERGS: {Name: "icebergs", Help: "冰山架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
- m.Cmd(PUBLISH, mdb.CREATE, nfs.FILE, ice.BIN_ICE_BIN)
- _publish_bin_list(m, m.Config(nfs.PATH))
+ _publish_bin_list(m, ice.USR_PUBLISH)
}},
ice.INTSHELL: {Name: "intshell", Help: "神农架", Hand: func(m *ice.Message, arg ...string) {
defer func() { m.Cmdy(PUBLISH, ice.CONTEXTS) }()
_publish_list(m, `.*\.(sh|vim|conf)$`)
}},
ice.CONTEXTS: {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
- u := kit.ParseURL(tcp.ReplaceLocalhost(m, m.Option(ice.MSG_USERWEB)))
+ u := web.OptionUserWeb(m)
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ice.DF)[0],
- kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ice.DF), 1)))
+ kit.Select(kit.Select("443", "80", u.Scheme == ice.HTTP), strings.Split(u.Host, ice.DF), 1)))
if len(arg) == 0 {
arg = append(arg, ice.MISC, ice.CORE, ice.BASE)
@@ -105,13 +98,13 @@ func init() {
for _, k := range arg {
switch k {
case ice.MISC:
- if bin := path.Join(ice.USR_PUBLISH, kit.Keys("ice", runtime.GOOS, runtime.GOARCH)); !kit.FileExists(bin) {
+ if bin := path.Join(ice.USR_PUBLISH, kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)); !nfs.ExistsFile(m, bin) {
m.Cmd(nfs.LINK, bin, m.Cmdx(cli.RUNTIME, "boot.bin"))
}
case ice.CORE:
- if !kit.FileExists(".git") {
- repos := web.MergeURL2(m, "/x/"+m.Option(ice.MSG_USERPOD))
+ if !nfs.ExistsFile(m, ".git") {
+ repos := web.MergeURL2(m, "/x/"+kit.Select(ice.Info.PathName, m.Option(ice.MSG_USERPOD)))
m.Cmd(cli.SYSTEM, "git", "init")
m.Cmd(cli.SYSTEM, "git", "remote", "add", "origin", repos)
m.Cmd("web.code.git.repos", mdb.CREATE, repos, "master", "", nfs.PWD)
@@ -132,7 +125,7 @@ func init() {
_publish_file(m, m.Option(nfs.FILE))
}},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
- m.Cmdy(nfs.TRASH, path.Join(m.Config(nfs.PATH), m.Option(nfs.PATH)))
+ m.Cmdy(nfs.TRASH, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH)))
}},
mdb.EXPORT: {Name: "export", Help: "工具链", Hand: func(m *ice.Message, arg ...string) {
var list = []string{ice.ETC_PATH}
@@ -159,7 +152,7 @@ func init() {
m.Cmd("web.code.git.server", mdb.IMPORT)
}},
}, Hand: func(m *ice.Message, arg ...string) {
- m.Option(nfs.DIR_ROOT, m.Config(nfs.PATH))
+ m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH)
m.Cmdy(nfs.DIR, kit.Select("", arg, 0), nfs.DIR_WEB_FIELDS)
}},
}})
diff --git a/core/code/py.go b/core/code/py.go
index eb3aeda6..5efdf7d6 100644
--- a/core/code/py.go
+++ b/core/code/py.go
@@ -29,7 +29,7 @@ const PY = nfs.PY
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
- PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
+ PY: {Name: "py path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.ENGINE, mdb.CREATE, PY, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, PY, m.PrefixKey())
diff --git a/core/code/sh.go b/core/code/sh.go
index cc1986e0..63b84d05 100644
--- a/core/code/sh.go
+++ b/core/code/sh.go
@@ -60,7 +60,7 @@ const SH = nfs.SH
func init() {
Index.Register(&ice.Context{Name: SH, Help: "命令", Commands: ice.Commands{
- SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeAction(ice.Actions{
+ SH: {Name: "sh path auto", Help: "命令", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Name: "_init", Help: "初始化", Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, m.CommandKey(), m.PrefixKey())
diff --git a/core/code/shy.go b/core/code/shy.go
index cbfb4024..cdd07d64 100644
--- a/core/code/shy.go
+++ b/core/code/shy.go
@@ -35,7 +35,7 @@ const SHY = "shy"
func init() {
Index.Register(&ice.Context{Name: SHY, Help: "脚本", Commands: ice.Commands{
- SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
+ SHY: {Name: "shy path auto", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, cmd := range []string{mdb.SEARCH, mdb.ENGINE, mdb.RENDER, mdb.PLUGIN} {
m.Cmd(cmd, mdb.CREATE, SHY, m.PrefixKey())
diff --git a/core/code/template.go b/core/code/template.go
index f9d3b44d..b23430dc 100644
--- a/core/code/template.go
+++ b/core/code/template.go
@@ -14,7 +14,7 @@ const TEMPLATE = "template"
func init() {
Index.MergeCommands(ice.Commands{
- TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeAction(ice.Actions{
+ TEMPLATE: {Name: "template name auto", Help: "模板", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
for _, _template := range _template_list {
m.Cmd(TEMPLATE, mdb.CREATE, kit.SimpleKV(kit.Format(_template[0]), _template[1:]...))
diff --git a/core/code/upgrade.go b/core/code/upgrade.go
index df296d68..c66d973b 100644
--- a/core/code/upgrade.go
+++ b/core/code/upgrade.go
@@ -18,20 +18,20 @@ const UPGRADE = "upgrade"
func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(mdb.HASH, kit.Dict(
- nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "bin", nfs.FILE, "ice.bin")),
- nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.src.tar.gz")),
- nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, "tar", nfs.FILE, "contexts.bin.tar.gz")),
+ nfs.TARGET, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, ice.BIN, nfs.FILE, "ice.bin")),
+ nfs.SOURCE, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.src.tar.gz")),
+ nfs.BINARY, kit.Dict(mdb.LIST, kit.List(mdb.TYPE, nfs.TAR, nfs.FILE, "contexts.bin.tar.gz")),
))},
}, Commands: ice.Commands{
UPGRADE: {Name: "upgrade item=target,source,binary run restart", Help: "升级", Actions: ice.Actions{
cli.RESTART: {Name: "restart", Help: "重启", Hand: func(m *ice.Message, arg ...string) {
- m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
+ m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
}},
}, Hand: func(m *ice.Message, arg ...string) {
- mdb.Grows(m, m.CommandKey(), kit.Keys(mdb.HASH, kit.Select(cli.SYSTEM, arg, 0)), "", "", func(index int, value ice.Map) {
+ mdb.ZoneSelect(m, kit.Select(cli.SYSTEM, arg, 0)).Tables(func(value ice.Maps) {
if value[nfs.FILE] == ice.ICE_BIN { // 程序文件
value[nfs.FILE] = kit.Keys(ice.ICE, runtime.GOOS, runtime.GOARCH)
- defer m.Cmd(cli.SYSTEM, "mv", value[nfs.FILE], ice.BIN_ICE_BIN)
+ defer nfs.Rename(m, value[nfs.FILE], ice.BIN_ICE_BIN)
m.Option(ice.EXIT, ice.TRUE)
}
@@ -39,14 +39,14 @@ func init() {
dir := kit.Select(kit.Format(value[nfs.FILE]), value[nfs.PATH])
m.Cmd(web.SPIDE, ice.DEV, web.SPIDE_SAVE, dir, web.SPIDE_GET, "/publish/"+kit.Format(value[nfs.FILE]))
switch value[mdb.TYPE] {
- case "bin":
+ case ice.BIN:
os.Chmod(dir, 0755)
- case "tar":
+ case nfs.TAR:
m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir))
}
})
if web.ToastSuccess(m); m.Option(ice.EXIT) == ice.TRUE {
- m.Sleep("1s").Go(func() { m.Cmd(ice.EXIT, 1) })
+ m.Sleep300ms().Go(func() { m.Cmd(ice.EXIT, 1) })
web.ToastRestart(m)
}
}},
diff --git a/core/code/vimer.go b/core/code/vimer.go
index 0c642739..ce2b2643 100644
--- a/core/code/vimer.go
+++ b/core/code/vimer.go
@@ -10,6 +10,7 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -195,7 +196,7 @@ func init() {
mdb.SEARCH: {Name: "search type name text", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
- m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, web.MergeCmd(m, ""))
+ m.PushSearch(mdb.TYPE, "go", mdb.NAME, "src/main.go", mdb.TEXT, chat.MergeCmd(m, ""))
}
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/code/webpack.go b/core/code/webpack.go
index a12a6410..640cd272 100644
--- a/core/code/webpack.go
+++ b/core/code/webpack.go
@@ -2,6 +2,7 @@ package code
import (
"fmt"
+ "io"
"os"
"path"
"strings"
@@ -26,43 +27,46 @@ func _webpack_can(m *ice.Message) {
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS))
m.Cmdy(nfs.DIR, _volcanos(m, PAGE))
}
+func _webpack_css(m *ice.Message, css, js io.Writer, p string) {
+ fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, p)))
+ fmt.Fprintln(css, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
+ fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
+}
+func _webpack_js(m *ice.Message, js io.Writer, p string) {
+ fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
+ fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
+}
+func _webpack_node(m *ice.Message, js io.Writer, p string) {
+ fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, p)+`"`)
+ fmt.Fprintln(js, m.Cmdx(nfs.CAT, strings.TrimPrefix(p, ice.REQUIRE+ice.PS)))
+ fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, p)+`"] = []`)
+}
func _webpack_cache(m *ice.Message, dir string, write bool) {
if _, e := nfs.DiskFile.StatFile(ice.USR_VOLCANOS); os.IsNotExist(e) {
return
}
- css, _, e := kit.Create(path.Join(dir, PAGE_CACHE_CSS))
+ css, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_CSS))
m.Assert(e)
defer css.Close()
- js, _, e := kit.Create(path.Join(dir, PAGE_CACHE_JS))
+ js, _, e := nfs.CreateFile(m, path.Join(dir, PAGE_CACHE_JS))
m.Assert(e)
defer js.Close()
defer fmt.Fprintln(js, `_can_name = ""`)
-
defer _webpack_can(m)
if !write {
return
}
- m.Option(nfs.DIR_ROOT, "")
+ m.Option(nfs.DIR_ROOT, dir)
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
- // m.Cmd(nfs.DIR, ice.SRC).Tables(func(value ice.Maps) {
- // if kit.Ext(value[nfs.PATH]) == JS {
- // fmt.Fprintln(js, `_can_name = "`+path.Join("/require", ice.Info.Make.Module, value[nfs.PATH])+`"`)
- // fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
- // }
- // })
-
- m.Option(nfs.DIR_ROOT, dir)
for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == CSS {
- fmt.Fprintln(css, kit.Format("/* %s */", path.Join(ice.PS, value[nfs.PATH])))
- fmt.Fprintln(css, m.Cmdx(nfs.CAT, value[nfs.PATH]))
- fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join(ice.PS, value[nfs.PATH])+`"] = []`)
+ _webpack_css(m, css, js, value[nfs.PATH])
}
})
}
@@ -70,45 +74,37 @@ func _webpack_cache(m *ice.Message, dir string, write bool) {
for _, k := range []string{LIB, PANEL, PLUGIN} {
m.Cmd(nfs.DIR, k).Sort(nfs.PATH).Tables(func(value ice.Maps) {
if kit.Ext(value[nfs.PATH]) == JS {
- fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, value[nfs.PATH])+`"`)
- fmt.Fprintln(js, m.Cmdx(nfs.CAT, value[nfs.PATH]))
+ _webpack_js(m, js, value[nfs.PATH])
}
})
}
for _, k := range []string{ice.FRAME_JS} {
- fmt.Fprintln(js, `_can_name = "`+path.Join(ice.PS, k)+`"`)
- fmt.Fprintln(js, m.Cmdx(nfs.CAT, k))
+ _webpack_js(m, js, k)
}
- m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(nfs.PATH)).Sort(nfs.PATH).Tables(func(value ice.Maps) {
+ mdb.HashSelects(m).Sort(nfs.PATH).Tables(func(value ice.Maps) {
defer fmt.Fprintln(js)
-
p := value[nfs.PATH]
switch kit.Ext(p) {
case nfs.CSS:
- fmt.Fprintln(css, kit.Format("/* %s */", path.Join("/require/node_modules/", p)))
- fmt.Fprintln(css, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
- fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
+ _webpack_css(m, css, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
return
case nfs.JS:
default:
p = p + "/lib/" + p + ".js"
}
-
- fmt.Fprintln(js, `_can_name = "`+path.Join("/require/node_modules/", p)+`"`)
- fmt.Fprintln(js, m.Cmdx(nfs.CAT, path.Join("node_modules", p)))
- fmt.Fprintln(js, `Volcanos.meta.cache["`+path.Join("/require/node_modules/", p)+`"] = []`)
+ _webpack_node(m, js, path.Join(ice.REQUIRE, ice.NODE_MODULES, ice.LIB, p))
})
}
func _webpack_build(m *ice.Message, file string) {
- if f, _, e := kit.Create(kit.Keys(file, JS)); m.Assert(e) {
+ if f, _, e := nfs.CreateFile(m, kit.Keys(file, JS)); m.Assert(e) {
defer f.Close()
fmt.Fprintln(f, `Volcanos.meta.webpack = true`)
fmt.Fprintln(f, `Volcanos.meta.pack = `+kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option(nfs.CONTENT)))))
fmt.Fprintln(f, `Volcanos.meta.args = `+kit.Formats(kit.Dict(m.OptionSimple(kit.Split(m.Option(ctx.ARGS))...))))
}
- if f, p, e := kit.Create(kit.Keys(file, HTML)); m.Assert(e) {
+ if f, p, e := nfs.CreateFile(m, kit.Keys(file, HTML)); m.Assert(e) {
defer f.Close()
defer m.Echo(p)
@@ -142,13 +138,12 @@ const (
PLUGIN = "plugin"
)
const (
- PUBLISH_ORDER_JS = "publish/order.js"
- PAGE_INDEX_CSS = "page/index.css"
- PAGE_CACHE_CSS = "page/cache.css"
- PAGE_CACHE_JS = "page/cache.js"
- PAGE_INDEX_JS = "page/index.js"
- PAGE_CAN_CSS = "page/can.css"
- PAGE_CAN_JS = "page/can.js"
+ PAGE_INDEX_CSS = "page/index.css"
+ PAGE_CACHE_CSS = "page/cache.css"
+ PAGE_CACHE_JS = "page/cache.js"
+ PAGE_INDEX_JS = "page/index.js"
+ PAGE_CAN_CSS = "page/can.css"
+ PAGE_CAN_JS = "page/can.js"
)
const DEVPACK = "devpack"
@@ -156,26 +151,26 @@ const WEBPACK = "webpack"
func init() {
Index.MergeCommands(ice.Commands{
- WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeAction(ice.Actions{
+ WEBPACK: {Name: "webpack path auto create remove", Help: "打包", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), true)
}},
- mdb.INSERT: {Name: "insert", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
- m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, nfs.PATH, arg[0])
- }},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
_webpack_cache(m.Spawn(), _volcanos(m), false)
}},
+ mdb.INSERT: {Name: "insert path", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
+ mdb.HashCreate(m, nfs.PATH, m.Option(nfs.PATH))
+ }},
+ cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
+ _webpack_cache(m.Spawn(), _volcanos(m), true)
+ _webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
+ }},
nfs.TRASH: {Name: "trash", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
if !strings.Contains(m.Option(nfs.PATH), "page/index") {
m.Cmd(nfs.TRASH, m.Option(nfs.PATH))
}
}},
- cli.BUILD: {Name: "build name=hi", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
- _webpack_cache(m.Spawn(), _volcanos(m), true)
- _webpack_build(m, _publish(m, WEBPACK, m.Option(mdb.NAME)))
- }},
- }, mdb.HashAction(mdb.SHORT, nfs.PATH)), Hand: func(m *ice.Message, arg ...string) {
+ }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path")), Hand: func(m *ice.Message, arg ...string) {
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.OptionFields(nfs.DIR_WEB_FIELDS)
diff --git a/core/code/xterm.go b/core/code/xterm.go
index 477b737b..e297dbb6 100644
--- a/core/code/xterm.go
+++ b/core/code/xterm.go
@@ -2,17 +2,18 @@ package code
import (
"encoding/base64"
+ "io"
"os"
"os/exec"
"path"
"strings"
- "time"
pty "shylinux.com/x/creackpty"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"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"
)
@@ -22,8 +23,8 @@ func _xterm_socket(m *ice.Message, h, t string) {
m.Option(ice.MSG_DAEMON, m.Conf("", kit.Keys(mdb.HASH, h, mdb.META, mdb.TEXT)))
m.Option(mdb.TEXT, t)
}
-func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
- f, _ = mdb.HashTarget(m, h, func() ice.Any {
+func _xterm_get(m *ice.Message, h string, must bool) *os.File {
+ if f, ok := mdb.HashTarget(m, h, func() ice.Any {
if !must {
return nil
}
@@ -36,7 +37,9 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
m.Assert(err)
m.Go(func() {
- mdb.HashSelectUpdate(m, h, func(value ice.Map) { value["_cmd"] = cmd })
+ mdb.HashSelectUpdate(m, h, func(value ice.Map) {
+ value["_cmd"] = nfs.NewCloser(func() error { return cmd.Process.Kill() })
+ })
buf := make([]byte, ice.MOD_BUFS)
for {
if n, e := tty.Read(buf); !m.Warn(e) {
@@ -49,29 +52,30 @@ func _xterm_get(m *ice.Message, h string, must bool) (f *os.File) {
web.PushNoticeGrow(m, "exit")
})
return tty
- }).(*os.File)
- return
+ }).(*os.File); m.Warn(!ok, ice.ErrNotValid, f) {
+ mdb.HashSelectUpdate(m, h, func(value ice.Map) { delete(value, mdb.TARGET) })
+ return nil
+ } else {
+ return f
+ }
}
const XTERM = "xterm"
func init() {
Index.MergeCommands(ice.Commands{
- XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{
+ XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeActions(ice.Actions{
ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelectValue(m, func(value ice.Map) {
- if cmd, ok := value["_cmd"].(*exec.Cmd); ok {
- cmd.Process.Kill()
+ if c, ok := value["_cmd"].(io.Closer); ok {
+ c.Close()
}
})
}},
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
switch mdb.HashInputs(m, arg); arg[0] {
case mdb.TYPE:
- m.Push(arg[0], "python")
- m.Push(arg[0], "node")
- m.Push(arg[0], "bash")
- m.Push(arg[0], "sh")
+ m.Push(arg[0], "python", "node", "bash", "sh")
case mdb.NAME:
m.Push(arg[0], path.Base(m.Option(mdb.TYPE)))
}
@@ -90,15 +94,6 @@ func init() {
mdb.HashModify(m, m.OptionSimple(mdb.HASH), arg)
}},
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
- mdb.HashSelect(m).Tables(func(value ice.Maps) {
- if f := _xterm_get(m, value[mdb.HASH], false); f != nil {
- if kit.Time(m.Time())-kit.Time(value[mdb.TIME]) < int64(time.Hour) {
- return // 有效终端
- }
- f.Close()
- }
- m.Cmd("", mdb.REMOVE, kit.Dict(value))
- })
}},
"resize": {Name: "resize", Help: "大小", Hand: func(m *ice.Message, arg ...string) {
pty.Setsize(_xterm_get(m, m.Option(mdb.HASH), true), &pty.Winsize{Rows: uint16(kit.Int(m.Option("rows"))), Cols: uint16(kit.Int(m.Option("cols")))})
diff --git a/core/code/zml.go b/core/code/zml.go
index 31f6c588..54c6a174 100644
--- a/core/code/zml.go
+++ b/core/code/zml.go
@@ -7,11 +7,11 @@ import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
- "shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
)
func _website_url(m *ice.Message, file string) string {
- return strings.Split(web.MergeWebsite(m, file), "?")[0]
+ return strings.Split(chat.MergeWebsite(m, file), "?")[0]
}
const ZML = nfs.ZML
@@ -21,7 +21,7 @@ func init() {
SRC_WEBSITE = "src/website/"
)
Index.Register(&ice.Context{Name: ZML, Help: "网页", Commands: ice.Commands{
- ZML: {Name: "zml", Help: "网页", Actions: ice.MergeAction(ice.Actions{
+ ZML: {Name: "zml", Help: "网页", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, nfs.ZML, m.PrefixKey())
m.Cmd(mdb.ENGINE, mdb.CREATE, nfs.ZML, m.PrefixKey())
diff --git a/core/mall/asset.go b/core/mall/asset.go
index e0046439..449a3117 100644
--- a/core/mall/asset.go
+++ b/core/mall/asset.go
@@ -68,7 +68,7 @@ func init() {
}, Commands: ice.Commands{
ASSET: {Name: "asset account id auto spend trans bonus", Help: "资产", Meta: kit.Dict(
"_trans", kit.Dict(ACCOUNT, "账户", AMOUNT, "金额", FROM, "转出", TO, "转入", "time", "时间", "name", "商家", "text", "备注"),
- ), Actions: ice.MergeAction(ice.Actions{
+ ), Actions: ice.MergeActions(ice.Actions{
SPEND: {Name: "spend account name amount time@date text", Help: "支出", Hand: func(m *ice.Message, arg ...string) {
_sub_amount(m, arg)
_asset_insert(m, arg[1], kit.Simple(mdb.TYPE, "支出", arg[2:])...)
diff --git a/core/mall/paper.go b/core/mall/paper.go
index 23d5cebb..21fdc3d8 100644
--- a/core/mall/paper.go
+++ b/core/mall/paper.go
@@ -9,6 +9,6 @@ const PAPER = "paper"
func init() {
Index.MergeCommands(ice.Commands{
- PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeAction(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
+ PAPER: {Name: "paper", Help: "问卷", Actions: ice.MergeActions(ice.Actions{}, mdb.ZoneAction(mdb.FIELD, "time,id,type,name,text"))},
})
}
diff --git a/core/mall/salary.go b/core/mall/salary.go
index 74026ee2..970c2168 100644
--- a/core/mall/salary.go
+++ b/core/mall/salary.go
@@ -15,7 +15,7 @@ const SALARY = "salary"
func init() {
Index.MergeCommands(ice.Commands{
- SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeAction(ice.Actions{
+ SALARY: {Name: "salary month auto create", Help: "工资", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create month company amount income tax 公积金 养老保险 医疗保险 生育保险 工伤保险 失业保险 企业公积金 企业养老保险 企业医疗保险 企业生育保险 企业工伤保险 企业失业保险", Help: "添加"},
}, mdb.HashAction(mdb.SHORT, MONTH, mdb.FIELD, "month,company,amount,income,tax")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...)
diff --git a/core/team/count.go b/core/team/count.go
index ad232da3..385bfd4b 100644
--- a/core/team/count.go
+++ b/core/team/count.go
@@ -15,7 +15,7 @@ func init() {
Index.MergeCommands(ice.Commands{
COUNT: {Name: "count begin_time@date end_time@date auto insert", Help: "倒计时", Meta: kit.Dict(
ice.Display(""),
- ), Actions: ice.MergeAction(ice.Actions{
+ ), Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TASK, mdb.INSERT, arg)
}},
diff --git a/core/team/epic.go b/core/team/epic.go
index b463c6e5..29c7e216 100644
--- a/core/team/epic.go
+++ b/core/team/epic.go
@@ -13,7 +13,7 @@ const EPIC = "epic"
func init() {
Index.MergeCommands(ice.Commands{
- EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeAction(ice.Actions{
+ EPIC: {Name: "epic hash list create export import", Help: "史记", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create time@date type name", Help: "创建"},
mdb.MODIFY: {Name: "modify hash time@date type name", Help: "编辑"},
}, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/team/plan.go b/core/team/plan.go
index 57cb698b..8ae29070 100644
--- a/core/team/plan.go
+++ b/core/team/plan.go
@@ -7,6 +7,7 @@ import (
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -70,7 +71,7 @@ func init() {
Index.MergeCommands(ice.Commands{
PLAN: {Name: "plan scale=week,day,week,month,year,long begin_time@date list", Help: "计划", Meta: kit.Dict(
ice.Display("/plugin/local/team/plan.js"),
- ), Actions: ice.MergeAction(ice.Actions{
+ ), Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(TODO, mdb.INPUTS, arg)
}},
@@ -79,7 +80,7 @@ func init() {
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
- m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, web.MergeCmd(m, ""))
+ m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, chat.MergeCmd(m, ""))
}
}},
ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/team/task.go b/core/team/task.go
index c97421a2..51117576 100644
--- a/core/team/task.go
+++ b/core/team/task.go
@@ -57,7 +57,7 @@ const TASK = "task"
func init() {
Index.MergeCommands(ice.Commands{
- TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeAction(ice.Actions{
+ TASK: {Name: "task zone id auto insert export import", Help: "任务", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone type=once,step,week name text begin_time@date close_time@date", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.HASH, m.OptionSimple(mdb.ZONE))
m.Cmdy(mdb.INSERT, m.Prefix(TASK), "", mdb.ZONE, m.Option(mdb.ZONE),
diff --git a/core/team/todo.go b/core/team/todo.go
index 8b82a069..d07d8264 100644
--- a/core/team/todo.go
+++ b/core/team/todo.go
@@ -11,7 +11,7 @@ const TODO = "todo"
func init() {
Index.MergeCommands(ice.Commands{
- TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeAction(ice.Actions{
+ TODO: {Name: "todo hash list create export import", Help: "待办", Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INPUTS, m.PrefixKey(), "", mdb.HASH, arg)
m.Cmdy(TASK, mdb.INPUTS, arg)
diff --git a/core/wiki/draw.go b/core/wiki/draw.go
index d4108eaa..b47be5bd 100644
--- a/core/wiki/draw.go
+++ b/core/wiki/draw.go
@@ -17,7 +17,7 @@ func init() {
Index.Merge(&ice.Context{Configs: ice.Configs{
DRAW: {Name: DRAW, Help: "思维导图", Value: kit.Data(lex.REGEXP, ".*\\.svg")},
}, Commands: ice.Commands{
- DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeAction(ice.Actions{
+ DRAW: {Name: "draw path=src/main.svg pid refresh:button=auto save edit actions", Help: "思维导图", Meta: kit.Dict(ice.DisplayLocal("")), Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.RENDER, mdb.CREATE, mdb.TYPE, nfs.SVG, mdb.NAME, m.PrefixKey())
}},
diff --git a/core/wiki/field.go b/core/wiki/field.go
index 09382702..d62050eb 100644
--- a/core/wiki/field.go
+++ b/core/wiki/field.go
@@ -125,7 +125,7 @@ const FIELD = "field"
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
- FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeAction(ice.Actions{
+ FIELD: {Name: "field [name] cmd", Help: "插件", Actions: ice.MergeActions(ice.Actions{
ice.RUN: {Name: "run", Help: "执行"},
}, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
if arg = _name(m, arg); strings.Contains(arg[1], ice.NL) {
diff --git a/core/wiki/word.go b/core/wiki/word.go
index 3b594076..57275ef5 100644
--- a/core/wiki/word.go
+++ b/core/wiki/word.go
@@ -10,7 +10,7 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/ssh"
- "shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -41,13 +41,13 @@ func init() {
mdb.FIELD, "time,hash,type,name,text",
)},
}, Commands: ice.Commands{
- WORD: {Name: "word path=src/main.shy@key list play", Help: "语言文字", Actions: ice.MergeAction(ice.Actions{
+ WORD: {Name: "word path=src/main.shy@key list play", Help: "语言文字", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.PrefixKey("src/main.shy"))
}},
mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
if arg[0] == mdb.FOREACH && arg[1] == "" {
- m.PushSearch(mdb.TYPE, "shy", mdb.NAME, "src/main.shy", mdb.TEXT, web.MergeCmd(m, ""))
+ m.PushSearch(mdb.TYPE, "shy", mdb.NAME, "src/main.shy", mdb.TEXT, chat.MergeCmd(m, ""))
}
m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Tables(func(value ice.Maps) {
if arg[1] == "" {
diff --git a/init.go b/init.go
index c8a05f7f..e7417328 100644
--- a/init.go
+++ b/init.go
@@ -46,6 +46,7 @@ func (f *Frame) Close(m *Message, arg ...string) bool {
}
})
conf.Close()
+ go func() { m.Sleep("3s"); os.Exit(kit.Int(Pulse.Option(EXIT))) }()
return true
}
diff --git a/logs.go b/logs.go
index 0d6bec1a..27dcd90c 100644
--- a/logs.go
+++ b/logs.go
@@ -35,7 +35,9 @@ func (m *Message) join(arg ...Any) (string, []Any) {
}
func (m *Message) log(level string, str string, arg ...Any) *Message {
_source := logs.FileLineMeta(logs.FileLine(3, 3))
- Info.Log(m, m.FormatPrefix(), level, logs.Format(str, append(arg, _source)...)) // 日志回调
+ if Info.Log != nil {
+ Info.Log(m, m.FormatPrefix(), level, logs.Format(str, append(arg, _source)...)) // 日志回调
+ }
// 日志颜色
prefix, suffix := "", ""
diff --git a/meta.go b/meta.go
index a95553d3..a2ac1562 100644
--- a/meta.go
+++ b/meta.go
@@ -208,6 +208,12 @@ func (m *Message) Copy(msg *Message, arg ...string) *Message {
}
for _, k := range msg.meta[MSG_OPTION] {
+ switch k {
+ case MSG_CMDS:
+ case MSG_FIELDS:
+ case MSG_SESSID:
+ continue
+ }
if v, ok := msg.data[k]; ok {
m.data[k] = v
} else {
diff --git a/misc.go b/misc.go
index 033d1cd0..80ca11e9 100644
--- a/misc.go
+++ b/misc.go
@@ -164,7 +164,7 @@ func (m *Message) _command(arg ...Any) *Message {
opts[k] = v
}
case Map:
- for k, v := range val {
+ for k, v := range kit.KeyValue(nil, "", val) {
opts[k] = v
}
case Option:
@@ -249,8 +249,13 @@ func (c *Context) _command(m *Message, cmd *Command, key string, arg ...string)
}
m._target = kit.FileLine(cmd.Hand, 3)
- m.Log(LOG_CMDS, "%s.%s %d %v", c.Name, key, len(arg), arg,
- logs.FileLineMeta(kit.Select(m._target, m._source, m.target.Name == MDB)))
+ if key == "select" {
+ m.Log(LOG_CMDS, "%s.%s %d %v %v", c.Name, key, len(arg), arg, m.Optionv(MSG_FIELDS),
+ logs.FileLineMeta(kit.Select(m._target, m._source, m.target.Name == MDB)))
+ } else {
+ m.Log(LOG_CMDS, "%s.%s %d %v", c.Name, key, len(arg), arg,
+ logs.FileLineMeta(kit.Select(m._target, m._source, m.target.Name == MDB)))
+ }
if cmd.Hand != nil {
cmd.Hand(m, arg...)
@@ -293,7 +298,7 @@ func (c *Context) _action(m *Message, cmd *Command, key string, sub string, h *A
h.Hand(m, arg...)
return m
}
-func MergeAction(list ...Any) Actions {
+func MergeActions(list ...Any) Actions {
if len(list) == 0 {
return nil
}
@@ -318,7 +323,7 @@ func MergeAction(list ...Any) Actions {
case string:
base[CTX_INIT] = &Action{Hand: func(m *Message, arg ...string) {
m.Search(from, func(p *Context, s *Context, key string, cmd *Command) {
- MergeAction(base, cmd.Actions)
+ MergeActions(base, cmd.Actions)
m.target.Merge(m.target)
})
}}
diff --git a/misc/bash/bash.go b/misc/bash/bash.go
index 2b55d35f..888df1b4 100644
--- a/misc/bash/bash.go
+++ b/misc/bash/bash.go
@@ -16,7 +16,7 @@ var Index = &ice.Context{Name: BASH, Help: "命令行", Configs: ice.Configs{
nfs.SOURCE, "http://mirrors.tencent.com/macports/distfiles/bash/5.1_1/bash-5.1.tar.gz",
)},
}, Commands: ice.Commands{
- BASH: {Name: "bash path auto order build download", Help: "命令行", Actions: ice.MergeAction(ice.Actions{
+ BASH: {Name: "bash path auto order build download", Help: "命令行", Actions: ice.MergeActions(ice.Actions{
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, cli.ORDER, m.Config(nfs.SOURCE), "_install/bin")
}},
diff --git a/misc/bash/favor.go b/misc/bash/favor.go
index 284db8f8..6d732918 100644
--- a/misc/bash/favor.go
+++ b/misc/bash/favor.go
@@ -24,7 +24,7 @@ func init() {
}, Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(FAVOR).Table()
}},
- FAVOR: {Name: "favor zone id auto", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
+ FAVOR: {Name: "favor zone id auto", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=系统命令 type=shell name=1 text=pwd pwd=/home", Help: "添加"},
cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, m.Option(cli.PWD))
diff --git a/misc/bash/grant.go b/misc/bash/grant.go
index b7f89ac1..defd2a59 100644
--- a/misc/bash/grant.go
+++ b/misc/bash/grant.go
@@ -9,7 +9,7 @@ const GRANT = "grant"
func init() {
Index.MergeCommands(ice.Commands{
- "grant": {Name: "grant hash auto", Help: "授权", Actions: ice.MergeAction(ice.Actions{
+ "grant": {Name: "grant hash auto", Help: "授权", Actions: ice.MergeActions(ice.Actions{
"confirm": {Name: "confirm", Help: "同意", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(SESS, mdb.MODIFY, GRANT, m.Option(ice.MSG_USERNAME), ice.Option{mdb.HASH, m.Option("hash")})
}},
diff --git a/misc/bash/run.go b/misc/bash/run.go
index 5bdc3077..4fb46b6b 100644
--- a/misc/bash/run.go
+++ b/misc/bash/run.go
@@ -72,7 +72,7 @@ const RUN = "run"
func init() {
Index.MergeCommands(ice.Commands{
- "/run/": {Name: "/run/", Help: "执行", Actions: ice.MergeAction(ice.Actions{
+ "/run/": {Name: "/run/", Help: "执行", Actions: ice.MergeActions(ice.Actions{
ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Search(arg[0], func(_ *ice.Context, s *ice.Context, key string, cmd *ice.Command) {
if p := strings.ReplaceAll(kit.Select("/app/cat.sh", cmd.Meta["display"]), ".js", ".sh"); strings.HasPrefix(p, ice.PS+ice.REQUIRE) {
diff --git a/misc/bash/sess.go b/misc/bash/sess.go
index 2da012f8..b5e581d8 100644
--- a/misc/bash/sess.go
+++ b/misc/bash/sess.go
@@ -62,7 +62,7 @@ func init() {
}
m.Echo(m.Option(SID))
}},
- SESS: {Name: "sess hash auto prunes", Help: "会话流", Actions: ice.MergeAction(ice.Actions{
+ SESS: {Name: "sess hash auto prunes", Help: "会话流", Actions: ice.MergeActions(ice.Actions{
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
m.OptionFields(m.Config(mdb.FIELD))
m.Cmdy(mdb.PRUNES, m.PrefixKey(), "", mdb.HASH, mdb.STATUS, aaa.LOGOUT)
diff --git a/misc/bash/sync.go b/misc/bash/sync.go
index cc5418db..acbe1b96 100644
--- a/misc/bash/sync.go
+++ b/misc/bash/sync.go
@@ -26,7 +26,7 @@ func init() {
}
}},
}},
- SYNC: {Name: "sync id auto page export import", Help: "同步流", Actions: ice.MergeAction(ice.Actions{
+ SYNC: {Name: "sync id auto page export import", Help: "同步流", Actions: ice.MergeActions(ice.Actions{
cli.SYSTEM: {Name: "system", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
m.Option(cli.CMD_DIR, m.Option(cli.PWD))
ctx.ProcessCommand(m, cli.SYSTEM, kit.Split(m.Option(mdb.TEXT)), arg...)
diff --git a/misc/bash/trash.go b/misc/bash/trash.go
index 14417ec0..805f07ed 100644
--- a/misc/bash/trash.go
+++ b/misc/bash/trash.go
@@ -25,7 +25,7 @@ func init() {
m.Cmdy(TRASH, mdb.INSERT, arg)
}},
}},
- TRASH: {Name: "TRASH hash path auto prunes", Help: "回收站", Actions: ice.MergeAction(ice.Actions{
+ TRASH: {Name: "TRASH hash path auto prunes", Help: "回收站", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert from to", Help: "添加", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(aaa.USERNAME, tcp.HOSTNAME, nfs.SIZE, FROM, TO))
}},
diff --git a/misc/bash/zsh.go b/misc/bash/zsh.go
index df935658..c7a8917e 100644
--- a/misc/bash/zsh.go
+++ b/misc/bash/zsh.go
@@ -11,7 +11,7 @@ const ZSH = "zsh"
func init() {
Index.MergeCommands(ice.Commands{
- ZSH: {Name: "zsh path auto order build download", Help: "命令行", Actions: ice.MergeAction(ice.Actions{
+ ZSH: {Name: "zsh path auto order build download", Help: "命令行", Actions: ice.MergeActions(ice.Actions{
cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, cli.ORDER, m.Config(nfs.SOURCE), "_install/bin")
}},
diff --git a/misc/git/git.go b/misc/git/git.go
index 2b68d5da..49e79cfe 100644
--- a/misc/git/git.go
+++ b/misc/git/git.go
@@ -16,7 +16,7 @@ var Index = &ice.Context{Name: GIT, Help: "代码库", Configs: ice.Configs{
nfs.SOURCE, "http://mirrors.tencent.com/macports/distfiles/git-cinnabar/git-2.31.1.tar.gz",
)},
}, Commands: ice.Commands{
- GIT: {Name: "git path auto install order build download", Help: "代码库", Actions: ice.MergeAction(ice.Actions{
+ GIT: {Name: "git path auto install order build download", Help: "代码库", Actions: ice.MergeActions(ice.Actions{
code.INSTALL: {Name: "install", Help: "安装", Hand: func(m *ice.Message, arg ...string) {
web.PushStream(m)
defer m.ProcessInner()
diff --git a/misc/git/repos.go b/misc/git/repos.go
index 5856b71f..8fea6b99 100644
--- a/misc/git/repos.go
+++ b/misc/git/repos.go
@@ -51,7 +51,7 @@ func init() {
REPOS, "https://shylinux.com/x", nfs.PATH, ice.USR_LOCAL,
)},
}, Commands: ice.Commands{
- REPOS: {Name: "repos repos path auto create", Help: "代码库", Actions: ice.MergeAction(ice.Actions{
+ REPOS: {Name: "repos repos path auto create", Help: "代码库", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Conf(REPOS, mdb.HASH, "")
_repos_insert(m, path.Base(kit.Pwd()), kit.Pwd())
diff --git a/misc/git/server.go b/misc/git/server.go
index b3555266..71c9c3c4 100644
--- a/misc/git/server.go
+++ b/misc/git/server.go
@@ -42,6 +42,18 @@ func packetWrite(m *ice.Message, cmd string, str ...string) {
var basicAuthRegex = regexp.MustCompile("^([^:]*):(.*)$")
+func _server_rewrite(m *ice.Message, p string, r *http.Request) {
+ if ua := r.Header.Get(web.UserAgent); strings.HasPrefix(ua, "curl") || strings.HasPrefix(ua, "Wget") {
+ r.URL.Path = strings.Replace(r.URL.Path, "/x/", "/chat/pod/", 1)
+ m.Info("rewrite %v -> %v", p, r.URL.Path) // 下载镜像
+ } else if strings.HasPrefix(ua, "git") || strings.HasPrefix(ua, "Go") {
+ r.URL.Path = strings.Replace(r.URL.Path, "/x/", "/code/git/repos/", 1)
+ m.Info("rewrite %v -> %v", p, r.URL.Path) // 下载源码
+ } else {
+ r.URL.Path = strings.Replace(r.URL.Path, "/x/", "/chat/pod/", 1)
+ m.Info("rewrite %v -> %v", p, r.URL.Path) // 访问服务
+ }
+}
func _server_login(m *ice.Message) error {
if m.Conf("web.serve", "meta.localhost") != ice.FALSE {
if tcp.IsLocalHost(m, m.Option(ice.MSG_USERIP)) {
@@ -117,23 +129,13 @@ func init() {
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
m.Render(ice.RENDER_VOID)
}},
- "/repos/": {Name: "/repos/", Help: "代码库", Actions: ice.MergeAction(ice.Actions{
+ "/repos/": {Name: "/repos/", Help: "代码库", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
web.AddRewrite(func(p string, w http.ResponseWriter, r *http.Request) bool {
- if strings.HasPrefix(p, "/chat/pod/") {
- if strings.HasPrefix(r.Header.Get("User-Agent"), "git") || strings.HasPrefix(r.Header.Get("User-Agent"), "Go") {
- r.URL.Path = strings.Replace(r.URL.Path, "/chat/pod/", "/code/git/repos/", 1)
- m.Info("rewrite %v -> %v", p, r.URL.Path)
- } else if strings.HasPrefix(r.Header.Get("User-Agent"), "curl") || strings.HasPrefix(r.Header.Get("User-Agent"), "Wget") {
- if ls := strings.Split(p, ice.PS); m.Cmd(web.DREAM, ls[3]).Length() > 0 {
- r.URL.RawQuery += kit.Select("", "&", len(r.URL.RawQuery) > 1) + "pod=" + ls[3]
- }
- r.URL.Path = "/publish/ice.bin"
- m.Info("rewrite %v -> %v", p, r.URL.Path)
- }
- } else if strings.HasPrefix(p, "/x/") {
- r.URL.Path = strings.Replace(r.URL.Path, "/x/", "/code/git/repos/", 1)
- m.Info("rewrite %v -> %v", p, r.URL.Path)
+ if strings.HasPrefix(p, "/x/") {
+ _server_rewrite(m, p, r)
+ } else if strings.HasPrefix(p, "/chat/pod/") {
+ _server_rewrite(m, p, r)
}
return false
})
diff --git a/misc/git/spide.go b/misc/git/spide.go
index fb0b0eed..5b24fabb 100644
--- a/misc/git/spide.go
+++ b/misc/git/spide.go
@@ -61,7 +61,7 @@ const SPIDE = "spide"
func init() {
Index.MergeCommands(ice.Commands{
- SPIDE: {Name: "spide repos auto", Help: "构架图", Actions: ice.MergeAction(ice.Actions{
+ SPIDE: {Name: "spide repos auto", Help: "构架图", Actions: ice.MergeActions(ice.Actions{
code.INNER: {Name: "web.code.inner"},
"depend": {Name: "depend path=icebergs/base", Help: "依赖", Hand: func(m *ice.Message, arg ...string) {
keys := map[string]bool{}
diff --git a/misc/git/trend.go b/misc/git/trend.go
index c6814435..36c68f12 100644
--- a/misc/git/trend.go
+++ b/misc/git/trend.go
@@ -14,7 +14,7 @@ func init() {
Index.MergeCommands(ice.Commands{
TREND: {Name: "trend repos@key begin_time@date auto", Help: "趋势图", Meta: kit.Dict(
ice.DisplayStory("trend.js"),
- ), Actions: ice.MergeAction(ice.Actions{
+ ), Actions: ice.MergeActions(ice.Actions{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(REPOS, ice.OptionFields("name,time"))
}}, code.INNER: {Name: "web.code.inner"},
diff --git a/misc/input/input.go b/misc/input/input.go
index 050a45e8..5b83ad86 100644
--- a/misc/input/input.go
+++ b/misc/input/input.go
@@ -71,7 +71,7 @@ func (i input) Save(m *ice.Message, arg ...string) {
if f, p, e := kit.Create(m.Option(nfs.FILE)); m.Assert(e) {
defer f.Close()
n := 0
- m.Option(ice.CACHE_LIMIT, -2)
+ m.Option(mdb.CACHE_LIMIT, -2)
for _, lib := range kit.Split(m.Option(mdb.ZONE)) {
mdb.Richs(m.Message, m.PrefixKey(), "", lib, func(key string, value ice.Map) {
mdb.Grows(m.Message, m.PrefixKey(), kit.Keys(mdb.HASH, key), "", "", func(index int, value ice.Map) {
diff --git a/misc/input/wubi.go b/misc/input/wubi.go
index f9bd7efb..adce6194 100644
--- a/misc/input/wubi.go
+++ b/misc/input/wubi.go
@@ -37,7 +37,7 @@ func (w wubi) Input(m *ice.Message, arg ...string) {
return
}
- m.Option(ice.CACHE_LIMIT, "10")
+ m.Option(mdb.CACHE_LIMIT, "10")
m.Cmd(w, "word", arg[0]).Tables(func(value ice.Maps) {
m.Echo(value[mdb.TEXT] + ice.NL)
})
diff --git a/misc/lark/app.go b/misc/lark/app.go
index 69d65f57..85db2af3 100644
--- a/misc/lark/app.go
+++ b/misc/lark/app.go
@@ -26,7 +26,7 @@ func init() {
tcp.SERVER, "https://open.feishu.cn/",
)},
}, Commands: ice.Commands{
- APP: {Name: "app appid auto token login", Help: "应用", Actions: ice.MergeAction(ice.Actions{
+ APP: {Name: "app appid auto token login", Help: "应用", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, LARK, m.Config(tcp.SERVER))
}},
diff --git a/misc/lark/sso.go b/misc/lark/sso.go
index c0eb371f..abf6a294 100644
--- a/misc/lark/sso.go
+++ b/misc/lark/sso.go
@@ -15,7 +15,7 @@ func init() {
Index.MergeCommands(ice.Commands{
"/sso": {Name: "/sso", Help: "网页", Hand: func(m *ice.Message, arg ...string) {
if m.Option(ice.MSG_USERNAME) != "" { // 默认主页
- web.RenderIndex(m, web.SERVE, ice.VOLCANOS)
+ web.RenderIndex(m, ice.VOLCANOS)
return
}
diff --git a/misc/ssh/channel.go b/misc/ssh/channel.go
index 0bcfdd8c..8aad9ae2 100644
--- a/misc/ssh/channel.go
+++ b/misc/ssh/channel.go
@@ -68,7 +68,7 @@ const CHANNEL = "channel"
func init() {
psh.Index.MergeCommands(ice.Commands{
- CHANNEL: {Name: "channel hash id auto", Help: "通道", Actions: ice.MergeAction(ice.Actions{
+ CHANNEL: {Name: "channel hash id auto", Help: "通道", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Richs(CHANNEL, "", mdb.FOREACH, func(key string, value ice.Map) {
kit.Value(value, kit.Keym(mdb.STATUS), tcp.CLOSE)
diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go
index e79f7138..b5e564b4 100644
--- a/misc/ssh/connect.go
+++ b/misc/ssh/connect.go
@@ -156,7 +156,7 @@ const CONNECT = "connect"
func init() {
psh.Index.MergeCommands(ice.Commands{
- CONNECT: {Name: "connect name auto", Help: "连接", Actions: ice.MergeAction(ice.Actions{
+ CONNECT: {Name: "connect name auto", Help: "连接", Actions: ice.MergeActions(ice.Actions{
tcp.OPEN: {Name: "open authfile username=shy password verfiy host=shylinux.com port=22 private=.ssh/id_rsa", Help: "终端", Hand: func(m *ice.Message, arg ...string) {
aaa.UserRoot(m)
_ssh_open(m.OptionLoad(m.Option("authfile")), arg...)
diff --git a/misc/ssh/rsa.go b/misc/ssh/rsa.go
index 59908855..6f23d738 100644
--- a/misc/ssh/rsa.go
+++ b/misc/ssh/rsa.go
@@ -23,7 +23,7 @@ const RSA = "rsa"
func init() {
aaa.Index.MergeCommands(ice.Commands{
- RSA: {Name: "rsa hash auto", Help: "公钥", Actions: ice.MergeAction(ice.Actions{
+ RSA: {Name: "rsa hash auto", Help: "公钥", Actions: ice.MergeActions(ice.Actions{
mdb.IMPORT: {Name: "import key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, path.Base(m.Option("key"))), kit.Data(mdb.TIME, m.Time(),
"title", kit.Format("%s@%s", ice.Info.UserName, ice.Info.HostName),
diff --git a/misc/ssh/service.go b/misc/ssh/service.go
index b62dc461..1e5c41cc 100644
--- a/misc/ssh/service.go
+++ b/misc/ssh/service.go
@@ -104,7 +104,7 @@ func init() {
mdb.SHORT, tcp.PORT, mdb.FIELD, "time,port,status,private,authkey,count",
)},
}, Commands: ice.Commands{
- SERVICE: {Name: "service port id auto listen prunes", Help: "服务", Actions: ice.MergeAction(ice.Actions{
+ SERVICE: {Name: "service port id auto listen prunes", Help: "服务", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Richs(SERVICE, "", mdb.FOREACH, func(key string, value ice.Map) {
if value = kit.GetMeta(value); kit.Value(value, mdb.STATUS) == tcp.OPEN {
diff --git a/misc/ssh/session.go b/misc/ssh/session.go
index c5305d82..38bac3fa 100644
--- a/misc/ssh/session.go
+++ b/misc/ssh/session.go
@@ -59,7 +59,7 @@ const SESSION = "session"
func init() {
psh.Index.MergeCommands(ice.Commands{
- SESSION: {Name: "session name id auto", Help: "会话", Actions: ice.MergeAction(ice.Actions{
+ SESSION: {Name: "session name id auto", Help: "会话", Actions: ice.MergeActions(ice.Actions{
mdb.REPEAT: {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SESSION, ctx.ACTION, ctx.COMMAND, CMD, m.Option(mdb.TEXT))
}},
diff --git a/misc/tmux/script.go b/misc/tmux/script.go
index 2e6fddd9..c91b8f0b 100644
--- a/misc/tmux/script.go
+++ b/misc/tmux/script.go
@@ -9,7 +9,7 @@ const SCRIPT = "script"
func init() {
Index.MergeCommands(ice.Commands{
- SCRIPT: {Name: "script name auto create export import", Help: "脚本", Actions: ice.MergeAction(ice.Actions{
+ SCRIPT: {Name: "script name auto create export import", Help: "脚本", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create type=shell,tmux,vim name=hi text:textarea=pwd", Help: "添加"},
}, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text")), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...)
diff --git a/misc/tmux/tmux.go b/misc/tmux/tmux.go
index 16aa2737..a347d8b8 100644
--- a/misc/tmux/tmux.go
+++ b/misc/tmux/tmux.go
@@ -16,7 +16,7 @@ var Index = &ice.Context{Name: TMUX, Help: "工作台", Configs: ice.Configs{
nfs.SOURCE, "http://mirrors.tencent.com/macports/distfiles/tmux/tmux-3.2.tar.gz",
)},
}, Commands: ice.Commands{
- TMUX: {Name: "tmux path auto start order build download", Help: "服务", Actions: ice.MergeAction(ice.Actions{
+ TMUX: {Name: "tmux path auto start order build download", Help: "服务", Actions: ice.MergeActions(ice.Actions{
cli.START: {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) {
m.Optionv(code.PREPARE, func(p string) []string {
return []string{"-S", kit.Path(m.Option(cli.CMD_DIR, p), "tmux.socket"), "new-session", "-dn", "miss"}
diff --git a/misc/vim/favor.go b/misc/vim/favor.go
index 9c568536..1b8f08a2 100644
--- a/misc/vim/favor.go
+++ b/misc/vim/favor.go
@@ -30,7 +30,7 @@ func init() {
value[nfs.FILE], value[nfs.LINE], "1", value[mdb.NAME], value[mdb.TEXT])
})
}},
- FAVOR: {Name: "favor zone id auto", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
+ FAVOR: {Name: "favor zone id auto", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=数据结构 type name=hi text=hello file line", Help: "添加"},
code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
p := path.Join(m.Option(cli.PWD), m.Option(nfs.FILE))
diff --git a/misc/vim/sess.go b/misc/vim/sess.go
index 72c07eca..6b1d9593 100644
--- a/misc/vim/sess.go
+++ b/misc/vim/sess.go
@@ -58,7 +58,7 @@ func init() {
}
m.Echo(m.Option(SID))
}},
- SESS: {Name: "sess hash auto prunes", Help: "会话流", Actions: ice.MergeAction(ice.Actions{
+ SESS: {Name: "sess hash auto prunes", Help: "会话流", Actions: ice.MergeActions(ice.Actions{
mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
m.OptionFields(m.Config(mdb.FIELD))
m.Cmdy(mdb.PRUNES, m.PrefixKey(), "", mdb.HASH, mdb.STATUS, aaa.LOGOUT)
diff --git a/misc/vim/sync.go b/misc/vim/sync.go
index 7c5d4b86..d0a891ca 100644
--- a/misc/vim/sync.go
+++ b/misc/vim/sync.go
@@ -26,7 +26,7 @@ func init() {
m.Cmd(SYNC, mdb.INSERT, mdb.TYPE, VIMRC, mdb.NAME, arg[0], mdb.TEXT, kit.Select(m.Option(ARG), m.Option(SUB)),
m.OptionSimple(cli.PWD, BUF, ROW, COL))
}},
- SYNC: {Name: "sync id auto page export import", Help: "同步流", Actions: ice.MergeAction(ice.Actions{
+ SYNC: {Name: "sync id auto page export import", Help: "同步流", Actions: ice.MergeActions(ice.Actions{
code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
p := path.Join(m.Option(cli.PWD), m.Option(BUF))
ctx.ProcessCommand(m, code.INNER, []string{path.Dir(p) + ice.PS, path.Base(p), m.Option(ROW)}, arg...)
diff --git a/misc/vim/tags.go b/misc/vim/tags.go
index a3d81fb9..91977eb7 100644
--- a/misc/vim/tags.go
+++ b/misc/vim/tags.go
@@ -45,7 +45,7 @@ func init() {
}
}
}},
- TAGS: {Name: "tags zone id auto", Help: "索引", Actions: ice.MergeAction(ice.Actions{
+ TAGS: {Name: "tags zone id auto", Help: "索引", Actions: ice.MergeActions(ice.Actions{
"listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) {
kit.Fetch(kit.UnMarshal(m.Option(mdb.TEXT)), func(index int, value ice.Map) {
m.Cmd(TAGS, mdb.INSERT, mdb.ZONE, value[mdb.ZONE], kit.Simple(value))
diff --git a/misc/vim/vim.go b/misc/vim/vim.go
index bcc2e3a7..bcdf6f64 100644
--- a/misc/vim/vim.go
+++ b/misc/vim/vim.go
@@ -24,7 +24,7 @@ var Index = &ice.Context{Name: VIM, Help: "编辑器", Configs: ice.Configs{
nfs.SOURCE, "http://mirrors.tencent.com/macports/distfiles/vim/vim-8.2.2681.tar.gz",
)},
}, Commands: ice.Commands{
- VIM: {Name: "vim path auto order build download", Help: "编辑器", Actions: ice.MergeAction(ice.Actions{
+ VIM: {Name: "vim path auto order build download", Help: "编辑器", Actions: ice.MergeActions(ice.Actions{
cli.BUILD: {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(code.INSTALL, cli.BUILD, _vim_pkg(m, m.Config(nfs.SOURCE)), "--enable-multibyte=yes",
"--enable-pythoninterp=yes", "--enable-luainterp=yes", "--enable-cscope=yes")
diff --git a/misc/vim/vimrc.go b/misc/vim/vimrc.go
index ac5c3431..05953219 100644
--- a/misc/vim/vimrc.go
+++ b/misc/vim/vimrc.go
@@ -11,7 +11,7 @@ const VIMRC = "vimrc"
func init() {
Index.Merge(&ice.Context{Commands: ice.Commands{
- VIMRC: {Name: "vimrc", Help: "收藏夹", Actions: ice.MergeAction(ice.Actions{
+ VIMRC: {Name: "vimrc", Help: "收藏夹", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(mdb.PLUGIN, mdb.CREATE, VIMRC, m.PrefixKey())
m.Cmd(mdb.RENDER, mdb.CREATE, VIMRC, m.PrefixKey())
diff --git a/misc/wework/bot.go b/misc/wework/bot.go
index de1bdcce..eb4761a5 100644
--- a/misc/wework/bot.go
+++ b/misc/wework/bot.go
@@ -43,7 +43,7 @@ func init() {
m.Debug("what %v", en_msg)
m.RenderResult(en_msg)
}},
- BOT: {Name: "bot name chat text:textarea auto create", Help: "机器人", Actions: ice.MergeAction(ice.Actions{
+ BOT: {Name: "bot name chat text:textarea auto create", Help: "机器人", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create name token ekey hook", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, m.Option("name"), m.Option("hook"))
m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, arg)
diff --git a/misc/wx/access.go b/misc/wx/access.go
index 8ac27b1a..31ce00fb 100644
--- a/misc/wx/access.go
+++ b/misc/wx/access.go
@@ -6,10 +6,12 @@ import (
"time"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/gdb"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/ssh"
"shylinux.com/x/icebergs/base/tcp"
"shylinux.com/x/icebergs/base/web"
+ "shylinux.com/x/icebergs/core/chat"
kit "shylinux.com/x/toolkits"
)
@@ -57,9 +59,15 @@ const ACCESS = "access"
func init() {
Index.MergeCommands(ice.Commands{
- ACCESS: {Name: "access appid auto config ticket tokens login", Help: "认证", Actions: ice.MergeAction(ice.Actions{
+ ACCESS: {Name: "access appid auto config ticket tokens login", Help: "认证", Actions: ice.MergeActions(ice.Actions{
ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.SPIDE, mdb.CREATE, WX, m.Config(tcp.SERVER))
+ gdb.Watch(m, chat.HEADER_AGENT, m.PrefixKey())
+ }},
+ chat.HEADER_AGENT: {Hand: func(m *ice.Message, arg ...string) {
+ if strings.Index(m.Option(ice.MSG_USERUA), "MicroMessenger") > -1 {
+ _wx_config(m, m.Config(APPID))
+ }
}},
LOGIN: {Name: "login appid appmm token", Help: "登录", Hand: func(m *ice.Message, arg ...string) {
m.Config(APPID, m.Option(APPID))
diff --git a/misc/wx/favor.go b/misc/wx/favor.go
index 12ff4c67..9c2b70c5 100644
--- a/misc/wx/favor.go
+++ b/misc/wx/favor.go
@@ -16,7 +16,7 @@ func init() {
mdb.LINK, "https://open.weixin.qq.com/qr/code",
)},
}, Commands: ice.Commands{
- FAVOR: {Name: "favor text:text auto create", Help: "收藏", Actions: ice.MergeAction(ice.Actions{
+ FAVOR: {Name: "favor text:text auto create", Help: "收藏", Actions: ice.MergeActions(ice.Actions{
mdb.CREATE: {Name: "create type name text", Help: "添加"},
}, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) {
mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) {
diff --git a/misc/wx/menu.go b/misc/wx/menu.go
index 0fdf28d6..ec42a87a 100644
--- a/misc/wx/menu.go
+++ b/misc/wx/menu.go
@@ -45,7 +45,7 @@ const MENU = "menu"
func init() {
Index.MergeCommands(ice.Commands{
- MENU: {Name: "menu zone id auto insert", Help: "菜单", Actions: ice.MergeAction(ice.Actions{
+ MENU: {Name: "menu zone id auto insert", Help: "菜单", Actions: ice.MergeActions(ice.Actions{
mdb.INSERT: {Name: "insert zone=home title=hi refer=hello image", Help: "添加"},
}, mdb.ZoneAction(mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,title,refer,image")), Hand: func(m *ice.Message, arg ...string) {
if mdb.ZoneSelect(m, arg...); len(arg) > 0 {
diff --git a/option.go b/option.go
index 3950b598..66ff4bfc 100644
--- a/option.go
+++ b/option.go
@@ -20,11 +20,13 @@ func (m *Message) OptionFields(arg ...string) string {
}
return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS)))
}
-func (m *Message) OptionDefault(key, value string) string {
- if m.Option(key) == "" {
- m.Option(key, value)
+func (m *Message) OptionDefault(arg ...string) string {
+ for i := 0; i < len(arg); i += 2 {
+ if m.Option(arg[i]) == "" {
+ m.Option(arg[i], arg[i+1])
+ }
}
- return m.Option(key)
+ return m.Option(arg[0])
}
func (m *Message) OptionSimple(key ...string) (res []string) {
for _, k := range kit.Split(kit.Join(key)) {
diff --git a/type.go b/type.go
index 50123f48..65b28693 100644
--- a/type.go
+++ b/type.go
@@ -115,7 +115,11 @@ func (c *Context) Register(s *Context, x Server, n ...string) *Context {
return s
}
func (c *Context) MergeCommands(Commands Commands) *Context {
- return c.Merge(&Context{Commands: Commands})
+ configs := Configs{}
+ for k, _ := range Commands {
+ configs[k] = &Config{Value: kit.Data()}
+ }
+ return c.Merge(&Context{Commands: Commands, Configs: configs})
}
func (c *Context) Merge(s *Context) *Context {
if c.Commands == nil {
@@ -175,6 +179,11 @@ func (c *Context) Merge(s *Context) *Context {
merge(p, false, key, cmd, func(m *Message, arg ...string) { h(m, arg...) })
}
}
+ if strings.HasPrefix(k, PS) {
+ k = kit.Select(k, PS+key, k == PS)
+ c.Commands[k] = &Command{Name: k, Help: cmd.Help, Hand: func(m *Message, arg ...string) { m.Cmdy(key, arg) }}
+ continue
+ }
if s != c {
switch k {
@@ -487,6 +496,12 @@ func (m *Message) Search(key string, cb Any) *Message {
return m
}
+func (m *Message) Commands(key string) *Command {
+ return m.Target().Commands[key]
+}
+func (m *Message) Actions(key string) *Action {
+ return m._cmd.Actions[key]
+}
func (m *Message) CmdAppend(arg ...string) string {
field := kit.Slice(arg, -1)[0]
return m._command(kit.Slice(arg, 0, -1), OptionFields(field)).Append(field)