1
0
forked from x/icebergs
icebergs/misc/lark/msg.go
2022-12-15 22:04:21 +08:00

101 lines
3.0 KiB
Go

package lark
import (
"encoding/json"
"net/http"
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/web"
"shylinux.com/x/icebergs/core/wiki"
kit "shylinux.com/x/toolkits"
)
func _lark_get(m *ice.Message, appid string, arg ...ice.Any) (*ice.Message, ice.Any) {
m.Option(web.SPIDE_HEADER, "Authorization", "Bearer "+m.Cmdx(APP, TOKEN, appid), web.ContentType, web.ContentJSON)
msg := m.Cmd(web.SPIDE, LARK, http.MethodGet, arg)
return msg, msg.Optionv(web.SPIDE_RES)
}
func _lark_post(m *ice.Message, appid string, arg ...ice.Any) *ice.Message {
m.Option(web.SPIDE_HEADER, "Authorization", "Bearer "+m.Cmdx(APP, TOKEN, appid), web.ContentType, web.ContentJSON)
return m.Cmd(web.SPIDE, LARK, arg)
}
func _lark_parse(m *ice.Message) {
data := m.Optionv(ice.MSG_USERDATA)
if data == nil {
json.NewDecoder(m.R.Body).Decode(&data)
m.Optionv(ice.MSG_USERDATA, data)
switch d := data.(type) {
case ice.Map:
for k, v := range d {
switch d := v.(type) {
case ice.Map:
for k, v := range d {
m.Add(ice.MSG_OPTION, k, kit.Format(v))
}
default:
for _, v := range kit.Simple(v) {
m.Add(ice.MSG_OPTION, kit.Keys(MSG, k), kit.Format(v))
}
}
}
}
}
m.Debug("msg: %v", kit.Format(data))
}
const (
APP_ID = "app_id"
SHIP_ID = "ship_id"
OPEN_ID = "open_id"
CHAT_ID = "chat_id"
USER_ID = "user_id"
OPEN_CHAT_ID = "open_chat_id"
USER_OPEN_ID = "user_open_id"
)
const MSG = "msg"
func init() {
Index.MergeCommands(ice.Commands{
web.WEB_LOGIN: {Hand: func(m *ice.Message, arg ...string) {
m.Option(ice.MSG_USERZONE, LARK)
}},
"/msg": {Name: "/msg", Help: "聊天消息", Hand: func(m *ice.Message, arg ...string) {
data := m.Optionv(ice.MSG_USERDATA)
if kit.Value(data, "action") != nil { // 卡片回调
m.Cmd(MSG, "card")
return
}
switch _lark_parse(m); m.Option("msg.type") {
case "url_verification": // 绑定验证
m.RenderResult(kit.Format(kit.Dict("challenge", m.Option("msg.challenge"))))
case "event_callback": // 事件回调
m.Cmd(EVENT, m.Option(mdb.TYPE))
default: // 未知消息
m.Cmd(DUTY, m.Option("msg.type"), kit.Formats(data))
}
}},
MSG: {Name: "msg", Help: "聊天消息", Actions: ice.Actions{
"location": {Hand: func(m *ice.Message, arg ...string) {}},
"image": {Hand: func(m *ice.Message, arg ...string) {}},
"card": {Hand: func(m *ice.Message, arg ...string) {
kit.For(kit.Value(m.Optionv(ice.MSG_USERDATA), "action.value"), func(k string, v string) { m.Option(k, v) })
m.Cmdy(TALK, kit.Parse(nil, "", kit.Split(m.Option(ice.CMD))...))
m.Cmd(SEND, m.Option(APP_ID), CHAT_ID, m.Option(OPEN_CHAT_ID), m.Option(wiki.TITLE)+ice.SP+m.Option(ice.CMD), m.Result())
}},
}, Hand: func(m *ice.Message, arg ...string) {
if m.Option(OPEN_CHAT_ID) == "" {
m.Cmdy(DUTY, m.Option(mdb.TYPE), kit.Formats(m.Optionv(ice.MSG_USERDATA)))
} else {
m.Cmdy(TALK, strings.TrimSpace(m.Option("text_without_at_bot")))
}
}},
})
}