feat #1 增加通过regist系列接口来注册监听函数
This commit is contained in:
parent
57da047a6a
commit
26dea572e8
|
|
@ -343,3 +343,26 @@ func (cli *StreamClient) SendDataFrameResponse(ctx context.Context, resp *payloa
|
|||
}
|
||||
return cli.conn.WriteJSON(resp)
|
||||
}
|
||||
|
||||
// 通用注册函数
|
||||
func (cli *StreamClient) RegisterRouter(stype, stopic string, frameHandler handler.IFrameHandler) {
|
||||
if cli.subscriptions == nil {
|
||||
cli.subscriptions = make(map[string]map[string]handler.IFrameHandler)
|
||||
}
|
||||
|
||||
if _, ok := cli.subscriptions[stype]; !ok {
|
||||
cli.subscriptions[stype] = make(map[string]handler.IFrameHandler)
|
||||
}
|
||||
|
||||
cli.subscriptions[stype][stopic] = frameHandler
|
||||
}
|
||||
|
||||
// callback类型注册函数
|
||||
func (cli *StreamClient) RegisterCallbackRouter(topic string, frameHandler handler.IFrameHandler) {
|
||||
cli.RegisterRouter(utils.SubscriptionTypeKCallback, topic, frameHandler)
|
||||
}
|
||||
|
||||
// 事件类型的注册函数
|
||||
func (cli *StreamClient) RegisterEventRouter(topic string, frameHandler handler.IFrameHandler) {
|
||||
cli.RegisterRouter(utils.SubscriptionTypeKEvent, topic, frameHandler)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,15 +23,7 @@ func WithAppCredential(cred *AppCredentialConfig) ClientOption {
|
|||
|
||||
func WithSubscription(stype, stopic string, frameHandler handler.IFrameHandler) ClientOption {
|
||||
return func(c *StreamClient) {
|
||||
if c.subscriptions == nil {
|
||||
c.subscriptions = make(map[string]map[string]handler.IFrameHandler)
|
||||
}
|
||||
|
||||
if _, ok := c.subscriptions[stype]; !ok {
|
||||
c.subscriptions[stype] = make(map[string]handler.IFrameHandler)
|
||||
}
|
||||
|
||||
c.subscriptions[stype][stopic] = frameHandler
|
||||
c.RegisterRouter(stype, stopic, frameHandler)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,128 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"flag"
|
||||
"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/event"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/logger"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/payload"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
/**
|
||||
* @Author linya.jj
|
||||
* @Date 2023/3/22 18:30
|
||||
*/
|
||||
|
||||
func OnChatBotMessageReceived(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 := &chatbot.BotCallbackDataModel{}
|
||||
err := json.Unmarshal([]byte(df.Data), msgData)
|
||||
if err != nil {
|
||||
// TODO 处理错误:回调消息反序列化出错
|
||||
return frameResp, nil
|
||||
}
|
||||
|
||||
//处理方式:回复文本消息,通过SessionWebhook来回复消息
|
||||
requestBody := map[string]interface{}{
|
||||
"msgtype": "text",
|
||||
"text": map[string]interface{}{
|
||||
"content": fmt.Sprintf("msg received: [%s]", msgData.Text.Content),
|
||||
},
|
||||
}
|
||||
|
||||
requestJsonBody, _ := json.Marshal(requestBody)
|
||||
req, err := http.NewRequestWithContext(ctx, http.MethodPost, msgData.SessionWebhook, bytes.NewReader(requestJsonBody))
|
||||
if err != nil {
|
||||
// TODO 处理错误
|
||||
return frameResp, nil
|
||||
}
|
||||
|
||||
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 {
|
||||
// TODO 处理错误: 回复消息出错
|
||||
return frameResp, nil
|
||||
}
|
||||
|
||||
return frameResp, nil
|
||||
}
|
||||
|
||||
// 事件处理函数
|
||||
func OnEventReceived(ctx context.Context, df *payload.DataFrame) (*payload.DataFrameResponse, error) {
|
||||
eventHeader := event.NewEventHeaderFromDataFrame(df)
|
||||
|
||||
logger.GetLogger().Infof("received event, eventId=[%s] eventBornTime=[%d] eventCorpId=[%s] eventType=[%s] eventUnifiedAppId=[%s] data=[%s]",
|
||||
eventHeader.EventId,
|
||||
eventHeader.EventBornTime,
|
||||
eventHeader.EventCorpId,
|
||||
eventHeader.EventType,
|
||||
eventHeader.EventUnifiedAppId,
|
||||
df.Data)
|
||||
|
||||
resultStr, _ := json.Marshal(event.NewEventProcessResultSuccess())
|
||||
|
||||
frameResp := &payload.DataFrameResponse{
|
||||
Code: payload.DataFrameResponseStatusCodeKOK,
|
||||
Headers: payload.DataFrameHeader{
|
||||
payload.DataFrameHeaderKContentType: payload.DataFrameContentTypeKJson,
|
||||
payload.DataFrameHeaderKMessageId: df.GetMessageId(),
|
||||
},
|
||||
Message: "ok",
|
||||
Data: string(resultStr),
|
||||
}
|
||||
|
||||
return frameResp, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
var clientId, clientSecret string
|
||||
flag.StringVar(&clientId, "client_id", "", "your-client-id")
|
||||
flag.StringVar(&clientSecret, "client_secret", "", "your-client-secret")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
logger.SetLogger(logger.NewStdTestLogger())
|
||||
|
||||
cli := client.NewStreamClient(
|
||||
client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)),
|
||||
client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()),
|
||||
)
|
||||
|
||||
//注册事件类型的处理函数
|
||||
cli.RegisterEventRouter("*", OnEventReceived)
|
||||
//注册callback类型的处理函数
|
||||
cli.RegisterCallbackRouter(payload.BotMessageCallbackTopic, OnChatBotMessageReceived)
|
||||
|
||||
err := cli.Start(context.Background())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer cli.Close()
|
||||
|
||||
select {}
|
||||
}
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
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"
|
||||
)
|
||||
|
||||
/**
|
||||
* @Author linya.jj
|
||||
* @Date 2023/3/22 18:30
|
||||
*/
|
||||
|
||||
func OnBotCallback(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: "",
|
||||
}
|
||||
|
||||
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(clientId, clientSecret string) {
|
||||
logger.SetLogger(logger.NewStdTestLogger())
|
||||
|
||||
cli := client.NewStreamClient(
|
||||
client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)),
|
||||
client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()),
|
||||
client.WithSubscription(utils.SubscriptionTypeKCallback, payload.BotMessageCallbackTopic, chatbot.NewDefaultChatBotFrameHandler(OnChatReceive).OnEventReceived),
|
||||
)
|
||||
|
||||
err := cli.Start(context.Background())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer cli.Close()
|
||||
|
||||
select {}
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/event"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/logger"
|
||||
"github.com/open-dingtalk/dingtalk-stream-sdk-go/utils"
|
||||
)
|
||||
|
||||
/**
|
||||
* @Author linya.jj
|
||||
* @Date 2023/3/22 18:30
|
||||
*/
|
||||
|
||||
func RunEventListener(clientId, clientSecret string) {
|
||||
logger.SetLogger(logger.NewStdTestLogger())
|
||||
|
||||
eventHandler := event.NewDefaultEventFrameHandler(event.EventHandlerDoNothing)
|
||||
|
||||
cli := client.NewStreamClient(
|
||||
client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)),
|
||||
client.WithUserAgent(client.NewDingtalkGoSDKUserAgent()),
|
||||
client.WithSubscription(utils.SubscriptionTypeKEvent, "*", eventHandler.OnEventReceived),
|
||||
)
|
||||
|
||||
err := cli.Start(context.Background())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
defer cli.Close()
|
||||
|
||||
select {}
|
||||
}
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
)
|
||||
|
||||
/**
|
||||
* @Author linya.jj
|
||||
* @Date 2023/3/22 18:30
|
||||
*/
|
||||
|
||||
func main() {
|
||||
var clientId, clientSecret string
|
||||
flag.StringVar(&clientId, "client_id", "", "your-client-id")
|
||||
flag.StringVar(&clientSecret, "client_secret", "", "your-client-secret")
|
||||
|
||||
flag.Parse()
|
||||
|
||||
RunBotListener(clientId, clientSecret)
|
||||
|
||||
select {}
|
||||
}
|
||||
|
|
@ -24,7 +24,7 @@ type DataFrame struct {
|
|||
SpecVersion string `json:"specVersion"`
|
||||
Type string `json:"type"`
|
||||
Time int64 `json:"time"`
|
||||
Headers DataFrameHeader `json:"headers""`
|
||||
Headers DataFrameHeader `json:"headers"`
|
||||
Data string `json:"data"`
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue