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)