ai_scheduler/internal/server/ding_talk_bot.go

108 lines
3.0 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"
"fmt"
"sync"
"gitea.cdlsxd.cn/self-tools/l-dingtalk-stream-sdk-go/chatbot"
"gitea.cdlsxd.cn/self-tools/l-dingtalk-stream-sdk-go/client"
"github.com/go-kratos/kratos/v2/log"
)
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) {
if botIndex == "" {
log.Info("未指定机器人索引,跳过启动")
return
}
var targets []string
switch {
case botIndex == "All":
targets = make([]string, 0, len(d.Clients))
for name := range d.Clients {
targets = append(targets, name)
}
default:
if _, exists := d.Clients[botIndex]; exists {
targets = []string{botIndex}
} else {
log.Infof("未找到索引为 %s 的机器人", botIndex)
return
}
}
var wg sync.WaitGroup
errors := make([]error, 0, len(targets))
for _, name := range targets {
wg.Add(1)
go func(name string) {
defer wg.Done()
err := d.Clients[name].Start(ctx)
if err != nil {
log.Errorf("%s 启动失败: %v", name, err)
errors = append(errors, fmt.Errorf("%s: %w", name, err))
} else {
log.Infof("%s 启动成功", name)
}
}(name)
}
wg.Wait()
if len(errors) > 0 {
log.Errorf("部分机器人启动失败,总数: %d, 成功: %d, 失败: %d",
len(targets), len(targets)-len(errors), len(errors))
}
}
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
}