1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-26 01:24:05 +08:00
This commit is contained in:
shylinux 2021-02-04 22:15:58 +08:00
parent 0b863d1eeb
commit ab79903523
8 changed files with 112 additions and 84 deletions

View File

@ -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/"),

View File

@ -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)
}},
},

View File

@ -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)
}},
},
})

View File

@ -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)
}},
},

View File

@ -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)
}},
},

View File

@ -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, "<label>", "$ ", "</label>")
default:
list = append(list, "<label>", "&lt; ", "</label>")
list = append(list, "<label>", "&gt; ", "</label>")
}
list = append(list, "<span>", l, "</span>")
list = append(list, "</div>")

View File

@ -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(`<xml>
<FromUserName><![CDATA[%s]]></FromUserName>
@ -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", `<xml>
<FromUserName><![CDATA[{{.Option "ToUserName"}}]]></FromUserName>
<ToUserName><![CDATA[{{.Option "FromUserName"}}]]></ToUserName>
<CreateTime>{{.Option "CreateTime"}}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{{.Result}}]]></Content>
</xml>`),
"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 = `<xml>
<FromUserName><![CDATA[{{.Option "ToUserName"}}]]></FromUserName>
<ToUserName><![CDATA[{{.Option "FromUserName"}}]]></ToUserName>
<CreateTime>{{.Option "CreateTime"}}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{{.Result}}]]></Content>
</xml>`

View File

@ -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