forked from x/icebergs
opt wx
This commit is contained in:
parent
221b84ff29
commit
82f4d2cf7e
@ -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
|
||||
}
|
||||
|
@ -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()))
|
||||
|
11
data.go
11
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 {
|
||||
|
@ -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)))
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -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) {
|
||||
}},
|
||||
)
|
||||
}})
|
||||
}
|
||||
|
@ -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)
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -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(`<xml>
|
||||
<FromUserName><![CDATA[%s]]></FromUserName>
|
||||
@ -55,8 +54,7 @@ func _wx_action(m *ice.Message) {
|
||||
m.Table(func(index int, value map[string]string, head []string) { count++ })
|
||||
m.Echo(`<ArticleCount>%d</ArticleCount>`, 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(`<Articles>`)
|
||||
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 = `<xml>
|
||||
<FromUserName><![CDATA[{{.Option "ToUserName"}}]]></FromUserName>
|
||||
<ToUserName><![CDATA[{{.Option "FromUserName"}}]]></ToUserName>
|
||||
<CreateTime>{{.Option "CreateTime"}}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[{{.Result}}]]></Content>
|
||||
</xml>`
|
||||
|
@ -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)
|
||||
}
|
||||
}},
|
||||
}})
|
||||
}
|
||||
|
@ -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 = `<xml>
|
||||
<FromUserName><![CDATA[{{.Option "ToUserName"}}]]></FromUserName>
|
||||
<ToUserName><![CDATA[{{.Option "FromUserName"}}]]></ToUserName>
|
||||
<CreateTime>{{.Option "CreateTime"}}</CreateTime>
|
||||
<MsgType><![CDATA[text]]></MsgType>
|
||||
<Content><![CDATA[{{.Result}}]]></Content>
|
||||
</xml>`
|
||||
|
@ -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{}) }
|
||||
|
@ -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`
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user