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 }