From d62af7bc90379d9614e647e72d25a871f4ad32fd Mon Sep 17 00:00:00 2001 From: shy Date: Fri, 16 Feb 2024 16:05:33 +0800 Subject: [PATCH] opt toast --- base/cli/qrcode.go | 3 ++- base/cli/runtime.go | 2 +- base/web/count.go | 6 ++--- base/web/dream.go | 50 +++++++++++++++++----------------------- base/web/matrix.css | 5 ++-- base/web/matrix.go | 24 ++++++++++--------- base/web/option.go | 37 ++++++++++++++--------------- base/web/route.go | 18 ++++++--------- base/web/space.go | 2 +- base/web/store.go | 2 +- core/chat/macos/macos.go | 2 +- core/code/bench.go | 13 ++++------- core/code/install.go | 9 ++++---- core/code/upgrade.go | 7 +++--- core/wiki/table.go | 2 +- meta.go | 17 ++++++++------ misc.go | 2 +- misc/bash/run.go | 2 +- misc/chrome/field.go | 2 +- misc/git/repos.go | 14 ++++------- misc/java/spring.go | 2 +- misc/lark/talk.go | 2 +- misc/ssh/connect.go | 22 ++++++------------ misc/ssh/relay/relay.go | 3 +-- misc/ssh/relay/trans.go | 3 +-- option.go | 7 ++++-- 26 files changed, 118 insertions(+), 140 deletions(-) diff --git a/base/cli/qrcode.go b/base/cli/qrcode.go index dc40ae69..5e0d8028 100644 --- a/base/cli/qrcode.go +++ b/base/cli/qrcode.go @@ -68,9 +68,10 @@ func init() { m.OptionDefault(FG, BLACK, BG, WHITE) _qrcode_cli(m, kit.Select(kit.Select(ice.Info.Make.Domain, ice.Info.Domain), arg, 0)) } else { - m.OptionDefault(SIZE, kit.Select("360", "280", m.IsMobileUA())) + // m.OptionDefault(SIZE, kit.Select("360", "280", m.IsMobileUA())) m.Option(FG, kit.Select(m.Option(ice.MSG_FG), arg, 1)) m.Option(BG, kit.Select(m.Option(ice.MSG_BG), arg, 2)) + m.Option(SIZE, kit.Select(m.OptionDefault(SIZE, "360"), arg, 3)) switch m.Option(ice.MSG_THEME) { case LIGHT, WHITE: m.OptionDefault(FG, BLACK, BG, WHITE) diff --git a/base/cli/runtime.go b/base/cli/runtime.go index e548af73..3659518a 100644 --- a/base/cli/runtime.go +++ b/base/cli/runtime.go @@ -103,7 +103,7 @@ func _runtime_hostinfo(m *ice.Message) { } } func _runtime_diskinfo(m *ice.Message) { - m.Spawn().Split(kit.Replace(m.Cmdx(SYSTEM, "df", "-h"), "Mounted on", "Mountedon"), "", lex.SP, lex.NL).Table(func(index int, value ice.Maps, head []string) { + m.Spawn().Split(kit.Replace(m.Cmdx(SYSTEM, "df", "-h"), "Mounted on", "Mountedon"), "", lex.SP, lex.NL).Table(func(value ice.Maps, index int, head []string) { kit.If(strings.HasPrefix(value["Filesystem"], "/dev"), func() { m.Push("", value, head) }) }) m.RenameAppend("%iused", "piused", "Use%", "Usep") diff --git a/base/web/count.go b/base/web/count.go index 61b4a946..a3146c70 100644 --- a/base/web/count.go +++ b/base/web/count.go @@ -88,12 +88,12 @@ func init() { m.StatusTimeCount(stat) }}, aaa.LOCATION: {Hand: func(m *ice.Message, arg ...string) { - GoToast(mdb.HashSelects(m).Sort(mdb.COUNT, ice.INT_R), "", func(toast func(string, int, int)) []string { - m.Table(func(index int, value ice.Maps) { + GoToast(mdb.HashSelects(m).Sort(mdb.COUNT, ice.INT_R), func(toast func(string, int, int)) []string { + m.Table(func(value ice.Maps, index, total int) { if value[aaa.LOCATION] == "" { location := kit.Format(kit.Value(SpideGet(m, "http://opendata.baidu.com/api.php?co=&resource_id=6006&oe=utf8", "query", value[mdb.NAME]), "data.0.location")) mdb.HashModify(m, mdb.HASH, value[mdb.HASH], aaa.LOCATION, location) - toast(kit.Select(value[mdb.NAME], location), index, m.Length()) + toast(kit.Select(value[mdb.NAME], location), index, total) m.Sleep300ms() } }) diff --git a/base/web/dream.go b/base/web/dream.go index 0f159de9..8e252b71 100644 --- a/base/web/dream.go +++ b/base/web/dream.go @@ -158,14 +158,10 @@ func _dream_binary(m *ice.Message, p string) { if bin := path.Join(m.Option(cli.CMD_DIR), ice.BIN_ICE_BIN); nfs.Exists(m, bin) { return } else if kit.IsUrl(p) || strings.HasPrefix(p, S()) { - GoToast(m, DOWNLOAD, func(toast func(string, int, int)) (list []string) { + GoToast(m, func(toast func(string, int, int)) []string { begin := time.Now() SpideSave(m, bin, kit.MergeURL(p, cli.GOOS, runtime.GOOS, cli.GOARCH, runtime.GOARCH), func(count, total, value int) { - if strings.HasPrefix(p, S()) { - toast(m.Option(mdb.NAME), count, total) - } else { - toast(m.Option(mdb.NAME)+"\n"+kit.FormatShow(cli.COST, kit.FmtDuration(time.Now().Sub(begin))), count, total) - } + toast(m.Option(mdb.NAME)+lex.NL+kit.FormatShow(cli.COST, kit.FmtDuration(time.Now().Sub(begin))), count, total) }) return nil }) @@ -310,8 +306,8 @@ func init() { }) }}, cli.BUILD: {Name: "build name", Hand: func(m *ice.Message, arg ...string) { - m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey())) compile := cli.SystemFind(m, "go") != "" + m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey())) m.Cmd("", FOR_FLOW, m.Option(mdb.NAME), kit.JoinWord(cli.SH, ice.ETC_MISS_SH), func(p string) bool { if compile && nfs.Exists(m, path.Join(p, ice.SRC_MAIN_GO)) { return false @@ -342,27 +338,23 @@ func init() { m.ProcessHold() }}, FOR_FLOW: {Name: "forFlow name cmd*='sh etc/miss.sh'", Help: "流程", Icon: "bi bi-terminal", Hand: func(m *ice.Message, arg ...string) { - list := []string{} - DreamEach(m.Spawn(ice.Maps{ice.MSG_DAEMON: ""}), m.Option(mdb.NAME), "", func(name string) { list = append(list, name) }) + msg := m.Spawn() + DreamEach(m.Spawn(ice.Maps{ice.MSG_DAEMON: ""}), m.Option(mdb.NAME), "", func(name string) { msg.Push(SPACE, name) }) m.Options(ctx.DISPLAY, PLUGIN_XTERM, cli.CMD_OUTPUT, nfs.NewWriteCloser(func(buf []byte) (int, error) { PushNoticeGrow(m.Options(ice.MSG_COUNT, "0"), strings.ReplaceAll(string(buf), lex.NL, "\r\n")) return len(buf), nil }, func() error { return nil })) - GoToast(m, "", func(toast func(string, int, int)) []string { - kit.For(list, func(index int, name string) { - toast(name, index, len(list)) - p := path.Join(ice.USR_LOCAL_WORK, name) - switch cb := m.OptionCB("").(type) { - case func(string) bool: - if cb(p) { - return - } + GoToastTable(msg, SPACE, func(value ice.Maps) { + p := path.Join(ice.USR_LOCAL_WORK, value[SPACE]) + switch cb := m.OptionCB("").(type) { + case func(string) bool: + if cb(p) { + return } - PushNoticeGrow(m, strings.ReplaceAll(kit.Format("[%s]%s$ %s\n", time.Now().Format(ice.MOD_TIME_ONLY), name, m.Option(ice.CMD)), lex.NL, "\r\n")) - m.Cmd(cli.SYSTEM, kit.Split(m.Option(ice.CMD)), kit.Dict(cli.CMD_DIR, p)).Sleep300ms() - PushNoticeGrow(m, "\r\n\r\n\r\n") - }) - return nil + } + PushNoticeGrow(m, strings.ReplaceAll(kit.Format("[%s]%s$ %s\r\n", time.Now().Format(ice.MOD_TIME_ONLY), value[SPACE], m.Option(ice.CMD)), lex.NL, "\r\n")) + m.Cmd(cli.SYSTEM, kit.Split(m.Option(ice.CMD)), kit.Dict(cli.CMD_DIR, p)).Sleep300ms() + PushNoticeGrow(m, "\r\n\r\n\r\n") }) }}, ctx.CMDS: {Name: "cmds name cmds*", Help: "命令", Icon: "bi bi-terminal", Hand: func(m *ice.Message, arg ...string) { @@ -495,8 +487,8 @@ func DreamEach(m *ice.Message, name string, status string, cb func(string)) *ice if len(list) == 0 { return m } - GoToast(m, "", func(toast func(string, int, int)) []string { - kit.For(list, func(index int, name string) { toast(name, index, len(list)); cb(name) }) + GoToast(m, func(toast func(string, int, int)) []string { + kit.For(list, func(name string, index, total int) { toast(name, index, total); cb(name) }) return nil }) return m @@ -514,10 +506,10 @@ func DreamListSpide(m *ice.Message, list []string, types string, cb func(dev, or kit.If(value[mdb.TYPE] == types, func() { list = append(list, value[mdb.NAME]) }) }) has := map[string]bool{} - GoToast(m, "", func(toast func(name string, count, total int)) []string { - kit.For(list, func(index int, dev string) { - toast(dev, index, len(list)) - if origin := m.Cmdv(SPIDE, dev, CLIENT_ORIGIN); !has[origin] { + GoToast(m, func(toast func(name string, count, total int)) []string { + kit.For(list, func(dev string, index, total int) { + toast(dev, index, total) + if origin := SpideOrigin(m, dev); !has[origin] { has[origin] = true cb(dev, origin) } diff --git a/base/web/matrix.css b/base/web/matrix.css index 365842a9..7ca55fc7 100644 --- a/base/web/matrix.css +++ b/base/web/matrix.css @@ -10,14 +10,15 @@ fieldset.web.matrix>div.output>table.content div.item div.title>span { cursor:po fieldset.web.matrix>div.output>table.content div.item div.status i { font-size:var(--status-font-size); padding:0; } fieldset.web.matrix>div.output>table.content div.item div.action { margin-top:var(--input-margin); overflow:hidden; } fieldset.web.matrix>div.output>table.content div.item div.action input.icons { display:none; } -fieldset.web.matrix>div.output>table.content div.item:hover { background-color:unset; color:unset; } fieldset.web.matrix>div.output>table.content div.item div.title:hover { background-color:unset; } fieldset.web.matrix>div.output>table.content div.item div.title span:hover { background-color:var(--hover-bg-color); } fieldset.web.matrix>div.output>table.content div.item div.status div.item:hover { background-color:var(--hover-bg-color); } -fieldset.web.matrix>div.output>table.content div.item.stop div.title>span { color:var(--disable-fg-color); } +fieldset.web.matrix>div.output>table.content div.item:hover { background-color:unset; color:unset; } fieldset.web.matrix>div.output>table.content div.item.notice { background-color:var(--notice-bg-color); color:var(--notice-fg-color); } fieldset.web.matrix>div.output>table.content div.item.danger { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } fieldset.web.matrix>div.output>table.content div.item.danger div.status div.item { color:var(--danger-fg-color); } +fieldset.web.matrix>div.output>table.content div.item.notice div.status div.item { color:var(--notice-fg-color); } +fieldset.web.matrix>div.output>table.content div.item.stop div.title>span { color:var(--disable-fg-color); } fieldset.web.matrix>div.output>table.content tr:not(:hover) div.action { visibility:hidden; } body:not(.mobile) fieldset.web.matrix>div.output>table.content thead { z-index:2; } body:not(.mobile) fieldset.web.matrix>div.output>table.content th:first-child { position:sticky; left:2px; z-index:2; } diff --git a/base/web/matrix.go b/base/web/matrix.go index 045404fe..a3612ff2 100644 --- a/base/web/matrix.go +++ b/base/web/matrix.go @@ -59,14 +59,16 @@ func _matrix_action(m *ice.Message, action string, arg ...string) { func _matrix_dream(m *ice.Message, action string, arg ...string) { m.Cmd(Space(m, m.Option(DOMAIN)), DREAM, kit.Select(m.ActionKey(), action), m.OptionSimple(mdb.NAME), arg) } +func _matrix_cmd(m *ice.Message, cmd string, arg ...string) *ice.Message { + return m.Cmdy(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), kit.Select(m.ActionKey(), cmd), arg) +} const MATRIX = "matrix" func init() { Index.MergeCommands(ice.Commands{ MATRIX: {Name: "matrix refresh", Help: "矩阵", Meta: kit.Dict( - ice.CTX_ICONS, kit.Dict(STATUS, "bi bi-git"), - ice.CTX_TRANS, kit.Dict(STATUS, "源码"), + ice.CTX_ICONS, kit.Dict(STATUS, "bi bi-git"), ice.CTX_TRANS, kit.Dict(STATUS, "源码"), ), Actions: ice.MergeActions(ice.Actions{ mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(DREAM, mdb.INPUTS, arg) }}, mdb.CREATE: {Name: "create name*=hi icons repos binary template", Hand: func(m *ice.Message, arg ...string) { m.Cmd(DREAM, mdb.CREATE, arg) }}, @@ -74,15 +76,16 @@ func init() { cli.START: {Hand: func(m *ice.Message, arg ...string) { _matrix_dream(m, "") }}, cli.STOP: {Hand: func(m *ice.Message, arg ...string) { _matrix_dream(m, "") }}, COMPILE: {Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), COMPILE, cli.AMD64, cli.LINUX, ice.SRC_MAIN_GO).ProcessHold() + _matrix_cmd(m, "", cli.AMD64, cli.LINUX, ice.SRC_MAIN_GO).ProcessHold() }}, UPGRADE: {Hand: func(m *ice.Message, arg ...string) { - m.Cmd(Space(m, kit.Keys(m.Option(DOMAIN), m.Option(mdb.NAME))), UPGRADE).Sleep3s() + _matrix_cmd(m, "").ProcessRefresh().Sleep3s() }}, INSTALL: {Hand: func(m *ice.Message, arg ...string) { - m.OptionDefault(nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME))) if kit.IsIn(m.Cmdv(Space(m, m.Option(DOMAIN)), SPIDE, ice.DEV_IP, CLIENT_HOSTNAME), m.Cmd(tcp.HOST).Appendv(aaa.IP)...) { m.Option(nfs.BINARY, S(m.Option(mdb.NAME))) + } else { + m.OptionDefault(nfs.BINARY, UserHost(m)+S(m.Option(mdb.NAME))) } _matrix_dream(m, mdb.CREATE, kit.Simple(m.OptionSimple(mdb.ICONS, nfs.REPOS, nfs.BINARY))...) _matrix_dream(m, cli.START) @@ -92,21 +95,20 @@ func init() { _matrix_action(m, arg[1], arg[2:]...) return } - GoToast(m, "", func(toast func(name string, count, total int)) []string { - fields := kit.Split(mdb.Config(m, mdb.FIELD)) + GoToast(m, func(toast func(name string, count, total int)) []string { + field := kit.Split(mdb.Config(m, mdb.FIELD)) m.Options("space.timeout", cli.TIME_300ms, "dream.simple", ice.TRUE) - kit.For(_matrix_list(m, "", fields...), func(domain string, index int, total int) { + kit.For(_matrix_list(m, "", field...), func(domain string, index int, total int) { toast(domain, index, total) - _matrix_list(m, domain, fields...) + _matrix_list(m, domain, field...) }) - stat := map[string]int{} - m.Table(func(value ice.Maps) { stat[value[mdb.TYPE]]++; stat[value[mdb.STATUS]]++ }).StatusTimeCount(stat) m.RewriteAppend(func(value, key string, index int) string { if key == mdb.ICONS && strings.HasPrefix(value, nfs.REQUIRE) && m.Appendv(DOMAIN)[index] != "" { value = kit.MergeURL(strings.Split(value, "?")[0], ice.POD, kit.Keys(m.Appendv(DOMAIN)[index], m.Appendv(mdb.NAME)[index])) } return value }).Sort("type,status,name,domain", []string{SERVER, WORKER, ""}, []string{cli.START, cli.STOP, ""}, "str_r", "str_r") + m.StatusTimeCountStats(mdb.TYPE, mdb.STATUS) return nil }).Action(html.FILTER, mdb.CREATE).Display("") }}, diff --git a/base/web/option.go b/base/web/option.go index 5cafecdb..6fe2751f 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -48,24 +48,17 @@ func ParseLink(m *ice.Message, url string) ice.Maps { return list } func PushPodCmd(m *ice.Message, cmd string, arg ...string) *ice.Message { - list := []string{} + msg := m.Spawn() m.Cmds(SPACE, func(value ice.Maps) { - kit.If(kit.IsIn(value[mdb.TYPE], WORKER), func() { list = append(list, value[mdb.NAME]) }) + kit.If(kit.IsIn(value[mdb.TYPE], WORKER), func() { msg.Push(SPACE, value[mdb.NAME]) }) }) - if len(list) == 0 { - return m - } kit.If(m.Length() > 0 && len(m.Appendv(SPACE)) == 0, func() { m.Table(func(value ice.Maps) { m.Push(SPACE, "") }) }) - GoToast(m, "", func(toast func(string, int, int)) []string { - kit.For(list, func(index int, space string) { - toast(space, index, len(list)) - m.Cmd(SPACE, space, kit.Dict(ice.MSG_USERPOD, space), kit.Select(m.PrefixKey(), cmd), arg).Table(func(index int, val ice.Maps, head []string) { - kit.If(!kit.IsIn(SPACE, head...), func() { head = append(head, SPACE) }) - val[SPACE] = kit.Keys(space, val[SPACE]) - m.Push("", val, head) - }) + GoToastTable(msg, SPACE, func(value ice.Maps) { + m.Cmd(SPACE, value[SPACE], kit.Dict(ice.MSG_USERPOD, value[SPACE]), kit.Select(m.PrefixKey(), cmd), arg).Table(func(val ice.Maps, index int, head []string) { + kit.If(!kit.IsIn(SPACE, head...), func() { head = append(head, SPACE) }) + val[SPACE] = kit.Keys(value[SPACE], val[SPACE]) + m.Push("", val, head) }) - return nil }) return m } @@ -138,13 +131,21 @@ func ToastProcess(m *ice.Message, arg ...ice.Any) func(...ice.Any) { Toast(m, toastContent(m, ice.PROCESS, arg...), "", "-1", "", h) return func(arg ...ice.Any) { Toast(m, toastContent(m, ice.SUCCESS, arg...), "", cli.TIME_3s, "", h) } } -func GoToast(m *ice.Message, title string, cb func(toast func(name string, count, total int)) []string) *ice.Message { - h := kit.HashsUniq() - icon, _total := Icons[ice.PROCESS], 0 +func GoToastTable(m *ice.Message, key string, cb func(value ice.Maps)) *ice.Message { + if m.Length() == 0 { + return m + } + return GoToast(m, func(toast func(string, int, int)) []string { + m.Table(func(value ice.Maps, index, total int) { toast(value[key], index, total); cb(value) }) + return nil + }) +} +func GoToast(m *ice.Message, cb func(toast func(name string, count, total int)) []string) *ice.Message { + icon, _total, h := Icons[ice.PROCESS], 1, kit.HashsUniq() toast := func(name string, count, total int) { kit.If(total == 0, func() { total = 1 }) Toast(m, kit.Format("%s %s %s", icon, kit.JoinWord(kit.Select(ice.LIST, m.ActionKey()), name), strings.ReplaceAll(kit.FmtSize(count, total), "B", "")), - kit.Select(title, m.Option(ice.MSG_TITLE)), m.OptionDefault(ice.TOAST_DURATION, "-1"), count*100/total, h) + m.Option(ice.MSG_TITLE), m.OptionDefault(ice.TOAST_DURATION, "-1"), count*100/total, h) _total = total } if list := cb(toast); len(list) > 0 { diff --git a/base/web/route.go b/base/web/route.go index 4a3ad9d0..adf999cd 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -16,7 +16,7 @@ import ( ) func _route_push(m *ice.Message, space string, msg *ice.Message) *ice.Message { - return msg.Table(func(index int, value ice.Maps, head []string) { + return msg.Table(func(value ice.Maps, index int, head []string) { value[SPACE], head = space, append(head, SPACE) m.Push("", value, head) }) @@ -44,7 +44,7 @@ func _route_match(m *ice.Message, space string, cb func(ice.Maps, int, []ice.Map } } func _route_toast(m *ice.Message, space string, args ...string) { - GoToast(m, "", func(toast func(string, int, int)) (list []string) { + GoToast(m, func(toast func(string, int, int)) (list []string) { count, total := 0, 1 _route_match(m, space, func(value ice.Maps, i int, _list []ice.Maps) { count, total = i, len(_list) @@ -84,9 +84,8 @@ func init() { _route_toast(m, m.Option(SPACE), append([]string{m.Option(ctx.INDEX)}, kit.Split(m.Option(ctx.ARGS))...)...) }}, cli.BUILD: {Name: "build space", Help: "构建", Hand: func(m *ice.Message, arg ...string) { + m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), m.CommandKey())) _route_toast(m, m.Option(SPACE), cli.RUNTIME, UPGRADE) - m.Option(ice.MSG_TITLE, kit.Keys(m.Option(ice.MSG_USERPOD0), m.Option(ice.MSG_USERPOD), m.CommandKey(), m.ActionKey())) - func() { defer ToastProcess(m)(); m.Sleep3s() }() m.SetAppend().Cmdy("", "travel") }}, "travel": {Help: "遍历", Icon: "bi bi-card-list", Hand: func(m *ice.Message, arg ...string) { @@ -100,21 +99,18 @@ func init() { m.Push(key, ice.Info.Make.Module) case nfs.VERSION: m.Push(key, ice.Info.Make.Versions()) - case "commitTime": + case cli.COMMIT_TIME: m.Push(key, ice.Info.Make.When) - case "compileTime": + case cli.COMPILE_TIME: m.Push(key, ice.Info.Make.Time) - case "bootTime": + case cli.BOOT_TIME: m.Push(key, m.Cmdx(cli.RUNTIME, "boot.time")) case "md5": m.Push(key, ice.Info.Hash) case nfs.SIZE: - if m.Option(ice.MSG_USERPOD) == "" { - defer ToastProcess(m)() - } var stats runtime.MemStats runtime.ReadMemStats(&stats) - m.Push(key, kit.Format("%s/%s/%s", kit.FmtSize(int64(stats.Sys)), ice.Info.Size, m.Cmdx(nfs.DIR, nfs.SIZE))) + m.Push(key, kit.Format("%s/%s/%s", ice.Info.Size, kit.FmtSize(int64(stats.Sys)), m.Cmdx(nfs.DIR, nfs.SIZE))) case nfs.PATH: m.Push(key, kit.Path("")) case tcp.HOSTNAME: diff --git a/base/web/space.go b/base/web/space.go index b122c95d..51528091 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -311,7 +311,7 @@ func init() { } defer m.StatusTimeCount(kit.Dict(ice.MAIN, mdb.Config(m, ice.MAIN))) kit.If(len(arg) > 0 && arg[0] != "", func() { m.OptionFields(ice.MSG_DETAIL) }) - mdb.HashSelect(m.Spawn(), arg...).Table(func(index int, value ice.Maps, field []string) { + mdb.HashSelect(m.Spawn(), arg...).Table(func(value ice.Maps) { if m.Push("", value, kit.Split(mdb.Config(m, mdb.FIELD))); len(arg) > 0 && arg[0] != "" { m.Push(mdb.STATUS, value[mdb.STATUS]).Push(aaa.UA, value[aaa.UA]) } diff --git a/base/web/store.go b/base/web/store.go index 556a889f..e89b03c4 100644 --- a/base/web/store.go +++ b/base/web/store.go @@ -58,11 +58,11 @@ func init() { m.PushAction(mdb.REMOVE).Action(html.FILTER, mdb.CREATE) } } else { + defer ToastProcess(m, ice.LIST, arg[0])(ice.LIST, arg[0]) if arg[0] == ice.OPS && ice.Info.NodeType == SERVER { m.Cmdy(DREAM) return } - defer ToastProcess(m, m.Trans("querying, please wait", "查询中,请稍候"))(m.Trans("query succsess", "查询成功")) origin := SpideOrigin(m, arg[0]) kit.If(kit.IsIn(arg[0], ice.OPS, ice.DEV), func() { origin = tcp.PublishLocalhost(m, origin) }) list := m.Spawn(ice.Maps{ice.MSG_FIELDS: ""}).CmdMap(DREAM, mdb.NAME) diff --git a/core/chat/macos/macos.go b/core/chat/macos/macos.go index 783c788a..1ebf00a7 100644 --- a/core/chat/macos/macos.go +++ b/core/chat/macos/macos.go @@ -57,7 +57,7 @@ func PodCmdAction(arg ...string) ice.Actions { msg := disableApp(mdb.HashSelect(m.Spawn(), arg...).Sort(mdb.NAME)) web.PushPodCmd(msg, m.PrefixKey(), arg...) has := map[string]bool{} - msg.Table(func(index int, value ice.Maps, head []string) { + msg.Table(func(value ice.Maps, index int, head []string) { kit.If(!has[value[ctx.INDEX]], func() { has[value[ctx.INDEX]] = true; m.Push("", value, head) }) }) }}, diff --git a/core/code/bench.go b/core/code/bench.go index 51b450ca..2646419c 100644 --- a/core/code/bench.go +++ b/core/code/bench.go @@ -14,7 +14,6 @@ import ( "shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/base/web/html" kit "shylinux.com/x/toolkits" - "shylinux.com/x/toolkits/task" "shylinux.com/x/toolkits/util/bench" ) @@ -47,16 +46,14 @@ func _bench_http(m *ice.Message, target string, arg ...string) { } } }) - var ndata int64 - total, count := nreqs*nconn, 0 - var lock task.Lock - web.GoToast(m, m.Option(mdb.NAME), func(toast func(name string, count, total int)) []string { + var ndata, count int64 + total := int(nreqs * nconn) + web.GoToast(m, func(toast func(name string, count, total int)) []string { if s, e := bench.HTTP(m.FormatTaskMeta(), nconn, nreqs, list, func(req *http.Request, res *http.Response) { + toast(m.Option(mdb.NAME), int(count), total) n, _ := io.Copy(ioutil.Discard, res.Body) atomic.AddInt64(&ndata, n) - defer lock.Lock()() - toast(m.Option(mdb.NAME), count, int(total)) - count++ + atomic.AddInt64(&count, 1) }); m.Assert(e) { m.Echo("nconn: %d total: %d ndata: %s\n", nconn, total, kit.FmtSize(ndata)).Echo(s.Show()).ProcessInner() } diff --git a/core/code/install.go b/core/code/install.go index 4d77b9e7..ca9be754 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -38,22 +38,21 @@ func _install_download(m *ice.Message, arg ...string) { return } mdb.HashCreate(m.Cmd(nfs.SAVE, file, ""), mdb.NAME, name, nfs.PATH, file, web.LINK, link) - web.GoToast(m, name, func(toast func(string, int, int)) (list []string) { + web.GoToast(m, func(toast func(string, int, int)) []string { begin := time.Now() _toast := func(count, total, value int) { - cost := time.Now().Sub(begin) - toast(kit.FormatShow(nfs.FROM, begin.Format("15:04:05"), cli.COST, kit.FmtDuration(cost), cli.REST, kit.FmtDuration(cost*time.Duration(101)/time.Duration(value+1)-cost)), count, total) + toast(kit.FormatShow(cli.COST, kit.FmtDuration(time.Now().Sub(begin))), count, total) mdb.HashSelectUpdate(m, name, func(value ice.Map) { value[mdb.COUNT], value[mdb.TOTAL], value[mdb.VALUE] = count, total, value }) } defer nfs.TarExport(m, file) if mdb.Config(m, nfs.REPOS) != "" { web.SpideSave(m, file, mdb.Config(m, nfs.REPOS)+path.Base(link), _toast) if s, e := nfs.StatFile(m, file); e == nil && s.Size() > 0 { - return + return nil } } web.SpideSave(m, file, link, _toast) - return + return nil }) if s, e := nfs.StatFile(m, file); e == nil && s.Size() > 0 { web.ToastSuccess(m) diff --git a/core/code/upgrade.go b/core/code/upgrade.go index 69f9daf9..67cc633f 100644 --- a/core/code/upgrade.go +++ b/core/code/upgrade.go @@ -46,10 +46,9 @@ func init() { uri = kit.MergeURL(uri, ice.POD, p) }) dir := path.Join(kit.Format(value[nfs.PATH]), kit.Format(value[nfs.FILE])) - web.GoToast(m, web.DOWNLOAD, func(toast func(name string, count, total int)) []string { - switch web.SpideSave(m, dir, uri, func(count, total, value int) { - toast(dir, count, total) - }); value[mdb.TYPE] { + web.GoToast(m, func(toast func(name string, count, total int)) []string { + web.SpideSave(m, dir, uri, func(count, total, value int) { toast(dir, count, total) }) + switch value[mdb.TYPE] { case nfs.TAR: m.Cmd(cli.SYSTEM, nfs.TAR, "xf", dir, "-C", path.Dir(dir)) // m.Cmd(nfs.TAR, mdb.EXPORT, dir, "-C", path.Dir(dir)) diff --git a/core/wiki/table.go b/core/wiki/table.go index 06ea6897..da69108f 100644 --- a/core/wiki/table.go +++ b/core/wiki/table.go @@ -10,7 +10,7 @@ import ( func _table_run(m *ice.Message, arg ...string) { list := [][]string{} - m.Cmd(arg).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(arg).Table(func(value ice.Maps, index int, head []string) { ls := []string{} kit.If(index == 0, func() { m.Options(HEAD, head) }) kit.For(head, func(h string) { ls = append(ls, value[h]) }) diff --git a/meta.go b/meta.go index 49fb78f4..da94c394 100644 --- a/meta.go +++ b/meta.go @@ -176,7 +176,7 @@ func (m *Message) Length() (max int) { return max } func (m *Message) TablesLimit(count int, cb func(value Maps)) *Message { - return m.Table(func(index int, value Maps) { kit.If(index < count, func() { cb(value) }) }) + return m.Table(func(value Maps, index int) { kit.If(index < count, func() { cb(value) }) }) } func (m *Message) Stats(arg ...string) (res []string) { stats := map[string]float64{} @@ -184,6 +184,11 @@ func (m *Message) Stats(arg ...string) (res []string) { kit.For(arg, func(k string) { res = append(res, k, kit.Format("%0.2f", stats[k])) }) return } +func (m *Message) TableStats(field ...string) map[string]int { + stat := map[string]int{} + m.Table(func(value Maps) { kit.For(field, func(k string) { stat[value[k]]++ }) }) + return stat +} func (m *Message) TableAmount(cb func(Maps) float64) float64 { var amount float64 m.Table(func(value Maps) { amount += cb(value) }) @@ -196,14 +201,12 @@ func (m *Message) Table(cb Any) *Message { } cbs := func(index int, value Maps, head []string) { switch cb := cb.(type) { - case func(index int, value Maps, head []string): - cb(index, value, head) - case func(index int, value Maps): - cb(index, value) - case func(value Maps, index int): - cb(value, index) + case func(value Maps, index int, head []string): + cb(value, index, head) case func(value Maps, index, total int): cb(value, index, n) + case func(value Maps, index int): + cb(value, index) case func(value Maps): cb(value) default: diff --git a/misc.go b/misc.go index 5b291077..ce8e241b 100644 --- a/misc.go +++ b/misc.go @@ -108,7 +108,7 @@ func (m *Message) RenameAppend(arg ...string) *Message { return m } func (m *Message) RewriteAppend(cb func(value, key string, index int) string) *Message { - m.Table(func(index int, value Maps, head []string) { + m.Table(func(value Maps, index int, head []string) { for _, key := range head { v := cb(value[key], key, index) if m.FieldsIsDetail() { diff --git a/misc/bash/run.go b/misc/bash/run.go index ba3aa2f2..a6bb24d8 100644 --- a/misc/bash/run.go +++ b/misc/bash/run.go @@ -103,7 +103,7 @@ func Complete(m *ice.Message, detail bool, arg ...string) (res []string) { kit.If(detail, func() { echo("func") }) m.Cmdy(arg).Search(arg[0], func(p *ice.Context, s *ice.Context, key string, cmd *ice.Command) { field := kit.Format(kit.Value(cmd.List, kit.Keys(len(arg)-1, mdb.NAME))) - m.Table(func(index int, value ice.Maps, head []string) { + m.Table(func(value ice.Maps, index int, head []string) { echo(value[field]) if detail { echo(kit.Join(kit.Simple(head, func(key string) string { return key + ": " + value[key] }), lex.SP)) diff --git a/misc/chrome/field.go b/misc/chrome/field.go index b997b3b9..7535fadf 100644 --- a/misc/chrome/field.go +++ b/misc/chrome/field.go @@ -19,7 +19,7 @@ type field struct { func (s field) Inputs(m *ice.Message, arg ...string) { s.daemon.Inputs(m, arg...) } func (s field) Command(m *ice.Message, arg ...string) { - s.Zone.List(m.Spawn(), kit.Simple(m.Option(web.DOMAIN), arg)...).Table(func(index int, value ice.Maps, head []string) { + s.Zone.List(m.Spawn(), kit.Simple(m.Option(web.DOMAIN), arg)...).Table(func(value ice.Maps, index int, head []string) { if len(arg) == 0 { m.Options(ice.MSG_OPTS, head, kit.Simple(value)) s.send(m, "1", m.Option(TID), m.CommandKey(), value[mdb.ID], value[ctx.ARGS]) diff --git a/misc/git/repos.go b/misc/git/repos.go index dc5c31cf..e0c05b8a 100644 --- a/misc/git/repos.go +++ b/misc/git/repos.go @@ -109,16 +109,10 @@ func _repos_open(m *ice.Message, p string) *git.Repository { return mdb.HashSelectTarget(m, p, nil).(*git.Repository) } func _repos_each(m *ice.Message, title string, cb func(*git.Repository, ice.Maps) error) { - msg := m.Cmd("") - web.GoToast(m, title, func(toast func(string, int, int)) (list []string) { - msg.Table(func(index int, value ice.Maps) { - toast(value[REPOS], index, msg.Length()) - if err := cb(_repos_open(m, value[REPOS]), value); err != nil && err != git.NoErrAlreadyUpToDate { - web.ToastFailure(m, value[REPOS], err.Error()) - list = append(list, value[REPOS]) - } - }) - return + web.GoToastTable(m.Cmd(""), REPOS, func(value ice.Maps) { + if err := cb(_repos_open(m, value[REPOS]), value); err != nil && err != git.NoErrAlreadyUpToDate { + web.ToastFailure(m, value[REPOS], err.Error()) + } }) } func _repos_each_origin(m *ice.Message, title string, cb func(*git.Repository, string, *http.BasicAuth, ice.Maps) error) { diff --git a/misc/java/spring.go b/misc/java/spring.go index d048d3b9..3f453411 100644 --- a/misc/java/spring.go +++ b/misc/java/spring.go @@ -32,7 +32,7 @@ func (s spring) List(m *ice.Message, arg ...string) { if len(arg) == 0 { s.Hash.List(m, arg...).PushAction(s.Start, s.Build) } else { - m.Cmd(cli.DAEMON).Table(func(index int, value ice.Maps, head []string) { + m.Cmd(cli.DAEMON).Table(func(value ice.Maps, index int, head []string) { if strings.Contains(value[ice.CMD], "target/"+arg[0]+"-0.0.1-SNAPSHOT.jar") { m.PushRecord(value, head...) } diff --git a/misc/lark/talk.go b/misc/lark/talk.go index 2f05f535..cbada039 100644 --- a/misc/lark/talk.go +++ b/misc/lark/talk.go @@ -34,7 +34,7 @@ func init() { return } val := []string{} - m.Table(func(index int, value ice.Maps, head []string) { + m.Table(func(value ice.Maps, index int, head []string) { kit.For(head, func(k string) { val = append(val, kit.Format("%s:\t%s", k, value[k])) }) val = append(val, lex.NL) }) diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go index 34082d8e..fc8d9a79 100644 --- a/misc/ssh/connect.go +++ b/misc/ssh/connect.go @@ -173,21 +173,13 @@ func init() { SESSION: {Help: "会话", Hand: func(m *ice.Message, arg ...string) { _ssh_hold(m, _ssh_target(m, m.Option(mdb.NAME))) }}, DIRECT: {Name: "direct cmd=pwd", Help: "命令", Hand: func(m *ice.Message, arg ...string) { if m.Option(mdb.NAME) == "" { - msg := m.Cmds("") - web.GoToast(m, m.Option(ice.CMD), func(toast func(string, int, int)) []string { - count, total := 0, msg.Length() - toast("", count, total) - msg.Table(func(value ice.Maps) { - toast(value[mdb.NAME], count, total) - msg := m.Cmds("", m.ActionKey(), value) - kit.If(len(msg.Resultv()) == 0, func() { msg.TableEcho() }) - m.Push(mdb.TIME, msg.Time()) - m.Push(mdb.NAME, value[mdb.NAME]) - m.Push(cli.COST, m.FormatCost()) - m.Push(RES, msg.Result()) - count++ - }) - return nil + web.GoToastTable(m.Cmds(""), mdb.NAME, func(value ice.Maps) { + msg := m.Cmds("", m.ActionKey(), value) + kit.If(len(msg.Resultv()) == 0, func() { msg.TableEcho() }) + m.Push(mdb.TIME, msg.Time()) + m.Push(mdb.NAME, value[mdb.NAME]) + m.Push(cli.COST, m.FormatCost()) + m.Push(RES, msg.Result()) }).ProcessInner() } else if s, e := _ssh_target(m, m.Option(mdb.NAME)).NewSession(); !m.WarnNotValid(e) { defer s.Close() diff --git a/misc/ssh/relay/relay.go b/misc/ssh/relay/relay.go index c45aea0d..d4ad22a1 100644 --- a/misc/ssh/relay/relay.go +++ b/misc/ssh/relay/relay.go @@ -137,12 +137,11 @@ func (s relay) Stats(m *ice.Message) { }, } machine := m.Option(MACHINE) - web.GoToast(m.Message, "", func(toast func(string, int, int)) []string { + m.GoToast(func(toast func(string, int, int)) { kit.For(cmds, func(key, value string, index int) { toast(key, index/2, len(cmds)/2) s.foreachModify(m, machine, key, value, trans[key]) }) - return nil }).ProcessInner() s.foreach(m.Spawn(ice.Maps{MACHINE: machine}), func(msg *ice.Message, cmd []string) { ssh.CombinedOutput(msg.Message, s.admins(msg, cli.RUNTIME), func(res string) { diff --git a/misc/ssh/relay/trans.go b/misc/ssh/relay/trans.go index b9868683..c73a6af6 100644 --- a/misc/ssh/relay/trans.go +++ b/misc/ssh/relay/trans.go @@ -43,7 +43,7 @@ func (s trans) Send(m *ice.Message, arg ...string) { s.open(m, func(fs *ssh.FileSystem) { nfs.Create(m.Message, path.Join(m.Option(nfs.PATH), m.OptionDefault(nfs.FILE, path.Base(m.Option(nfs.FROM)))), func(w io.Writer, p string) { m.Logs(tcp.SEND, nfs.TO, p, m.OptionSimple(tcp.HOST, nfs.FROM), nfs.SIZE, kit.FmtSize(info.Size())) - web.GoToast(m.Message, "", func(toast func(name string, count, total int)) []string { + m.GoToast(func(toast func(name string, count, total int)) { last := 0 nfs.CopyStream(m.Message, w, r, 81920, int(info.Size()), func(count, total int) { if size := count / 1024 / 1024; size != last { @@ -51,7 +51,6 @@ func (s trans) Send(m *ice.Message, arg ...string) { last = size } }) - return nil }) }) }) diff --git a/option.go b/option.go index 2c304d71..104b1c30 100644 --- a/option.go +++ b/option.go @@ -98,6 +98,9 @@ func (m *Message) StatusTime(arg ...Any) *Message { func (m *Message) StatusTimeCount(arg ...Any) *Message { return m.StatusTime(append([]Any{kit.MDB_COUNT, kit.Split(m.FormatSize())[0]}, arg...)) } +func (m *Message) StatusTimeCountStats(field ...string) *Message { + return m.StatusTimeCount(m.TableStats(field...)) +} func (m *Message) StatusTimeCountTotal(arg ...Any) *Message { return m.StatusTimeCount(append([]Any{kit.MDB_TOTAL}, arg...)) } @@ -116,8 +119,8 @@ func (m *Message) ProcessReplace(url string, arg ...Any) { } func (m *Message) ProcessHistory(arg ...Any) { m.Process(PROCESS_HISTORY, arg...) } func (m *Message) ProcessConfirm(arg ...Any) { m.Process(PROCESS_CONFIRM, arg...) } -func (m *Message) ProcessRefresh(arg ...string) { - m.Process(PROCESS_REFRESH).Option(PROCESS_ARG, int(kit.Duration(kit.Select("30ms", arg, 0))/time.Millisecond)) +func (m *Message) ProcessRefresh(arg ...string) *Message { + return m.Process(PROCESS_REFRESH).Options(PROCESS_ARG, int(kit.Duration(kit.Select("30ms", arg, 0))/time.Millisecond)) } func (m *Message) ProcessRewrite(arg ...Any) { m.Process(PROCESS_REWRITE, arg...) } func (m *Message) ProcessDisplay(arg ...Any) { m.Process(PROCESS_DISPLAY).Option(MSG_DISPLAY, arg...) }