From 82f4d2cf7eecb2b334b1d3b6657fb0793720ba6d Mon Sep 17 00:00:00 2001 From: shylinux Date: Wed, 20 Oct 2021 10:35:12 +0800 Subject: [PATCH] opt wx --- base/mdb/zone.go | 8 +++- base/web/share.go | 2 +- data.go | 11 +++-- misc/wx/access.go | 119 +++++++++++++++++++++++----------------------- misc/wx/event.go | 23 ++++----- misc/wx/favor.go | 39 ++++++--------- misc/wx/login.go | 94 ++++++++++++++---------------------- misc/wx/menu.go | 41 +++++----------- misc/wx/text.go | 46 ++++++++++-------- misc/wx/wx.go | 18 ++++--- misc/wx/wx.shy | 3 +- 11 files changed, 183 insertions(+), 221 deletions(-) diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 3f5cf381..823e83d8 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -4,14 +4,13 @@ import ( "encoding/csv" "os" "path" - "strings" ice "shylinux.com/x/icebergs" kit "shylinux.com/x/toolkits" ) func _zone_fields(m *ice.Message) []string { - return kit.Split(kit.Select("zone,id,time,type,name,text", strings.Join(kit.Simple(m.Optionv(FIELDS)), ","))) + return kit.Split(kit.Select("zone,id,time,type,name,text", kit.Join(kit.Simple(m.Optionv(FIELDS))))) } func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { if zone == RANDOM { @@ -170,3 +169,8 @@ func ZoneAction(fields ...string) map[string]*ice.Action { }}, }, fields...) } +func ZoneSelect(m *ice.Message, arg ...string) *ice.Message { + m.Fields(len(arg), kit.Fields(kit.MDB_TIME, m.Config(kit.MDB_SHORT), kit.MDB_COUNT), m.Config(kit.MDB_FIELD)) + m.Cmdy(SELECT, m.PrefixKey(), "", ZONE, arg) + return m +} diff --git a/base/web/share.go b/base/web/share.go index 4772a402..3209d120 100644 --- a/base/web/share.go +++ b/base/web/share.go @@ -124,7 +124,7 @@ func init() { }}, SHARE: {Name: "share hash auto prunes", Help: "共享链", Action: ice.MergeAction(map[string]*ice.Action{ mdb.CREATE: {Name: "create type name text", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Conf(SHARE, kit.Keym(kit.MDB_EXPIRE))), + m.Cmdy(mdb.INSERT, m.PrefixKey(), "", mdb.HASH, kit.MDB_TIME, m.Time(m.Config(kit.MDB_EXPIRE)), 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) // m.Option(kit.MDB_LINK, _share_link(m, "/share/"+m.Result())) diff --git a/data.go b/data.go index 7e7c13a7..a35c325e 100644 --- a/data.go +++ b/data.go @@ -8,16 +8,19 @@ import ( "shylinux.com/x/toolkits/miss" ) -func (m *Message) CommandKey(arg ...string) string { - return strings.TrimPrefix(m._key, "/") +func (m *Message) CommandKey() string { + return strings.TrimSuffix(strings.TrimPrefix(m._key, "/"), "/") } func (m *Message) PrefixKey(arg ...string) string { - return kit.Keys(m.Cap(CTX_FOLLOW), strings.TrimPrefix(m._key, "/"), arg) + return kit.Keys(m.Cap(CTX_FOLLOW), m.CommandKey(), arg) } func (m *Message) Prefix(arg ...string) string { return kit.Keys(m.Cap(CTX_FOLLOW), arg) } -func (m *Message) Config(key string) string { +func (m *Message) Config(key string, arg ...interface{}) string { + if len(arg) > 0 { + m.Conf(m.PrefixKey(), kit.Keym(key), arg[0]) + } return m.Conf(m.PrefixKey(), kit.Keym(key)) } func (m *Message) ConfigSimple(key string) []string { diff --git a/misc/wx/access.go b/misc/wx/access.go index 1fa648d4..4244e72e 100644 --- a/misc/wx/access.go +++ b/misc/wx/access.go @@ -2,94 +2,93 @@ package wx import ( "crypto/sha1" - "encoding/hex" - "fmt" - "strings" "time" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" + "shylinux.com/x/icebergs/base/ssh" + "shylinux.com/x/icebergs/base/tcp" "shylinux.com/x/icebergs/base/web" kit "shylinux.com/x/toolkits" ) func _wx_sign(m *ice.Message, nonce, stamp string) string { - b := sha1.Sum([]byte(strings.Join(kit.Sort([]string{ - fmt.Sprintf("jsapi_ticket=%s", m.Cmdx(ACCESS, TICKET)), - fmt.Sprintf("url=%s", m.Option(ice.MSG_USERWEB)), - fmt.Sprintf("timestamp=%s", stamp), - fmt.Sprintf("noncestr=%s", nonce), - }), "&"))) - return hex.EncodeToString(b[:]) + return kit.Format(sha1.Sum([]byte(kit.Join(kit.Sort([]string{ + kit.Format("jsapi_ticket=%s", m.Cmdx(ACCESS, TICKET)), + kit.Format("url=%s", m.Option(ice.MSG_USERWEB)), + kit.Format("timestamp=%s", stamp), + kit.Format("noncestr=%s", nonce), + }), "&")))) } func _wx_config(m *ice.Message, nonce string) { - m.Option(APPID, m.Conf(LOGIN, kit.Keym(APPID))) - m.Option(SCRIPT, m.Conf(ACCESS, kit.Keym(SCRIPT))) + m.Option(APPID, m.Config(APPID)) + m.Option(ssh.SCRIPT, m.Config(ssh.SCRIPT)) m.Option("signature", _wx_sign(m, m.Option("noncestr", nonce), m.Option("timestamp", kit.Format(time.Now().Unix())))) } const ( - WEIXIN = "weixin" + APPID = "appid" + APPMM = "appmm" + TOKEN = "token" EXPIRE = "expire" TICKET = "ticket" EXPIRES = "expires" - SCRIPT = "script" - CONFIG = "config" ) const ( + WEIXIN = "weixin" ERRCODE = "errcode" ERRMSG = "errmsg" ) const ACCESS = "access" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data( - SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js", - WEIXIN, "https://api.weixin.qq.com", - )}, - }, - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Conf(ACCESS, kit.Keym(WEIXIN))) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + ACCESS: {Name: ACCESS, Help: "认证", Value: kit.Data( + ssh.SCRIPT, "https://res.wx.qq.com/open/js/jweixin-1.6.0.js", + tcp.SERVER, "https://api.weixin.qq.com", + APPID, "", APPMM, "", "tokens", "", + )}, + }, Commands: map[string]*ice.Command{ + ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmd(web.SPIDE, mdb.CREATE, WEIXIN, m.Config(tcp.SERVER)) + }}, + 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.Config(APPID, m.Option(APPID)) + m.Config(APPMM, m.Option(APPMM)) + m.Config("tokens", m.Option(TOKEN)) }}, - 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.Keym(APPID), m.Option(APPID)) - m.Conf(LOGIN, kit.Keym(APPMM), m.Option(APPMM)) - m.Conf(LOGIN, kit.Keym(TOKEN), m.Option(TOKEN)) - }}, - TOKEN: {Name: "token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) { - if now := time.Now().Unix(); m.Conf(ACCESS, kit.Keym(TOKEN)) == "" || now > kit.Int64(m.Conf(ACCESS, kit.Keym(EXPIRE))) { - msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential", - APPID, m.Conf(LOGIN, kit.Keym(APPID)), "secret", m.Conf(LOGIN, kit.Keym(APPMM))) - if m.Warn(msg.Append(ERRCODE) != "", msg.Append(ERRCODE), msg.Append(ERRMSG)) { - return - } - - m.Conf(ACCESS, kit.Keym(EXPIRE), now+kit.Int64(msg.Append("expires_in"))) - m.Conf(ACCESS, kit.Keym(TOKEN), msg.Append("access_token")) + TOKEN: {Name: "token", Help: "令牌", Hand: func(m *ice.Message, arg ...string) { + if now := time.Now().Unix(); m.Config(TOKEN) == "" || now > kit.Int64(m.Config(EXPIRE)) { + msg := m.Cmd(web.SPIDE, WEIXIN, web.SPIDE_GET, "/cgi-bin/token?grant_type=client_credential", + APPID, m.Config(APPID), "secret", m.Config(APPMM)) + if m.Warn(msg.Append(ERRCODE) != "", msg.Append(ERRCODE), msg.Append(ERRMSG)) { + return } - m.Echo(m.Conf(ACCESS, kit.Keym(TOKEN))) - }}, - TICKET: {Name: "ticket", Help: "票据", Hand: func(m *ice.Message, arg ...string) { - if now := time.Now().Unix(); m.Conf(ACCESS, kit.Keym(TICKET)) == "" || now > kit.Int64(m.Conf(ACCESS, kit.Keym(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(ACCESS, kit.Keym(EXPIRES), now+kit.Int64(msg.Append("expires_in"))) - m.Conf(ACCESS, kit.Keym(TICKET), msg.Append(TICKET)) - } - m.Echo(m.Conf(ACCESS, kit.Keym(TICKET))) - }}, - CONFIG: {Name: "config", Help: "配置", Hand: func(m *ice.Message, arg ...string) { - _wx_config(m, "some") - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Echo(kit.Formats(m.Confv(ACCESS))) + m.Config(EXPIRE, now+kit.Int64(msg.Append("expires_in"))) + m.Config(TOKEN, msg.Append("access_token")) + } + m.Echo(m.Config(TOKEN)) }}, - }}) + TICKET: {Name: "ticket", Help: "票据", Hand: func(m *ice.Message, arg ...string) { + if now := time.Now().Unix(); m.Conf(TICKET) == "" || now > kit.Int64(m.Config(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.Config(EXPIRES, now+kit.Int64(msg.Append("expires_in"))) + m.Config(TICKET, msg.Append(TICKET)) + } + m.Echo(m.Config(TICKET)) + }}, + ctx.CONFIG: {Name: "config", Help: "配置", Hand: func(m *ice.Message, arg ...string) { + _wx_config(m, "some") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Echo(kit.Formats(m.Confv(ACCESS))) + }}, + }}) } diff --git a/misc/wx/event.go b/misc/wx/event.go index 197606c7..d9b9fe05 100644 --- a/misc/wx/event.go +++ b/misc/wx/event.go @@ -8,19 +8,16 @@ import ( const EVENT = "event" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - EVENT: {Name: EVENT, Help: "事件", Value: kit.Data()}, - }, - Commands: map[string]*ice.Command{ - EVENT: {Name: "event", Help: "事件", Action: map[string]*ice.Action{ - "subscribe": {Name: "subscribe", Help: "订阅", Hand: func(m *ice.Message, arg ...string) { - _wx_action(m.Cmdy(MENU, "home")) - }}, - "unsubscribe": {Name: "unsubscribe", Help: "取关", Hand: func(m *ice.Message, arg ...string) { - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + EVENT: {Name: EVENT, Help: "事件", Value: kit.Data()}, + }, Commands: map[string]*ice.Command{ + EVENT: {Name: "event", Help: "事件", Action: map[string]*ice.Action{ + "subscribe": {Name: "subscribe", Help: "订阅", Hand: func(m *ice.Message, arg ...string) { + _wx_action(m.Cmdy(MENU, "home")) }}, + "unsubscribe": {Name: "unsubscribe", Help: "取关", Hand: func(m *ice.Message, arg ...string) { + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }}, - ) + }}) } diff --git a/misc/wx/favor.go b/misc/wx/favor.go index 022ee8ce..15f3e72e 100644 --- a/misc/wx/favor.go +++ b/misc/wx/favor.go @@ -3,7 +3,6 @@ package wx import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/aaa" - "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" ) @@ -11,28 +10,18 @@ import ( const FAVOR = "favor" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - FAVOR: {Name: "favor", Help: "收藏", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,name,text", - )}, - }, - Commands: map[string]*ice.Command{ - FAVOR: {Name: "favor text auto create", Help: "收藏", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create name text", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, m.OptionSimple(kit.MDB_TEXT)) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), m.Conf(FAVOR, kit.META_FIELD)) - m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TEXT, arg) - m.Table(func(index int, value map[string]string, head []string) { - m.PushImages(cli.QRCODE, kit.MergeURL("https://open.weixin.qq.com/qr/code", aaa.USERNAME, value[kit.MDB_TEXT])) - }) - m.PushAction(mdb.REMOVE) - }}, - }, - }) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + FAVOR: {Name: "favor", Help: "收藏", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TEXT, kit.MDB_FIELD, "time,type,name,text", + )}, + }, Commands: map[string]*ice.Command{ + FAVOR: {Name: "favor text auto create", Help: "收藏", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.CREATE: {Name: "create type name text", Help: "添加"}, + }, mdb.HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + mdb.HashSelect(m, arg...).Table(func(index int, value map[string]string, head []string) { + m.PushQRCode(kit.MDB_SCAN, kit.MergeURL("https://open.weixin.qq.com/qr/code", aaa.USERNAME, value[kit.MDB_TEXT])) + }) + m.PushAction(mdb.REMOVE) + }}, + }}) } diff --git a/misc/wx/login.go b/misc/wx/login.go index c234e0dd..0274a1ea 100644 --- a/misc/wx/login.go +++ b/misc/wx/login.go @@ -2,7 +2,6 @@ package wx import ( "crypto/sha1" - "encoding/hex" "encoding/xml" "strings" @@ -19,7 +18,7 @@ func _wx_parse(m *ice.Message) { FromUserName string ToUserName string CreateTime int64 - MsgId int64 + MsgID int64 Event string MsgType string Content string @@ -30,19 +29,19 @@ func _wx_parse(m *ice.Message) { m.Option("FromUserName", data.FromUserName) m.Option("ToUserName", data.ToUserName) m.Option("CreateTime", data.CreateTime) - m.Option("MsgId", data.MsgId) + m.Option("MsgID", data.MsgID) m.Option("Event", data.Event) m.Option("MsgType", data.MsgType) m.Option("Content", data.Content) } func _wx_reply(m *ice.Message, tmpl string) { - if res, err := kit.Render(m.Conf(LOGIN, kit.Keym(kit.MDB_TEMPLATE, tmpl)), m); err == nil { + if res, err := kit.Render(m.Config(kit.MDB_TEMPLATE), m); err == nil { m.Set(ice.MSG_RESULT).RenderResult(string(res)) } } func _wx_action(m *ice.Message) { - m.RenderResult().Set(ice.MSG_RESULT) + m.Set(ice.MSG_RESULT).RenderResult() m.Echo(` @@ -55,8 +54,7 @@ func _wx_action(m *ice.Message) { m.Table(func(index int, value map[string]string, head []string) { count++ }) m.Echo(`%d`, count) - share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN, - aaa.USERNAME, m.Option(ice.MSG_USERNAME), aaa.USERROLE, m.Option(ice.MSG_USERROLE)) + share := m.Cmdx(web.SHARE, mdb.CREATE, kit.MDB_TYPE, web.LOGIN) m.Echo(``) m.Table(func(index int, value map[string]string, head []string) { @@ -75,58 +73,40 @@ func _wx_action(m *ice.Message) { m.Debug("echo: %v", m.Result()) } -const ( - APPID = "appid" - APPMM = "appmm" - TOKEN = "token" -) const LOGIN = "login" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - LOGIN: {Name: LOGIN, Help: "登录", Value: kit.Data( - APPID, "", APPMM, "", TOKEN, "", - kit.MDB_TEMPLATE, kit.Dict(TEXT, text), - )}, - }, - Commands: map[string]*ice.Command{ - "/login/": {Name: "/login/", Help: "认证", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - 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 // 验证失败 + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + LOGIN: {Name: LOGIN, Help: "登录", Value: kit.Data()}, + }, Commands: map[string]*ice.Command{ + "/login/": {Name: "/login/", Help: "认证", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + check := kit.Sort([]string{m.Conf(ACCESS, "meta.tokens"), m.Option("timestamp"), m.Option("nonce")}) + if sig := kit.Format(sha1.Sum([]byte(strings.Join(check, "")))); m.Warn(sig != m.Option("signature"), ice.ErrNotRight) { + return // 验证失败 + } + if m.Option("echostr") != "" { + m.RenderResult(m.Option("echostr")) + return // 绑定验证 + } + + // 解析数据 + _wx_parse(m) + + // 用户登录 + m.Option(ice.MSG_USERZONE, WX) + aaa.UserLogin(m, m.Append("FromUserName"), "") + + switch m.Option("MsgType") { + case EVENT: // 事件 + m.Cmdy(EVENT, m.Option("Event")) + + case TEXT: // 文本 + cmds := kit.Split(m.Option("Content")) + if m.Warn(!m.Right(cmds), ice.ErrNotRight) { + cmds = []string{MENU, mdb.CREATE} } - if m.Option("echostr") != "" { - m.RenderResult(m.Option("echostr")) - return // 绑定验证 - } - - // 解析数据 - _wx_parse(m) - - // 用户登录 - m.Option(ice.MSG_USERZONE, "wx") - aaa.UserLogin(m, m.Append("FromUserName"), "") - - switch m.Option("MsgType") { - case EVENT: // 事件 - m.Cmdy(EVENT, m.Option("Event")) - - case TEXT: // 文本 - cmds := kit.Split(m.Option("Content")) - if m.Warn(!m.Right(cmds), ice.ErrNotRight) { - cmds = []string{MENU, mdb.CREATE} - } - m.Cmdy(TEXT, cmds) - } - }}, - }}) + m.Cmdy(TEXT, cmds) + } + }}, + }}) } - -var text = ` - - -{{.Option "CreateTime"}} - - -` diff --git a/misc/wx/menu.go b/misc/wx/menu.go index b2b6edbd..4869e38b 100644 --- a/misc/wx/menu.go +++ b/misc/wx/menu.go @@ -9,32 +9,17 @@ import ( const MENU = "menu" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - MENU: {Name: MENU, Help: "菜单", Value: kit.Data( - kit.MDB_SHORT, kit.MDB_ZONE, kit.MDB_FIELD, "time,id,title,refer,image", - )}, - }, - Commands: map[string]*ice.Command{ - MENU: {Name: "menu zone id auto create", Help: "菜单", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(MENU), "", mdb.HASH, arg) - }}, - mdb.INSERT: {Name: "insert zone=home title=hi refer=hello image=", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.INSERT, m.Prefix(MENU), "", mdb.HASH, m.OptionSimple(kit.MDB_ZONE)) - m.Cmdy(mdb.INSERT, m.Prefix(MENU), kit.KeyHash(m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:]) - }}, - mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, m.Prefix(MENU), "", mdb.ZONE, m.Option(kit.MDB_ZONE), m.Option(kit.MDB_ID), arg) - }}, - mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.DELETE, m.Prefix(MENU), "", mdb.ZONE, m.OptionSimple(kit.MDB_ZONE)) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Fields(len(arg), "time,zone,count", m.Conf(MENU, kit.META_FIELD)) - if m.Cmdy(mdb.SELECT, m.Prefix(MENU), "", mdb.ZONE, arg); len(arg) == 0 { - m.PushAction(mdb.REMOVE) - } - }}, - }}) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + MENU: {Name: MENU, Help: "菜单", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_ZONE, kit.MDB_FIELD, "time,id,title,refer,image", + )}, + }, Commands: map[string]*ice.Command{ + MENU: {Name: "menu zone id auto insert", Help: "菜单", Action: ice.MergeAction(map[string]*ice.Action{ + mdb.INSERT: {Name: "insert zone=home title=hi refer=hello image=", Help: "添加"}, + }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if mdb.ZoneSelect(m, arg...); len(arg) == 0 { + m.PushAction(mdb.REMOVE) + } + }}, + }}) } diff --git a/misc/wx/text.go b/misc/wx/text.go index 8df36985..b88e62a9 100644 --- a/misc/wx/text.go +++ b/misc/wx/text.go @@ -9,26 +9,32 @@ import ( const TEXT = "text" func init() { - Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{ - TEXT: {Name: TEXT, Help: "文本", Value: kit.Data()}, - }, - Commands: map[string]*ice.Command{ - TEXT: {Name: "text", Help: "文本", Action: map[string]*ice.Action{ - "menu": {Name: "menu name", Help: "菜单", Hand: func(m *ice.Message, arg ...string) { - _wx_action(m.Cmdy(MENU, kit.Select("home", m.Option(kit.MDB_NAME)))) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - // 执行命令 - if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Resultv()) == 0 { - m.Cmdy(cli.SYSTEM, arg) - } else if len(m.Resultv()) == 0 { - m.Table() - } - - // 返回结果 - _wx_reply(m, TEXT) + Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ + TEXT: {Name: TEXT, Help: "文本", Value: kit.Data(kit.MDB_TEMPLATE, text)}, + }, Commands: map[string]*ice.Command{ + TEXT: {Name: "text", Help: "文本", Action: map[string]*ice.Action{ + MENU: {Name: "menu name", Help: "菜单", Hand: func(m *ice.Message, arg ...string) { + _wx_action(m.Cmdy(MENU, kit.Select("home", m.Option(kit.MDB_NAME)))) }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + // 执行命令 + if m.Cmdy(arg); len(m.Appendv(ice.MSG_APPEND)) == 0 && len(m.Result()) == 0 { + m.Cmdy(cli.SYSTEM, arg) + } + if len(m.Result()) == 0 { + m.Table() + } + + // 返回结果 + _wx_reply(m, m.CommandKey()) }}, - ) + }}) } + +var text = ` + + +{{.Option "CreateTime"}} + + +` diff --git a/misc/wx/wx.go b/misc/wx/wx.go index 0f40a2e9..599f9fa1 100644 --- a/misc/wx/wx.go +++ b/misc/wx/wx.go @@ -8,15 +8,13 @@ import ( const WX = "wx" -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() - }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save() - }}, - }, -} +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() + }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Save() + }}, +}} func init() { chat.Index.Register(Index, &web.Frame{}) } diff --git a/misc/wx/wx.shy b/misc/wx/wx.shy index 3ff9ee5a..2193e6fa 100644 --- a/misc/wx/wx.shy +++ b/misc/wx/wx.shy @@ -9,6 +9,7 @@ qrcode `http://weixin.qq.com/r/_B1-Z7TEXOkjrfAE90jq` chapter "应用" field "访问" web.chat.wx.access +field "收藏" web.chat.wx.login field "收藏" web.chat.wx.favor field "菜单" web.chat.wx.menu @@ -23,7 +24,7 @@ field "会话" aaa.sess field "用户" aaa.user chapter "项目" -field "趋势图" web.code.git.trend args `icebergs` field "源代码" web.code.inner args `usr/icebergs/ misc/wx/wx.go` +field "趋势图" web.code.git.trend args `icebergs` field "架构图" web.code.git.spide args `icebergs`