package wechat import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "errors" "fmt" ) type Template interface { ShouldSend(ctx *TemplateContext) bool Data(ctx *TemplateContext) *DefaultWechatTemplate MsgId(ctx *TemplateContext) string Url(ctx *TemplateContext) string TemplateId(ctx *TemplateContext) string } type TemplateContext struct { Cloudbrain *models.Cloudbrain } func SendTemplateMsg(template Template, ctx *TemplateContext, userId int64) error { defer func() { if err := recover(); err != nil { combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2)) log.Error("PANIC:", combinedErr) } }() if !template.ShouldSend(ctx) { log.Info("SendTemplateMsg should not Send.jobId=%d jobType=%s", ctx.Cloudbrain.ID, ctx.Cloudbrain.JobType) return nil } openId := models.GetUserWechatOpenId(userId) if openId == "" { log.Error("Wechat openId not exist,userId=%d", userId) return errors.New("Wechat openId not exist") } req := TemplateMsgRequest{ ToUser: openId, TemplateId: template.TemplateId(ctx), Url: template.Url(ctx), ClientMsgId: template.MsgId(ctx), Data: template.Data(ctx), } err, retryFlag := sendTemplateMsg(req) if retryFlag { log.Info("SendTemplateMsg calling") refreshAccessToken() err, _ = sendTemplateMsg(req) if err != nil { log.Error("SendTemplateMsg err. %v", err) return err } return nil } if err != nil { log.Error("SendTemplateMsg err. %v", err) return err } log.Info("SendTemplateMsg success") return nil }