package chat import ( "context" "strings" "time" "git.imall.cloud/openim/chat/pkg/common/constant" "git.imall.cloud/openim/chat/pkg/common/mctx" "git.imall.cloud/openim/chat/pkg/common/rtc" "git.imall.cloud/openim/chat/pkg/protocol/admin" "git.imall.cloud/openim/chat/pkg/protocol/chat" "github.com/openimsdk/tools/db/mongoutil" "github.com/openimsdk/tools/discovery" "github.com/openimsdk/tools/errs" "github.com/openimsdk/tools/mw" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "git.imall.cloud/openim/chat/pkg/common/config" "git.imall.cloud/openim/chat/pkg/common/db/database" "git.imall.cloud/openim/chat/pkg/email" chatClient "git.imall.cloud/openim/chat/pkg/rpclient/chat" "git.imall.cloud/openim/chat/pkg/sms" "github.com/openimsdk/tools/db/redisutil" "github.com/redis/go-redis/v9" ) type Config struct { RpcConfig config.Chat RedisConfig config.Redis MongodbConfig config.Mongo Discovery config.Discovery Share config.Share } func Start(ctx context.Context, config *Config, client discovery.SvcDiscoveryRegistry, server *grpc.Server) error { if len(config.Share.ChatAdmin) == 0 { return errs.New("share chat admin not configured") } mgocli, err := mongoutil.NewMongoDB(ctx, config.MongodbConfig.Build()) if err != nil { return err } rdb, err := redisutil.NewRedisClient(ctx, config.RedisConfig.Build()) if err != nil { return err } var srv chatSvr srv.rdb = rdb config.RpcConfig.VerifyCode.Phone.Use = strings.ToLower(config.RpcConfig.VerifyCode.Phone.Use) config.RpcConfig.VerifyCode.Mail.Use = strings.ToLower(config.RpcConfig.VerifyCode.Mail.Use) srv.conf = config.RpcConfig.VerifyCode switch config.RpcConfig.VerifyCode.Phone.Use { case "ali": ali := config.RpcConfig.VerifyCode.Phone.Ali srv.SMS, err = sms.NewAli(ali.Endpoint, ali.AccessKeyID, ali.AccessKeySecret, ali.SignName, ali.VerificationCodeTemplateCode) if err != nil { return err } case "bao": bao := config.RpcConfig.VerifyCode.Phone.Bao srv.SMS, err = sms.NewBao(bao.Endpoint, bao.AccessKeyID, bao.AccessKeySecret, bao.SignName, bao.VerificationCodeTemplateCode) if err != nil { return err } } if mail := config.RpcConfig.VerifyCode.Mail; mail.Use == constant.VerifyMail { srv.Mail = email.NewMail(mail.SMTPAddr, mail.SMTPPort, mail.SenderMail, mail.SenderAuthorizationCode, mail.Title) } srv.Database, err = database.NewChatDatabase(mgocli, rdb) if err != nil { return err } conn, err := client.GetConn(ctx, config.Discovery.RpcService.Admin, grpc.WithTransportCredentials(insecure.NewCredentials()), mw.GrpcClient()) if err != nil { return err } srv.Admin = chatClient.NewAdminClient(admin.NewAdminClient(conn)) srv.Code = verifyCode{ UintTime: time.Duration(config.RpcConfig.VerifyCode.UintTime) * time.Second, MaxCount: config.RpcConfig.VerifyCode.MaxCount, ValidCount: config.RpcConfig.VerifyCode.ValidCount, SuperCode: config.RpcConfig.VerifyCode.SuperCode, ValidTime: time.Duration(config.RpcConfig.VerifyCode.ValidTime) * time.Second, Len: config.RpcConfig.VerifyCode.Len, } srv.Livekit = rtc.NewLiveKit(config.RpcConfig.LiveKit.Key, config.RpcConfig.LiveKit.Secret, config.RpcConfig.LiveKit.URL) srv.AllowRegister = config.RpcConfig.AllowRegister chat.RegisterChatServer(server, &srv) return nil } type chatSvr struct { chat.UnimplementedChatServer conf config.VerifyCode Database database.ChatDatabaseInterface Admin *chatClient.AdminClient SMS sms.SMS Mail email.Mail Code verifyCode Livekit *rtc.LiveKit ChatAdminUserID string AllowRegister bool rdb redis.UniversalClient } func (o *chatSvr) WithAdminUser(ctx context.Context) context.Context { return mctx.WithAdminUser(ctx, o.ChatAdminUserID) } type verifyCode struct { UintTime time.Duration // sec MaxCount int ValidCount int SuperCode string ValidTime time.Duration Len int }