ai_scheduler/internal/server/ding_talk_bot.go

76 lines
2.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package server
import (
"ai_scheduler/internal/entitys"
"ai_scheduler/internal/services"
"context"
"github.com/go-kratos/kratos/v2/log"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/chatbot"
"github.com/open-dingtalk/dingtalk-stream-sdk-go/client"
)
type DingBotServiceInterface interface {
GetServiceCfg() ([]entitys.DingTalkBot, error)
OnChatBotMessageReceived(ctx context.Context, data *chatbot.BotCallbackDataModel) (content []byte, err error)
}
type DingTalkBotServer struct {
Clients map[string]*client.StreamClient
}
// NewDingTalkBotServer 批量注册钉钉客户端cli
// 这里支持两种方式一种是完全独立service,一种是直接用现成的service
// 独立的service,在本页的ProvideAllDingBotServices方法进行注册
// 现成的service参考services->dtalk_bot.go
// 具体使用请根据实际业务需求
func NewDingTalkBotServer(
services []DingBotServiceInterface,
) *DingTalkBotServer {
clients := make(map[string]*client.StreamClient)
for _, service := range services {
serviceConfigs, err := service.GetServiceCfg()
for _, serviceConf := range serviceConfigs {
if serviceConf.ClientId == "" || serviceConf.ClientSecret == "" {
continue
}
cli := DingBotServerInit(serviceConf.ClientId, serviceConf.ClientSecret, service)
if cli == nil {
log.Info("%s客户端初始失败:%s", serviceConf.BotIndex, err.Error())
continue
}
clients[serviceConf.BotIndex] = cli
}
}
return &DingTalkBotServer{
Clients: clients,
}
}
func ProvideAllDingBotServices(
dingBotSvc *services.DingBotService,
) []DingBotServiceInterface {
return []DingBotServiceInterface{dingBotSvc}
}
func (d *DingTalkBotServer) Run(ctx context.Context, botIndex string) {
for name, cli := range d.Clients {
if botIndex != "All" {
if name != botIndex {
continue
}
}
err := cli.Start(ctx)
if err != nil {
log.Info("%s启动失败", name)
continue
}
log.Info("%s启动成功", name)
}
}
func DingBotServerInit(clientId string, clientSecret string, service DingBotServiceInterface) (cli *client.StreamClient) {
cli = client.NewStreamClient(client.WithAppCredential(client.NewAppCredentialConfig(clientId, clientSecret)))
cli.RegisterChatBotCallbackRouter(service.OnChatBotMessageReceived)
return
}