From f3ad58e3f0d7ea8c510f02fc089894d7fdf75735 Mon Sep 17 00:00:00 2001 From: shylinux Date: Mon, 23 Mar 2020 00:24:12 +0800 Subject: [PATCH] opt favor --- base/aaa/aaa.go | 23 ++++++++--- base/web/web.go | 103 ++++++++++++++++++++++++++++------------------ conf.go | 2 + core/chat/chat.go | 22 +++++----- misc/mp/mp.go | 25 ++++++++++- 5 files changed, 118 insertions(+), 57 deletions(-) diff --git a/base/aaa/aaa.go b/base/aaa/aaa.go index 01ae6a4b..546a54c8 100644 --- a/base/aaa/aaa.go +++ b/base/aaa/aaa.go @@ -42,9 +42,11 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", switch arg[0] { case "check": // 用户角色 - m.Echo(kit.Select(kit.Select("void", - "tech", m.Confs(ice.AAA_ROLE, kit.Keys("meta.tech", arg[1]))), - "root", m.Confs(ice.AAA_ROLE, kit.Keys("meta.root", arg[1])))) + if len(arg) > 1 && arg[1] != "" { + m.Echo(kit.Select(kit.Select("void", + "tech", m.Confs(ice.AAA_ROLE, kit.Keys("meta.tech", arg[1]))), + "root", m.Confs(ice.AAA_ROLE, kit.Keys("meta.root", arg[1])))) + } case "black", "white": // 黑白名单 @@ -97,7 +99,7 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", m.Echo("ok") default: - m.Conf(ice.AAA_ROLE, kit.Keys("meta", arg[0], arg[1]), "true") + m.Conf(ice.AAA_ROLE, kit.Keys("meta", arg[0], arg[1]), kit.Select("true", arg, 2)) } }}, ice.AAA_USER: {Name: "user first|login", Help: "用户", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { @@ -125,9 +127,13 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", // 用户认证 user := m.Richs(ice.AAA_USER, nil, arg[1], nil) if word := kit.Select("", arg, 2); user == nil { + nick := arg[1] + if len(nick) > 8 { + nick = nick[:8] + } // 创建用户 m.Rich(ice.AAA_USER, nil, kit.Dict( - "username", arg[1], "password", word, + "usernick", nick, "username", arg[1], "password", word, "usernode", m.Conf(ice.CLI_RUNTIME, "boot.hostname"), )) user = m.Richs(ice.AAA_USER, nil, arg[1], nil) @@ -165,6 +171,13 @@ var Index = &ice.Context{Name: "aaa", Help: "认证模块", } switch arg[0] { + case "auth": + m.Richs(ice.AAA_SESS, nil, arg[1], func(value map[string]interface{}) { + value["username"], value["userrole"] = arg[2], m.Cmdx(ice.AAA_ROLE, "check", arg[2]) + m.Log(ice.LOG_LOGIN, "sessid: %s username: %s userrole: %s", arg[1], arg[2], value["userrole"]) + m.Echo("%v", value["userrole"]) + }) + case "check": // 查看会话 m.Richs(ice.AAA_SESS, nil, arg[1], func(value map[string]interface{}) { diff --git a/base/web/web.go b/base/web/web.go index 87455874..de087a21 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -76,9 +76,12 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { case ice.RENDER_QRCODE: if qr, e := qrcode.New(arg[0], qrcode.Medium); msg.Assert(e) { msg.W.Header().Set("Content-Type", "image/png") - msg.Assert(qr.Write(256, msg.W)) + msg.Assert(qr.Write(kit.Int(kit.Select("256", arg, 1)), msg.W)) } default: + if cmd != "" { + msg.Echo(kit.Format(cmd, args...)) + } msg.W.Header().Set("Content-Type", "application/json") fmt.Fprint(msg.W, msg.Formats("meta")) } @@ -251,7 +254,13 @@ func (web *Frame) HandleCmd(m *ice.Message, key string, cmd *ice.Command) { msg.Option(ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP)) msg.Option(ice.MSG_USERURL, r.URL.Path) msg.Option(ice.MSG_SESSID, "") + msg.Option(ice.MSG_OUTPUT, "") msg.R, msg.W = r, w + if r.Header.Get("X-Real-Port") != "" { + msg.Option(ice.MSG_USERADDR, msg.Option(ice.MSG_USERIP)+":"+r.Header.Get("X-Real-Port")) + } else { + msg.Option(ice.MSG_USERADDR, r.RemoteAddr) + } // 请求变量 for _, v := range r.Cookies() { @@ -349,7 +358,7 @@ func (web *Frame) ServeHTTP(w http.ResponseWriter, r *http.Request) { m.Conf(ice.WEB_SERVE, "meta.init", "true") } m.W = w - m.Render("refresh") + Render(m, "refresh") m.Event(ice.SYSTEM_INIT) m.W = nil } else { @@ -813,12 +822,10 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", default: if len(arg) == 1 { - // 空间空间 - list := []string{} - m.Cmdy(ice.WEB_SPACE, arg[0], "space").Table(func(index int, value map[string]string, head []string) { - list = append(list, arg[0]+"."+value["name"]) + // 空间详情 + m.Richs(ice.WEB_SPACE, nil, arg[0], func(key string, value map[string]interface{}) { + m.Push("detail", value) }) - m.Append("name", list) break } @@ -1577,7 +1584,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", } if len(arg) == 1 { // 共享详情 - m.Richs(ice.WEB_SHARE, nil, arg[0], func(key string, value map[string]interface{}) { + if m.Richs(ice.WEB_SHARE, nil, arg[0], func(key string, value map[string]interface{}) { m.Push("detail", value) m.Push("key", "link") m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.link"), m.Conf(ice.WEB_SHARE, "meta.domain"), key, key)) @@ -1585,17 +1592,30 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.share"), m.Conf(ice.WEB_SHARE, "meta.domain"), key)) m.Push("key", "value") m.Push("value", fmt.Sprintf(m.Conf(ice.WEB_SHARE, "meta.template.value"), m.Conf(ice.WEB_SHARE, "meta.domain"), key)) - }) - return + }) != nil { + return + } } switch arg[0] { + case "invite": + arg = []string{arg[0], m.Cmdx(ice.WEB_SHARE, "add", "invite", kit.Select("tech", arg, 1), kit.Select("miss", arg, 2))} + + fallthrough + case "check": + m.Richs(ice.WEB_SHARE, nil, arg[1], func(key string, value map[string]interface{}) { + m.Render(ice.RENDER_QRCODE, kit.Format(kit.Dict( + kit.MDB_TYPE, "share", kit.MDB_NAME, value["type"], kit.MDB_TEXT, key, + ))) + }) + case "auth": m.Richs(ice.WEB_SHARE, nil, arg[1], func(key string, value map[string]interface{}) { - m.Richs(ice.AAA_SESS, nil, value["text"], func(key string, value map[string]interface{}) { - value["username"], value["userrole"] = arg[2], m.Cmdx(ice.AAA_ROLE, "check", arg[2]) - m.Echo("%s", value["userrole"]) - }) + if value["type"] == "active" { + m.Cmdy(ice.WEB_SPACE, value["name"], "sessid", m.Cmdx(ice.AAA_SESS, "create", arg[2])) + } else { + m.Cmdy(ice.AAA_SESS, "auth", value["text"], arg[2]) + } }) case "add": @@ -1609,6 +1629,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", // 创建共享 h := m.Rich(ice.WEB_SHARE, nil, kit.Dict( + kit.MDB_TIME, m.Time("10m"), kit.MDB_TYPE, arg[0], kit.MDB_NAME, arg[1], kit.MDB_TEXT, arg[2], "extra", extra, )) @@ -1850,6 +1871,10 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", m.Richs(ice.WEB_SHARE, nil, arg[0], func(key string, value map[string]interface{}) { m.Log(ice.LOG_EXPORT, "%s: %v", arg, kit.Format(value)) + if kit.Time(kit.Format(value[kit.MDB_TIME])) < kit.Time(m.Time()) { + m.Echo("invalid") + return + } switch value["type"] { case ice.TYPE_SPACE: @@ -1877,8 +1902,13 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", case "share", "共享码": m.Render(ice.RENDER_QRCODE, kit.Format("%s/share/%s/", m.Conf(ice.WEB_SHARE, "meta.domain"), key)) return + case "check", "安全码": + m.Render(ice.RENDER_QRCODE, kit.Format(kit.Dict( + kit.MDB_TYPE, "share", kit.MDB_NAME, value["type"], kit.MDB_TEXT, key, + ))) + return case "value", "数据值": - m.Render(ice.RENDER_QRCODE, kit.Format(value)) + m.Render(ice.RENDER_QRCODE, kit.Format(value), kit.Select("256", arg, 2)) return case "text": m.Render(ice.RENDER_QRCODE, kit.Format(value["text"])) @@ -1903,7 +1933,7 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", if arg[1] == "" { // 返回主页 - http.ServeFile(m.W, m.R, m.Conf(ice.WEB_SHARE, "meta.index")) + Render(m, ice.RENDER_DOWNLOAD, m.Conf(ice.WEB_SHARE, "meta.index")) break } @@ -1946,16 +1976,12 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", m.Cmdy(cmds).Option("cmds", cmds) m.Option("title", value["name"]) - case ice.TYPE_ACTIVE: - // 扫码数据 - m.Render(ice.RENDER_QRCODE, kit.Format(value)) - default: // 查看数据 m.Option("type", value["type"]) m.Option("name", value["name"]) m.Option("text", value["text"]) - m.Render(m.Conf(ice.WEB_SHARE, "meta.template.simple")) + m.Render(ice.RENDER_TEMPLATE, m.Conf(ice.WEB_SHARE, "meta.template.simple")) m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT) } }) @@ -2036,36 +2062,33 @@ var Index = &ice.Context{Name: "web", Help: "网络模块", }) }) case "push": - m.Richs(ice.WEB_FAVOR, nil, m.Option("favor"), func(key string, value map[string]interface{}) { - m.Log(ice.LOG_IMPORT, "%v", value) - m.Grow(ice.WEB_FAVOR, kit.Keys(kit.MDB_HASH, key), kit.Dict( - kit.MDB_TYPE, m.Option("type"), kit.MDB_NAME, m.Option("name"), kit.MDB_TEXT, m.Option("text"), - "extra", kit.UnMarshal(m.Option("extra")), - )) - }) + m.Cmdy(ice.WEB_FAVOR, m.Option("favor"), m.Option("type"), m.Option("name"), m.Option("text"), m.Option("extra")) } }}, "/route/": {Name: "/route/", Help: "路由器", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[0] { case "login": - if m.Richs(ice.WEB_ROUTE, nil, kit.Select(m.Option("login"), arg, 1), func(key string, value map[string]interface{}) { - m.Echo("%s", value["share"]) - }) == nil { - sessid := m.Cmdx(ice.AAA_SESS, "create", "") - share := m.Cmdx(ice.WEB_SHARE, "add", "login", m.Option(ice.MSG_USERIP), sessid) - m.Rich(ice.WEB_ROUTE, nil, kit.Dict("share", share, "sessid", sessid)) - m.Render("cookie", sessid) - m.Render(share) + if m.Option(ice.MSG_USERNAME) != "" { + m.Push(ice.MSG_USERNAME, m.Option(ice.MSG_USERNAME)) + m.Info("username: %v", m.Option(ice.MSG_USERNAME)) + break } + if m.Option(ice.MSG_SESSID) != "" && m.Cmdx(ice.AAA_SESS, "check", m.Option(ice.MSG_SESSID)) != "" { + m.Info("sessid: %v", m.Option(ice.MSG_SESSID)) + break + } + + sessid := m.Cmdx(ice.AAA_SESS, "create", "") + share := m.Cmdx(ice.WEB_SHARE, "add", "login", m.Option(ice.MSG_USERIP), sessid) + Render(m, "cookie", sessid) + m.Render(share) } }}, "/space/": {Name: "/space/", Help: "空间站", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if s, e := websocket.Upgrade(m.W, m.R, nil, m.Confi(ice.WEB_SPACE, "meta.buffer.r"), m.Confi(ice.WEB_SPACE, "meta.buffer.w")); m.Assert(e) { - m.Option("name", strings.Replace(m.Option("name"), ".", "_", -1)) - if !m.Options("name") { - m.Option("name", kit.Hashs("uniq")) - } + m.Option("name", strings.Replace(kit.Select(m.Option(ice.MSG_USERADDR), m.Option("name")), ".", "_", -1)) + m.Option("node", kit.Select("worker", m.Option("node"))) // 共享空间 share := m.Option("share") diff --git a/conf.go b/conf.go index 612701f9..8c0a44d9 100644 --- a/conf.go +++ b/conf.go @@ -33,8 +33,10 @@ const ( // MSG MSG_USERIP = "user.ip" MSG_USERUA = "user.ua" MSG_USERURL = "user.url" + MSG_USERNICK = "user.nick" MSG_USERNAME = "user.name" MSG_USERROLE = "user.role" + MSG_USERADDR = "user.addr" MSG_RIVER = "sess.river" MSG_STORM = "sess.storm" diff --git a/core/chat/chat.go b/core/chat/chat.go index a479d7eb..c7a49826 100644 --- a/core/chat/chat.go +++ b/core/chat/chat.go @@ -11,6 +11,8 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", Configs: map[string]*ice.Config{ ice.CHAT_RIVER: {Name: "river", Help: "群组", Value: kit.Data( "template", kit.Dict("root", []interface{}{ + []interface{}{"river", `{{.Option "user.nick"|Format}}@{{.Conf "runtime" "node.name"|Format}}`, "mall"}, + []interface{}{"storm", "mall", "mall"}, []interface{}{"field", "asset", "web.mall"}, []interface{}{"field", "spend", "web.mall"}, @@ -118,22 +120,19 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", }}, "auto": {Name: "auto user", Help: "自动化", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Richs(ice.AAA_USER, nil, arg[0], func(key string, value map[string]interface{}) { + m.Option(ice.MSG_USERNICK, value["usernick"]) m.Option(ice.MSG_USERNAME, value["username"]) - m.Option(ice.MSG_USERROLE, m.Cmdx(ice.AAA_ROLE, "check", value["username"])) - - if len(arg[0]) > 8 { - arg[0] = arg[0][:8] - } - - // 创建群组 - name := kit.Select(arg[0], value["nickname"]) + "@" + m.Conf(ice.CLI_RUNTIME, "boot.hostname") - storm, river := "", m.Option(ice.MSG_RIVER, m.Cmdx("/ocean", "spawn", name, m.Option(ice.MSG_USERNAME))) + m.Option(ice.MSG_USERROLE, "root") // 创建应用 + storm, river := "", "" m.Option("cache.limit", -2) - m.Richs(ice.WEB_FAVOR, nil, kit.Keys("river", m.Option(ice.MSG_USERROLE)), func(key string, value map[string]interface{}) { + m.Richs(ice.WEB_FAVOR, nil, kit.Keys("river", m.Cmdx(ice.AAA_ROLE, "check", value["username"])), func(key string, value map[string]interface{}) { m.Grows(ice.WEB_FAVOR, kit.Keys("hash", key), "", "", func(index int, value map[string]interface{}) { switch value["type"] { + case "river": + name, _ := kit.Render(kit.Format(value["name"]), m) + river = m.Option(ice.MSG_RIVER, m.Cmdx("/ocean", "spawn", string(name))) case "storm": storm = m.Option(ice.MSG_STORM, m.Cmdx("/steam", river, "spawn", value["name"])) case "field": @@ -218,6 +217,8 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", arg = append(arg, "tool.0.args", m.Option("args")) arg = append(arg, "tool.0.single", "yes") } else { + m.Option(ice.MSG_RIVER, arg[5]) + m.Option(ice.MSG_STORM, arg[7]) m.Cmd("/action", arg[5], arg[7]).Table(func(index int, value map[string]string, head []string) { arg = append(arg, kit.Format("tool.%d.pod", index), value["node"]) arg = append(arg, kit.Format("tool.%d.ctx", index), value["group"]) @@ -403,6 +404,7 @@ var Index = &ice.Context{Name: "chat", Help: "聊天中心", if len(arg) == 2 { // 命令列表 m.Set(ice.MSG_OPTION) + m.Render("") m.Grows(ice.CHAT_RIVER, prefix, "", "", func(index int, value map[string]interface{}) { if meta, ok := kit.Value(value, "meta").(map[string]interface{}); ok { m.Push("river", arg[0]) diff --git a/misc/mp/mp.go b/misc/mp/mp.go index 8cadec48..166c3563 100644 --- a/misc/mp/mp.go +++ b/misc/mp/mp.go @@ -85,10 +85,31 @@ var Index = &ice.Context{Name: "mp", Help: "小程序", break } + switch kit.Select("active", m.Option("type")) { + case "share": + m.Richs(ice.WEB_SHARE, nil, m.Option("text"), func(key string, value map[string]interface{}) { + switch value["type"] { + case "invite": + if m.Option(ice.MSG_USERROLE) != value["name"] { + m.Cmd(ice.AAA_ROLE, value["name"], m.Option(ice.MSG_USERNAME)) + m.Cmd("web.chat.auto", m.Option(ice.MSG_USERNAME), value["name"]) + } + break + default: + m.Option("type", value["type"]) + m.Option("name", value["name"]) + m.Option("text", value["text"]) + } + }) + } + switch kit.Select("active", m.Option("type")) { case "active": - // 授权登录 - m.Cmd(ice.WEB_SPACE, m.Option("auth"), "sessid", m.Cmdx(ice.AAA_SESS, "create", m.Option(ice.MSG_USERNAME))) + // 网页登录 + m.Cmdy(ice.WEB_SPACE, m.Option("name"), "sessid", m.Cmdx(ice.AAA_SESS, "create", m.Option(ice.MSG_USERNAME))) + case "login": + // 终端登录 + m.Cmdy(ice.AAA_SESS, "auth", m.Option("text"), m.Option(ice.MSG_USERNAME)) } case "upload":