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 []*client.StreamClient } // NewDingTalkBotServer 批量注册钉钉客户端cli // 这里支持两种方式,一种是完全独立service,一种是直接用现成的service // 独立的service,在本页的ProvideAllDingBotServices方法进行注册 // 现成的service参考services->dtalk_bot.go // 具体使用请根据实际业务需求 func NewDingTalkBotServer( services []DingBotServiceInterface, ) *DingTalkBotServer { clients := make([]*client.StreamClient, 0) for _, service := range services { serviceConfigs, index := 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客户端初始失败", index) continue } clients = append(clients, cli) } } return &DingTalkBotServer{ Clients: clients, } } func ProvideAllDingBotServices( dingBotSvc *services.DingBotService, ) []DingBotServiceInterface { return []DingBotServiceInterface{dingBotSvc} } func (d *DingTalkBotServer) Run(ctx context.Context) { for name, cli := range d.Clients { 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 }