From ef6ac8100ef6005f6a7d8b7f802f6b2b4774bf15 Mon Sep 17 00:00:00 2001 From: shaoying Date: Sat, 1 May 2021 18:54:35 +0800 Subject: [PATCH] opt share --- base/aaa/user.go | 3 --- base/web/share.go | 41 +++++++++++++++++++----------- base/web/space.go | 23 +++++++++++------ conf.go | 1 + core/chat/action.go | 57 ++++++++++++++++++++++++++++------------- core/chat/header.go | 23 ++++++++++++++++- core/chat/river.go | 31 +++++++++++++++++------ core/code/binpack.go | 14 +++++++---- core/code/compile.go | 1 + logs.go | 1 + misc.go | 10 +++++++- type.go | 60 +++++++++++++++++++++++++++++++------------- 12 files changed, 188 insertions(+), 77 deletions(-) diff --git a/base/aaa/user.go b/base/aaa/user.go index 516e8366..72e16dba 100644 --- a/base/aaa/user.go +++ b/base/aaa/user.go @@ -1,8 +1,6 @@ package aaa import ( - "strings" - ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" @@ -80,7 +78,6 @@ func UserLogin(m *ice.Message, username, password string) bool { USERNICK, m.Option(ice.MSG_USERNICK, UserNick(m, username)), USERROLE, m.Option(ice.MSG_USERROLE, UserRole(m, username)), USERNAME, m.Option(ice.MSG_USERNAME, username), - PASSWORD, strings.Repeat("*", len(password)), ) return true } diff --git a/base/web/share.go b/base/web/share.go index 24a6cc3d..7337e43c 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -4,6 +4,7 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" "net/http" @@ -13,6 +14,16 @@ import ( "time" ) +func _share_domain(m *ice.Message) string { + link := m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)) + if link == "" { + link = m.Cmd(SPACE, SPIDE_DEV, kit.SSH_PWD).Append(kit.MDB_LINK) + } + if link == "" { + link = kit.Format("http://%s:%s", m.Cmd(tcp.HOST).Append(tcp.IP), m.Cmd(SERVE).Append(tcp.PORT)) + } + return link +} func _share_cache(m *ice.Message, arg ...string) { msg := m.Cmd(CACHE, arg[0]) m.Render(ice.RENDER_DOWNLOAD, msg.Append(kit.MDB_FILE), msg.Append(kit.MDB_TYPE), msg.Append(kit.MDB_NAME)) @@ -78,7 +89,7 @@ const ( LOGIN = "login" RIVER = "river" STORM = "storm" - APPLY = "apply" + FIELD = "field" ) const SHARE = "share" @@ -94,6 +105,9 @@ func init() { aaa.USERROLE, m.Option(ice.MSG_USERROLE), aaa.USERNAME, m.Option(ice.MSG_USERNAME), RIVER, m.Option(ice.MSG_RIVER), STORM, m.Option(ice.MSG_STORM), arg) }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH), arg) + }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.DELETE, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, @@ -101,32 +115,29 @@ func init() { m.Option(mdb.FIELDS, "time,userrole,username,river,storm,type,name,text") m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) {}}, LOGIN: {Name: "login userrole=void,tech username", Help: "登录", Hand: func(m *ice.Message, arg ...string) { - m.EchoQRCode(kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), + m.EchoQRCode(kit.MergeURL(_share_domain(m), SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, aaa.USERNAME, kit.Select(m.Option(ice.MSG_USERNAME), m.Option(aaa.USERNAME)), aaa.USERROLE, m.Option(aaa.USERROLE), ))) }}, - APPLY: {Name: "apply", Help: "申请", Hand: func(m *ice.Message, arg ...string) { - m.EchoQRCode(kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), - SHARE, m.Cmdx(SHARE, mdb.CREATE, kit.MDB_TYPE, APPLY))) - }}, - "auth": {Name: "auth", Help: "授权", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, SHARE, "", mdb.HASH, kit.MDB_HASH, arg) - }}, - mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Fields(len(arg) == 0, "time,hash,type,name,text,userrole,username,river,storm") m.Cmdy(mdb.SELECT, SHARE, "", mdb.HASH, kit.MDB_HASH, arg) m.PushAction(mdb.REMOVE) if len(arg) > 0 { - m.PushAnchor(kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) - m.PushScript("shell", kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) - m.PushQRCode("share", kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/share/"+arg[0], SHARE, arg[0])) + link := kit.MergeURL(m.Option(ice.MSG_USERWEB), SHARE, arg[0]) + if strings.Contains(link, tcp.LOCALHOST) { + link = strings.Replace(link, tcp.LOCALHOST, m.Cmd(tcp.HOST, ice.OptionFields(tcp.IP)).Append(tcp.IP), 1) + } + + m.PushAnchor(link) + m.PushScript("shell", link) + m.PushQRCode("qrcode", link) } else { m.Option("_action", "login") } @@ -143,7 +154,7 @@ func init() { } switch msg.Append(kit.MDB_TYPE) { - case LOGIN, APPLY, RIVER: + case LOGIN, RIVER: switch kit.Select("", arg, 1) { case SHARE: m.Render(ice.RENDER_QRCODE, kit.MergeURL2(m.Option(ice.MSG_USERWEB), "/", list)) diff --git a/base/web/space.go b/base/web/space.go index 7ee34e11..d3ff532e 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -140,8 +140,11 @@ func _space_handle(m *ice.Message, safe bool, send map[string]*ice.Message, c *w if len(target) == 0 { // 本地执行 msg.Log_AUTH(aaa.USERROLE, msg.Option(ice.MSG_USERROLE), aaa.USERNAME, msg.Option(ice.MSG_USERNAME)) - if msg.Optionv(ice.MSG_HANDLE, "true"); !msg.Warn(!safe, ice.ErrNotRight) { + if msg.Optionv(ice.MSG_HANDLE, "true"); safe { msg.Go(func() { _space_exec(msg, source, target, c, name) }) + } else { + msg.Push(kit.MDB_LINK, kit.MergePOD(_share_domain(msg), name)) + _space_echo(msg, []string{}, kit.Revert(source)[1:], c, name) } } else if msg.Richs(SPACE, nil, target[0], func(key string, value map[string]interface{}) { @@ -185,9 +188,10 @@ func _space_search(m *ice.Message, kind, name, text string, arg ...string) { } }) + port := m.Cmd(SERVE, ice.Option{mdb.FIELDS, tcp.PORT}).Append(tcp.PORT) m.Cmd(tcp.HOST).Table(func(index int, value map[string]string, head []string) { - m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, "local", kit.MDB_NAME, value[kit.MDB_NAME], - kit.MDB_TEXT, "http://"+value[tcp.IP]+":9020", kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value)) + m.PushSearch(kit.SSH_CMD, SPACE, kit.MDB_TYPE, MYSELF, kit.MDB_NAME, value[kit.MDB_NAME], + kit.MDB_TEXT, kit.Format("http://%s:%s", value[tcp.IP], port), kit.SSH_POD, kit.Keys(m.Option(ice.MSG_USERPOD), value)) }) } @@ -231,7 +235,9 @@ func init() { "/space/": {Name: "/space/ type name share river", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if s, e := websocket.Upgrade(m.W, m.R, nil, kit.Int(m.Conf(SPACE, "meta.buffer.r")), kit.Int(m.Conf(SPACE, "meta.buffer.w"))); m.Assert(e) { - name := m.Option(kit.MDB_NAME, strings.Replace(kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)), ".", "_", -1)) + name := kit.Select(s.RemoteAddr().String(), m.Option(kit.MDB_NAME)) + name = m.Option(kit.MDB_NAME, strings.Replace(name, ".", "_", -1)) + name = m.Option(kit.MDB_NAME, strings.Replace(name, ":", "-", -1)) kind := kit.Select(WORKER, m.Option(kit.MDB_TYPE)) share := m.Option("share") river := m.Option("river") @@ -259,10 +265,11 @@ func init() { if m.Option(ice.MSG_USERNAME) != "" { break } - link := kit.MergeURL(m.Conf(SHARE, kit.Keym(kit.MDB_DOMAIN)), "grant", name) - go func() { - m.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, m.Cmdx(cli.QRCODE, link)) - }() + + m.Go(func(msg *ice.Message) { + link := kit.MergeURL(_share_domain(msg), "grant", name) + msg.Sleep("100ms").Cmd(SPACE, name, "pwd", name, link, msg.Cmdx(cli.QRCODE, link)) + }) } frame := m.Target().Server().(*Frame) diff --git a/conf.go b/conf.go index 57bdd726..50eae16d 100644 --- a/conf.go +++ b/conf.go @@ -75,6 +75,7 @@ const ( // MSG MSG_USERZONE = "user.zone" MSG_USERROLE = "user.role" + MSG_TITLE = "sess.title" MSG_RIVER = "sess.river" MSG_STORM = "sess.storm" MSG_LOCAL = "sess.local" diff --git a/core/chat/action.go b/core/chat/action.go index 5dfd5562..926f57c2 100644 --- a/core/chat/action.go +++ b/core/chat/action.go @@ -1,13 +1,14 @@ package chat import ( + "path" + "strings" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/ctx" "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - - "path" ) func _action_domain(m *ice.Message, cmd string, arg ...string) (domain string) { @@ -52,6 +53,29 @@ func _action_right(m *ice.Message, river string, storm string) (ok bool) { } return ok } +func _action_share(m *ice.Message, cmd string, arg ...string) { + switch msg := m.Cmd(web.SHARE, arg[1]); msg.Append(kit.MDB_TYPE) { + case web.FIELD: + if cmd := kit.Keys(msg.Append(web.RIVER), msg.Append(web.STORM)); len(arg) == 2 { + m.Push("index", cmd) + m.Push("args", msg.Append(kit.MDB_TEXT)) + } else { + if m.Warn(kit.Time() > kit.Time(msg.Append(kit.MDB_TIME)), ice.ErrExpire) { + return // 分享超时 + } + m.Log_AUTH( + aaa.USERROLE, m.Option(ice.MSG_USERROLE, msg.Append(aaa.USERROLE)), + aaa.USERNAME, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)), + ) + if m.Warn(!m.Right(arg[3:]), ice.ErrNotRight) { + return // 没有授权 + } + + m.Cmdy(cmd, arg[3:]) + } + } +} + func _action_list(m *ice.Message, river, storm string) { m.Option(ice.MSG_RIVER, river) m.Cmdy(TOOL, storm).Table(func(index int, value map[string]string, head []string) { @@ -106,26 +130,23 @@ func init() { P_ACTION: {Name: "/action river storm action arg...", Help: "工作台", Action: map[string]*ice.Action{ ctx.COMMAND: {Name: "command", Help: "命令", Hand: func(m *ice.Message, arg ...string) { for _, k := range arg { - m.Cmdy(ctx.COMMAND, k) + m.Cmdy(ctx.COMMAND, strings.TrimPrefix(k, ".")) } }}, + SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { + _header_share(m, arg...) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if arg[0] == "_share" { - switch msg := m.Cmd(web.SHARE, arg[1]); msg.Append(kit.MDB_TYPE) { - case STORM: - m.Option(kit.MDB_TITLE, msg.Append(kit.MDB_NAME)) - arg[0] = msg.Append(RIVER) - arg[1] = msg.Append(STORM) - default: - return - } - } else { - if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { - return // 没有登录 - } - if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) { - return // 没有授权 - } + _action_share(m, cmd, arg...) + return + } + + if m.Warn(m.Option(ice.MSG_USERNAME) == "", ice.ErrNotLogin) { + return // 没有登录 + } + if m.Warn(!_action_right(m, arg[0], arg[1]), ice.ErrNotRight) { + return // 没有授权 } m.Option(ice.MSG_RIVER, arg[0]) diff --git a/core/chat/header.go b/core/chat/header.go index 6a638d4c..10ea3d4f 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -1,9 +1,12 @@ package chat import ( + "strings" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/tcp" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" @@ -16,6 +19,8 @@ func _header_check(m *ice.Message) { if m.Option(ice.MSG_USERNAME) != msg.Append(aaa.USERNAME) { web.RenderCookie(m, aaa.SessCreate(m, m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)))) } + case web.FIELD: + m.Option(ice.MSG_USERNAME, msg.Append(aaa.USERNAME)) } } @@ -23,6 +28,17 @@ func _header_check(m *ice.Message) { m.Option(web.SSO, m.Conf(web.SERVE, kit.Keym(web.SSO))) } } +func _header_share(m *ice.Message, arg ...string) { + share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) + + link := kit.MergeURL(m.Option(ice.MSG_USERWEB), web.SHARE, share) + if strings.Contains(link, tcp.LOCALHOST) { + link = strings.Replace(link, tcp.LOCALHOST, m.Cmd(tcp.HOST, ice.OptionFields(tcp.IP)).Append(tcp.IP), 1) + } + + m.Push(kit.MDB_NAME, link) + m.PushQRCode(kit.MDB_TEXT, link) +} func _header_grant(m *ice.Message, arg ...string) { if pod := m.Option(kit.SSH_POD); pod != "" { m.Option(kit.SSH_POD, "") @@ -46,6 +62,8 @@ const ( GRANT = "grant" SHARE = "share" AGENT = "agent" + + LOGOUT = "logout" ) const P_HEADER = "/header" const HEADER = "header" @@ -71,11 +89,14 @@ func init() { _header_grant(m, arg...) }}, SHARE: {Name: "share type", Help: "扫码登录", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, arg) + _header_share(m, arg...) }}, AGENT: {Name: "agent", Help: "应用宿主", Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.chat.wx.access", "config") }}, + LOGOUT: {Name: "logout", Help: "退出登录", Hand: func(m *ice.Message, arg ...string) { + m.Cmd(aaa.SESS, mdb.REMOVE, ice.OptionHash(m.Option(ice.MSG_SESSID))) + }}, code.WEBPACK: {Name: "webpack", Help: "网页打包", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.WEBPACK, mdb.CREATE) diff --git a/core/chat/river.go b/core/chat/river.go index daf26c2a..69afc5a5 100644 --- a/core/chat/river.go +++ b/core/chat/river.go @@ -15,6 +15,24 @@ func _river_list(m *ice.Message) { m.Set(ice.MSG_OPTION, kit.MDB_HASH) m.Set(ice.MSG_OPTION, kit.MDB_NAME) + if m.Option(web.SHARE) != "" { + switch msg := m.Cmd(web.SHARE, m.Option(web.SHARE)); msg.Append(kit.MDB_TYPE) { + case web.RIVER, web.STORM: // 应用入口 + m.Option(ice.MSG_TITLE, msg.Append(kit.MDB_NAME)) + m.Option(ice.MSG_RIVER, msg.Append(RIVER)) + m.Option(ice.MSG_STORM, msg.Append(STORM)) + + if msg.Cmd(m.Prefix(USER), m.Option(ice.MSG_USERNAME)).Append(aaa.USERNAME) == "" { + // msg.Cmd(m.Prefix(USER), mdb.INSERT, aaa.USERNAME, m.Option(ice.MSG_USERNAME)) + // 加入群组 + } + case web.FIELD: // 应用入口 + m.Option(ice.MSG_TITLE, msg.Append(kit.MDB_NAME)) + m.Option(ice.MSG_RIVER, "_share") + return + } + } + m.Richs(RIVER, nil, kit.MDB_FOREACH, func(key string, value map[string]interface{}) { m.Richs(RIVER, kit.Keys(kit.MDB_HASH, key, USER), m.Option(ice.MSG_USERNAME), func(k string, val map[string]interface{}) { m.Push(key, kit.GetMeta(value), []string{kit.MDB_HASH, kit.MDB_NAME}, kit.GetMeta(val)) @@ -22,12 +40,8 @@ func _river_list(m *ice.Message) { }) } func _river_share(m *ice.Message) { - if m.Option(web.SHARE) == "" || m.Option(RIVER) == "" { - return - } - + return msg := m.Spawn() - msg.Option(mdb.FIELDS, "type,name,text,river,storm") if res := msg.Cmd(web.SHARE, m.Option(web.SHARE)); res.Append(kit.MDB_TYPE) == RIVER { msg.Option(ice.MSG_RIVER, res.Append(RIVER)) } else { @@ -330,12 +344,13 @@ func init() { m.Cmdy(mdb.INPUTS, RIVER, "", mdb.HASH, arg) } }}, - web.SHARE: {Name: "share type name", Help: "共享", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.SHARE, mdb.CREATE, kit.MDB_TYPE, LOGIN, arg) - }}, tcp.START: {Name: "start name repos template", Help: "启动", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(m.Space(m.Option(kit.SSH_POD)), web.DREAM, tcp.START, arg) }}, + + SHARE: {Name: "share", Help: "共享", Hand: func(m *ice.Message, arg ...string) { + _header_share(m, arg...) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmdy(mdb.SELECT, RIVER, "", mdb.HASH, kit.MDB_HASH, arg) m.PushAction(mdb.REMOVE) diff --git a/core/code/binpack.go b/core/code/binpack.go index bad51818..edbe3a76 100644 --- a/core/code/binpack.go +++ b/core/code/binpack.go @@ -4,6 +4,7 @@ import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/nfs" + "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" "fmt" @@ -57,15 +58,18 @@ func _pack_volcanos(m *ice.Message, pack *os.File, dir string) { m.Option(nfs.DIR_TYPE, nfs.CAT) for _, k := range []string{"favicon.ico", "proto.js", "frame.js"} { - pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", - kit.Select("", k, k != "index.html"), - _pack_file(m, path.Join(dir, k)))) + pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", k, _pack_file(m, path.Join(dir, k)))) } for _, k := range []string{"lib", "page", "panel", "plugin"} { m.Cmd(nfs.DIR, k).Table(func(index int, value map[string]string, head []string) { + if value[kit.MDB_PATH] == "page/index.html" { + pack.WriteString(fmt.Sprintf(" \"%s/%s\": %s,\n", + m.Conf(web.SERVE, kit.Keym(ice.VOLCANOS, kit.MDB_PATH)), value[kit.MDB_PATH], + _pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) + return + } pack.WriteString(fmt.Sprintf(" \"/%s\": %s,\n", - kit.Select("", value[kit.MDB_PATH], value[kit.MDB_PATH] != "page/index.html"), - _pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) + value[kit.MDB_PATH], _pack_file(m, path.Join(dir, value[kit.MDB_PATH])))) }) } pack.WriteString("\n") diff --git a/core/code/compile.go b/core/code/compile.go index 34ce45ad..2b667dca 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -51,6 +51,7 @@ func init() { main = k } } + _autogen_version(m) // 编译目标 file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) diff --git a/logs.go b/logs.go index 20f451b0..faafb71d 100644 --- a/logs.go +++ b/logs.go @@ -10,6 +10,7 @@ import ( var OK = "ok" var ErrWarn = "warn: " +var ErrExpire = "expire: " var ErrNotLogin = "not login: " var ErrNotRight = "not right: " var ErrNotFound = "not found: " diff --git a/misc.go b/misc.go index 1758f978..2db0a857 100644 --- a/misc.go +++ b/misc.go @@ -143,7 +143,7 @@ func Render(m *Message, cmd string, args ...interface{}) string { list := []string{} for _, k := range kit.Split(strings.Join(arg, ",")) { list = append(list, fmt.Sprintf(``, - k, kit.Select(k, kit.Value(m.cmd.Meta, kit.Keys("trans", k))))) + k, kit.Select(k, kit.Value(m._cmd.Meta, kit.Keys("trans", k))))) } return strings.Join(list, "") @@ -255,3 +255,11 @@ func (m *Message) RenameAppend(from, to string) { func (m *Message) Fields(condition bool, fields string) string { return m.Option("fields", kit.Select(kit.Select("detail", fields, condition), m.Option("fields"))) } + +type Option struct { + Name string + Value interface{} +} + +func OptionFields(str string) Option { return Option{"fields", str} } +func OptionHash(str string) Option { return Option{kit.MDB_HASH, str} } diff --git a/type.go b/type.go index 1b21d10b..53047689 100644 --- a/type.go +++ b/type.go @@ -111,7 +111,7 @@ func (c *Context) _hand(m *Message, cmd *Command, key string, k string, h *Actio return m } func (c *Context) cmd(m *Message, cmd *Command, key string, arg ...string) *Message { - if m.cmd = cmd; cmd == nil { + if m._cmd = cmd; cmd == nil { return m } @@ -324,7 +324,7 @@ type Message struct { source *Context target *Context - cmd *Command + _cmd *Command cb func(*Message) *Message W http.ResponseWriter @@ -628,10 +628,36 @@ func (m *Message) Search(key string, cb interface{}) *Message { return m } -func (m *Message) _hand(arg ...interface{}) *Message { - list := kit.Simple(arg...) - if len(arg) > 0 { - switch cb := arg[len(arg)-1]; cbs := cb.(type) { +func (m *Message) Cmdy(arg ...interface{}) *Message { + return m.Copy(m.cmd(arg...)) +} +func (m *Message) Cmdx(arg ...interface{}) string { + return kit.Select("", m.cmd(arg...).meta[MSG_RESULT], 0) +} +func (m *Message) Cmds(arg ...interface{}) *Message { + return m.Go(func() { m.cmd(arg...) }) +} +func (m *Message) Cmd(arg ...interface{}) *Message { + return m.cmd(arg...) +} +func (m *Message) cmd(arg ...interface{}) *Message { + opts := map[string]interface{}{} + args := []interface{}{} + + for _, v := range arg { + switch val := v.(type) { + case Option: + opts[val.Name] = val.Value + case *Option: + opts[val.Name] = val.Value + default: + args = append(args, v) + } + } + + list := kit.Simple(args...) + if len(args) > 0 { + switch cb := args[len(args)-1]; cbs := cb.(type) { case string: default: if reflect.Func == reflect.TypeOf(cbs).Kind() { @@ -650,15 +676,24 @@ func (m *Message) _hand(arg ...interface{}) *Message { if cmd, ok := m.target.Commands[list[0]]; ok { m.TryCatch(m.Spawn(), true, func(msg *Message) { + for k, v := range opts { + msg.Option(k, v) + } m = m.target.cmd(msg, cmd, list[0], list[1:]...) }) } else if cmd, ok := m.source.Commands[list[0]]; ok { m.TryCatch(m.Spawn(m.source), true, func(msg *Message) { + for k, v := range opts { + msg.Option(k, v) + } m = m.source.cmd(msg, cmd, list[0], list[1:]...) }) } else { m.Search(list[0], func(p *Context, s *Context, key string, cmd *Command) { m.TryCatch(m.Spawn(s), true, func(msg *Message) { + for k, v := range opts { + msg.Option(k, v) + } m = s.cmd(msg, cmd, key, list[1:]...) }) }) @@ -669,18 +704,7 @@ func (m *Message) _hand(arg ...interface{}) *Message { } return m } -func (m *Message) Cmdy(arg ...interface{}) *Message { - return m.Copy(m._hand(arg...)) -} -func (m *Message) Cmdx(arg ...interface{}) string { - return kit.Select("", m._hand(arg...).meta[MSG_RESULT], 0) -} -func (m *Message) Cmds(arg ...interface{}) *Message { - return m.Go(func() { m._hand(arg...) }) -} -func (m *Message) Cmd(arg ...interface{}) *Message { - return m._hand(arg...) -} + func (m *Message) Confv(arg ...interface{}) (val interface{}) { m.Search(kit.Format(arg[0]), func(p *Context, s *Context, key string, conf *Config) { if len(arg) == 1 {