feat #1 增加通过regist系列接口来注册监听函数

This commit is contained in:
jiangjian 2023-05-24 14:08:19 +08:00
parent 57da047a6a
commit 26dea572e8
7 changed files with 153 additions and 150 deletions

View File

@ -343,3 +343,26 @@ func (cli *StreamClient) SendDataFrameResponse(ctx context.Context, resp *payloa
} }
return cli.conn.WriteJSON(resp) 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)
}

View File

@ -23,15 +23,7 @@ func WithAppCredential(cred *AppCredentialConfig) ClientOption {
func WithSubscription(stype, stopic string, frameHandler handler.IFrameHandler) ClientOption { func WithSubscription(stype, stopic string, frameHandler handler.IFrameHandler) ClientOption {
return func(c *StreamClient) { return func(c *StreamClient) {
if c.subscriptions == nil { c.RegisterRouter(stype, stopic, frameHandler)
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
} }
} }

128
example/example.go Normal file
View File

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

View File

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

View File

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

View File

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

View File

@ -24,7 +24,7 @@ type DataFrame struct {
SpecVersion string `json:"specVersion"` SpecVersion string `json:"specVersion"`
Type string `json:"type"` Type string `json:"type"`
Time int64 `json:"time"` Time int64 `json:"time"`
Headers DataFrameHeader `json:"headers""` Headers DataFrameHeader `json:"headers"`
Data string `json:"data"` Data string `json:"data"`
} }