handler.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package card
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
  6. )
  7. type ICardCallbackHandler func(c context.Context, request *CardRequest) (*CardResponse, error)
  8. type DefaultCardCallbackFrameHandler struct {
  9. defaultHandler ICardCallbackHandler
  10. }
  11. func NewDefaultPluginFrameHandler(defaultHandler ICardCallbackHandler) *DefaultCardCallbackFrameHandler {
  12. return &DefaultCardCallbackFrameHandler{
  13. defaultHandler: defaultHandler,
  14. }
  15. }
  16. func (h *DefaultCardCallbackFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
  17. msgData := &CardRequest{}
  18. err := json.Unmarshal([]byte(df.Data), msgData)
  19. if err != nil {
  20. return nil, err
  21. }
  22. json.Unmarshal([]byte(msgData.Content), &msgData.CardActionData)
  23. if h.defaultHandler == nil {
  24. return payload.NewDataFrameResponse(payload.DataFrameResponseStatusCodeKHandlerNotFound), nil
  25. }
  26. result, err := h.defaultHandler(ctx, msgData)
  27. if err != nil {
  28. return nil, err
  29. }
  30. frameResp := payload.NewSuccessDataFrameResponse()
  31. callbackData := make(map[string]any)
  32. callbackData["response"] = result
  33. if err = frameResp.SetJson(callbackData); err != nil {
  34. return nil, err
  35. }
  36. return frameResp, nil
  37. }