76 lines
2.2 KiB
Go
76 lines
2.2 KiB
Go
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.Infof("%s启动失败", name)
|
||
continue
|
||
}
|
||
log.Infof("%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
|
||
}
|