1
0
forked from x/icebergs
This commit is contained in:
harveyshao 2022-01-11 12:30:32 +08:00
parent 7868ea57f2
commit 231812d2bd
33 changed files with 191 additions and 133 deletions

View File

@ -42,7 +42,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) {
m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, mdb.HASH, h, STATUS, STOP) m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, mdb.HASH, h, STATUS, STOP)
} }
switch cb := m.Optionv(kit.Keycb(DAEMON)).(type) { switch cb := m.OptionCB(DAEMON).(type) {
case func(string): case func(string):
m.Sleep300ms() m.Sleep300ms()
cb(m.Conf(DAEMON, kit.Keys(mdb.HASH, h, kit.Keym(STATUS)))) cb(m.Conf(DAEMON, kit.Keys(mdb.HASH, h, kit.Keym(STATUS))))
@ -82,11 +82,15 @@ const (
STATUS = "status" STATUS = "status"
ERROR = "error" ERROR = "error"
START = "start" START = "start"
CLEAR = "clear"
RESTART = "restart" RESTART = "restart"
RELOAD = "reload" RELOAD = "reload"
STOP = "stop" STOP = "stop"
CODE = "code" CODE = "code"
COST = "cost"
BACK = "back" BACK = "back"
FROM = "from"
OPEN = "open" OPEN = "open"
CLOSE = "close" CLOSE = "close"

View File

@ -395,7 +395,7 @@ func init() {
mdb.CREATE: {Name: "create nlang=32 ncell=128", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mdb.CREATE: {Name: "create nlang=32 ncell=128", Help: "创建", Hand: func(m *ice.Message, arg ...string) {
mat := NewMatrix(m, kit.Int(kit.Select("32", m.Option(NLANG))), kit.Int(kit.Select("128", m.Option(NCELL)))) mat := NewMatrix(m, kit.Int(kit.Select("32", m.Option(NLANG))), kit.Int(kit.Select("128", m.Option(NCELL))))
h := m.Rich(m.Prefix(MATRIX), "", kit.Data(mdb.TIME, m.Time(), MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell)) h := m.Rich(m.Prefix(MATRIX), "", kit.Data(mdb.TIME, m.Time(), MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell))
switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { switch cb := m.OptionCB(MATRIX).(type) {
case func(string, *Matrix): case func(string, *Matrix):
cb(h, mat) cb(h, mat)
} }

View File

@ -17,7 +17,7 @@ func init() {
}}, }},
}, HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.Cmdy(kit.Keys(value[TEXT], value[NAME]),
m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3))
}) })

View File

@ -60,10 +60,8 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) {
value = RANDOMS value = RANDOMS
} }
fields := _hash_fields(m) fields := _hash_fields(m)
m.Debug("what %v", 123)
m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) {
m.Debug("what %v", 123) switch val = kit.GetMeta(val); cb := m.OptionCB(SELECT).(type) {
switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(SELECT)).(type) {
case func(fields []string, value map[string]interface{}): case func(fields []string, value map[string]interface{}):
cb(fields, val) cb(fields, val)
default: default:
@ -74,7 +72,7 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) {
} }
} }
}) })
if m.Option(FIELDS) != DETAIL { if !m.FieldsIsDetail() {
m.SortTimeR(TIME) m.SortTimeR(TIME)
} }
} }
@ -118,7 +116,7 @@ func _hash_import(m *ice.Message, prefix, chain, file string) {
func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) { func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) {
fields := _hash_fields(m) fields := _hash_fields(m)
m.Richs(prefix, chain, FOREACH, func(key string, val map[string]interface{}) { m.Richs(prefix, chain, FOREACH, func(key string, val map[string]interface{}) {
switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(PRUNES)).(type) { switch val = kit.GetMeta(val); cb := m.OptionCB(PRUNES).(type) {
case func(string, map[string]interface{}) bool: case func(string, map[string]interface{}) bool:
if !cb(key, val) { if !cb(key, val) {
return return

View File

@ -51,7 +51,7 @@ func _list_select(m *ice.Message, prefix, chain, field, value string) {
} }
fields := _list_fields(m) fields := _list_fields(m)
m.Grows(prefix, chain, kit.Select(m.Option(ice.CACHE_FIELD), field), kit.Select(m.Option(ice.CACHE_VALUE), value), func(index int, val map[string]interface{}) { m.Grows(prefix, chain, kit.Select(m.Option(ice.CACHE_FIELD), field), kit.Select(m.Option(ice.CACHE_VALUE), value), func(index int, val map[string]interface{}) {
switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(SELECT)).(type) { switch val = kit.GetMeta(val); cb := m.OptionCB(SELECT).(type) {
case func(fields []string, value map[string]interface{}): case func(fields []string, value map[string]interface{}):
cb(fields, val) cb(fields, val)
default: default:
@ -166,6 +166,9 @@ func ListAction(fields ...string) map[string]*ice.Action {
NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) {
NextPage(m, m.Config(COUNT), kit.Slice(arg, 1)...) NextPage(m, m.Config(COUNT), kit.Slice(arg, 1)...)
}}, }},
SELECT: {Name: "select", Help: "列表", Hand: func(m *ice.Message, arg ...string) {
ListSelect(m, arg...)
}},
}, fields...) }, fields...)
} }
func ListSelect(m *ice.Message, arg ...string) *ice.Message { func ListSelect(m *ice.Message, arg ...string) *ice.Message {

View File

@ -64,10 +64,8 @@ const (
RANDOMS = "%" RANDOMS = "%"
) )
const ( const (
FIELDS = "fields"
DETAIL = "detail" DETAIL = "detail"
RANDOM = "random" RANDOM = "random"
REPEAT = "repeat"
CREATE = "create" CREATE = "create"
REMOVE = "remove" REMOVE = "remove"
@ -80,11 +78,13 @@ const (
PRUNES = "prunes" PRUNES = "prunes"
EXPORT = "export" EXPORT = "export"
IMPORT = "import" IMPORT = "import"
UPLOAD = "upload" UPLOAD = "upload"
REVERT = "revert" REVERT = "revert"
NEXT = "next" NEXT = "next"
PREV = "prev" PREV = "prev"
PAGE = "page"
) )
const ( const (
CACHE_CLEAR_ON_EXIT = "cache.clear.on.exit" CACHE_CLEAR_ON_EXIT = "cache.clear.on.exit"

View File

@ -17,7 +17,7 @@ func init() {
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.Cmdy(kit.Keys(value[TEXT], value[NAME]),
m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3))
}) })

View File

@ -17,7 +17,7 @@ func init() {
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) > 1 { if len(arg) > 1 {
m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) {
m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.Cmdy(kit.Keys(value[TEXT], value[NAME]),
m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3))
}) })

View File

@ -18,7 +18,7 @@ func init() {
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
msg := m.Spawn(c) msg := m.Spawn(c)
if len(arg) > 1 { if len(arg) > 1 {
msg.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { msg.OptionCB(SELECT, func(fields []string, value map[string]interface{}) {
m.OptionFields(kit.Select("ctx,cmd,type,name,text", kit.Select(m.OptionFields(), arg, 2))) m.OptionFields(kit.Select("ctx,cmd,type,name,text", kit.Select(m.OptionFields(), arg, 2)))
m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2)) m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2))
}) })

View File

@ -11,7 +11,7 @@ import (
) )
func _zone_fields(m *ice.Message) []string { func _zone_fields(m *ice.Message) []string {
return kit.Split(kit.Select("zone,id,time,type,name,text", kit.Join(kit.Simple(m.Optionv(FIELDS))))) return kit.Split(kit.Select("zone,id,time,type,name,text", m.OptionFields()))
} }
func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
if zone == RANDOM { if zone == RANDOM {
@ -19,7 +19,7 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
} }
fields := _zone_fields(m) fields := _zone_fields(m)
cb := m.Optionv(kit.Keycb(SELECT)) cb := m.OptionCB(SELECT)
m.Richs(prefix, chain, kit.Select(FOREACH, zone), func(key string, val map[string]interface{}) { m.Richs(prefix, chain, kit.Select(FOREACH, zone), func(key string, val map[string]interface{}) {
if val = kit.GetMeta(val); zone == "" { if val = kit.GetMeta(val); zone == "" {
if m.OptionFields() == DETAIL { if m.OptionFields() == DETAIL {
@ -38,8 +38,16 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) {
cb(key, value, val) cb(key, value, val)
case func(string, map[string]interface{}): case func(string, map[string]interface{}):
cb(key, value) cb(key, value)
case func(map[string]interface{}):
cb(value)
case func(map[string]string):
res := map[string]string{}
for k, v := range value {
res[k] = kit.Format(v)
}
cb(res)
default: default:
if m.Option(FIELDS) == DETAIL { if m.FieldsIsDetail() {
m.Push(DETAIL, value) m.Push(DETAIL, value)
} else { } else {
m.Push(key, value, fields, val) m.Push(key, value, fields, val)
@ -90,7 +98,7 @@ func _zone_import(m *ice.Message, prefix, chain, file string) {
count := 0 count := 0
list := map[string]string{} list := map[string]string{}
zkey := kit.Select(head[0], m.Option(FIELDS)) zkey := kit.Select(head[0], m.OptionFields())
for { for {
line, e := r.Read() line, e := r.Read()
@ -187,7 +195,7 @@ func ZoneAction(args ...interface{}) map[string]*ice.Action {
NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) {
NextPageLimit(m, arg[0], arg[1:]...) NextPageLimit(m, arg[0], arg[1:]...)
}}, }},
SELECT: &ice.Action{Name: "select hash auto", Help: "列表", Hand: func(m *ice.Message, arg ...string) { SELECT: {Name: "select", Help: "列表", Hand: func(m *ice.Message, arg ...string) {
ZoneSelect(m, arg...) ZoneSelect(m, arg...)
}}, }},
}) })
@ -200,3 +208,12 @@ func ZoneSelect(m *ice.Message, arg ...string) *ice.Message {
} }
return m return m
} }
func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message {
m.Option(ice.CACHE_LIMIT, "-1")
return ZoneSelect(m, arg...)
}
func ZoneSelectCB(m *ice.Message, zone string, cb interface{}) *ice.Message {
m.OptionCB(SELECT, cb)
m.Option(ice.CACHE_LIMIT, "-1")
return ZoneSelect(m, zone)
}

View File

@ -78,7 +78,7 @@ func _cat_list(m *ice.Message, name string) {
} }
defer f.Close() defer f.Close()
switch cb := m.Optionv(kit.Keycb(CAT)).(type) { switch cb := m.OptionCB(CAT).(type) {
case func(string, int) string: case func(string, int) string:
list := []string{} list := []string{}
for bio, i := bufio.NewScanner(f), 0; bio.Scan(); i++ { for bio, i := bufio.NewScanner(f), 0; bio.Scan(); i++ {
@ -114,7 +114,6 @@ func _cat_list(m *ice.Message, name string) {
const ( const (
CAT_CONTENT = "cat_content" CAT_CONTENT = "cat_content"
TEMPLATE = "template" TEMPLATE = "template"
SOURCE = "source" SOURCE = "source"
@ -123,6 +122,8 @@ const (
MASTER = "master" MASTER = "master"
BRANCH = "branch" BRANCH = "branch"
REPOS = "repos" REPOS = "repos"
LOAD = "load"
) )
const ( const (
HTML = "html" HTML = "html"

View File

@ -50,7 +50,7 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d
p := path.Join(root, name, f.Name()) p := path.Join(root, name, f.Name())
if !(dir_type == TYPE_CAT && f.IsDir() || dir_type == TYPE_DIR && !f.IsDir()) && (dir_reg == nil || dir_reg.MatchString(f.Name())) { if !(dir_type == TYPE_CAT && f.IsDir() || dir_type == TYPE_DIR && !f.IsDir()) && (dir_reg == nil || dir_reg.MatchString(f.Name())) {
switch cb := m.Optionv(kit.Keycb(DIR)).(type) { switch cb := m.OptionCB(DIR).(type) {
case func(f os.FileInfo, p string): case func(f os.FileInfo, p string):
cb(f, p) cb(f, p)
continue continue

View File

@ -254,7 +254,7 @@ func init() {
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}},
SOURCE: {Name: "source file", Help: "脚本解析", Action: ice.MergeAction(map[string]*ice.Action{ SOURCE: {Name: "source file", Help: "脚本解析", Action: ice.MergeAction(map[string]*ice.Action{
mdb.REPEAT: {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) { "repeat": {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(SCREEN, m.Option(mdb.TEXT)) m.Cmdy(SCREEN, m.Option(mdb.TEXT))
m.ProcessInner() m.ProcessInner()
}}, }},

View File

@ -42,7 +42,7 @@ func _client_dial(m *ice.Message, arg ...string) {
defer c.Close() defer c.Close()
} }
switch cb := m.Optionv(kit.Keycb(CLIENT)).(type) { switch cb := m.OptionCB(CLIENT).(type) {
case func(net.Conn, error): case func(net.Conn, error):
cb(c, e) cb(c, e)
case func(net.Conn): case func(net.Conn):

View File

@ -36,7 +36,7 @@ func _server_listen(m *ice.Message, arg ...string) {
defer l.Close() defer l.Close()
} }
switch cb := m.Optionv(kit.Keycb(SERVER)).(type) { switch cb := m.OptionCB(SERVER).(type) {
case func(net.Listener, error): case func(net.Listener, error):
cb(l, e) cb(l, e)
case func(net.Listener): case func(net.Listener):

View File

@ -75,7 +75,7 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool {
defer m.Event(SERVE_STOP) defer m.Event(SERVE_STOP)
web.Message, web.Server = m, &http.Server{Handler: web} web.Message, web.Server = m, &http.Server{Handler: web}
switch cb := m.Optionv(kit.Keycb(SERVE)).(type) { switch cb := m.OptionCB(SERVE).(type) {
case func(http.Handler): case func(http.Handler):
cb(web) // 启动框架 cb(web) // 启动框架
default: default:

View File

@ -355,7 +355,7 @@ func init() {
mdb.TIME, m.Time(), mdb.NAME, m.Option(mdb.NAME), mdb.TIME, m.Time(), mdb.NAME, m.Option(mdb.NAME),
MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell, MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell,
)) ))
switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { switch cb := m.OptionCB(MATRIX).(type) {
case func(string, *Matrix): case func(string, *Matrix):
cb(h, mat) cb(h, mat)
} }
@ -394,7 +394,7 @@ func init() {
for stream := lex.NewStream(bytes.NewBufferString(m.Option(mdb.TEXT))); stream.Scan(); { for stream := lex.NewStream(bytes.NewBufferString(m.Option(mdb.TEXT))); stream.Scan(); {
hash, _ := mat.Parse(m, func(m *ice.Message, nhash string, hash int, word []string, begin int, stream *lex.Stream) (int, []string) { hash, _ := mat.Parse(m, func(m *ice.Message, nhash string, hash int, word []string, begin int, stream *lex.Stream) (int, []string) {
switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { switch cb := m.OptionCB(MATRIX).(type) {
case func(string, int, []string, int, *lex.Stream) (int, []string): case func(string, int, []string, int, *lex.Stream) (int, []string):
return cb(nhash, hash, word, begin, stream) return cb(nhash, hash, word, begin, stream)
} }

View File

@ -49,7 +49,7 @@ func init() {
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if len(arg) == 0 { if len(arg) == 0 {
m.Option(mdb.FIELDS, "time,type,name,share") m.OptionFields("time,type,name,share")
m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH) m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.PushAnchor(value[mdb.NAME], m.MergeURL2("/chat/pod/"+kit.Keys(m.Option(ice.POD), value[mdb.NAME]))) m.PushAnchor(value[mdb.NAME], m.MergeURL2("/chat/pod/"+kit.Keys(m.Option(ice.POD), value[mdb.NAME])))

View File

@ -29,7 +29,7 @@ func init() {
}}, }},
mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) { mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(mdb.ZONE), arg[2:]) m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(mdb.ZONE), arg[2:])
m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{mdb.FIELDS, "time,space"}).Table(func(index int, value map[string]string, head []string) { m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{"fields", "time,space"}).Table(func(index int, value map[string]string, head []string) {
m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name")) m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name"))
}) })
}}, }},

View File

@ -136,7 +136,7 @@ func _install_service(m *ice.Message, arg ...string) {
m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir") m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir")
m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Table(func(index int, value map[string]string, head []string) { m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Table(func(index int, value map[string]string, head []string) {
if strings.Contains(value[ice.CMD], "bin/"+arg[0]) { if strings.Contains(value[ice.CMD], "bin/"+arg[0]) {
m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) m.Push("", value, kit.Split(m.OptionFields()))
} }
}) })

View File

@ -24,8 +24,8 @@ const (
PAGE_INDEX_CSS = "page/index.css" PAGE_INDEX_CSS = "page/index.css"
PAGE_CACHE_JS = "page/cache.js" PAGE_CACHE_JS = "page/cache.js"
PAGE_INDEX_JS = "page/index.js" PAGE_INDEX_JS = "page/index.js"
PAGE_CMD_CSS = "page/cmd.css" PAGE_CAN_CSS = "page/can.css"
PAGE_CMD_JS = "page/cmd.js" PAGE_CAN_JS = "page/can.js"
) )
const DEVPACK = "devpack" const DEVPACK = "devpack"
@ -97,15 +97,15 @@ func init() {
m.Echo(p) m.Echo(p)
} }
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS))
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS))
}}, }},
mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_JS)) m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_JS))
m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_CSS))
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS))
m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS))
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(nfs.DIR_DEEP, true) m.Option(nfs.DIR_DEEP, true)

View File

@ -27,7 +27,7 @@ func _sub_amount(m *ice.Message, arg []string) {
func _asset_check(m *ice.Message, account string) { func _asset_check(m *ice.Message, account string) {
amount := 0 amount := 0
m.Option(kit.Keycb(mdb.SELECT), func(key string, value map[string]interface{}) { m.OptionCB(mdb.SELECT, func(key string, value map[string]interface{}) {
amount += kit.Int(kit.Value(value, AMOUNT)) amount += kit.Int(kit.Value(value, AMOUNT))
}) })
m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, account, ice.OptionFields(m.Config(mdb.FIELD))) m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, account, ice.OptionFields(m.Config(mdb.FIELD)))
@ -37,8 +37,8 @@ func _asset_check(m *ice.Message, account string) {
func _asset_insert(m *ice.Message, account string, arg ...string) { func _asset_insert(m *ice.Message, account string, arg ...string) {
m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account) m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account)
m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.ZONE, account, arg) m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.ZONE, account, arg)
m.OptionFields("time,account,amount,count")
amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, ice.Option{mdb.FIELDS, "time,account,amount,count"}).Append(AMOUNT)) amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account).Append(AMOUNT))
amount += kit.Int(_sub_value(m, AMOUNT, arg...)) amount += kit.Int(_sub_value(m, AMOUNT, arg...))
m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount) m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount)
} }

View File

@ -42,7 +42,7 @@ func _plan_scope(m *ice.Message, tz int, arg ...string) (time.Time, time.Time) {
func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message { func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message {
m.Option(ice.CACHE_LIMIT, "100") m.Option(ice.CACHE_LIMIT, "100")
m.Fields(0, "begin_time,close_time,zone,id,level,status,score,type,name,text,pod,extra") m.Fields(0, "begin_time,close_time,zone,id,level,status,score,type,name,text,pod,extra")
m.Option(kit.Keycb(mdb.SELECT), func(key string, fields []string, value, val map[string]interface{}) { m.OptionCB(mdb.SELECT, func(key string, fields []string, value, val map[string]interface{}) {
begin, _ := time.ParseInLocation(ice.MOD_TIME, kit.Format(value[BEGIN_TIME]), time.Local) begin, _ := time.ParseInLocation(ice.MOD_TIME, kit.Format(value[BEGIN_TIME]), time.Local)
if begin_time.After(begin) || begin.After(end_time) { if begin_time.After(begin) || begin.After(end_time) {
return return

View File

@ -42,6 +42,7 @@ func _field_show(m *ice.Message, name, text string, arg ...string) {
name = strings.ReplaceAll(name, ice.SP, "_") name = strings.ReplaceAll(name, ice.SP, "_")
meta[mdb.NAME], meta[mdb.INDEX] = name, text meta[mdb.NAME], meta[mdb.INDEX] = name, text
msg := m.Spawn()
// 扩展参数 // 扩展参数
for i := 0; i < len(arg)-1; i += 2 { for i := 0; i < len(arg)-1; i += 2 {
@ -63,6 +64,20 @@ func _field_show(m *ice.Message, name, text string, arg ...string) {
case "content": case "content":
meta[arg[i]] = arg[i+1] meta[arg[i]] = arg[i+1]
case SPARK:
msg.Echo(strings.TrimSpace(arg[i+1]))
meta["msg"] = msg.FormatMeta()
case TABLE:
ls := kit.Split(arg[i+1], ice.NL, ice.NL, ice.NL)
head := kit.Split(ls[0])
for _, l := range ls[1:] {
for i, v := range kit.Split(l) {
msg.Push(head[i], v)
}
}
meta["msg"] = msg.FormatMeta()
case ARGS: case ARGS:
args := kit.Simple(m.Optionv(arg[i])) args := kit.Simple(m.Optionv(arg[i]))

View File

@ -39,7 +39,8 @@ func init() {
ice.DisplayLocal(""), ice.DisplayLocal(""),
), Action: ice.MergeAction(map[string]*ice.Action{ ), Action: ice.MergeAction(map[string]*ice.Action{
mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,time") m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,line,time")
m.Cmdy(nfs.DIR, "src/help/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,line,time")
}}, }},
web.STORY: {Name: "story", Help: "运行", Hand: func(m *ice.Message, arg ...string) { web.STORY: {Name: "story", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(arg[0], ctx.ACTION, ice.RUN, arg[2:]) m.Cmdy(arg[0], ctx.ACTION, ice.RUN, arg[2:])

View File

@ -16,8 +16,11 @@ func (m *Message) Length() (max int) {
max = l max = l
} }
} }
if max > 0 {
return max return max
} }
return len(m.Resultv())
}
func (m *Message) CSV(text string, head ...string) *Message { func (m *Message) CSV(text string, head ...string) *Message {
bio := bytes.NewBufferString(text) bio := bytes.NewBufferString(text)
r := csv.NewReader(bio) r := csv.NewReader(bio)
@ -94,7 +97,9 @@ func (m *Message) FieldsIsDetail() bool {
return false return false
} }
func (m *Message) IsErr(str string) bool { return m.Result(1) == str } func (m *Message) IsErr(arg ...string) bool {
return len(arg) > 0 && m.Result(1) == arg[0] || m.Result(0) == ErrWarn
}
func (m *Message) IsErrNotFound() bool { return m.Result(1) == ErrNotFound } func (m *Message) IsErrNotFound() bool { return m.Result(1) == ErrNotFound }
func (m *Message) OptionCB(key string, cb ...interface{}) interface{} { func (m *Message) OptionCB(key string, cb ...interface{}) interface{} {
if len(cb) > 0 { if len(cb) > 0 {
@ -197,7 +202,7 @@ func (m *Message) cmd(arg ...interface{}) *Message {
ok := false ok := false
run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) { run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) {
if ok = true; cbs != nil { if ok = true; cbs != nil {
msg.Option(kit.Keycb(kit.Slice(kit.Split(list[0], PT), -1)[0]), cbs) msg.OptionCB(kit.Slice(kit.Split(list[0], PT), -1)[0], cbs)
} }
for k, v := range opts { for k, v := range opts {
msg.Option(k, v) msg.Option(k, v)

View File

@ -1,7 +1,13 @@
package input package input
import ( import (
"strings"
"shylinux.com/x/ice" "shylinux.com/x/ice"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits"
) )
type wubi struct { type wubi struct {
@ -19,4 +25,22 @@ type wubi struct {
list string `name:"list method=word,line code auto" help:"五笔"` list string `name:"list method=word,line code auto" help:"五笔"`
} }
func init() { ice.Cmd("web.code.input.wubi", wubi{}) } func (w wubi) Input(m *ice.Message, arg ...string) {
if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice") {
switch list := kit.Split(arg[0]); list[1] {
case "add": // ice add 想你 shwq [person [9999]]
m.Cmd(w, ctx.ACTION, mdb.INSERT, mdb.TEXT, list[2], cli.CODE, list[3],
mdb.ZONE, kit.Select("person", list, 4), mdb.VALUE, kit.Select("999999", list, 5),
)
m.Echo(list[3] + ice.NL)
}
return
}
m.Option(ice.CACHE_LIMIT, "10")
m.Cmd(w, "word", arg[0]).Table(func(index int, value map[string]string, head []string) {
m.Echo(value[mdb.TEXT] + ice.NL)
})
}
func init() { ice.CodeCtxCmd(wubi{}) }

View File

@ -138,7 +138,7 @@ func _ssh_conn(m *ice.Message, cb func(*ssh.Client), arg ...string) {
return m.Option(aaa.PASSWORD), nil return m.Option(aaa.PASSWORD), nil
})) }))
m.Option(kit.Keycb(tcp.CLIENT), func(c net.Conn) { m.OptionCB(tcp.CLIENT, func(c net.Conn) {
conn, chans, reqs, err := ssh.NewClientConn(c, m.Option(tcp.HOST)+":"+m.Option(tcp.PORT), &ssh.ClientConfig{ conn, chans, reqs, err := ssh.NewClientConn(c, m.Option(tcp.HOST)+":"+m.Option(tcp.PORT), &ssh.ClientConfig{
User: m.Option(aaa.USERNAME), Auth: methods, BannerCallback: func(message string) error { return nil }, User: m.Option(aaa.USERNAME), Auth: methods, BannerCallback: func(message string) error { return nil },
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil },

View File

@ -123,7 +123,7 @@ func init() {
m.Cmd(SERVICE, mdb.IMPORT, AUTHKEY, m.Option(AUTHKEY)) m.Cmd(SERVICE, mdb.IMPORT, AUTHKEY, m.Option(AUTHKEY))
} }
m.Option(kit.Keycb(tcp.SERVER), func(c net.Conn) { m.Go(func() { _ssh_accept(m, kit.Hashs(m.Option(tcp.PORT)), c) }) }) m.OptionCB(tcp.SERVER, func(c net.Conn) { m.Go(func() { _ssh_accept(m, kit.Hashs(m.Option(tcp.PORT)), c) }) })
m.Go(func() { m.Go(func() {
m.Cmdy(tcp.SERVER, tcp.LISTEN, mdb.TYPE, SSH, mdb.NAME, tcp.PORT, tcp.PORT, m.Option(tcp.PORT)) m.Cmdy(tcp.SERVER, tcp.LISTEN, mdb.TYPE, SSH, mdb.NAME, tcp.PORT, tcp.PORT, m.Option(tcp.PORT))
}) })

View File

@ -5,6 +5,7 @@ import (
ice "shylinux.com/x/icebergs" ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/mdb"
kit "shylinux.com/x/toolkits" kit "shylinux.com/x/toolkits"
) )
@ -13,46 +14,29 @@ const INPUT = "input"
func init() { func init() {
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data( INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data(mdb.FIELD, "time,id,type,name,text")},
mdb.FIELD, "time,id,type,name,text",
)},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
"/input": {Name: "/input", Help: "输入法", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/input": {Name: "/input", Help: "输入法", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if m.Cmdy(TAGS, arg[0]); len(m.Result()) > 0 { if m.Cmdy(TAGS, ctx.ACTION, INPUT, arg[0], m.Option("pre")); m.Length() > 0 {
m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "tags", arg[0], m.Result()))
return // 代码补全 return // 代码补全
} }
if m.Cmdy("web.code.input.wubi", ctx.ACTION, INPUT, arg[0]); m.Length() > 0 {
m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "wubi", arg[0], m.Result()))
return // 五笔输入
}
if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice") { if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice") {
switch list := kit.Split(arg[0]); list[1] { list := kit.Split(arg[0])
case "add": // ice add 想你 shwq [person [9999]] if m.Cmdy(list[1:]); m.IsErrNotFound() {
m.Cmd("web.code.input.wubi", mdb.INSERT, mdb.TEXT, list[2], cli.CODE, list[3], m.SetResult().Cmdy(cli.SYSTEM, list[1:])
mdb.ZONE, kit.Select("person", list, 4), mdb.VALUE, kit.Select("999999", list, 5), }
) if len(m.Resultv()) == 0 {
arg[0] = list[3]
default: // 执行命令
if m.Cmdy(list[1:]); strings.TrimSpace(m.Result()) == "" {
m.Table() m.Table()
} }
if strings.TrimSpace(m.Result()) == "" { m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "cmds", strings.TrimSpace(strings.Join(list[1:], ice.SP)), m.Result()))
m.Cmdy(cli.SYSTEM, list[1:]) return // 本地命令
} }
m.Cmd(INPUT, mdb.INSERT, mdb.TYPE, "cmd", mdb.NAME, strings.TrimSpace(strings.Join(list[1:], ice.SP)), mdb.TEXT, m.Result())
m.Echo("%s\n", arg[0])
return
}
}
// 词汇列表
m.Option(ice.CACHE_LIMIT, "10")
m.Cmd("web.code.input.wubi", "word", arg[0]).Table(func(index int, value map[string]string, head []string) {
m.Echo("%s\n", value[mdb.TEXT])
})
m.Cmd(INPUT, mdb.INSERT, mdb.TYPE, "wubi", mdb.NAME, arg[0], mdb.TEXT, m.Result())
}},
INPUT: {Name: "input id auto export import", Help: "输入法", Action: ice.MergeAction(map[string]*ice.Action{
mdb.INSERT: {},
}, mdb.ListAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
mdb.ListSelect(m, arg...)
}}, }},
INPUT: {Name: "input id auto export import", Help: "输入法", Action: mdb.ListAction()},
}}) }})
} }

View File

@ -14,64 +14,68 @@ import (
const TAGS = "tags" const TAGS = "tags"
func init() { func init() {
const (
MODULE = "module"
PATTERN = "pattern"
ONIMPORT = "onimport"
ONACTION = "onaction"
ONEXPORT = "onexport"
defs_pattern = "4\n%s\n/\\<%s: /\n"
func_pattern = "4\n%s\n/\\<%s: \\(shy\\|func\\)/\n"
libs_pattern = "4\nusr/volcanos/lib/%s.js\n/\\<%s: \\(shy\\|func\\)/\n"
)
Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ Index.Merge(&ice.Context{Configs: map[string]*ice.Config{
TAGS: {Name: TAGS, Help: "索引", Value: kit.Data( TAGS: {Name: TAGS, Help: "索引", Value: kit.Data(
mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,file,line", mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line",
)}, )},
}, Commands: map[string]*ice.Command{ }, Commands: map[string]*ice.Command{
"/tags": {Name: "/tags", Help: "跳转", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/tags": {Name: "/tags", Help: "跳转", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch m.Option("module") { switch m.Option(MODULE) {
case "onimport", "onaction", "onexport": case ONIMPORT, ONACTION, ONEXPORT:
m.Echo("4\n%s\n/\\<%s: \\(shy\\|func\\)/\n", m.Option(BUF), m.Option("pattern")) m.Echo(func_pattern, m.Option(BUF), m.Option(PATTERN))
case "msg": case "msg", "res":
m.Echo("4\nusr/volcanos/lib/%s.js\n/\\<%s: \\(shy\\|func\\)/\n", "misc", m.Option("pattern")) m.Echo(libs_pattern, ice.MISC, m.Option(PATTERN))
default: default:
if mdb.ZoneSelect(m, m.Option("module")); m.Length() > 0 { if mdb.ZoneSelectCB(m, m.Option(MODULE), func(value map[string]string) {
switch m.Append(mdb.TYPE) { if value[mdb.NAME] == m.Option(PATTERN) {
case "function": m.Echo(kit.Select(defs_pattern, func_pattern, value[mdb.TYPE] == "function"),
m.Echo("4\nusr/volcanos%s\n/\\<%s: \\(shy\\|func\\)/\n", m.Append(nfs.FILE), m.Option("pattern")) path.Join(value[nfs.PATH], value[nfs.FILE]), m.Option(PATTERN))
default:
m.Echo("4\nusr/volcanos%s\n/\\<%s: /\n", m.Append(nfs.FILE), m.Option("pattern"))
} }
return }); m.Length() == 0 {
m.Echo(defs_pattern, "usr/volcanos/proto.js", m.Option(PATTERN))
} }
m.Echo("4\n%s\n/\\<%s: /\n", "usr/volcanos/proto.js", m.Option("pattern"))
} }
}}, }},
TAGS: {Name: "tags zone id auto", Help: "索引", Action: ice.MergeAction(map[string]*ice.Action{ TAGS: {Name: "tags zone id auto", Help: "索引", Action: ice.MergeAction(map[string]*ice.Action{
mdb.INSERT: {Name: "insert zone=core type name=hi text=hello file line", Help: "添加"},
code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
m.ProcessCommand(code.INNER, []string{
kit.Select(ice.PWD, path.Dir(m.Option(nfs.FILE))),
path.Base(m.Option(nfs.FILE)),
m.Option(nfs.LINE),
}, arg...)
}},
"listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) { "listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) {
kit.Fetch(kit.UnMarshal(m.Option("content")), func(index int, value map[string]interface{}) { kit.Fetch(kit.UnMarshal(m.Option(mdb.TEXT)), func(index int, value map[string]interface{}) {
m.Cmd(TAGS, mdb.INSERT, mdb.ZONE, value[mdb.ZONE], kit.Simple(value)) m.Cmd(TAGS, mdb.INSERT, mdb.ZONE, value[mdb.ZONE], kit.Simple(value))
}) })
m.ProcessRefresh30ms() m.ProcessRefresh300ms()
}},
mdb.INSERT: {Name: "insert zone=core type name=hi text=hello path file line", Help: "添加"},
code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) {
m.ProcessCommand(code.INNER, m.OptionSplit("path,file,line"), arg...)
}},
INPUT: {Name: "input name text", Help: "补全", Hand: func(m *ice.Message, arg ...string) {
mdb.ZoneSelectCB(m, kit.Slice(kit.Split(m.Option(mdb.TEXT), ice.PT), -1)[0], func(value map[string]string) {
if !strings.Contains(value[mdb.NAME], m.Option(mdb.NAME)) {
return
}
if m.Length() == 0 {
m.Echo("func" + ice.NL)
}
m.Echo(value[mdb.NAME] + ice.NL)
m.Echo("%s: %s"+ice.NL, value[mdb.NAME], strings.Split(value[mdb.TEXT], ice.NL)[0])
})
}}, }},
}, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(ice.CACHE_LIMIT, "-1") if mdb.ZoneSelectAll(m, arg...); len(arg) == 0 {
if mdb.ZoneSelect(m, arg...); len(arg) == 0 {
m.Action("listTags", mdb.CREATE, mdb.EXPORT, mdb.IMPORT) m.Action("listTags", mdb.CREATE, mdb.EXPORT, mdb.IMPORT)
} else { } else {
if m.IsCliUA() { m.Action(mdb.INSERT).PushAction(code.INNER).StatusTimeCount()
if m.Length() == 0 {
return
}
m.Sort(mdb.NAME)
m.Echo("func\n").Table(func(index int, value map[string]string, head []string) {
m.Echo(arg[0] + ice.PT + value[mdb.NAME] + ice.NL)
m.Echo("%s: %s: %s // %s\n", value[mdb.TYPE], value[mdb.NAME], strings.Split(value[mdb.TEXT], ice.NL)[0], value[nfs.FILE])
})
return
}
m.Action(mdb.INSERT)
m.PushAction(code.INNER)
m.StatusTimeCount()
} }
}}, }},
}}) }})

View File

@ -96,7 +96,7 @@ func (m *Message) Upload(dir string) {
m.Cmdy(SPIDE, DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0]))) m.Cmdy(SPIDE, DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0])))
} }
} }
func (m *Message) Action(arg ...interface{}) { func (m *Message) Action(arg ...interface{}) *Message {
for i, v := range arg { for i, v := range arg {
switch v.(type) { switch v.(type) {
case string: case string:
@ -105,6 +105,7 @@ func (m *Message) Action(arg ...interface{}) {
} }
} }
m.Option(MSG_ACTION, kit.Format(arg)) m.Option(MSG_ACTION, kit.Format(arg))
return m
} }
func (m *Message) Status(arg ...interface{}) { func (m *Message) Status(arg ...interface{}) {
list := kit.List() list := kit.List()

View File

@ -93,11 +93,11 @@ func (m *Message) RenderCmd(index string, args ...interface{}) {
<head> <head>
<meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no"> <meta name="viewport" content="width=device-width,initial-scale=0.8,user-scalable=no">
<meta charset="utf-8"> <meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/page/cmd.css"> <link rel="stylesheet" type="text/css" href="/page/can.css">
</head> </head>
<body> <body>
<script src="/page/cmd.js"></script> <script src="/page/can.js"></script>
<script>cmd(%s)</script> <script>can(%s)</script>
</body> </body>
`, list)) `, list))
} }
@ -149,11 +149,12 @@ func (m *Message) PushDownload(key string, arg ...interface{}) { // [name] file
} }
} }
func (m *Message) PushAction(list ...interface{}) { func (m *Message) PushAction(list ...interface{}) *Message {
m.Set(MSG_APPEND, ACTION) m.Set(MSG_APPEND, ACTION)
m.Table(func(index int, value map[string]string, head []string) { m.Table(func(index int, value map[string]string, head []string) {
m.PushButton(list...) m.PushButton(list...)
}) })
return m
} }
func (m *Message) PushPodCmd(cmd string, arg ...string) { func (m *Message) PushPodCmd(cmd string, arg ...string) {
if m.Length() > 0 && len(m.Appendv(POD)) == 0 { if m.Length() > 0 && len(m.Appendv(POD)) == 0 {