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 {