diff --git a/base/cli/daemon.go b/base/cli/daemon.go index e6987ea6..f50e296b 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -129,7 +129,7 @@ func init() { }}, STOP: {Name: "stop", Help: "停止", Hand: func(m *ice.Message, arg ...string) { m.OptionFields(m.Config(mdb.FIELD)) - m.Cmd(mdb.SELECT, DAEMON, "", mdb.HASH, m.OptionSimple(mdb.HASH)).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(mdb.SELECT, DAEMON, "", mdb.HASH, m.OptionSimple(mdb.HASH)).Tables(func(value ice.Maps) { m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, m.OptionSimple(mdb.HASH), STATUS, STOP) m.Cmdy(SYSTEM, KILL, value[PID]) }) @@ -138,7 +138,7 @@ func init() { } }}, }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Set(ctx.ACTION).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Set(ctx.ACTION).Tables(func(value ice.Maps) { switch value[STATUS] { case START: m.PushButton(RESTART, STOP) diff --git a/base/cli/system.go b/base/cli/system.go index 8ab4d521..a2ac4cd8 100644 --- a/base/cli/system.go +++ b/base/cli/system.go @@ -82,7 +82,6 @@ func _system_find(m *ice.Message, bin string, dir ...string) string { return bin } if strings.HasPrefix(bin, nfs.PWD) { - // return kit.Path(m.Option(CMD_DIR), bin) return bin } if len(dir) == 0 { @@ -131,6 +130,10 @@ func IsSuccess(m *ice.Message) bool { return m.Append(CODE) == "0" || m.Append(CODE) == "" } func SystemFind(m *ice.Message, bin string, dir ...string) string { + if text := kit.ReadFile(ice.ETC_PATH); len(text) > 0 { + dir = append(dir, strings.Split(text, ice.NL)...) + } + dir = append(dir, strings.Split(kit.Env(PATH), ice.DF)...) return _system_find(m, bin, dir...) } diff --git a/base/ctx/context.go b/base/ctx/context.go index 10c5f27d..e5345ebb 100644 --- a/base/ctx/context.go +++ b/base/ctx/context.go @@ -46,7 +46,7 @@ func init() { m.Display("/plugin/story/spide.js?prefix=spide", "root", kit.Select(ice.ICE, arg, 0), "split", ice.PT) } else if index := kit.Keys(arg[1]); strings.HasSuffix(index, arg[2]) { // 命令列表 - m.Cmdy(CONTEXT, index, COMMAND).Table(func(i int, value ice.Maps, head []string) { + m.Cmdy(CONTEXT, index, COMMAND).Tables(func(value ice.Maps) { m.Push("file", arg[1]) }) diff --git a/base/gdb/event.go b/base/gdb/event.go index 634abef1..cda2a7f5 100644 --- a/base/gdb/event.go +++ b/base/gdb/event.go @@ -11,7 +11,7 @@ func _event_listen(m *ice.Message, event string, cmd string) { m.Cmdy(mdb.INSERT, EVENT, "", mdb.ZONE, event, ice.CMD, cmd) } func _event_action(m *ice.Message, event string, arg ...string) { - mdb.ZoneSelect(m, event).Table(func(index int, value ice.Maps, head []string) { + mdb.ZoneSelect(m, event).Tables(func(value ice.Maps) { m.Cmd(kit.Split(value[ice.CMD]), event, arg).Cost(EVENT, event, ice.ARG, arg) }) } diff --git a/base/gdb/signal.go b/base/gdb/signal.go index 13aea35e..829f58ef 100644 --- a/base/gdb/signal.go +++ b/base/gdb/signal.go @@ -21,7 +21,7 @@ func _signal_listen(m *ice.Message, s int, arg ...string) { } } func _signal_action(m *ice.Message, arg ...string) { - mdb.HashSelect(m.Spawn(), arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m.Spawn(), arg...).Tables(func(value ice.Maps) { m.Cmdy(kit.Split(value[ice.CMD])) }) } diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 6007cb79..b3e48034 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -192,49 +192,15 @@ func AutoConfig(args ...ice.Any) *ice.Action { }} } func HashAction(args ...ice.Any) ice.Actions { - _key := func(m *ice.Message) string { - if m.Config(HASH) == UNIQ { - return HASH - } - if m.Config(SHORT) == UNIQ { - return HASH - } - return kit.Select(HASH, m.Config(SHORT)) - } return ice.Actions{ice.CTX_INIT: AutoConfig(args...), - INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, arg) - }}, - CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(INSERT, m.PrefixKey(), "", HASH, arg) - }}, - REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(m.Config(FIELD)) - m.Cmdy(DELETE, m.PrefixKey(), "", HASH, m.OptionSimple(_key(m)), arg) - m.Event(kit.Keys(m.CommandKey(), REMOVE), m.CommandKey(), m.Option(m.Config(SHORT))) - }}, - MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - field := m.Config(FIELD) - for i := 0; i < len(arg); i += 2 { - if !strings.Contains(field, arg[i]) { - arg[i] = kit.Keys("extra", arg[i]) - } - } - m.Cmdy(MODIFY, m.PrefixKey(), "", HASH, m.OptionSimple(_key(m)), arg) - }}, - SELECT: &ice.Action{Name: "select hash auto", Help: "列表", Hand: func(m *ice.Message, arg ...string) { - HashSelect(m, arg...) - }}, - PRUNES: &ice.Action{Name: "prunes before@date", Help: "清理", Hand: func(m *ice.Message, arg ...string) { - HashPrunes(m, nil) - }}, - EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.OptionFields(m.Config(FIELD)) - m.Cmdy(EXPORT, m.PrefixKey(), "", HASH, arg) - }}, - IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(IMPORT, m.PrefixKey(), "", HASH, arg) - }}, + INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { HashInputs(m, arg) }}, + CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { HashCreate(m, arg) }}, + REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { HashRemove(m, arg) }}, + MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { HashModify(m, arg) }}, + SELECT: {Name: "select hash auto", Help: "列表", Hand: func(m *ice.Message, arg ...string) { HashSelect(m, arg...) }}, + PRUNES: {Name: "prunes before@date", Help: "清理", Hand: func(m *ice.Message, arg ...string) { HashPrunes(m, nil) }}, + EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { HashExport(m, arg) }}, + IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { HashImport(m, arg) }}, } } func HashActionStatus(args ...ice.Any) ice.Actions { @@ -248,16 +214,32 @@ func HashActionStatus(args ...ice.Any) ice.Actions { } func HashInputs(m *ice.Message, arg ...ice.Any) *ice.Message { - return m.Cmd(INPUTS, m.PrefixKey(), "", HASH, kit.Simple(arg...)) + return m.Cmdy(INPUTS, m.PrefixKey(), "", HASH, kit.Simple(arg...)) } func HashCreate(m *ice.Message, arg ...ice.Any) *ice.Message { - return m.Cmd(INSERT, m.PrefixKey(), "", HASH, kit.Simple(arg...)) + field := m.Config(FIELD) + args := kit.Simple(arg...) + for i := 0; i < len(args); i += 2 { + if !strings.Contains(field, args[i]) { + args[i] = kit.Keys("extra", args[i]) + } + } + return m.Cmd(INSERT, m.PrefixKey(), "", HASH, args) } func HashRemove(m *ice.Message, arg ...ice.Any) *ice.Message { + m.OptionFields(m.Config(FIELD)) + defer m.Event(kit.Keys(m.CommandKey(), REMOVE), m.CommandKey(), m.Option(m.Config(SHORT))) return m.Cmd(DELETE, m.PrefixKey(), "", HASH, kit.Simple(arg...)) } func HashModify(m *ice.Message, arg ...ice.Any) *ice.Message { - return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, kit.Simple(arg...)) + field := m.Config(FIELD) + args := kit.Simple(arg...) + for i := 0; i < len(args); i += 2 { + if !strings.Contains(field, args[i]) { + args[i] = kit.Keys("extra", args[i]) + } + } + return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, args) } func HashSelect(m *ice.Message, arg ...string) *ice.Message { m.Fields(len(arg), m.Config(FIELD)) @@ -271,10 +253,13 @@ func HashPrunes(m *ice.Message, cb func(ice.Maps) bool) *ice.Message { if m.Config(HASH) == UNIQ { return HASH } + if m.Config(SHORT) == UNIQ { + return HASH + } return kit.Select(HASH, m.Config(SHORT)) } expire := kit.Time(kit.Select(m.Time("-72h"), m.Option(EXPIRE))) - m.Cmd(m.CommandKey()).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(m.CommandKey()).Tables(func(value ice.Maps) { if kit.Time(value[TIME]) > expire { return } @@ -287,6 +272,7 @@ func HashPrunes(m *ice.Message, cb func(ice.Maps) bool) *ice.Message { return m } func HashExport(m *ice.Message, arg ...ice.Any) *ice.Message { + m.OptionFields(m.Config(FIELD)) return m.Cmd(EXPORT, m.PrefixKey(), "", HASH, kit.Simple(arg...)) } func HashImport(m *ice.Message, arg ...ice.Any) *ice.Message { diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 62636cbe..1048be94 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -72,14 +72,13 @@ const ( DETAIL = "detail" RANDOM = "random" + INPUTS = "inputs" CREATE = "create" REMOVE = "remove" INSERT = "insert" DELETE = "delete" MODIFY = "modify" SELECT = "select" - - INPUTS = "inputs" PRUNES = "prunes" EXPORT = "export" IMPORT = "import" @@ -148,6 +147,21 @@ const MDB = "mdb" var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: ice.Commands{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {}}, ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) {}}, + INPUTS: {Name: "inputs key sub type field value", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[3] { + case "index": + m.OptionFields(arg[3]) + m.Cmdy("command", "search", "command", "", "") + } + switch arg[2] { + case ZONE: // inputs key sub type zone field value + _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.Select(NAME, arg, 4), kit.Select("", arg, 5)) + case HASH: + _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(NAME, arg, 3), kit.Select("", arg, 4)) + case LIST: + _list_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(NAME, arg, 3), kit.Select("", arg, 4)) + } + }}, INSERT: {Name: "insert key sub type arg...", Help: "添加", Hand: func(m *ice.Message, arg ...string) { switch arg[2] { case ZONE: // insert key sub type zone arg... @@ -190,21 +204,6 @@ var Index = &ice.Context{Name: MDB, Help: "数据模块", Commands: ice.Commands _list_select(m, arg[0], _domain_chain(m, arg[1]), kit.Select("", arg, 3), kit.Select("", arg, 4)) } }}, - INPUTS: {Name: "inputs key sub type field value", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch arg[3] { - case "index": - m.OptionFields(arg[3]) - m.Cmdy("command", "search", "command") - } - switch arg[2] { - case ZONE: // inputs key sub type zone field value - _list_inputs(m, arg[0], _domain_chain(m, kit.Keys(arg[1], kit.KeyHash(arg[3]))), kit.Select(NAME, arg, 4), kit.Select("", arg, 5)) - case HASH: - _hash_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(NAME, arg, 3), kit.Select("", arg, 4)) - case LIST: - _list_inputs(m, arg[0], _domain_chain(m, arg[1]), kit.Select(NAME, arg, 3), kit.Select("", arg, 4)) - } - }}, PRUNES: {Name: "prunes key sub type [field value]...", Help: "清理", Hand: func(m *ice.Message, arg ...string) { switch arg[2] { case ZONE: // prunes key sub type zone field value diff --git a/base/nfs/dir.go b/base/nfs/dir.go index 1fe4eed5..c0c8fd10 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -191,7 +191,7 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d } func _dir_search(m *ice.Message, kind, name string) { msg := _dir_list(m.Spawn(), PWD, "", 0, true, TYPE_BOTH, nil, kit.Split("time,type,name")) - msg.Table(func(index int, value ice.Maps, head []string) { + msg.Tables(func(value ice.Maps) { if !strings.Contains(value[mdb.NAME], name) { return } diff --git a/base/tcp/client.go b/base/tcp/client.go index e286a168..12b20db4 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -93,7 +93,7 @@ func init() { _client_dial(m, arg...) }}, }, mdb.HashActionStatus()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushButton(kit.Select("", mdb.REMOVE, value[STATUS] == OPEN)) }) }}, diff --git a/base/tcp/host.go b/base/tcp/host.go index 8f7e9ce1..15562e9a 100644 --- a/base/tcp/host.go +++ b/base/tcp/host.go @@ -80,7 +80,7 @@ func init() { }, Commands: ice.Commands{ HOST: {Name: "host name auto", Help: "主机", Actions: ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - m.Cmd(HOST).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(HOST).Tables(func(value ice.Maps) { m.Cmd(HOST, aaa.WHITE, value[aaa.IP]) }) }}, diff --git a/base/tcp/server.go b/base/tcp/server.go index 0b12af27..9bd7566a 100644 --- a/base/tcp/server.go +++ b/base/tcp/server.go @@ -101,7 +101,7 @@ func init() { _server_listen(m, arg...) }}, }, mdb.HashActionStatus()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushButton(kit.Select("", mdb.REMOVE, value[STATUS] == CLOSE)) }) }}, diff --git a/base/web/broad.go b/base/web/broad.go index 4c3a36ee..729cb8b5 100644 --- a/base/web/broad.go +++ b/base/web/broad.go @@ -46,7 +46,7 @@ func _serve_udp(m *ice.Message, host, port string) { } if remote, err := net.ResolveUDPAddr("udp4", kit.Format("%s:%s", msg.Option(tcp.HOST), msg.Option(tcp.PORT))); err == nil { - m.Cmd(BROAD).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(BROAD).Tables(func(value ice.Maps) { m.Debug("broad %v to %v", kit.Format(value), kit.Format(remote)) s.WriteToUDP([]byte(m.Spawn(value).FormatMeta()), remote) }) diff --git a/base/web/cache.go b/base/web/cache.go index 2207ca0d..0fed59d7 100644 --- a/base/web/cache.go +++ b/base/web/cache.go @@ -41,7 +41,7 @@ func _cache_save(m *ice.Message, kind, name, text string, arg ...string) { // fi m.Push(mdb.DATA, h) } func _cache_watch(m *ice.Message, key, file string) { - mdb.HashSelect(m.Spawn(), key).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m.Spawn(), key).Tables(func(value ice.Maps) { if value[nfs.FILE] == "" { m.Cmdy(nfs.SAVE, file, value[mdb.TEXT]) } else { diff --git a/base/web/dream.go b/base/web/dream.go index 08b2ad0d..e28d092d 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -15,7 +15,7 @@ import ( ) func _dream_list(m *ice.Message) *ice.Message { - return m.Cmdy(nfs.DIR, m.Config(nfs.PATH), "time,size,name").Table(func(index int, value ice.Maps, head []string) { + return m.Cmdy(nfs.DIR, m.Config(nfs.PATH), "time,size,name").Tables(func(value ice.Maps) { if m.Richs(SPACE, nil, value[mdb.NAME], func(key string, val ice.Map) { m.Push(mdb.TYPE, val[mdb.TYPE]) m.Push(cli.STATUS, cli.START) @@ -146,7 +146,7 @@ func init() { }, Hand: func(m *ice.Message, arg ...string) { if start := 0; len(arg) == 0 { _dream_list(m).SetAppend(mdb.TEXT) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { if value[cli.STATUS] != cli.START { m.Push(mdb.TEXT, "") return diff --git a/base/web/route.go b/base/web/route.go index 3f954c53..700a6f30 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -19,7 +19,7 @@ func _route_travel(m *ice.Message, route string) { return // 避免循环 } - m.Cmd(SPACE, val[mdb.NAME], ROUTE).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(SPACE, val[mdb.NAME], ROUTE).Tables(func(value ice.Maps) { m.Push(mdb.TYPE, value[mdb.TYPE]) m.Push(ROUTE, kit.Keys(val[mdb.NAME], value[ROUTE])) }) @@ -32,7 +32,7 @@ func _route_travel(m *ice.Message, route string) { }) } func _route_list(m *ice.Message) { - m.Table(func(index int, value ice.Maps, field []string) { + m.Tables(func(value ice.Maps) { m.PushAnchor(value[ROUTE], m.MergePod(value[ROUTE])) switch value[mdb.TYPE] { @@ -47,7 +47,7 @@ func _route_list(m *ice.Message) { // 网卡信息 u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) - m.Cmd(tcp.HOST).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(tcp.HOST).Tables(func(value ice.Maps) { m.Push(mdb.TYPE, MYSELF) m.Push(ROUTE, ice.Info.NodeName) m.PushAnchor(value[aaa.IP], kit.Format("%s://%s:%s", u.Scheme, value[aaa.IP], u.Port())) @@ -106,13 +106,13 @@ func init() { } } else if len(arg) == 1 || arg[1] == "" { // 模块列表 - m.Cmd(SPACE, arg[0], ctx.CONTEXT, ice.ICE).Table(func(index int, value ice.Maps, head []string) { + 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).Table(func(index int, value ice.Maps, head []string) { + 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)) }) diff --git a/base/web/serve.go b/base/web/serve.go index c23058d4..d7fe6963 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -323,7 +323,7 @@ func init() { }) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, arg ...string) { - m.Cmd(SERVE).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(SERVE).Tables(func(value ice.Maps) { m.Done(value[cli.STATUS] == tcp.START) }) }}, diff --git a/base/web/space.go b/base/web/space.go index cb1d17e8..dfb33f14 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -220,8 +220,8 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) { if name != "" { return } - m.Cmd(SERVE, ice.OptionFields("")).Table(func(index int, val ice.Maps, head []string) { - m.Cmd(tcp.HOST, ice.OptionFields("")).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(SERVE, ice.OptionFields("")).Tables(func(val ice.Maps) { + m.Cmd(tcp.HOST, ice.OptionFields("")).Tables(func(value ice.Maps) { m.PushSearch(kit.SimpleKV("", MYSELF, value[mdb.NAME], kit.Format("http://%s:%s", value[aaa.IP], val[tcp.PORT]))) }) }) @@ -327,7 +327,7 @@ func init() { }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { // 节点列表 if mdb.HashSelect(m, arg...); len(arg) == 0 { - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { switch value[mdb.TYPE] { case MASTER: m.PushAnchor(value[mdb.NAME], m.Cmd(SPIDE, value[mdb.NAME], ice.OptionFields("")).Append("client.url")) diff --git a/core/chat/action.go b/core/chat/action.go index ecf43ebf..7f23b5e9 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -26,7 +26,7 @@ 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)) } func _action_list(m *ice.Message, river, storm string) { - m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Table(func(index int, value ice.Maps, head []string) { + m.Cmdy(STORM, storm, ice.Option{ice.MSG_RIVER, river}).Tables(func(value ice.Maps) { m.Cmdy(m.Space(kit.Select(m.Option(ice.POD), value[ice.POD])), ctx.COMMAND, kit.Keys(value[ice.CTX], value[ice.CMD])) }) } diff --git a/core/chat/files.go b/core/chat/files.go index 6835da3f..38984539 100644 --- a/core/chat/files.go +++ b/core/chat/files.go @@ -27,7 +27,7 @@ func init() { }}, }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { mdb.HashSelect(m, arg...) - m.Table(func(index int, value ice.Maps, head []string) { + m.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/meet.go b/core/chat/meet.go index c3a96957..543a4fdf 100644 --- a/core/chat/meet.go +++ b/core/chat/meet.go @@ -42,7 +42,7 @@ func init() { mdb.CREATE: {Name: "create name 照片 性别 年龄 身高 体重 籍贯 户口 学历 学校 职业 公司 年薪 资产 家境", Help: "添加"}, }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { msg := m.Spawn() - mdb.HashSelect(msg, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(msg, arg...).Tables(func(value ice.Maps) { value["照片"] = ice.Render(m, ice.RENDER_IMAGES, value["照片"], kit.Select("100", "400", msg.FieldsIsDetail())) m.Push(m.OptionFields(), value, kit.Split(msg.OptionFields())) }) diff --git a/core/chat/node.go b/core/chat/node.go index 63623707..8989ae28 100644 --- a/core/chat/node.go +++ b/core/chat/node.go @@ -51,7 +51,7 @@ func init() { if len(arg) == 0 { m.OptionFields("time,type,name,share") m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { m.PushAnchor(value[mdb.NAME], m.MergeURL2("/chat/pod/"+kit.Keys(m.Option(ice.POD), value[mdb.NAME]))) }) m.RenameAppend("name", "pod") diff --git a/core/chat/ocean.go b/core/chat/ocean.go index 66b7c42c..0bf8fac0 100644 --- a/core/chat/ocean.go +++ b/core/chat/ocean.go @@ -24,7 +24,7 @@ func init() { }, Hand: func(m *ice.Message, arg ...string) { m.Fields(len(arg), "time,username") m.Cmdy(mdb.SELECT, RIVER, _river_key(m, OCEAN), mdb.HASH, aaa.USERNAME, arg) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { msg := m.Cmd(aaa.USER, value[aaa.USERNAME]) m.Push(aaa.USERNICK, msg.Append(aaa.USERNICK)) m.PushImages(aaa.AVATAR, msg.Append(aaa.AVATAR), kit.Select("60", "240", m.FieldsIsDetail())) diff --git a/core/chat/room.go b/core/chat/room.go index 8456dc95..d2663fac 100644 --- a/core/chat/room.go +++ b/core/chat/room.go @@ -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) { m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.ZONE, m.Option(mdb.ZONE), arg[2:]) - m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{"fields", "time,space"}).Table(func(index int, value ice.Maps, head []string) { + m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{"fields", "time,space"}).Tables(func(value ice.Maps) { m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name")) }) }}, diff --git a/core/chat/storm.go b/core/chat/storm.go index 9cca0fa4..147dff69 100644 --- a/core/chat/storm.go +++ b/core/chat/storm.go @@ -81,7 +81,7 @@ func init() { if m.Copy(msg); len(arg) > 1 { // 命令插件 m.ProcessField(arg[0], arg[1], ice.RUN) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { m.Cmdy(m.Space(value[ice.POD]), ctx.CONTEXT, value[ice.CTX], ctx.COMMAND, value[ice.CMD]) }) } else { diff --git a/core/chat/website.go b/core/chat/website.go index 4b0030af..0b1e48dc 100644 --- a/core/chat/website.go +++ b/core/chat/website.go @@ -148,7 +148,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin return true } func _website_search(m *ice.Message, kind, name, text string, arg ...string) { - m.Cmd(m.PrefixKey(), ice.OptionFields("")).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(m.PrefixKey(), ice.OptionFields("")).Tables(func(value ice.Maps) { m.PushSearch(value, mdb.TEXT, m.MergeWebsite(value[nfs.PATH])) }) } diff --git a/core/code/xterm.go b/core/code/xterm.go index bf74c9a9..cf0bc72c 100644 --- a/core/code/xterm.go +++ b/core/code/xterm.go @@ -4,12 +4,14 @@ import ( "encoding/base64" "os" "os/exec" + "path" "strings" "sync" "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" kit "shylinux.com/x/toolkits" @@ -20,7 +22,7 @@ const XTERM = "xterm" func init() { cache := sync.Map{} add := func(m *ice.Message, key string) string { - cmd := exec.Command(kit.Select("/bin/sh", m.Option(mdb.TYPE))) + cmd := exec.Command(cli.SystemFind(m, kit.Select("sh", m.Option(mdb.TYPE)))) cmd.Env = append(os.Environ(), "TERM=xterm") tty, err := pty.Start(cmd) @@ -30,18 +32,19 @@ func init() { m.Go(func() { defer m.Cmd(m.PrefixKey(), mdb.PRUNES) defer cache.Delete(key) + buf := make([]byte, ice.MOD_BUFS) for { if n, e := tty.Read(buf); !m.Warn(e) { m.Option(mdb.HASH, key) - m.Optionv(ice.MSG_OPTS, kit.Simple(mdb.HASH)) + m.Option(mdb.TEXT, base64.StdEncoding.EncodeToString(buf[:n])) m.Option(ice.MSG_DAEMON, m.Conf(m.PrefixKey(), kit.Keys(mdb.HASH, key, mdb.META, mdb.TEXT))) - m.PushNoticeGrow(kit.Format(kit.Dict(mdb.TYPE, "data", mdb.TEXT, base64.StdEncoding.EncodeToString(buf[:n])))) + m.PushNoticeGrow("data") } else { break } } - m.PushNoticeGrow(kit.Format(kit.Dict(mdb.TYPE, "exit"))) + m.PushNoticeGrow("exit") }) return key } @@ -61,18 +64,21 @@ func init() { } Index.MergeCommands(ice.Commands{ - XTERM: {Name: "xterm hash id auto", Help: "终端", Actions: ice.MergeAction(ice.Actions{ + XTERM: {Name: "xterm hash refresh", Help: "终端", Actions: ice.MergeAction(ice.Actions{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - if mdb.HashInputs(m, arg); arg[0] == mdb.TYPE { - m.Push(mdb.TYPE, "/usr/bin/python") - m.Push(mdb.TYPE, "/usr/bin/node") - m.Push(mdb.TYPE, "/bin/bash") - m.Push(mdb.TYPE, "/bin/sh") + 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") + case mdb.NAME: + m.Push(arg[0], path.Base(m.Option(mdb.TYPE))) } }}, mdb.CREATE: {Name: "create type name", Help: "创建", Hand: func(m *ice.Message, arg ...string) { if m.Option(mdb.TEXT, m.Option(ice.MSG_DAEMON)) != "" { - m.Echo(add(m, mdb.HashCreate(m, m.OptionSimple("type,name,text")).Result())) + m.Echo(add(m, mdb.HashCreate(m, arg, m.OptionSimple(mdb.TEXT)).Result())) } }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { @@ -106,7 +112,9 @@ func init() { }}, "input": {Name: "input", Help: "输入", Hand: func(m *ice.Message, arg ...string) { mdb.HashModify(m, m.OptionSimple(mdb.HASH), mdb.TIME, m.Time()) - get(m, m.Option(mdb.HASH)).Write([]byte(strings.Join(arg, ""))) + if b, e := base64.StdEncoding.DecodeString(strings.Join(arg, "")); m.Assert(e) { + get(m, m.Option(mdb.HASH)).Write(b) + } }}, }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,extra"), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { mdb.HashSelect(m, kit.Slice(arg, 0, 1)...) diff --git a/core/mall/asset.go b/core/mall/asset.go index a60f087e..7070a95b 100644 --- a/core/mall/asset.go +++ b/core/mall/asset.go @@ -82,7 +82,7 @@ func init() { }}, CHECK: {Name: "check", Help: "核算", Hand: func(m *ice.Message, arg ...string) { if m.Option(ACCOUNT) == "" { - m.Cmd(ASSET).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(ASSET).Tables(func(value ice.Maps) { _asset_check(m, value[ACCOUNT]) }) m.ProcessRefresh30ms() @@ -98,7 +98,7 @@ func init() { m.PushAction(CHECK) m.SortIntR(AMOUNT) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { amount += kit.Int(value[AMOUNT]) count += kit.Int(value[COUNT]) }) @@ -106,7 +106,7 @@ func init() { } else { m.PushAction(mdb.PLUGIN) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { amount += kit.Int(value[AMOUNT]) count++ }) diff --git a/core/mall/salary.go b/core/mall/salary.go index 814231b9..178edde2 100644 --- a/core/mall/salary.go +++ b/core/mall/salary.go @@ -24,7 +24,7 @@ func init() { }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { mdb.HashSelect(m, arg...) amount, income, tax := 0, 0, 0 - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { amount += kit.Int(value[AMOUNT]) income += kit.Int(value[INCOME]) tax += kit.Int(value[TAX]) diff --git a/core/team/count.go b/core/team/count.go index 92761e45..ed933a84 100644 --- a/core/team/count.go +++ b/core/team/count.go @@ -25,7 +25,7 @@ func init() { msg.SortTime(BEGIN_TIME) tz := int64(8) - msg.Table(func(index int, value ice.Maps, head []string) { + msg.Tables(func(value ice.Maps) { if value[mdb.STATUS] == CANCEL { return } diff --git a/core/team/task.go b/core/team/task.go index 3bbbce3c..6bf7d4d2 100644 --- a/core/team/task.go +++ b/core/team/task.go @@ -96,7 +96,7 @@ func init() { }, mdb.ZoneAction(), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { if mdb.ZoneSelect(m, arg...); len(arg) > 0 { status := map[string]int{} - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { m.PushButton(_task_action(m, value[STATUS])) status[value[mdb.STATUS]]++ }) diff --git a/core/wiki/word.go b/core/wiki/word.go index 06c29380..2c33e1fe 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -49,7 +49,7 @@ func init() { if arg[0] == mdb.FOREACH && arg[1] == "" { m.PushSearch(mdb.TYPE, "shy", mdb.NAME, "src/main.shy", mdb.TEXT, m.MergeCmd("")) } - m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH).Tables(func(value ice.Maps) { if arg[1] == "" { if value[mdb.TYPE] == SPARK { value[mdb.TEXT] = ice.Render(m, ice.RENDER_SCRIPT, value[mdb.TEXT]) diff --git a/meta.go b/meta.go index 1a18ddf3..e324c349 100644 --- a/meta.go +++ b/meta.go @@ -331,16 +331,16 @@ func (m *Message) Sort(key string, arg ...string) *Message { // 排序因子 number := map[int]int64{} table := []Maps{} - m.Table(func(index int, line Maps, head []string) { - switch table = append(table, line); cmp { + m.Table(func(index int, value Maps, head []string) { + switch table = append(table, value); cmp { case "int": - number[index] = kit.Int64(line[key]) + number[index] = kit.Int64(value[key]) case "int_r": - number[index] = -kit.Int64(line[key]) + number[index] = -kit.Int64(value[key]) case "time": - number[index] = int64(kit.Time(line[key])) + number[index] = int64(kit.Time(value[key])) case "time_r": - number[index] = -int64(kit.Time(line[key])) + number[index] = -int64(kit.Time(value[key])) } }) compare := func(i, j int, op string) bool { diff --git a/misc.go b/misc.go index 49a57666..10e934c3 100644 --- a/misc.go +++ b/misc.go @@ -309,23 +309,27 @@ func SplitCmd(name string) (list []Any) { BUTTON = "button" ) const ( - RUN = "run" - LIST = "list" - BACK = "back" - AUTO = "auto" - PAGE = "page" - ARGS = "args" + REFRESH = "refresh" + RUN = "run" + LIST = "list" + BACK = "back" + AUTO = "auto" + PAGE = "page" + ARGS = "args" ) item, button := kit.Dict(), false ls := kit.Split(name, SP, ":=@") for i := 1; i < len(ls); i++ { switch ls[i] { + case REFRESH: + list = append(list, kit.Dict(TYPE, BUTTON, NAME, ls[i], ACTION, AUTO)) + button = true case RUN: - list = append(list, kit.Dict(TYPE, BUTTON, NAME, RUN)) + list = append(list, kit.Dict(TYPE, BUTTON, NAME, ls[i])) button = true case LIST: - list = append(list, kit.Dict(TYPE, BUTTON, NAME, LIST, ACTION, AUTO)) + list = append(list, kit.Dict(TYPE, BUTTON, NAME, ls[i], ACTION, AUTO)) button = true case AUTO: list = append(list, kit.Dict(TYPE, BUTTON, NAME, LIST, ACTION, AUTO)) diff --git a/misc/alpha/alpha.go b/misc/alpha/alpha.go index 86fb1b80..356c518b 100644 --- a/misc/alpha/alpha.go +++ b/misc/alpha/alpha.go @@ -71,7 +71,7 @@ func (a alpha) List(m *ice.Message, arg ...string) { // 搜索词汇 msg := m.Cmd(cli.SYSTEM, "grep", "-rih", arg[1], m.Config(mdb.STORE)) - msg.CSV(msg.Result(), kit.Split(m.Config(mdb.FIELD))...).Table(func(index int, value ice.Maps, head []string) { + msg.CSV(msg.Result(), kit.Split(m.Config(mdb.FIELD))...).Tables(func(value ice.Maps) { if m.FieldsIsDetail() { m.Push(mdb.DETAIL, value, kit.Split(m.Config(mdb.FIELD))) m.Push(mdb.TIME, m.Time()) diff --git a/misc/bash/configs.go b/misc/bash/configs.go index 79199f21..1b3a1e1a 100644 --- a/misc/bash/configs.go +++ b/misc/bash/configs.go @@ -10,7 +10,7 @@ import ( func init() { Index.Merge(&ice.Context{Commands: ice.Commands{ "/configs": {Name: "/configs", Help: "配置", Hand: func(m *ice.Message, arg ...string) { - m.Cmd("web.code.git.configs").Table(func(index int, value ice.Maps, head []string) { + m.Cmd("web.code.git.configs").Tables(func(value ice.Maps) { if strings.HasPrefix(value[mdb.NAME], "url") { m.Echo(`git config --global "%s" "%s"`, value[mdb.NAME], value[mdb.VALUE]) m.Echo(ice.NL) diff --git a/misc/bash/favor.go b/misc/bash/favor.go index 25941182..7b74a006 100644 --- a/misc/bash/favor.go +++ b/misc/bash/favor.go @@ -18,7 +18,7 @@ func init() { "/favor": {Name: "/favor", Help: "收藏", Actions: ice.Actions{ mdb.EXPORT: {Name: "export zone name", Help: "导出", Hand: func(m *ice.Message, arg ...string) { m.Echo("#!/bin/sh\n\n") - m.Cmdy(FAVOR, m.Option(mdb.ZONE)).Table(func(index int, value ice.Maps, head []string) { + m.Cmdy(FAVOR, m.Option(mdb.ZONE)).Tables(func(value ice.Maps) { if m.Option(mdb.NAME) == "" || m.Option(mdb.NAME) == value[mdb.NAME] { m.Echo("# %v\n%v\n\n", value[mdb.NAME], value[mdb.TEXT]) } diff --git a/misc/bash/grant.go b/misc/bash/grant.go index 7977ee96..50cc7789 100644 --- a/misc/bash/grant.go +++ b/misc/bash/grant.go @@ -23,7 +23,7 @@ func init() { if m.Cmdy(SESS, arg); len(arg) > 0 && m.Append("grant") == "" { m.Process("_confirm", "授权设备") } - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { if value["grant"] == "" { m.PushButton("confirm", mdb.REMOVE) } else { diff --git a/misc/bash/input.go b/misc/bash/input.go index d377325b..a0185010 100644 --- a/misc/bash/input.go +++ b/misc/bash/input.go @@ -15,7 +15,7 @@ func init() { word := list[kit.Int(m.Option("index"))] switch arg[0] { case "shy": - m.Cmd("web.code.input.find", word).Table(func(index int, value ice.Maps, head []string) { + m.Cmd("web.code.input.find", word).Tables(func(value ice.Maps) { m.Echo(value["text"]).Echo(" ") }) diff --git a/misc/chrome/change.go b/misc/chrome/change.go index 797f08ff..3ea9d917 100644 --- a/misc/chrome/change.go +++ b/misc/chrome/change.go @@ -29,7 +29,7 @@ func (c change) List(m *ice.Message, arg ...string) { c.send(m, kit.Slice(arg, 0, 2)) return } - c.send(m.Spawn(), kit.Slice(arg, 0, 2), m.CommandKey(), kit.Slice(arg, 2)).Table(func(index int, value ice.Maps, head []string) { + c.send(m.Spawn(), kit.Slice(arg, 0, 2), m.CommandKey(), kit.Slice(arg, 2)).Tables(func(value ice.Maps) { m.Push(mdb.TEXT, kit.ReplaceAll(value[mdb.TEXT], "<", "<", ">", ">")) }) if len(arg) > 3 { diff --git a/misc/chrome/field.go b/misc/chrome/field.go index eaf838fa..c8e22d40 100644 --- a/misc/chrome/field.go +++ b/misc/chrome/field.go @@ -36,7 +36,7 @@ func (f field) Command(m *ice.Message, arg ...string) { }) } func (f field) Run(m *ice.Message, arg ...string) { - f.Zone.List(m.Spawn(), m.Option(tcp.HOST), arg[0]).Table(func(index int, value ice.Maps, head []string) { + f.Zone.List(m.Spawn(), m.Option(tcp.HOST), arg[0]).Tables(func(value ice.Maps) { m.Cmdy(value[mdb.INDEX], arg[1:]) }) } diff --git a/misc/chrome/operate.go b/misc/chrome/operate.go index 5bfcb8ba..33fa070a 100644 --- a/misc/chrome/operate.go +++ b/misc/chrome/operate.go @@ -20,8 +20,8 @@ func (o operate) send(m *ice.Message, arg ...ice.Any) *ice.Message { func (o operate) Inputs(m *ice.Message, arg ...string) { switch arg[0] { case mdb.ZONE: - o.send(m.Spawn()).Table(func(index int, value ice.Maps, head []string) { - o.send(m.Spawn(), value[WID]).Table(func(index int, value ice.Maps, head []string) { + o.send(m.Spawn()).Tables(func(value ice.Maps) { + o.send(m.Spawn(), value[WID]).Tables(func(value ice.Maps) { m.Push(mdb.ZONE, kit.ParseURL(value[URL]).Host) }) }).Sort(mdb.ZONE) @@ -32,7 +32,7 @@ func (o operate) Spide(m *ice.Message, arg ...string) { o.send(m, arg) return } - o.send(m, arg[:2], "spide").Table(func(index int, value ice.Maps, head []string) { + o.send(m, arg[:2], "spide").Tables(func(value ice.Maps) { switch value[mdb.TYPE] { case wiki.VIDEO: m.PushVideos(mdb.SHOW, value[mdb.LINK]) diff --git a/misc/chrome/style.go b/misc/chrome/style.go index 64d1f6ca..a4661d68 100644 --- a/misc/chrome/style.go +++ b/misc/chrome/style.go @@ -19,7 +19,7 @@ func (s style) Inputs(m *ice.Message, arg ...string) { s.operate.Inputs(m, arg...) } func (s style) Command(m *ice.Message, arg ...string) { - s.Zone.List(m, m.Option(tcp.HOST)).Table(func(index int, value ice.Maps, head []string) { + s.Zone.List(m, m.Option(tcp.HOST)).Tables(func(value ice.Maps) { s.send(m, "1", m.Option(TID), m.CommandKey(), value[SELECTOR], value[PROPERTY]) }) } diff --git a/misc/git/repos.go b/misc/git/repos.go index b51efd62..64e77fff 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -55,7 +55,7 @@ func init() { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Conf(REPOS, mdb.HASH, "") _repos_insert(m, path.Base(kit.Pwd()), kit.Pwd()) - m.Cmd(nfs.DIR, ice.USR, "name,path").Table(func(index int, value ice.Maps, head []string) { + m.Cmd(nfs.DIR, ice.USR, "name,path").Tables(func(value ice.Maps) { _repos_insert(m, value[mdb.NAME], value[nfs.PATH]) }) cli.IsAlpine(m, "git", "apk add git") diff --git a/misc/git/server.go b/misc/git/server.go index df0f0260..eb85b616 100644 --- a/misc/git/server.go +++ b/misc/git/server.go @@ -182,7 +182,7 @@ func init() { m.Cmdy(cli.SYSTEM, GIT, INIT, "--bare", m.Option(mdb.NAME)) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(REPOS, ice.OptionFields("time,name,path")).Table(func(index int, value ice.Maps, head []string) { + m.Cmdy(REPOS, ice.OptionFields("time,name,path")).Tables(func(value ice.Maps) { remote := strings.Split(m.MergeURL2("/x/"+value[REPOS]), "?")[0] m.Option(cli.CMD_DIR, value[nfs.PATH]) m.Cmd(cli.SYSTEM, GIT, PUSH, remote, MASTER) @@ -195,7 +195,7 @@ func init() { }}, }, Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.DIR_ROOT, ice.USR_LOCAL_REPOS); len(arg) == 0 { - m.Cmdy(nfs.DIR, nfs.PWD).Table(func(index int, value ice.Maps, head []string) { + m.Cmdy(nfs.DIR, nfs.PWD).Tables(func(value ice.Maps) { m.PushScript("git clone " + m.MergeLink("/x/"+strings.TrimSuffix(value[nfs.PATH], ice.PS))) }) m.Cut("time,path,size,script,action") diff --git a/misc/git/spide.go b/misc/git/spide.go index af6575a6..7f388a6f 100644 --- a/misc/git/spide.go +++ b/misc/git/spide.go @@ -117,7 +117,7 @@ func init() { if len(arg) == 1 { // 目录列表 m.Option(nfs.DIR_DEEP, ice.TRUE) color := []string{cli.YELLOW, cli.BLUE, cli.CYAN, cli.RED} - nfs.Dir(m, nfs.PATH).Table(func(index int, value ice.Maps, head []string) { + nfs.Dir(m, nfs.PATH).Tables(func(value ice.Maps) { m.Push(cli.COLOR, color[strings.Count(value[nfs.PATH], ice.PS)%len(color)]) }) return diff --git a/misc/git/status.go b/misc/git/status.go index 78f3d1bc..ed3f3384 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -27,7 +27,7 @@ func _status_tag(m *ice.Message, tags string) string { } func _status_tags(m *ice.Message, repos string) { vs := ice.Maps{} - m.Cmd(STATUS).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(STATUS).Tables(func(value ice.Maps) { if value[mdb.TYPE] == "##" { if value[REPOS] == ice.RELEASE { value[REPOS] = ice.ICE @@ -92,7 +92,7 @@ func _status_each(m *ice.Message, title string, cmds ...string) { toast(cli.BEGIN, count, total) list := []string{} - m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(REPOS, ice.OptionFields("name,path")).Tables(func(value ice.Maps) { toast(value[REPOS], count, total) if msg := m.Cmd(cmds, ice.Option{cli.CMD_DIR, value[nfs.PATH]}); !cli.IsSuccess(msg) { @@ -126,7 +126,7 @@ func _status_stat(m *ice.Message, files, adds, dels int) (int, int, int) { return files, adds, dels } func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) { - m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(REPOS, ice.OptionFields("name,path")).Tables(func(value ice.Maps) { m.Option(cli.CMD_DIR, value[nfs.PATH]) diff := m.Cmdx(cli.SYSTEM, GIT, STATUS, "-sb") tags := m.Cmdx(cli.SYSTEM, GIT, "describe", "--tags") diff --git a/misc/git/total.go b/misc/git/total.go index f3641997..9472b040 100644 --- a/misc/git/total.go +++ b/misc/git/total.go @@ -29,7 +29,7 @@ func init() { TOTAL: {Name: "total repos auto pie", Help: "统计量", Actions: ice.Actions{ PIE: {Name: "pie", Help: "饼图", Hand: func(m *ice.Message, arg ...string) { defer m.Display("/plugin/story/pie.js") - m.Cmd(TOTAL).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(TOTAL).Tables(func(value ice.Maps) { if value[REPOS] == "total" { m.StatusTimeCount(REPOS, "total", "value", "1", "total", value["rest"]) return @@ -41,7 +41,7 @@ func init() { }, Hand: func(m *ice.Message, arg ...string) { if len(arg) > 0 { // 提交详情 arg[0] = kit.Replace(arg[0], "src", "contexts") - m.Cmd(REPOS, ice.OptionFields("name,path")).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(REPOS, ice.OptionFields("name,path")).Tables(func(value ice.Maps) { if value[REPOS] == arg[0] { m.Cmdy("_sum", value[nfs.PATH], arg[1:]) } @@ -62,7 +62,7 @@ func init() { mu.Lock() defer mu.Unlock() - msg.Table(func(index int, value ice.Maps, head []string) { + msg.Tables(func(value ice.Maps) { if kit.Int(value["days"]) > days { days = kit.Int(value["days"]) } diff --git a/misc/input/wubi.go b/misc/input/wubi.go index 338fccca..f9bd7efb 100644 --- a/misc/input/wubi.go +++ b/misc/input/wubi.go @@ -38,7 +38,7 @@ func (w wubi) Input(m *ice.Message, arg ...string) { } m.Option(ice.CACHE_LIMIT, "10") - m.Cmd(w, "word", arg[0]).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(w, "word", arg[0]).Tables(func(value ice.Maps) { m.Echo(value[mdb.TEXT] + ice.NL) }) } diff --git a/misc/lark/home.go b/misc/lark/home.go index b9aca14e..999a137c 100644 --- a/misc/lark/home.go +++ b/misc/lark/home.go @@ -21,8 +21,8 @@ func init() { text, link, list := kit.Select("", arg, 3), kit.MergeURL2(m.Conf(web.SHARE, kit.Keym("domain")), "/chat/lark/sso"), []string{} if len(arg) == 0 { - m.Cmd("web.chat./river").Table(func(index int, val ice.Maps, head []string) { - m.Cmd("web.chat./river", val[mdb.HASH], chat.STORM).Table(func(index int, value ice.Maps, head []string) { + m.Cmd("web.chat./river").Tables(func(val ice.Maps) { + m.Cmd("web.chat./river", val[mdb.HASH], chat.STORM).Tables(func(value ice.Maps) { list = append(list, kit.Keys(val[mdb.NAME], value[mdb.NAME]), ice.CMD, kit.Format([]string{HOME, val[mdb.HASH], value[mdb.HASH], val[mdb.NAME] + "." + value[mdb.NAME]})) }) @@ -31,7 +31,7 @@ func init() { m.Option(ice.MSG_RIVER, arg[0]) m.Option(ice.MSG_STORM, arg[1]) link = kit.MergeURL(link, chat.RIVER, arg[0], chat.STORM, arg[1]) - m.Cmd("web.chat./river", arg[0], chat.STORM, arg[1]).Table(func(index int, value ice.Maps, head []string) { + m.Cmd("web.chat./river", arg[0], chat.STORM, arg[1]).Tables(func(value ice.Maps) { list = append(list, value[ice.CMD], ice.CMD, kit.Keys(value[ice.CTX], value[ice.CMD])) }) } diff --git a/misc/ssh/channel.go b/misc/ssh/channel.go index 8b7cd978..7f33efc7 100644 --- a/misc/ssh/channel.go +++ b/misc/ssh/channel.go @@ -101,7 +101,7 @@ func init() { m.Action(mdb.PRUNES) mdb.HashSelect(m, arg...) m.Set(ice.MSG_APPEND, ctx.ACTION) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) }) return diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go index ac6a518e..45f6b6d8 100644 --- a/misc/ssh/connect.go +++ b/misc/ssh/connect.go @@ -204,7 +204,7 @@ func init() { }) }}, }, mdb.HashActionStatus()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushButton(kit.Select("", "command,session", value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) }) if len(arg) == 0 { diff --git a/misc/ssh/rsa.go b/misc/ssh/rsa.go index 7c2c21c4..106c7ec9 100644 --- a/misc/ssh/rsa.go +++ b/misc/ssh/rsa.go @@ -34,7 +34,7 @@ func init() { )) }}, mdb.EXPORT: {Name: "export key=.ssh/id_rsa pub=.ssh/id_rsa.pub", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(m.PrefixKey(), m.Option(mdb.HASH)).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(m.PrefixKey(), m.Option(mdb.HASH)).Tables(func(value ice.Maps) { m.Cmdx(nfs.SAVE, kit.HomePath(m.Option("key")), value[PRIVATE]) m.Cmdx(nfs.SAVE, kit.HomePath(m.Option("pub")), value[PUBLIC]) }) diff --git a/misc/ssh/service.go b/misc/ssh/service.go index 190fc3b4..b62dc461 100644 --- a/misc/ssh/service.go +++ b/misc/ssh/service.go @@ -31,7 +31,7 @@ func _ssh_config(m *ice.Message, h string) *ssh.ServerConfig { m.Log_AUTH(tcp.HOSTPORT, conn.RemoteAddr(), aaa.USERNAME, conn.User()) err = nil // 本机用户 } else { - m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, h), mdb.LIST).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, h), mdb.LIST).Tables(func(value ice.Maps) { if !strings.HasPrefix(value[mdb.NAME], conn.User()+"@") { return } @@ -135,7 +135,7 @@ func init() { }}, mdb.EXPORT: {Name: "export authkey=.ssh/authorized_keys", Help: "导出", Hand: func(m *ice.Message, arg ...string) { list := []string{} - m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, kit.Hashs(m.Option(tcp.PORT))), mdb.LIST).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(mdb.SELECT, SERVICE, kit.Keys(mdb.HASH, kit.Hashs(m.Option(tcp.PORT))), mdb.LIST).Tables(func(value ice.Maps) { list = append(list, fmt.Sprintf("%s %s %s", value[mdb.TYPE], value[mdb.TEXT], value[mdb.NAME])) }) diff --git a/misc/ssh/session.go b/misc/ssh/session.go index 745bf753..f54e5a9c 100644 --- a/misc/ssh/session.go +++ b/misc/ssh/session.go @@ -76,7 +76,7 @@ func init() { }}, }, mdb.ZoneAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) == 0 { - mdb.HashSelect(m, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushButton(kit.Select("", ctx.COMMAND, value[mdb.STATUS] == tcp.OPEN), mdb.REMOVE) }) return @@ -85,7 +85,7 @@ func init() { m.Action(ctx.COMMAND, mdb.PAGE) m.OptionPage(kit.Slice(arg, 2)...) m.Fields(len(kit.Slice(arg, 1, 2)), "time,id,type,text") - mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Table(func(index int, value ice.Maps, head []string) { + mdb.ZoneSelect(m, kit.Slice(arg, 0, 2)...).Tables(func(value ice.Maps) { m.PushButton(kit.Select("", mdb.REPEAT, value[mdb.TYPE] == CMD)) }) }}, diff --git a/misc/tmux/session.go b/misc/tmux/session.go index adc311b6..f3af4311 100644 --- a/misc/tmux/session.go +++ b/misc/tmux/session.go @@ -129,7 +129,7 @@ func init() { }}, SCRIPT: {Name: "script name", Help: "脚本", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(SCRIPT, m.Option(mdb.NAME)).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(SCRIPT, m.Option(mdb.NAME)).Tables(func(value ice.Maps) { switch value[mdb.TYPE] { case "shell": for _, line := range kit.Split(value[mdb.TEXT], ice.NL, ice.NL, ice.NL) { @@ -170,7 +170,7 @@ func init() { // 会话列表 m.Split(m.Cmdx(cli.SYSTEM, TMUX, "list-session", "-F", m.Config(FORMAT)), m.Config(FIELDS), ice.FS, ice.NL) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { switch value["tag"] { case "1": m.PushButton("") diff --git a/misc/vim/favor.go b/misc/vim/favor.go index a91e55f4..318efc86 100644 --- a/misc/vim/favor.go +++ b/misc/vim/favor.go @@ -21,7 +21,7 @@ func init() { }, Commands: ice.Commands{ "/favor": {Name: "/favor", Help: "收藏", Actions: ice.Actions{ mdb.SELECT: {Name: "select", Help: "主题", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(FAVOR).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(FAVOR).Tables(func(value ice.Maps) { m.Echo(value[mdb.ZONE]).Echo(ice.NL) }) }}, @@ -29,7 +29,7 @@ func init() { m.Cmd(FAVOR, mdb.INSERT) }}, }, Hand: func(m *ice.Message, arg ...string) { - m.Cmd(FAVOR, m.Option(mdb.ZONE)).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(FAVOR, m.Option(mdb.ZONE)).Tables(func(value ice.Maps) { m.Echo("%v\n", m.Option(mdb.ZONE)).Echo("%v:%v:%v:(%v): %v\n", value[nfs.FILE], value[nfs.LINE], "1", value[mdb.NAME], value[mdb.TEXT]) }) diff --git a/misc/wx/favor.go b/misc/wx/favor.go index 09c0b1c5..12ff4c67 100644 --- a/misc/wx/favor.go +++ b/misc/wx/favor.go @@ -19,7 +19,7 @@ func init() { FAVOR: {Name: "favor text:text auto create", Help: "收藏", Actions: ice.MergeAction(ice.Actions{ mdb.CREATE: {Name: "create type name text", Help: "添加"}, }, mdb.HashAction()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Table(func(index int, value ice.Maps, head []string) { + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushQRCode(mdb.SCAN, kit.MergeURL(m.Config(mdb.LINK), aaa.USERNAME, value[mdb.TEXT])) }) }}, diff --git a/misc/wx/menu.go b/misc/wx/menu.go index 0789cd7b..9f72b5d8 100644 --- a/misc/wx/menu.go +++ b/misc/wx/menu.go @@ -19,13 +19,13 @@ func _wx_action(m *ice.Message) { `, m.Option("ToUserName"), m.Option("FromUserName"), m.Option("CreateTime"), "news") count := 0 - m.Table(func(index int, value ice.Maps, head []string) { count++ }) + m.Tables(func(value ice.Maps) { count++ }) m.Echo(`%d`, count) share := m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, web.LOGIN) m.Echo(``) - m.Table(func(index int, value ice.Maps, head []string) { + m.Tables(func(value ice.Maps) { m.Echo(` <![CDATA[%s]]> diff --git a/option.go b/option.go index c51fe4d4..c4cac671 100644 --- a/option.go +++ b/option.go @@ -181,10 +181,15 @@ func (m *Message) Toast(text string, arg ...Any) { // [title [duration [progress m.PushNoticeToast("", text, arg) } func (m *Message) PushNotice(arg ...Any) { + m.Optionv(MSG_OPTS, m.meta[MSG_OPTION]) if m.Option(MSG_USERPOD) == "" { m.Cmd(SPACE, m.Option(MSG_DAEMON), arg) } else { - m.Cmd("web.spide", OPS, m.MergeURL2("/share/toast/"), kit.Format(kit.Dict("hash", m.Option("hash"), POD, m.Option(MSG_DAEMON), "cmds", kit.Simple(arg...)))) + opts := kit.Dict(POD, m.Option(MSG_DAEMON), "cmds", kit.Simple(arg...)) + for _, k := range m.meta[MSG_OPTS] { + opts[k] = m.Option(k) + } + m.Cmd("web.spide", OPS, m.MergeURL2("/share/toast/"), kit.Format(opts)) } } func (m *Message) PushNoticeGrow(arg ...Any) {