From ab7990352371834a965a43fcc1518c2c27949c66 Mon Sep 17 00:00:00 2001 From: shylinux Date: Thu, 4 Feb 2021 22:15:58 +0800 Subject: [PATCH] opt wx --- base/web/serve.go | 6 +-- core/chat/files.go | 12 +++-- core/chat/location.go | 19 ++++++-- core/chat/paste.go | 20 ++++---- core/chat/scan.go | 25 +++++----- misc.go | 5 +- misc/wx/wx.go | 108 ++++++++++++++++++++++++------------------ misc/wx/wx.shy | 1 - 8 files changed, 112 insertions(+), 84 deletions(-) diff --git a/base/web/serve.go b/base/web/serve.go index 732f4d86..3b580581 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -203,9 +203,9 @@ func init() { Configs: map[string]*ice.Config{ SERVE: {Name: SERVE, Help: "服务器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_NAME, tcp.LOCALHOST, true, aaa.BLACK, kit.Dict(), aaa.WHITE, kit.Dict( - "intshell", true, "volcanos", true, - "publish", true, "require", true, - SPACE, true, SHARE, true, + LOGIN, true, SPACE, true, SHARE, true, + "volcanos", true, "intshell", true, + "require", true, "publish", true, ), "logheaders", false, "static", kit.Dict("/", "usr/volcanos/"), diff --git a/core/chat/files.go b/core/chat/files.go index 7fe505cd..917311d2 100644 --- a/core/chat/files.go +++ b/core/chat/files.go @@ -25,13 +25,17 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, kit.Select("time,hash,name,data", mdb.DETAIL, len(arg) > 0)) - m.Cmdy(mdb.SELECT, FILES, "", mdb.HASH, "hash", arg) + m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg) + m.Table(func(index int, value map[string]string, head []string) { m.PushDownload(value[kit.MDB_NAME], "/share/cache/"+value["data"]) + if len(arg) > 0 { + switch kit.Ext(value["name"]) { + case "png": + m.PushImages("image", "/share/cache/"+value["data"]) + } + } }) - if len(arg) == 0 { - m.SortTimeR(kit.MDB_TIME) - } m.PushAction(mdb.REMOVE) }}, }, diff --git a/core/chat/location.go b/core/chat/location.go index 758f6791..92fbcc60 100644 --- a/core/chat/location.go +++ b/core/chat/location.go @@ -22,9 +22,14 @@ func _trans(arg []string, tr map[string]string) { } const ( + ADDRESS = "address" LATITUDE = "latitude" LONGITUDE = "longitude" ) +const ( + GETLOCATION = "getLocation" + OPENLOCATION = "openLocation" +) const LOCATION = "location" @@ -34,9 +39,15 @@ func init() { LOCATION: {Name: LOCATION, Help: "地理位置", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, }, Commands: map[string]*ice.Command{ - LOCATION: {Name: "location text auto create@getLocation", Help: "地理位置", Action: map[string]*ice.Action{ + LOCATION: {Name: "location text auto getLocation", Help: "地理位置", Action: map[string]*ice.Action{ + OPENLOCATION: {Name: "create type=text name address latitude longitude", Help: "地图", Hand: func(m *ice.Message, arg ...string) { + }}, + GETLOCATION: {Name: "create type=text name address latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + _trans(arg, map[string]string{ADDRESS: "text"}) + m.Cmdy(mdb.INSERT, LOCATION, "", mdb.HASH, arg) + }}, mdb.CREATE: {Name: "create type=text name address latitude longitude", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - _trans(arg, map[string]string{"address": "text"}) + _trans(arg, map[string]string{ADDRESS: "text"}) m.Cmdy(mdb.INSERT, LOCATION, "", mdb.HASH, arg) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { @@ -56,8 +67,8 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, kit.Select("time,type,name,text,longitude,latitude", mdb.DETAIL, len(arg) > 0)) - m.Cmdy(mdb.SELECT, LOCATION, "", mdb.HASH, kit.MDB_TEXT, arg) - m.PushAction("openLocation", mdb.REMOVE) + m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_TEXT, arg) + m.PushAction(OPENLOCATION, mdb.REMOVE) }}, }, }) diff --git a/core/chat/paste.go b/core/chat/paste.go index 8c0f66ac..2af53eb0 100644 --- a/core/chat/paste.go +++ b/core/chat/paste.go @@ -3,7 +3,6 @@ package chat import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" - "github.com/shylinux/icebergs/core/wiki" kit "github.com/shylinux/toolkits" ) @@ -15,7 +14,11 @@ func init() { PASTE: {Name: PASTE, Help: "粘贴板", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, }, Commands: map[string]*ice.Command{ - PASTE: {Name: "paste hash auto create@paste", Help: "粘贴板", Action: map[string]*ice.Action{ + PASTE: {Name: "paste hash auto getClipboardData", Help: "粘贴板", Action: map[string]*ice.Action{ + "getClipboardData": {Name: "getClipboardData", Help: "粘贴", Hand: func(m *ice.Message, arg ...string) { + _trans(arg, map[string]string{"data": "text"}) + m.Cmdy(mdb.INSERT, PASTE, "", mdb.HASH, arg) + }}, mdb.CREATE: {Name: "create type=text name=hi data:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { _trans(arg, map[string]string{"data": "text"}) m.Cmdy(mdb.INSERT, PASTE, "", mdb.HASH, arg) @@ -36,16 +39,11 @@ func init() { m.Cmdy(mdb.INPUTS, PASTE, "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 { - text := m.Cmd(mdb.SELECT, PASTE, "", mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) - m.Cmdy(wiki.IMAGE, "qrcode", text) - m.Cmdy(wiki.SPARK, "inner", text) - m.Render("") - return + m.Option(mdb.FIELDS, kit.Select("time,hash,type,name,text", mdb.DETAIL, len(arg) > 0)) + if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { + m.PushScript("script", m.Append(kit.MDB_TEXT)) + m.PushQRCode("qrcode", m.Append(kit.MDB_TEXT)) } - - m.Cmdy(mdb.SELECT, PASTE, "", mdb.HASH) - m.SortTimeR(kit.MDB_TIME) m.PushAction(mdb.REMOVE) }}, }, diff --git a/core/chat/scan.go b/core/chat/scan.go index c82d180d..d22a93fb 100644 --- a/core/chat/scan.go +++ b/core/chat/scan.go @@ -3,7 +3,6 @@ package chat import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/mdb" - "github.com/shylinux/icebergs/core/wiki" kit "github.com/shylinux/toolkits" ) @@ -15,10 +14,17 @@ func init() { SCAN: {Name: SCAN, Help: "扫码", Value: kit.Data(kit.MDB_SHORT, kit.MDB_TEXT)}, }, Commands: map[string]*ice.Command{ - SCAN: {Name: "scan hash auto create@scanQRCode scanQRCode0=应用扫码", Help: "扫码", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { + SCAN: {Name: "scan hash auto scanQRCode scanQRCode0", Help: "扫码", Action: map[string]*ice.Action{ + "scanQRCode0": {Name: "create", Help: "本机扫码", Hand: func(m *ice.Message, arg ...string) {}}, + "scanQRCode": {Name: "create", Help: "扫码", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, SCAN, "", mdb.HASH, arg) }}, + mdb.CREATE: {Name: "create type=text name=hi text:textarea=hi", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, SCAN, "", mdb.HASH, arg) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, SCAN, "", 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, SCAN, "", mdb.HASH, kit.MDB_HASH, m.Option(kit.MDB_HASH)) }}, @@ -32,16 +38,11 @@ func init() { m.Cmdy(mdb.INPUTS, SCAN, "", mdb.HASH, arg) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 { - text := m.Cmd(mdb.SELECT, SCAN, "", mdb.HASH, kit.MDB_HASH, arg[0]).Append(kit.MDB_TEXT) - m.Cmdy(wiki.IMAGE, "qrcode", text) - m.Cmdy(wiki.SPARK, "inner", text) - m.Render("") - return + m.Option(mdb.FIELDS, kit.Select("time,hash,type,name,text", mdb.DETAIL, len(arg) > 0)) + if m.Cmdy(mdb.SELECT, cmd, "", mdb.HASH, kit.MDB_HASH, arg); len(arg) > 0 { + m.PushScript("script", m.Append(kit.MDB_TEXT)) + m.PushQRCode("qrcode", m.Append(kit.MDB_TEXT)) } - - m.Cmdy(mdb.SELECT, SCAN, "", mdb.HASH) - m.SortTimeR(kit.MDB_TIME) m.PushAction(mdb.REMOVE) }}, }, diff --git a/misc.go b/misc.go index a228d10a..3fba2a16 100644 --- a/misc.go +++ b/misc.go @@ -6,10 +6,11 @@ import ( "bytes" "encoding/base64" "fmt" - "github.com/skip2/go-qrcode" "net/url" "path" "strings" + + "github.com/skip2/go-qrcode" ) func (m *Message) Prefix(arg ...string) string { @@ -160,7 +161,7 @@ func _render(m *Message, cmd string, args ...interface{}) string { case kit.SSH_SHELL: list = append(list, "") default: - list = append(list, "") + list = append(list, "") } list = append(list, "", l, "") list = append(list, "") diff --git a/misc/wx/wx.go b/misc/wx/wx.go index 9937690b..c940352e 100644 --- a/misc/wx/wx.go +++ b/misc/wx/wx.go @@ -1,14 +1,14 @@ package wx import ( - "github.com/shylinux/icebergs" + ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/chat" "github.com/shylinux/icebergs/core/wiki" - "github.com/shylinux/toolkits" + kit "github.com/shylinux/toolkits" "crypto/sha1" "encoding/hex" @@ -31,6 +31,7 @@ func _wx_config(m *ice.Message, nonce string) { m.Option(APPID, m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPID))) m.Option("signature", _wx_sign(m, m.Option("noncestr", nonce), m.Option("timestamp", kit.Format(time.Now().Unix())))) } + func _wx_parse(m *ice.Message) { data := struct { FromUserName string @@ -54,10 +55,11 @@ func _wx_parse(m *ice.Message) { m.Option("Event", data.Event) } func _wx_reply(m *ice.Message, tmpl string) { - m.Render(m.Conf(LOGIN, kit.Keys("meta.template", tmpl))) + m.Render(m.Conf(LOGIN, kit.Keym(kit.MDB_TEMPLATE, tmpl))) } func _wx_action(m *ice.Message) { m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT) + m.Set(ice.MSG_RESULT) m.Echo(` @@ -87,14 +89,19 @@ func _wx_action(m *ice.Message) { } const ( - LOGIN = "login" - APPID = "appid" - APPMM = "appmm" - TOKEN = "token" - TICKET = "ticket" + LOGIN = "login" + APPID = "appid" + APPMM = "appmm" + TOKEN = "token" + EXPIRE = "expire" + TICKET = "ticket" + EXPIRES = "expires" + CONFIG = "config" + WEIXIN = "weixin" +) +const ( + MENU = "menu" ACCESS = "access" - CONFIG = "config" - WEIXIN = "weixin" ) const WX = "wx" @@ -102,14 +109,7 @@ var Index = &ice.Context{Name: WX, Help: "公众号", Configs: map[string]*ice.Config{ LOGIN: {Name: LOGIN, Help: "认证", Value: kit.Data( WEIXIN, "https://api.weixin.qq.com", APPID, "", APPMM, "", TOKEN, "", - "template", kit.Dict("text", ` - - - {{.Option "CreateTime"}} - - - `), - "menu", []interface{}{ + kit.MDB_TEMPLATE, kit.Dict(kit.MDB_TEXT, text), MENU, []interface{}{ kit.Dict(wiki.TITLE, "主页", wiki.SPARK, "点击进入", wiki.IMAGE, "https://shylinux.com/static/volcanos/favicon.ico", wiki.REFER, "https://shylinux.com"), kit.Dict(wiki.TITLE, "产品", wiki.SPARK, "工具", wiki.IMAGE, "https://shylinux.com/static/volcanos/favicon.ico", wiki.REFER, "https://shylinux.com?river=product"), kit.Dict(wiki.TITLE, "研发", wiki.SPARK, "工具", wiki.IMAGE, "https://shylinux.com/static/volcanos/favicon.ico", wiki.REFER, "https://shylinux.com?river=project"), @@ -118,12 +118,11 @@ var Index = &ice.Context{Name: WX, Help: "公众号", }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Load() m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Conf(LOGIN, kit.Keys(kit.MDB_META, WEIXIN))) + m.Load() }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save() - }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, + ACCESS: {Name: "access appid auto ticket token login", Help: "认证", Action: map[string]*ice.Action{ LOGIN: {Name: "login appid appmm token", Help: "登录", Hand: func(m *ice.Message, arg ...string) { m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPID), m.Option(APPID)) @@ -131,48 +130,56 @@ var Index = &ice.Context{Name: WX, Help: "公众号", m.Conf(LOGIN, kit.Keys(kit.MDB_META, TOKEN), m.Option(TOKEN)) }}, TOKEN: {Name: "token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) { - if now := time.Now().Unix(); m.Conf(LOGIN, "meta.access.token") == "" || now > kit.Int64(m.Conf(LOGIN, "meta.access.expire")) { - msg := m.Cmd(web.SPIDE, "weixin", web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential", + if now := time.Now().Unix(); m.Conf(LOGIN, kit.Keym(ACCESS, TOKEN)) == "" || now > kit.Int64(m.Conf(LOGIN, kit.Keym(ACCESS, EXPIRE))) { + msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential", APPID, m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPID)), "secret", m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPMM))) + if m.Warn(msg.Append("errcode") != "", "%v: %v", msg.Append("errcode"), msg.Append("errmsg")) { + return + } - m.Conf(LOGIN, "meta.access.token", msg.Append("access_token")) - m.Conf(LOGIN, "meta.access.expire", now+kit.Int64(msg.Append("expires_in"))) + m.Conf(LOGIN, kit.Keym(ACCESS, EXPIRE), now+kit.Int64(msg.Append("expires_in"))) + m.Conf(LOGIN, kit.Keym(ACCESS, TOKEN), msg.Append("access_token")) } - m.Echo(m.Conf(LOGIN, "meta.access.token")) + m.Echo(m.Conf(LOGIN, kit.Keym(ACCESS, TOKEN))) }}, TICKET: {Name: "ticket", Help: "票据", Hand: func(m *ice.Message, arg ...string) { - if now := time.Now().Unix(); m.Conf(LOGIN, "meta.access.ticket") == "" || now > kit.Int64(m.Conf(LOGIN, "meta.access.expires")) { - msg := m.Cmd(web.SPIDE, "weixin", web.SPIDE_GET, "/cgi-bin/ticket/getticket?type=jsapi", + if now := time.Now().Unix(); m.Conf(LOGIN, kit.Keym(ACCESS, TICKET)) == "" || now > kit.Int64(m.Conf(LOGIN, kit.Keym(ACCESS, EXPIRES))) { + msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/ticket/getticket?type=jsapi", "access_token", m.Cmdx(ACCESS, TOKEN)) + if m.Warn(msg.Append("errcode") != "0", msg.Append("errcode"), msg.Append("errmsg")) { + return + } - m.Conf(LOGIN, "meta.access.ticket", msg.Append(TICKET)) - m.Conf(LOGIN, "meta.access.expires", now+kit.Int64(msg.Append("expires_in"))) + m.Conf(LOGIN, kit.Keym(ACCESS, EXPIRES), now+kit.Int64(msg.Append("expires_in"))) + m.Conf(LOGIN, kit.Keym(ACCESS, TICKET), msg.Append(TICKET)) } - m.Echo(m.Conf(LOGIN, "meta.access.ticket")) + m.Echo(m.Conf(LOGIN, kit.Keym(ACCESS, TICKET))) }}, CONFIG: {Name: "config", Help: "配置", Hand: func(m *ice.Message, arg ...string) { _wx_config(m, "some") }}, + 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.Push(APPID, m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPID))) + m.Echo(m.Conf(LOGIN, kit.Keys(kit.MDB_META, APPID))) }}, - "menu": {Name: "menu name auto", Help: "菜单", Action: map[string]*ice.Action{ + MENU: {Name: "menu name auto", Help: "菜单", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, "login") - kit.Fetch(m.Confv(LOGIN, "meta.menu"), func(index int, value map[string]interface{}) { + share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN) + kit.Fetch(m.Confv(LOGIN, kit.Keym(MENU)), func(index int, value map[string]interface{}) { m.Push("", value, kit.Split("title,spark,image")) m.Push(wiki.REFER, kit.MergeURL(kit.Format(value[wiki.REFER]), web.SHARE, share)) }) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - kit.Fetch(m.Confv(LOGIN, "meta.menu"), func(index int, value map[string]interface{}) { + kit.Fetch(m.Confv(LOGIN, kit.Keym(MENU)), func(index int, value map[string]interface{}) { m.Push("", value, kit.Split("title,spark,image,refer")) }) }}, "/login/": {Name: "/login/", Help: "认证", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - check := kit.Sort([]string{m.Conf(LOGIN, "meta.token"), m.Option("timestamp"), m.Option("nonce")}) + check := kit.Sort([]string{m.Conf(LOGIN, kit.Keym(TOKEN)), m.Option("timestamp"), m.Option("nonce")}) if b := sha1.Sum([]byte(strings.Join(check, ""))); m.Warn(m.Option("signature") != hex.EncodeToString(b[:]), ice.ErrNotRight) { return // 验证失败 } @@ -191,21 +198,20 @@ var Index = &ice.Context{Name: WX, Help: "公众号", switch m.Option("MsgType") { case "event": switch m.Option("Event") { - case "subscribe": - // 应用列表 - _wx_action(m.Cmdy("menu", mdb.CREATE)) - case "unsubscribe": + case "subscribe": // 关注事件 + _wx_action(m.Cmdy(MENU, mdb.CREATE)) + case "unsubscribe": // 取关事件 } - case "text": + case kit.MDB_TEXT: if cmds := kit.Split(m.Option("Content")); m.Warn(!m.Right(cmds), ice.ErrNotRight) { - _wx_action(m.Cmdy("menu", mdb.CREATE)) + _wx_action(m.Cmdy(MENU, mdb.CREATE)) break // 没有权限 } else { switch cmds[0] { - case "menu": + case MENU: // 应用列表 - _wx_action(m.Cmdy("menu", mdb.CREATE)) + _wx_action(m.Cmdy(MENU, mdb.CREATE)) default: // 执行命令 @@ -216,7 +222,7 @@ var Index = &ice.Context{Name: WX, Help: "公众号", } // 返回结果 - _wx_reply(m, "text") + _wx_reply(m, kit.MDB_TEXT) } } } @@ -225,3 +231,11 @@ var Index = &ice.Context{Name: WX, Help: "公众号", } func init() { chat.Index.Register(Index, &web.Frame{}) } + +var text = ` + + +{{.Option "CreateTime"}} + + +` diff --git a/misc/wx/wx.shy b/misc/wx/wx.shy index 45c94ba3..ae2479a2 100644 --- a/misc/wx/wx.shy +++ b/misc/wx/wx.shy @@ -6,7 +6,6 @@ refer ` 源码 https://github.com/shylinux/icebergs/blob/master/misc/wx/wx.go ` image qrcode `https://weixin.qq.com` -spark chapter "应用" field scan web.chat.scan