diff --git a/chatbot/chatbot_handler.go b/chatbot/chatbot_handler.go new file mode 100644 index 0000000..bf671a9 --- /dev/null +++ b/chatbot/chatbot_handler.go @@ -0,0 +1,51 @@ +package chatbot + +import ( + "context" + "encoding/json" + "github.com/open-dingtalk/dingtalk-stream-sdk-go/payload" +) + +/** + * @Author linya.jj + * @Date 2023/3/22 18:30 + */ + +type IMessageHandler func(c context.Context, data *BotCallbackDataModel) error + +type DefaultChatBotFrameHandler struct { + defaultHandler IMessageHandler +} + +func NewDefaultChatBotFrameHandler(defaultHandler IMessageHandler) *DefaultChatBotFrameHandler { + return &DefaultChatBotFrameHandler{ + defaultHandler: defaultHandler, + } +} + +func (h *DefaultChatBotFrameHandler) OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) { + frameResp := &payload.DataFrameResponse{ + Code: 200, + Headers: payload.DataFrameHeader{ + payload.DataFrameHeaderKContentType: payload.DataFrameContentTypeKJson, + payload.DataFrameHeaderKMessageId: df.GetMessageId(), + }, + Message: "ok", + Data: "", + } + + msgData := &BotCallbackDataModel{} + err := json.Unmarshal([]byte(df.Data), msgData) + if err != nil { + return nil, err + } + + if h.defaultHandler != nil { + err = h.defaultHandler(ctx, msgData) + if err != nil { + return nil, err + } + } + + return frameResp, nil +} diff --git a/chatbot/model.go b/chatbot/model.go new file mode 100644 index 0000000..d20f13f --- /dev/null +++ b/chatbot/model.go @@ -0,0 +1,36 @@ +package chatbot + +/** + * @Author linya.jj + * @Date 2023/3/22 18:30 + */ + +type BotCallbackDataAtUserModel struct { + DingtalkId string `json:"dingtalkId"` + StaffId string `json:"staffId"` +} + +type BotCallbackDataTextModel struct { + Content string `json:"content"` +} + +type BotCallbackDataModel struct { + ConversationId string `json:"conversationId"` + AtUsers []BotCallbackDataAtUserModel `json:"atUsers"` + ChatbotCorpId string `json:"chatbotCorpId"` + ChatbotUserId string `json:"chatbotUserId"` + MsgId string `json:"msgId"` + SenderNick string `json:"senderNick"` + IsAdmin bool `json:"isAdmin"` + SenderStaffId string `json:"senderStaffId"` + SessionWebhookExpiredTime int64 `json:"sessionWebhookExpiredTime"` + CreateAt int64 `json:"createAt"` + SenderCorpId string `json:"senderCorpId"` + ConversationType string `json:"conversationType"` + SenderId string `json:"senderId"` + ConversationTitle string `json:"conversationTitle"` + IsInAtList bool `json:"isInAtList"` + SessionWebhook string `json:"sessionWebhook"` + Text BotCallbackDataTextModel `json:"text"` + Msgtype string `json:"msgtype"` +} diff --git a/example/example_bot.go b/example/example_bot.go index 0acff20..3b1dfb6 100644 --- a/example/example_bot.go +++ b/example/example_bot.go @@ -1,11 +1,17 @@ package main import ( + "bytes" "context" + "encoding/json" + "fmt" + "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/logger" "github.com/open-dingtalk/dingtalk-stream-sdk-go/payload" "github.com/open-dingtalk/dingtalk-stream-sdk-go/utils" + "net/http" + "time" ) /** @@ -27,13 +33,43 @@ func OnBotCallback(ctx context.Context, df *payload.DataFrame) (*payload.DataFra return frameResp, nil } +func OnChatReceive(ctx context.Context, data *chatbot.BotCallbackDataModel) error { + requestBody := map[string]interface{}{ + "msgtype": "text", + "text": map[string]interface{}{ + "content": fmt.Sprintf("msg received: [%s]", data.Text.Content), + }, + } + + requestJsonBody, _ := json.Marshal(requestBody) + req, err := http.NewRequestWithContext(ctx, http.MethodPost, data.SessionWebhook, bytes.NewReader(requestJsonBody)) + if err != nil { + return err + } + + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "*/*") + + httpClient := &http.Client{ + Transport: http.DefaultTransport, + Timeout: 5 * time.Second, //设置超时,包含connection时间、任意重定向时间、读取response body时间 + } + + _, err = httpClient.Do(req) + if err != nil { + return err + } + + return nil +} + func RunBotListener() { logger.SetLogger(logger.NewStdTestLogger()) cli := client.NewStreamClient( client.WithAppCredential(client.NewAppCredentialConfig("your-client-id", "your-client-secret")), client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()), - client.WithSubscription(utils.SubscriptionTypeKCallback, payload.BotMessageCallbackTopic, OnBotCallback), + client.WithSubscription(utils.SubscriptionTypeKCallback, payload.BotMessageCallbackTopic, chatbot.NewDefaultChatBotFrameHandler(OnChatReceive).OnEventReceived), ) err := cli.Start(context.Background()) diff --git a/payload/utils.go b/payload/utils.go index 40d85e5..11a43e4 100644 --- a/payload/utils.go +++ b/payload/utils.go @@ -22,7 +22,7 @@ const ( DataFrameResponseStatusCodeKOK = 200 DataFrameResponseStatusCodeKInternalError = 500 - BotMessageCallbackTopic = "bot_got_msg" //机器人消息统一回调topic + BotMessageCallbackTopic = "/v1.0/im/bot/messages/get" //机器人消息统一回调topic ) func GenerateMessageId(prefix string) string {