diff --git a/base/aaa/sess.go b/base/aaa/sess.go index c3be32f9..3ae99511 100644 --- a/base/aaa/sess.go +++ b/base/aaa/sess.go @@ -64,6 +64,14 @@ func init() { mdb.CREATE: {Name: "create username", Help: "创建", Hand: func(m *ice.Message, arg ...string) { _sess_create(m, m.Option(USERNAME)) }}, + SESS_CREATE: {Name: "sess.create", Help: "检查", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.EXPORT, m.Prefix(SESS), "", mdb.HASH) + m.Cmd(mdb.IMPORT, m.Prefix(SESS), "", mdb.HASH) + }}, + USER_CREATE: {Name: "user.create", Help: "检查", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(mdb.EXPORT, m.Prefix(USER), "", mdb.HASH) + m.Cmd(mdb.IMPORT, m.Prefix(USER), "", mdb.HASH) + }}, CHECK: {Name: "check sessid", Help: "检查", Hand: func(m *ice.Message, arg ...string) { _sess_check(m, m.Option(SESSID)) }}, diff --git a/base/aaa/user.go b/base/aaa/user.go index 32fc3e8b..c1f6f5dc 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -31,7 +31,7 @@ func _user_login(m *ice.Message, name, word string) { _source := logs.FileLineMeta(logs.FileLine(-1, 3)) mdb.HashSelectDetail(m.Spawn(), name, func(value ice.Map) { - if m.Warn(word != "" && word != kit.Format(kit.Value(value, kit.Keys(mdb.EXTRA, PASSWORD))), ice.ErrNotRight) { + if m.Warn(word != "" && word != kit.Format(kit.Value(value, PASSWORD)), ice.ErrNotRight) { return } m.Auth( diff --git a/base/cli/forever.go b/base/cli/forever.go index 792c70e1..f6b8fb98 100644 --- a/base/cli/forever.go +++ b/base/cli/forever.go @@ -2,6 +2,7 @@ package cli import ( "os" + "path" ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" @@ -65,6 +66,14 @@ func init() { logs.Println(ice.EXIT) // 正常退出 break } else { + if m.Config("log.save") == ice.TRUE { + back := kit.Format("var/log.%s", logs.Now().Format("20060102_150405")) + m.Cmd(SYSTEM, "cp", "-r", "var/log", back, ice.Maps{CMD_OUTPUT: ""}) + m.Cmd(SYSTEM, "cp", "bin/boot.log", path.Join(back, "boot.log"), ice.Maps{CMD_OUTPUT: ""}) + // if IsSuccess(m.Cmd(SYSTEM, "grep", "fatal error: concurrent map read and map write", "bin/boot.log", ice.Maps{CMD_OUTPUT: ""})) { + // m.Cmd(SYSTEM, "cp", "bin/boot.log", path.Join(back, "boot.log"), ice.Maps{CMD_OUTPUT: ""}) + // } + } logs.Println() m.Sleep("1s") } diff --git a/base/log/log.go b/base/log/log.go index 572888e6..cf20553b 100644 --- a/base/log/log.go +++ b/base/log/log.go @@ -38,31 +38,35 @@ func (f *Frame) Start(m *ice.Message, arg ...string) bool { return true } - // file := kit.Select(BENCH, m.Conf(SHOW, kit.Keys(l.l, FILE))) - file := BENCH - view := m.Confm(VIEW, m.Conf(SHOW, kit.Keys(l.l, VIEW))) - bio := m.Confv(FILE, kit.Keys(file, FILE)).(*bufio.Writer) - if bio == nil { - continue - } + for _, file := range []string{m.Conf(SHOW, kit.Keys(l.l, FILE)), BENCH} { + if file == "" { + continue + } - bio.WriteString(l.p) - bio.WriteString(ice.SP) - if ice.Info.Colors == true { - if p, ok := view[PREFIX].(string); ok { - bio.WriteString(p) + view := m.Confm(VIEW, m.Conf(SHOW, kit.Keys(l.l, VIEW))) + bio := m.Confv(FILE, kit.Keys(file, FILE)).(*bufio.Writer) + if bio == nil { + continue } - } - bio.WriteString(l.l) - bio.WriteString(ice.SP) - bio.WriteString(l.s) - if ice.Info.Colors == true { - if p, ok := view[SUFFIX].(string); ok { - bio.WriteString(p) + + bio.WriteString(l.p) + bio.WriteString(ice.SP) + if ice.Info.Colors == true { + if p, ok := view[PREFIX].(string); ok { + bio.WriteString(p) + } } + bio.WriteString(l.l) + bio.WriteString(ice.SP) + bio.WriteString(l.s) + if ice.Info.Colors == true { + if p, ok := view[SUFFIX].(string); ok { + bio.WriteString(p) + } + } + bio.WriteString(ice.NL) + bio.Flush() } - bio.WriteString(ice.NL) - bio.Flush() } } return true diff --git a/base/mdb/hash.go b/base/mdb/hash.go index b66e6a6b..93105c5a 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -158,8 +158,12 @@ func _hash_import(m *ice.Message, prefix, chain, file string) { count++ } } else { - for _, data := range list { - Rich(m, prefix, chain, data) + for k, data := range list { + if m.Confv(prefix, kit.Keys(chain, HASH, k)) == nil { + m.Confv(prefix, kit.Keys(chain, HASH, k), data) + } else { + Rich(m, prefix, chain, data) + } count++ } } @@ -248,7 +252,11 @@ func HashModify(m *ice.Message, arg ...Any) *ice.Message { return m.Cmd(MODIFY, m.PrefixKey(), "", HASH, args) } func HashSelect(m *ice.Message, arg ...string) *ice.Message { - m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m)) + if len(arg) > 0 && arg[0] == FOREACH { + m.Fields(0, HashField(m)) + } else { + m.Fields(len(kit.Slice(arg, 0, 1)), HashField(m)) + } m.Cmdy(SELECT, m.PrefixKey(), "", HASH, HashShort(m), arg) if m.PushAction(m.Config(ACTION), REMOVE); !m.FieldsIsDetail() { return m.StatusTimeCount() diff --git a/base/ssh/script.go b/base/ssh/script.go index ec6cd646..0895dca7 100644 --- a/base/ssh/script.go +++ b/base/ssh/script.go @@ -91,8 +91,14 @@ func (f *Frame) alias(m *ice.Message, ls []string) []string { } func (f *Frame) parse(m *ice.Message, h, line string) string { msg := m.Spawn(f.target) - ls := f.change(msg, f.alias(msg, kit.Split(strings.TrimSpace(line)))) - if len(ls) == 0 { + ls := kit.Split(strings.TrimSpace(line)) + for i, v := range ls { + if v == "#" { + ls = ls[:i] + break + } + } + if ls = f.change(msg, f.alias(msg, ls)); len(ls) == 0 { return "" } diff --git a/base/web/option.go b/base/web/option.go index 1a65cea0..436d1ddc 100644 --- a/base/web/option.go +++ b/base/web/option.go @@ -2,6 +2,7 @@ package web import ( "net/url" + "path" "strings" "time" @@ -144,10 +145,17 @@ func MergePod(m Message, pod string, arg ...ice.Any) string { return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...) } func MergePodCmd(m Message, pod, cmd string, arg ...ice.Any) string { + p := "/chat" + p += path.Join("/pod/", kit.Keys(m.Option(ice.MSG_USERPOD), pod)) + p = kit.Select(p, "/chat", p == "/chat/pod") + p += path.Join("/cmd/", kit.Select(m.PrefixKey(), cmd)) + return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...) +} +func MergePodWebSite(m Message, pod, web string, arg ...ice.Any) string { p := "/chat" p += "/pod/" + kit.Keys(m.Option(ice.MSG_USERPOD), pod) p = kit.Select(p, "/chat/", p == "/chat/pod/") - p += "/cmd/" + kit.Select(m.PrefixKey(), cmd) + p += "/website/" + kit.Select("index.iml", web) return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), p, arg...) } func ProcessWebsite(m *ice.Message, pod, cmd string, arg ...ice.Any) { diff --git a/base/web/share.go b/base/web/share.go index c3b86856..c1fd1e9b 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -139,8 +139,7 @@ func init() { SHARE: {Name: "share hash auto prunes", Help: "共享链", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _share_render(m) }}, mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), - RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg) + mdb.HashCreate(m, aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERNICK, m.Option(ice.MSG_USERNICK), arg) m.Option(mdb.LINK, _share_link(m, PP(SHARE)+m.Result())) }}, LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) { diff --git a/core/chat/action.go b/core/chat/action.go index b181ec56..281dc3ab 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -10,32 +10,25 @@ import ( kit "shylinux.com/x/toolkits" ) -func _action_right(m *ice.Message, river string, storm string) (ok bool) { - return m.Option(ice.MSG_USERROLE) != aaa.VOID || m.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Length() > 0 -} -func _action_key(m *ice.Message, arg ...string) string { - return kit.KeyHash(kit.Select(m.Option(RIVER), arg, 0), STORM, kit.KeyHash(kit.Select(m.Option(STORM), arg, 1))) -} func _action_list(m *ice.Message, river, storm string) { - m.Cmdy(STORM, storm, kit.Dict(ice.MSG_RIVER, river)) + m.Cmdy(STORM, kit.Dict(ice.MSG_RIVER, river, ice.MSG_STORM, storm)) } func _action_exec(m *ice.Message, river, storm, index string, arg ...string) { m.Option(ice.MSG_RIVER, river) m.Option(ice.MSG_STORM, storm) - if m.Cmd(STORM, storm, index, func(value ice.Maps) { + if m.Warn(m.Cmd(STORM, index, func(value ice.Maps) { if index = value[ctx.INDEX]; value[web.SPACE] != "" { m.Option(ice.POD, value[web.SPACE]) } - }).Length() == 0 && m.Option(ice.MSG_USERPOD) == "" && !aaa.Right(m, index) { - return // 没有授权 + }).Length() == 0, ice.ErrNotFound, index) { + return } if m.Option(ice.MSG_UPLOAD) != "" { _action_upload(m) // 上传文件 } - - if index == m.Prefix(NODES) || !ctx.PodCmd(m, index, arg) { + if !ctx.PodCmd(m, index, arg) { m.Cmdy(index, arg) // 执行命令 } } @@ -52,7 +45,7 @@ func _action_auth(m *ice.Message, share string) *ice.Message { RIVER, m.Option(ice.MSG_RIVER, msg.Append(RIVER)), STORM, m.Option(ice.MSG_STORM, msg.Append(STORM)), ) - if m.Warn(!_action_right(m, msg.Append(web.RIVER), msg.Append(web.STORM)), ice.ErrNotRight) { + if m.Warn(!_river_right(m, msg.Append(web.RIVER)), ice.ErrNotRight) { msg.Append(mdb.TYPE, "") return msg // 没有权限 } @@ -62,6 +55,8 @@ func _action_share(m *ice.Message, arg ...string) { switch msg := _action_auth(m, arg[0]); msg.Append(mdb.TYPE) { case web.STORM: if len(arg) == 1 { + m.Push(TITLE, msg.Append(TITLE)) + m.Push(TOPIC, msg.Append(TOPIC)) _action_list(m, msg.Append(web.RIVER), msg.Append(web.STORM)) break // 命令列表 } @@ -88,12 +83,6 @@ func _action_upload(m *ice.Message) { m.Option(ice.MSG_UPLOAD, msg.Append(mdb.HASH), msg.Append(mdb.NAME), msg.Append(nfs.SIZE)) } -const ( - PUBLIC = "public" - PROTECTED = "protected" - PRIVATE = "private" -) - const ACTION = "action" func init() { @@ -101,9 +90,10 @@ func init() { web.P(ACTION): {Name: "/action river storm action arg...", Help: "工作台", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey()) + m.Cmd(aaa.ROLE, aaa.BLACK, aaa.VOID, m.CommandKey(), ctx.ACTION) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, RIVER, _action_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg) + m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m), mdb.LIST, m.OptionSimple(mdb.ID), arg) }}, web.SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { _action_share(m, arg...) @@ -112,12 +102,12 @@ func init() { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin, arg) { return // 没有登录 } - if m.Option(ice.MSG_USERPOD) == "" && m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight, arg) { + if m.Option(ice.MSG_USERPOD) == "" && m.Warn(!_river_right(m, arg[0]), ice.ErrNotRight, arg) { return // 没有授权 } if len(arg) == 2 { - m.Option(MENUS, m.Config(MENUS)) + m.OptionFromConfig(MENUS) _action_list(m, arg[0], arg[1]) return //命令列表 } diff --git a/core/chat/chat.go b/core/chat/chat.go index 34688d57..cee29941 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -1,11 +1,8 @@ package chat import ( - "path" - ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/web" - kit "shylinux.com/x/toolkits" ) const CHAT = "chat" @@ -13,25 +10,3 @@ const CHAT = "chat" var Index = &ice.Context{Name: CHAT, Help: "聊天中心"} func init() { web.Index.Register(Index, &web.Frame{}) } - -func MergePod(m *ice.Message, pod string, arg ...ice.Any) string { - return kit.MergePOD(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), pod, arg...) -} -func MergeCmd(m *ice.Message, cmd string, arg ...ice.Any) string { - return mergeurl(m, path.Join(ice.CMD, kit.Select(m.PrefixKey(), cmd)), arg...) -} -func MergeWebsite(m *ice.Message, web string, arg ...ice.Any) string { - if m.Option(ice.MSG_USERPOD) == "" { - return mergeurl(m, path.Join(ice.PS, "chat", WEBSITE, web), arg...) - } else { - return mergeurl(m, path.Join(WEBSITE, web), arg...) - } -} -func mergeurl(m *ice.Message, p string, arg ...ice.Any) string { - if m.Option(ice.MSG_USERPOD) == "" { - p = path.Join(ice.PS, p) - } else { - p = path.Join(ice.PS, "chat", ice.POD, m.Option(ice.MSG_USERPOD), p) - } - return kit.MergeURL2(kit.Select(ice.Info.Domain, m.Option(ice.MSG_USERWEB)), path.Join(p), arg...) -} diff --git a/core/chat/chat.shy b/core/chat/chat.shy index 81385e85..07800f8b 100644 --- a/core/chat/chat.shy +++ b/core/chat/chat.shy @@ -1,34 +1,36 @@ chapter "组织" - chat.go chat.shy +section "框架" header.go -footer.go -action.go -search.go river.go storm.go -ocean.go -nodes.go +action.go +search.go +footer.go +template.go -sso.go +section "集群" pod.go cmd.go -div.go -topic.go website.go - -scan.go -scan.js -paste.go -files.go -trans.go -location.go -location.shy - -room.go -meet.go -grant.go +div.go +sso.go oauth +section "应用" +keyboard.go +iframe.go +paste.go +media.go +files.go +trans.go +scan.go +scan.js +location.go +location.shy +topic.go +meet.go +room.go + diff --git a/core/chat/footer.go b/core/chat/footer.go index e4eb5764..477652f4 100644 --- a/core/chat/footer.go +++ b/core/chat/footer.go @@ -26,7 +26,7 @@ func init() { } } }}, - }, ctx.CmdAction(EMAIL, `shylinuxc@gmail.com`), web.ApiAction("/footer")), Hand: func(m *ice.Message, arg ...string) { + }, ctx.CmdAction(EMAIL, `shylinuxc@gmail.com`), web.ApiAction(web.P(FOOTER))), Hand: func(m *ice.Message, arg ...string) { m.Result(m.Configv(EMAIL)) }}, }) diff --git a/core/chat/header.go b/core/chat/header.go index 19c647ee..5e6f4ce3 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -5,7 +5,6 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" @@ -14,32 +13,9 @@ import ( kit "shylinux.com/x/toolkits" ) -func _header_check(m *ice.Message, arg ...string) bool { - if m.Option(web.SHARE) != "" { - m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) { - switch value[mdb.TYPE] { - case web.LOGIN: - if value[aaa.USERNAME] != m.Option(ice.MSG_USERNAME) { - web.RenderCookie(m, aaa.SessCreate(m, value[aaa.USERNAME])) - } - fallthrough - case web.STORM, web.FIELD: - m.Option(ice.MSG_USERNAME, value[aaa.USERNAME]) - m.Option(ice.MSG_USERROLE, value[aaa.USERROLE]) - m.Auth(aaa.USERROLE, value[aaa.USERROLE], aaa.USERNAME, value[aaa.USERNAME]) - } - }) - } - if m.Option(ice.MSG_USERNAME) != "" { - return true - } - - m.Option(web.SSO, m.Config(web.SSO)) - m.Option(web.LOGIN, m.Config(web.LOGIN)) - if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" { - m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT)) - } - return false +func _header_users(m *ice.Message, key string, arg ...string) { + key = kit.Select(m.ActionKey(), key) + m.Cmdy(aaa.USER, mdb.MODIFY, aaa.USERNAME, m.Option(ice.MSG_USERNAME), key, m.Option(key, arg[0])) } func _header_share(m *ice.Message, arg ...string) { if m.Option(mdb.LINK) == "" { @@ -47,19 +23,42 @@ func _header_share(m *ice.Message, arg ...string) { } else { m.Option(mdb.LINK, tcp.ReplaceLocalhost(m, m.Option(mdb.LINK))) } - m.Option(mdb.LINK, kit.MergeURL(m.Option(mdb.LINK), RIVER, "", STORM, "")) - m.PushQRCode(mdb.TEXT, m.Option(mdb.LINK)) - m.Push(mdb.NAME, m.Option(mdb.LINK)) + m.Push(mdb.NAME, m.Option(mdb.LINK)).PushQRCode(mdb.TEXT, m.Option(mdb.LINK)) } -func _header_users(m *ice.Message, key string, arg ...string) { - m.Option(aaa.USERNAME, m.Option(ice.MSG_USERNAME)) - m.Cmdy(aaa.USER, mdb.MODIFY, key, m.Option(key, arg[0])) +func _header_check(m *ice.Message, arg ...string) bool { + if m.Option(web.SHARE) != "" { + m.Cmd(web.SHARE, m.Option(web.SHARE), ice.OptionFields(""), func(value ice.Maps) { + if m.Warn(kit.Time(value[mdb.TIME]) < kit.Time(m.Time()), ice.ErrNotValid, m.Option(web.SHARE)) { + return + } + switch value[mdb.TYPE] { + case web.LOGIN: + if value[aaa.USERNAME] != m.Option(ice.MSG_USERNAME) { + web.RenderCookie(m, aaa.SessCreate(m, value[aaa.USERNAME])) + } + fallthrough + case web.STORM, web.FIELD: + m.Option(ice.MSG_USERROLE, value[aaa.USERROLE]) + m.Option(ice.MSG_USERNAME, value[aaa.USERNAME]) + m.Option(ice.MSG_USERNICK, value[aaa.USERNICK]) + m.Auth(aaa.USERROLE, value[aaa.USERROLE], aaa.USERNAME, value[aaa.USERNAME], aaa.USERNICK, value[aaa.USERNICK]) + } + }) + } + if m.Option(ice.MSG_USERNAME) != "" { + return true + } + if m.OptionFromConfig(web.SSO) == "" && m.Option("login.dev", m.CmdAppend(web.SPACE, ice.DEV, mdb.TEXT)) == "" { + if m.Option("login.dev", m.CmdAppend(web.SPACE, ice.SHY, mdb.TEXT)) == "" { + m.OptionFromConfig(web.LOGIN) + } + } + return false } const ( TITLE = "title" MENUS = "menus" - TRANS = "trans" HEADER_AGENT = "header.agent" ) @@ -85,39 +84,19 @@ func init() { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey()) }}, - aaa.LOGIN: {Name: "login", Help: "密码登录", Hand: func(m *ice.Message, arg ...string) { + aaa.LOGIN: {Hand: func(m *ice.Message, arg ...string) { if aaa.UserLogin(m, arg[0], arg[1]) { web.RenderCookie(m, aaa.SessCreate(m, arg[0])) } }}, - aaa.LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) { - aaa.UserLogout(m) - }}, - aaa.PASSWORD: {Name: "password", Help: "修改密码", Hand: func(m *ice.Message, arg ...string) { - _header_users(m, m.ActionKey(), arg...) - }}, - aaa.USERNICK: {Name: "usernick", Help: "用户昵称", Hand: func(m *ice.Message, arg ...string) { - _header_users(m, m.ActionKey(), arg...) - }}, - aaa.AVATAR: {Name: "avatar", Help: "用户头像", Hand: func(m *ice.Message, arg ...string) { - _header_users(m, m.ActionKey(), arg...) - }}, - aaa.BACKGROUND: {Name: "background", Help: "用户壁纸", Hand: func(m *ice.Message, arg ...string) { - _header_users(m, m.ActionKey(), arg...) - }}, - aaa.LANGUAGE: {Name: "language", Help: "语言地区", Hand: func(m *ice.Message, arg ...string) { - _header_users(m, m.ActionKey(), arg...) - }}, - ctx.CONFIG: {Name: "config scope", Help: "拉取配置", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.SPACE, m.Option(ice.MSG_USERPOD), m.Prefix("oauth.oauth"), "check", arg) - }}, - "webpack": {Name: "webpack", Help: "打包页面", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("webpack", cli.BUILD, m.OptionSimple(mdb.NAME)) - }}, - web.SHARE: {Name: "share type", Help: "共享", Hand: func(m *ice.Message, arg ...string) { - _header_share(m, arg...) - }}, - }, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction("/header")), Hand: func(m *ice.Message, arg ...string) { + aaa.LOGOUT: {Hand: func(m *ice.Message, arg ...string) { aaa.UserLogout(m) }}, + aaa.PASSWORD: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }}, + aaa.USERNICK: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }}, + aaa.LANGUAGE: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }}, + aaa.BACKGROUND: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }}, + aaa.AVATAR: {Hand: func(m *ice.Message, arg ...string) { _header_users(m, "", arg...) }}, + web.SHARE: {Hand: func(m *ice.Message, arg ...string) { _header_share(m, arg...) }}, + }, ctx.ConfAction(aaa.LOGIN, kit.List("登录", "扫码")), web.ApiAction(web.P(HEADER))), Hand: func(m *ice.Message, arg ...string) { if !_header_check(m, arg...) { return } @@ -126,18 +105,14 @@ func init() { for _, k := range []string{aaa.USERNICK, aaa.LANGUAGE} { m.Option(k, msg.Append(k)) } - for _, k := range []string{aaa.AVATAR, aaa.BACKGROUND} { + for _, k := range []string{aaa.BACKGROUND, aaa.AVATAR} { if msg.Append(k) != "" && !strings.HasPrefix(msg.Append(k), ice.HTTP) && aaa.Right(m.Spawn(), msg.Append(k)) { m.Option(k, web.SHARE_LOCAL+k) } } - if m.Option(aaa.AVATAR) == "" && m.R.Header.Get("Staffname") != "" { - m.Option(aaa.AVATAR, kit.Format("https://dayu.oa.com/avatars/%s/profile.jpg", m.R.Header.Get("Staffname"))) - } gdb.Event(m, HEADER_AGENT) - m.Option(TRANS, kit.Format(kit.Value(m.Target().Commands[web.P(m.CommandKey())].Meta, "_trans"))) - m.Option(MENUS, m.Config(MENUS)) + m.OptionFromConfig(MENUS) m.Echo(m.Config(TITLE)) }}, }) diff --git a/core/chat/nodes.go b/core/chat/nodes.go deleted file mode 100644 index 6c6d1f12..00000000 --- a/core/chat/nodes.go +++ /dev/null @@ -1,62 +0,0 @@ -package chat - -import ( - ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/gdb" - "shylinux.com/x/icebergs/base/mdb" - "shylinux.com/x/icebergs/base/web" - kit "shylinux.com/x/toolkits" -) - -const NODES = "nodes" - -func init() { - Index.MergeCommands(ice.Commands{ - NODES: {Name: "nodes space index auto insert invite", Help: "设备", Actions: ice.Actions{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - gdb.Watch(m, web.SPACE_START, m.PrefixKey()) - gdb.Watch(m, web.DREAM_START, m.PrefixKey()) - }}, - web.SPACE_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { - return - } - if msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(mdb.TYPE) == RIVER { - m.Cmdy("", mdb.INSERT, arg) - } - }}, - web.DREAM_START: {Name: "start type name share river", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - if m.Option(ice.MSG_RIVER, m.Option(RIVER)) == "" { - return - } - m.Cmdy("", mdb.INSERT, arg) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.SPACE) - }}, - mdb.INSERT: {Name: "insert type space share river", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Option(mdb.SHORT, web.SPACE) - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, m.CommandKey()), mdb.HASH, arg) - }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, _river_key(m, m.CommandKey()), mdb.HASH, m.OptionSimple(web.SPACE)) - }}, - aaa.INVITE: {Name: "invite", Help: "邀请", Hand: func(m *ice.Message, arg ...string) { - m.Option(web.SHARE, m.Cmdx(web.SHARE, mdb.CREATE, mdb.TYPE, RIVER)) - m.Cmdy("publish", ice.CONTEXTS, "tool") - }}, - }, Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 0 { - m.OptionFields("time,type,space,share") - m.Cmdy(mdb.SELECT, RIVER, _river_key(m, m.CommandKey()), mdb.HASH) - m.Tables(func(value ice.Maps) { - m.PushAnchor(value[mdb.NAME], web.MergePod(m, kit.Keys(m.Option(ice.POD), value[mdb.NAME]))) - }) - m.PushAction(mdb.REMOVE) - return - } - m.Cmdy(web.ROUTE, arg) - }}, - }) -} diff --git a/core/chat/ocean.go b/core/chat/ocean.go deleted file mode 100644 index 092e71c6..00000000 --- a/core/chat/ocean.go +++ /dev/null @@ -1,43 +0,0 @@ -package chat - -import ( - ice "shylinux.com/x/icebergs" - "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/gdb" - "shylinux.com/x/icebergs/base/mdb" - kit "shylinux.com/x/toolkits" -) - -const OCEAN = "ocean" - -func init() { - Index.MergeCommands(ice.Commands{ - OCEAN: {Name: "ocean username auto insert invite", Help: "用户", Actions: ice.Actions{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - gdb.Watch(m, RIVER_CREATE) - }}, - RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) { - m.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(aaa.USER, ice.OptionFields(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE)) - }}, - mdb.INSERT: {Name: "insert username", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Option(mdb.SHORT, aaa.USERNAME) - m.Cmdy(mdb.INSERT, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, arg) - }}, - mdb.DELETE: {Name: "delete", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(RIVER), _river_key(m, OCEAN), mdb.HASH, m.OptionSimple(aaa.USERNAME)) - }}, - }, Hand: func(m *ice.Message, arg ...string) { - m.Fields(len(arg), "time,username") - m.Cmdy(mdb.SELECT, RIVER, _river_key(m, OCEAN), mdb.HASH, aaa.USERNAME, arg) - 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())) - }) - m.PushAction(mdb.DELETE) - }}, - }) -} diff --git a/core/chat/river.go b/core/chat/river.go index ce6a4a36..da8ba40a 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -3,7 +3,6 @@ package chat import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/gdb" "shylinux.com/x/icebergs/base/mdb" @@ -12,41 +11,24 @@ import ( kit "shylinux.com/x/toolkits" ) +func _river_right(m *ice.Message, hash string) bool { + return m.Option(ice.MSG_USERROLE) == aaa.ROOT || m.Cmdx(aaa.ROLE, aaa.RIGHT, m.Option(ice.MSG_USERROLE), RIVER, hash) == ice.OK +} func _river_key(m *ice.Message, key ...ice.Any) string { return kit.Keys(mdb.HASH, m.Option(ice.MSG_RIVER), kit.Simple(key)) } func _river_list(m *ice.Message) { if m.Option(web.SHARE) != "" { switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(mdb.TYPE) { - case web.RIVER: // 共享群组 - m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME)) - m.Option(ice.MSG_RIVER, msg.Append(RIVER)) - m.Option(ice.MSG_STORM, msg.Append(STORM)) - - if m.Conf(RIVER, _river_key(m)) == "" { - break // 虚拟群组 - } - if msg.Cmd(OCEAN, m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { - msg.Cmd(OCEAN, mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) // 加入群组 - } - - case web.STORM: // 共享应用 - m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME)) - m.Option(ice.MSG_STORM, msg.Append(STORM)) - m.Option(ice.MSG_RIVER, "_share") - return - - case web.FIELD: // 共享命令 - m.Option(ice.MSG_TITLE, msg.Append(mdb.NAME)) + case web.STORM, web.FIELD: // 共享应用 m.Option(ice.MSG_RIVER, "_share") return } } - m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields(mdb.HASH, mdb.NAME), func(value ice.Maps) { - m.Cmd(mdb.SELECT, m.PrefixKey(), kit.Keys(mdb.HASH, value[mdb.HASH], OCEAN), mdb.HASH, aaa.USERNAME, m.Option(ice.MSG_USERNAME), func(val ice.Maps) { - m.Push("", value, []string{mdb.HASH, mdb.NAME}, val) - }) + if _river_right(m, value[mdb.HASH]) { + m.PushRecord(value, mdb.HASH, mdb.NAME) + } }) } @@ -60,66 +42,48 @@ func init() { RIVER: {Name: "river hash auto create", Help: "群组", Actions: ice.MergeActions(ice.Actions{ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, m.CommandKey()) + m.Cmd(aaa.ROLE, aaa.BLACK, aaa.VOID, m.CommandKey(), ctx.ACTION) }}, mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - switch m.Option(ctx.ACTION) { - case cli.START, "创建空间": - m.Cmdy(web.DREAM, mdb.INPUTS, arg) - return - } - switch arg[0] { case nfs.TEMPLATE: - m.Push(nfs.TEMPLATE, ice.BASE) - case aaa.USERROLE: - m.Push(aaa.USERROLE, aaa.VOID, aaa.TECH, aaa.ROOT) - case aaa.USERNAME: - m.Cmdy(aaa.USER).Cut(aaa.USERNAME, aaa.USERNICK, aaa.USERZONE) + m.Cmdy(TEMPLATE).CutTo(RIVER, arg[0]) default: mdb.HashInputs(m, arg) } }}, - mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + mdb.CREATE: {Name: "create type=void,tech name=hi text=hello template=base", Help: "添加", Hand: func(m *ice.Message, arg ...string) { h := mdb.HashCreate(m, arg) + defer m.Result(h) + + if m.Option(mdb.TYPE) == aaa.VOID { + m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, kit.Keys(RIVER, h)) + } gdb.Event(m, RIVER_CREATE, RIVER, m.Option(ice.MSG_RIVER, h), arg) - m.Result(h) }}, - cli.START: {Name: "start name=hi repos template", Help: "创建空间", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.Space(m, m.Option(ice.POD)), web.DREAM, cli.START, arg) - }}, - aaa.INVITE: {Name: "invite", Help: "添加设备", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("publish", ice.CONTEXTS) - }}, - }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction("/river")), Hand: func(m *ice.Message, arg ...string) { + }, mdb.HashAction(mdb.FIELD, "time,hash,type,name,text,template"), web.ApiAction(web.P(RIVER))), Hand: func(m *ice.Message, arg ...string) { if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { m.RenderStatusUnauthorized() return // 没有登录 } - if len(arg) == 0 { - m.Option(MENUS, m.Config(MENUS)) - _river_list(m) - return // 群组列表 - } - if len(arg) == 2 && arg[1] == STORM { - m.Option(ice.MSG_RIVER, arg[0]) - m.Cmdy(arg[1], arg[2:]) - return // 应用列表 - } if !aaa.Right(m, RIVER, arg) { m.RenderStatusForbidden() return // 没有授权 } - - if command := m.Commands(kit.Select("", arg, 1)); command != nil { + if len(arg) == 0 { + _river_list(m) + return // 群组列表 + } + if len(arg) > 1 && arg[1] == STORM { m.Option(ice.MSG_RIVER, arg[0]) m.Cmdy(arg[1], arg[2:]) - - } else if action := m.Actions(kit.Select("", arg, 1)); action != nil { + return // 应用列表 + } + if len(arg) > 2 && arg[2] == STORM { m.Option(ice.MSG_RIVER, arg[0]) - m.Cmdy("", arg[1:]) - - } else { - m.Cmdy(RIVER, arg) + m.Option(ice.MSG_STORM, arg[1]) + m.Cmdy(arg[2], arg[3:]) + return // 应用操作 } }}, }) diff --git a/core/chat/storm.go b/core/chat/storm.go index f383242c..5f2b3da6 100644 --- a/core/chat/storm.go +++ b/core/chat/storm.go @@ -5,12 +5,11 @@ import ( "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" - "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) func _storm_key(m *ice.Message, key ...ice.Any) string { - return _river_key(m, STORM, mdb.HASH, kit.Keys(key)) + return _river_key(m, mdb.HASH, m.Option(ice.MSG_STORM), kit.Keys(key)) } const STORM = "storm" @@ -18,59 +17,34 @@ const STORM = "storm" func init() { Index.MergeCommands(ice.Commands{ STORM: {Name: "storm hash id auto insert create", Help: "应用", Actions: ice.Actions{ - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - if ctx.Inputs(m, arg[0]) { - return - } - switch arg[0] { - case mdb.HASH: - m.Cmdy("", ice.OptionFields("hash,name")) - } - }}, - mdb.CREATE: {Name: "create type=public,protected,private name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, _river_key(m, STORM), mdb.HASH, arg) + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {}}, + mdb.CREATE: {Name: "create name=hi text=hello", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, _river_key(m), mdb.HASH, arg) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH)) + m.Cmdy(mdb.DELETE, RIVER, _river_key(m), mdb.HASH, mdb.HASH, m.Option(ice.MSG_STORM)) }}, - mdb.INSERT: {Name: "insert hash space index", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, arg[2:]) + mdb.INSERT: {Name: "insert hash space index args style display", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, RIVER, _storm_key(m), mdb.LIST, arg) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - if m.Option(mdb.ID) == "" { - m.Cmdy(mdb.MODIFY, RIVER, _river_key(m, STORM), mdb.HASH, m.OptionSimple(mdb.HASH), arg) + if len(arg) > 0 && arg[0] == mdb.ID { + m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m), mdb.LIST, arg) } else { - m.Cmdy(mdb.MODIFY, RIVER, _storm_key(m, m.Option(mdb.HASH)), mdb.LIST, m.OptionSimple(mdb.ID), arg) + m.Cmdy(mdb.MODIFY, RIVER, _river_key(m), mdb.HASH, mdb.HASH, m.Option(ice.MSG_STORM), arg) } }}, }, Hand: func(m *ice.Message, arg ...string) { - if len(arg) == 0 { // 应用列表 - m.OptionFields("time,hash,type,name,count") - m.Cmdy(mdb.SELECT, RIVER, _river_key(m, STORM), mdb.HASH).Sort(mdb.NAME) - m.PushAction(mdb.REMOVE) - return - } + if m.Option(ice.MSG_STORM) == "" { // 应用列表 + m.OptionFields("time,hash,name,text,count") + m.Cmdy(mdb.SELECT, RIVER, _river_key(m), mdb.HASH) - m.OptionFields("time,id,space,index,args,style,display") - msg := m.Cmd(mdb.SELECT, RIVER, _storm_key(m, arg[0]), mdb.LIST, mdb.ID, kit.Select("", arg, 1)) - if msg.Length() == 0 && len(arg) > 1 { // 虚拟群组 - if aaa.Right(m, arg[1]) { - msg.Push(ctx.INDEX, arg[1]) - } - } + } else if len(arg) == 0 || kit.Int(arg[0]) > 0 { // 工具列表 + m.OptionFields("time,id,space,index,args,style,display") + m.Cmdy(mdb.SELECT, RIVER, _storm_key(m), mdb.LIST, mdb.ID, arg) - if len(arg) > 2 && arg[2] == ice.RUN { // 执行命令 - if !m.Warn(aaa.Right(m, msg.Append(ctx.INDEX))) { - m.Cmdy(web.Space(m, kit.Select(m.Option(ice.POD), msg.Append(web.SPACE))), msg.Append(ctx.INDEX), arg[3:]) - } - return - } - - if m.Copy(msg); len(arg) > 1 { // 命令插件 - m.Tables(func(value ice.Maps) { m.Cmdy(web.Space(m, value[web.SPACE]), ctx.COMMAND, value[ctx.INDEX]) }) - if m.Length() > 0 { - m.ProcessField(arg[0], arg[1], ice.RUN) - } + } else if aaa.Right(m, arg[0]) { // 静态群组 + m.Push(ctx.INDEX, arg[0]) } }}, }) diff --git a/core/chat/template.go b/core/chat/template.go index d7393b0d..67374d85 100644 --- a/core/chat/template.go +++ b/core/chat/template.go @@ -18,7 +18,7 @@ func init() { kit.Fetch(_river_template, func(river string, value ice.Any) { m.Cmd("", mdb.CREATE, RIVER, river) kit.Fetch(value, func(storm string, value ice.Any) { - m.Cmd("", mdb.INSERT, RIVER, river, mdb.TYPE, "", STORM, storm, mdb.TEXT, "") + m.Cmd("", mdb.INSERT, RIVER, river, STORM, storm) kit.Fetch(value, func(index int, value ice.Any) { m.Cmd("", "add", RIVER, river, STORM, storm, ctx.INDEX, value) }) @@ -27,17 +27,17 @@ func init() { } }}, RIVER_CREATE: {Name: "river.create river template", Help: "建群", Hand: func(m *ice.Message, arg ...string) { - m.Cmd("", m.Option(TEMPLATE), func(value ice.Maps) { - h := m.Cmdx(STORM, mdb.CREATE, mdb.TYPE, "", mdb.NAME, value[STORM], mdb.TEXT, "") - m.Cmd("", m.Option(TEMPLATE), value[STORM], func(value ice.Maps) { - m.Cmd(STORM, mdb.INSERT, mdb.HASH, h, kit.SimpleKV("space,index", value)) + m.Cmd("", m.Option(TEMPLATE), ice.OptionFields(STORM), func(value ice.Maps) { + m.Option(ice.MSG_STORM, m.Cmdx(STORM, mdb.CREATE, mdb.NAME, value[STORM])) + m.Cmd("", m.Option(TEMPLATE), value[STORM], ice.OptionFields(ctx.INDEX), func(value ice.Maps) { + m.Cmd(STORM, mdb.INSERT, ctx.INDEX, value[ctx.INDEX]) }) }) }}, mdb.CREATE: {Name: "create river", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmd(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, m.OptionSimple(RIVER), kit.Dict(mdb.SHORT, RIVER)) }}, - mdb.INSERT: {Name: "insert river type storm text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + mdb.INSERT: {Name: "insert river storm", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmd(mdb.INSERT, m.PrefixKey(), kit.KeyHash(m.Option(RIVER)), mdb.HASH, arg[2:], kit.Dict(mdb.SHORT, STORM)) }}, "add": {Name: "add river storm index", Help: "添加", Hand: func(m *ice.Message, arg ...string) { @@ -53,18 +53,13 @@ func init() { }), Hand: func(m *ice.Message, arg ...string) { switch len(arg) { case 0: - m.OptionFields("time,river") - m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH) - m.PushAction(mdb.REMOVE) - m.Action(mdb.CREATE) + m.Cmdy(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, ice.OptionFields("time,river")) + m.PushAction(mdb.REMOVE).Action(mdb.CREATE) case 1: - m.OptionFields("time,type,storm,text") - m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0]), mdb.HASH) - m.PushAction(mdb.REMOVE) - m.Action(mdb.INSERT) + m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0]), mdb.HASH, ice.OptionFields("time,storm")) + m.PushAction(mdb.REMOVE).Action(mdb.INSERT) case 2: - m.OptionFields("time,index") - m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0], kit.KeyHash(arg[1])), mdb.LIST) + m.Cmdy(mdb.SELECT, m.PrefixKey(), kit.KeyHash(arg[0], kit.KeyHash(arg[1])), mdb.LIST, ice.OptionFields("time,index")) m.Action("add") } }}, @@ -73,10 +68,22 @@ func init() { var _river_template = kit.Dict( "base", kit.Dict( - "info", kit.List( - "web.chat.storm", - "web.chat.ocean", - "web.chat.nodes", + "draw", kit.List( + "web.wiki.draw", + "web.wiki.data", + "web.wiki.word", + ), + "term", kit.List( + "web.code.xterm", + "web.code.vimer", + "web.chat.iframe", + ), + "task", kit.List( + "web.team.task", + "web.team.plan", + "web.mall.asset", + "web.mall.salary", + "web.wiki.word", ), "scan", kit.List( "web.chat.scan", @@ -86,21 +93,5 @@ var _river_template = kit.Dict( "web.chat.meet.miss", "web.wiki.feel", ), - "task", kit.List( - "web.team.task", - "web.team.plan", - "web.mall.asset", - "web.mall.salary", - "web.wiki.word", - ), - "draw", kit.List( - "web.wiki.draw", - "web.wiki.data", - "web.wiki.word", - ), - "term", kit.List( - "web.code.xterm", - "web.code.vimer", - ), ), ) diff --git a/core/chat/trans.go b/core/chat/trans.go index ed39b119..b6041613 100644 --- a/core/chat/trans.go +++ b/core/chat/trans.go @@ -12,6 +12,8 @@ import ( kit "shylinux.com/x/toolkits" ) +const TRANS = "trans" + func init() { const ( SEND = "send" diff --git a/core/chat/website.go b/core/chat/website.go index 7189db8a..0ef33c61 100644 --- a/core/chat/website.go +++ b/core/chat/website.go @@ -17,7 +17,7 @@ import ( ) func _website_url(m *ice.Message, file string) string { - return strings.Split(MergeWebsite(m, file), "?")[0] + return strings.Split(web.MergePodWebSite(m, "", file), "?")[0] } func _website_parse(m *ice.Message, text string, args ...string) (ice.Map, bool) { if text == "" { @@ -150,7 +150,7 @@ func _website_render(m *ice.Message, w http.ResponseWriter, r *http.Request, kin } func _website_search(m *ice.Message, kind, name, text string, arg ...string) { m.Cmd(m.PrefixKey(), ice.OptionFields(""), func(value ice.Maps) { - m.PushSearch(value, mdb.TEXT, MergeWebsite(m, value[nfs.PATH])) + m.PushSearch(value, mdb.TEXT, web.MergePodWebSite(m, "", value[nfs.PATH])) }) } @@ -243,7 +243,7 @@ func init() { } }}, }, mdb.HashAction(mdb.SHORT, nfs.PATH, mdb.FIELD, "time,path,type,name,text"), ctx.CmdAction(), web.ApiAction()), Hand: func(m *ice.Message, arg ...string) { - mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(MergeWebsite(m, value[nfs.PATH])) }) + mdb.HashSelect(m, arg...).Tables(func(value ice.Maps) { m.PushAnchor(web.MergePodWebSite(m, "", value[nfs.PATH])) }) if len(arg) == 0 { // 文件列表 m.Cmd(nfs.DIR, SRC_WEBSITE, func(f os.FileInfo, p string) { m.Push("", kit.Dict( diff --git a/core/code/zml.go b/core/code/zml.go index a0c08a82..c919c7a9 100644 --- a/core/code/zml.go +++ b/core/code/zml.go @@ -9,12 +9,11 @@ import ( "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" "shylinux.com/x/icebergs/base/web" - "shylinux.com/x/icebergs/core/chat" kit "shylinux.com/x/toolkits" ) func _website_url(m *ice.Message, file string) string { - return strings.Split(chat.MergeWebsite(m, file), "?")[0] + return strings.Split(web.MergePodWebSite(m, "", file), "?")[0] } const ZML = nfs.ZML diff --git a/core/team/plan.go b/core/team/plan.go index 8ae29070..7004c7dd 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -7,7 +7,6 @@ import ( "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/web" - "shylinux.com/x/icebergs/core/chat" kit "shylinux.com/x/toolkits" ) @@ -80,7 +79,7 @@ func init() { }}, mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { if arg[0] == mdb.FOREACH && arg[1] == "" { - m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, chat.MergeCmd(m, "")) + m.PushSearch(mdb.TYPE, "plan", mdb.NAME, "", mdb.TEXT, web.MergePodCmd(m, "", "")) } }}, ice.RUN: {Name: "run", Help: "执行", Hand: func(m *ice.Message, arg ...string) { diff --git a/core/wiki/word.go b/core/wiki/word.go index 8dd027c9..16c01b72 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -10,7 +10,7 @@ import ( "shylinux.com/x/icebergs/base/lex" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" - "shylinux.com/x/icebergs/core/chat" + "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) @@ -47,9 +47,13 @@ func init() { m.Cmd(aaa.ROLE, aaa.WHITE, aaa.VOID, ice.SRC_MAIN_SHY) }}, mdb.SEARCH: {Name: "search", Help: "搜索", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == mdb.FOREACH && arg[1] == "" { - m.PushSearch(mdb.TYPE, nfs.SHY, mdb.NAME, ice.SRC_MAIN_SHY, mdb.TEXT, chat.MergeCmd(m, "")) + if (arg[0] != mdb.FOREACH && arg[0] != m.CommandKey()) || arg[1] == "" { + return } + if arg[1] == "" { + m.PushSearch(mdb.TYPE, nfs.SHY, mdb.NAME, ice.SRC_MAIN_SHY, mdb.TEXT, web.MergePodCmd(m, "", "")) + } + m.Cmd(mdb.SELECT, m.PrefixKey(), "", mdb.HASH, func(value ice.Maps) { if arg[1] == "" { if value[mdb.TYPE] == SPARK { diff --git a/meta.go b/meta.go index e2ab2a20..ad99af59 100644 --- a/meta.go +++ b/meta.go @@ -102,6 +102,9 @@ func (m *Message) Cut(fields ...string) *Message { m.meta[MSG_APPEND] = kit.Split(kit.Join(fields)) return m } +func (m *Message) CutTo(key, to string) *Message { + return m.Cut(key).RenameAppend(key, to) +} func (m *Message) Push(key string, value Any, arg ...Any) *Message { head := kit.Simple() if len(head) == 0 && len(arg) > 0 { diff --git a/misc/git/status.go b/misc/git/status.go index 4e445efd..c59dabcb 100644 --- a/misc/git/status.go +++ b/misc/git/status.go @@ -14,7 +14,6 @@ import ( "shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/core/code" kit "shylinux.com/x/toolkits" - "shylinux.com/x/toolkits/task" ) func _status_tag(m *ice.Message, tags string) string { @@ -127,14 +126,13 @@ func _status_stat(m *ice.Message, files, adds, dels int) (int, int, int) { } func _status_list(m *ice.Message) (files, adds, dels int, last time.Time) { defer m.Sort("repos,type") - m.Cmd(REPOS, ice.OptionFields("name,path")).TableGo(func(value ice.Maps, lock *task.Lock) { + m.Cmd(REPOS, ice.OptionFields("name,path")).Tables(func(value ice.Maps) { msg := m.Spawn(kit.Dict(cli.CMD_DIR, value[nfs.PATH])) diff := _git_cmds(msg, STATUS, "-sb") tags := _git_cmds(msg, "describe", "--tags") _files, _adds, _dels := _status_stat(msg, 0, 0, 0) now, _ := time.Parse("2006-01-02 15:04:05 -0700", strings.TrimSpace(_git_cmds(msg, "log", `--pretty=%cd`, "--date=iso", "-n1"))) - defer lock.Lock()() if files, adds, dels = files+_files, adds+_adds, dels+_dels; now.After(last) { last = now } diff --git a/option.go b/option.go index be37f9e8..a53e015e 100644 --- a/option.go +++ b/option.go @@ -20,6 +20,12 @@ func (m *Message) OptionFields(arg ...string) string { } return kit.Join(kit.Simple(m.Optionv(MSG_FIELDS))) } +func (m *Message) OptionFromConfig(arg ...string) string { + for _, key := range arg { + m.Option(key, m.Config(key)) + } + return m.Option(arg[0]) +} func (m *Message) OptionDefault(arg ...string) string { for i := 0; i < len(arg); i += 2 { if m.Option(arg[i]) == "" { diff --git a/render.go b/render.go index cd3d333c..25fe2862 100644 --- a/render.go +++ b/render.go @@ -105,6 +105,14 @@ func (m *Message) PushAction(list ...Any) *Message { } func (m *Message) PushSearch(args ...Any) { data := kit.Dict(args...) + for i := 0; i < len(args); i += 2 { + switch k := args[i].(type) { + case string: + if i+1 < len(args) { + data[k] = args[i+1] + } + } + } for _, k := range kit.Split(m.OptionFields()) { switch k { case POD: diff --git a/type.go b/type.go index af56bb74..3caa7b69 100644 --- a/type.go +++ b/type.go @@ -321,6 +321,23 @@ type Message struct { I io.Reader } +// func (m *Message) getMeta(key string) []string { +// defer m.lock.RLock()() +// return m.meta[key] +// } +// func (m *Message) setMeta(key string, value []string) { +// defer m.lock.Lock()() +// if value == nil { +// delete(m.meta, key) +// } else { +// m.meta[key] = value +// } +// } +// func (m *Message) getData(key string) Any { +// defer m.lock.RLock()() +// return m._data[key] +// } +// func (m *Message) Time(args ...Any) string { // [duration] [format [args...]] t := m.time if len(args) > 0 {