feat: support card instance callback

Signed-off-by: Ke Jie <chzealot@gmail.com>
This commit is contained in:
Ke Jie 2023-11-17 16:41:39 +08:00
parent aab862d51f
commit ffab4144be
5 changed files with 109 additions and 3 deletions

44
card/handler.go Normal file
View File

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

44
card/model.go Normal file
View File

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

View File

@ -6,6 +6,7 @@ import (
"encoding/json"
"errors"
"fmt"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/card"
"io"
"net/http"
"sync"
@ -405,12 +406,17 @@ func (cli *StreamClient) RegisterPluginCallbackRouter(messageHandler plugin.IPlu
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) {
cli.RegisterRouter(utils.SubscriptionTypeKEvent, topic, frameHandler)
}
// 事件类型的注册函数
// 所有事件的注册函数
func (cli *StreamClient) RegisterAllEventRouter(frameHandler handler.IFrameHandler) {
cli.RegisterRouter(utils.SubscriptionTypeKEvent, "*", frameHandler)
}

View File

@ -4,6 +4,7 @@ import (
"context"
"flag"
"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/client"
@ -61,6 +62,14 @@ func OnEventReceived(ctx context.Context, df *payload.DataFrame) (frameResp *pay
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
func main() {
var clientId, clientSecret string
@ -79,6 +88,8 @@ func main() {
cli.RegisterChatBotCallbackRouter(OnChatBotMessageReceived)
//注册插件的处理函数
cli.RegisterPluginCallbackRouter(OnPluginMessageReceived)
//注册互动卡片类型的处理函数
cli.RegisterCardCallbackRouter(OnCardCallbackReceived)
err := cli.Start(context.Background())
if err != nil {

View File

@ -24,8 +24,9 @@ const (
DataFrameResponseStatusCodeKInternalError = 500
DataFrameResponseStatusCodeKHandlerNotFound = 404
BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" //机器人消息统一回调topic
PluginMessageCallbackTopic = "/v1.0/graph/api/invoke" //AI插件消息统一回调topic
BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" // 机器人消息统一回调 topic
PluginMessageCallbackTopic = "/v1.0/graph/api/invoke" // AI插件消息统一回调 topic
CardInstanceCallbackTopic = "/v1.0/card/instances/callback" // 卡片回调的 topic
)
func GenerateMessageId(prefix string) string {