package wechat import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" "errors" "fmt" "time" ) type JobOperateType string const ( JobOperateTypeStart JobOperateType = "start" JobOperateTypeStop JobOperateType = "stop" ) func GetJobOperateTypeFromCloudbrainStatus(cloudbrain *models.Cloudbrain) JobOperateType { if cloudbrain.IsTerminal() { return JobOperateTypeStop } if cloudbrain.IsRunning() { return JobOperateTypeStart } return "" } func SendCloudbrainStartedMsg(operateType JobOperateType, cloudbrain models.Cloudbrain, date time.Time) error { defer func() { if err := recover(); err != nil { combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2)) log.Error("PANIC:", combinedErr) } }() repo, err := models.GetRepositoryByID(cloudbrain.RepoID) if err != nil { log.Error("SendCloudbrainStartedMsg GetRepositoryByID error,%v", err) } if setting.CloudbrainStartedTemplateId == "" { return nil } if date.IsZero() { date = time.Now() } openId := models.GetUserWechatOpenId(cloudbrain.UserID) if openId == "" { return errors.New("Wechat openId not exist") } data := CloudbrainTaskData{ First: TemplateValue{Value: getCloudbrainTemplateTitle(operateType)}, Keyword1: TemplateValue{Value: cloudbrain.DisplayJobName}, Keyword2: TemplateValue{Value: getJobTypeDisplayName(cloudbrain.JobType)}, Keyword3: TemplateValue{Value: date.Format("2006-01-02 15:04:05")}, Remark: TemplateValue{Value: getCloudbrainTemplateRemark(operateType)}, } req := TemplateMsgRequest{ ToUser: openId, TemplateId: setting.CloudbrainStartedTemplateId, Url: getCloudbrainTemplateUrl(cloudbrain, repo), ClientMsgId: string(operateType) + "_" + fmt.Sprint(cloudbrain.ID), Data: data, } err, retryFlag := sendTemplateMsg(req) if retryFlag { log.Info("retrySendCloudbrainTemplateMsg calling") refreshAccessToken() err, _ = sendTemplateMsg(req) if err != nil { log.Error("SendCloudbrainStartedMsg err. %v", err) return err } return nil } if err != nil { log.Error("SendCloudbrainStartedMsg err. %v", err) return err } return nil } func getCloudbrainTemplateUrl(cloudbrain models.Cloudbrain, repo *models.Repository) string { url := setting.AppURL + repo.FullName() switch cloudbrain.JobType { case string(models.JobTypeDebug): if cloudbrain.ComputeResource == "CPU/GPU" { url += "/cloudbrain/" + fmt.Sprint(cloudbrain.ID) } else { url += "/modelarts/notebook/" + fmt.Sprint(cloudbrain.ID) } case string(models.JobTypeBenchmark): url += "/cloudbrain/benchmark/" + fmt.Sprint(cloudbrain.ID) case string(models.JobTypeTrain): if cloudbrain.Type == models.TypeCloudBrainOne { url += "/cloudbrain/train-job/" + fmt.Sprint(cloudbrain.JobID) } else if cloudbrain.Type == models.TypeCloudBrainTwo { url += "/modelarts/train-job" + fmt.Sprint(cloudbrain.JobID) } else if cloudbrain.Type == models.TypeC2Net { url += "/grampus/train-job/" + fmt.Sprint(cloudbrain.JobID) } case string(models.JobTypeInference): url += "/modelarts/inference-job/" + fmt.Sprint(cloudbrain.JobID) } return url } func getCloudbrainTemplateTitle(operateType JobOperateType) string { var title string switch operateType { case JobOperateTypeStart: title = "您好,您提交的算力资源申请已通过,任务已启动,请您关注运行情况。" case JobOperateTypeStop: title = "您好,您提交的任务已运行结束。" } return title } func getCloudbrainTemplateRemark(operateType JobOperateType) string { var remark string switch operateType { case JobOperateTypeStart: remark = "感谢您的耐心等待。" case JobOperateTypeStop: remark = "点击可查看运行结果" } return remark } func getJobTypeDisplayName(jobType string) string { switch jobType { case string(models.JobTypeDebug): return "调试任务" case string(models.JobTypeBenchmark): return "评测任务" case string(models.JobTypeTrain): return "训练任务" case string(models.JobTypeInference): return "推理任务" } return "" }