feat: support card instance callback
Signed-off-by: Ke Jie <chzealot@gmail.com>
This commit is contained in:
parent
aab862d51f
commit
ffab4144be
|
|
@ -0,0 +1,44 @@
|
||||||
|
package card
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ICardCallbackHandler func(c context.Context, request *CardRequest) (*CardResponse, error)
|
||||||
|
|
||||||
|
type DefaultCardCallbackFrameHandler struct {
|
||||||
|
defaultHandler ICardCallbackHandler
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDefaultPluginFrameHandler(defaultHandler ICardCallbackHandler) *DefaultCardCallbackFrameHandler {
|
||||||
|
return &DefaultCardCallbackFrameHandler{
|
||||||
|
defaultHandler: defaultHandler,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *DefaultCardCallbackFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
|
||||||
|
msgData := &CardRequest{}
|
||||||
|
err := json.Unmarshal([]byte(df.Data), msgData)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
json.Unmarshal([]byte(msgData.Content), &msgData.CardActionData)
|
||||||
|
|
||||||
|
if h.defaultHandler == nil {
|
||||||
|
return payload.NewDataFrameResponse(payload.DataFrameResponseStatusCodeKHandlerNotFound), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
result, err := h.defaultHandler(ctx, msgData)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
frameResp := payload.NewSuccessDataFrameResponse()
|
||||||
|
callbackData := make(map[string]any)
|
||||||
|
callbackData["response"] = result
|
||||||
|
if err = frameResp.SetJson(callbackData); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return frameResp, nil
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
package card
|
||||||
|
|
||||||
|
type PrivateCardActionData struct {
|
||||||
|
CardPrivateData CardPrivateData `json:"cardPrivateData"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CardPrivateData struct {
|
||||||
|
ActionIdList []string `json:"actionIds"`
|
||||||
|
Params map[string]any `json:"params"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CardDataDto struct {
|
||||||
|
CardParamMap map[string]string `json:"cardParamMap"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type CardRequest struct {
|
||||||
|
Content string `json:"content"`
|
||||||
|
CorpId string `json:"corpId"`
|
||||||
|
Extension string `json:"extension"`
|
||||||
|
OutTrackId string `json:"outTrackId"`
|
||||||
|
SpaceId string `json:"spaceId"`
|
||||||
|
SpaceType string `json:"spaceType"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
UserId string `json:"userId"`
|
||||||
|
UserIdType int `json:"userIdType"`
|
||||||
|
CardActionData PrivateCardActionData
|
||||||
|
}
|
||||||
|
|
||||||
|
type CardResponse struct {
|
||||||
|
CardData *CardDataDto `json:"cardData"`
|
||||||
|
PrivateCardData *CardDataDto `json:"privateCardData"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *CardRequest) GetActionString(name string) string {
|
||||||
|
value, ok := r.CardActionData.CardPrivateData.Params[name]
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
s, ok := value.(string)
|
||||||
|
if ok {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/open-dingtalk/dingtalk-stream-sdk-go/card"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
@ -405,12 +406,17 @@ func (cli *StreamClient) RegisterPluginCallbackRouter(messageHandler plugin.IPlu
|
||||||
cli.RegisterRouter(utils.SubscriptionTypeKCallback, payload.PluginMessageCallbackTopic, plugin.NewDefaultPluginFrameHandler(messageHandler).OnEventReceived)
|
cli.RegisterRouter(utils.SubscriptionTypeKCallback, payload.PluginMessageCallbackTopic, plugin.NewDefaultPluginFrameHandler(messageHandler).OnEventReceived)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 互动卡片的注册函数
|
||||||
|
func (cli *StreamClient) RegisterCardCallbackRouter(messageHandler card.ICardCallbackHandler) {
|
||||||
|
cli.RegisterRouter(utils.SubscriptionTypeKCallback, payload.CardInstanceCallbackTopic, card.NewDefaultPluginFrameHandler(messageHandler).OnEventReceived)
|
||||||
|
}
|
||||||
|
|
||||||
// 事件类型的注册函数
|
// 事件类型的注册函数
|
||||||
func (cli *StreamClient) RegisterEventRouter(topic string, frameHandler handler.IFrameHandler) {
|
func (cli *StreamClient) RegisterEventRouter(topic string, frameHandler handler.IFrameHandler) {
|
||||||
cli.RegisterRouter(utils.SubscriptionTypeKEvent, topic, frameHandler)
|
cli.RegisterRouter(utils.SubscriptionTypeKEvent, topic, frameHandler)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 事件类型的注册函数
|
// 所有事件的注册函数
|
||||||
func (cli *StreamClient) RegisterAllEventRouter(frameHandler handler.IFrameHandler) {
|
func (cli *StreamClient) RegisterAllEventRouter(frameHandler handler.IFrameHandler) {
|
||||||
cli.RegisterRouter(utils.SubscriptionTypeKEvent, "*", frameHandler)
|
cli.RegisterRouter(utils.SubscriptionTypeKEvent, "*", frameHandler)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/open-dingtalk/dingtalk-stream-sdk-go/card"
|
||||||
|
|
||||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
|
"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
|
||||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
|
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
|
||||||
|
|
@ -61,6 +62,14 @@ func OnEventReceived(ctx context.Context, df *payload.DataFrame) (frameResp *pay
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func OnCardCallbackReceived(ctx context.Context, request *card.CardRequest) (*card.CardResponse, error) {
|
||||||
|
logger.GetLogger().Infof("receive card data: %v", request)
|
||||||
|
response := &card.CardResponse{
|
||||||
|
CardData: &card.CardDataDto{},
|
||||||
|
}
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
// go run example/*.go --client_id your-client-id --client_secret your-client-secret
|
// go run example/*.go --client_id your-client-id --client_secret your-client-secret
|
||||||
func main() {
|
func main() {
|
||||||
var clientId, clientSecret string
|
var clientId, clientSecret string
|
||||||
|
|
@ -79,6 +88,8 @@ func main() {
|
||||||
cli.RegisterChatBotCallbackRouter(OnChatBotMessageReceived)
|
cli.RegisterChatBotCallbackRouter(OnChatBotMessageReceived)
|
||||||
//注册插件的处理函数
|
//注册插件的处理函数
|
||||||
cli.RegisterPluginCallbackRouter(OnPluginMessageReceived)
|
cli.RegisterPluginCallbackRouter(OnPluginMessageReceived)
|
||||||
|
//注册互动卡片类型的处理函数
|
||||||
|
cli.RegisterCardCallbackRouter(OnCardCallbackReceived)
|
||||||
|
|
||||||
err := cli.Start(context.Background())
|
err := cli.Start(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ const (
|
||||||
|
|
||||||
BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" // 机器人消息统一回调 topic
|
BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" // 机器人消息统一回调 topic
|
||||||
PluginMessageCallbackTopic = "/v1.0/graph/api/invoke" // AI插件消息统一回调 topic
|
PluginMessageCallbackTopic = "/v1.0/graph/api/invoke" // AI插件消息统一回调 topic
|
||||||
|
CardInstanceCallbackTopic = "/v1.0/card/instances/callback" // 卡片回调的 topic
|
||||||
)
|
)
|
||||||
|
|
||||||
func GenerateMessageId(prefix string) string {
|
func GenerateMessageId(prefix string) string {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue