|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- package reward
-
- import (
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
- "fmt"
- "time"
- )
-
- var (
- ResourceSpecs *models.ResourceSpecs
- TrainResourceSpecs *models.ResourceSpecs
- )
-
- const RUN_CLOUDBRAIN_TASK_TITTLE = "运行云脑任务"
-
- func AcceptStatusChangeAction() {
- for {
- select {
- case task := <-models.StatusChangeChan:
- DeductPoint4Cloudbrain(*task, time.Now())
- }
- }
- }
-
- func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.RewardPeriodicTask, error) {
- sourceId := getCloudBrainPointTaskSourceId(task)
- r, err := GetPeriodicTask(models.SourceTypeRunCloudbrainTask, sourceId, sourceId, models.OperateTypeDecrease)
- if err != nil {
- return nil, err
- }
-
- if r != nil {
- log.Debug("PeriodicTask is already exist.cloudbrain.ID = %d", task.ID)
- return r, nil
- }
-
- if !setting.CloudBrainPaySwitch {
- log.Debug("CloudBrainPaySwitch is off")
- return nil, nil
- }
-
- unitPrice, err := models.GetCloudbrainTaskUnitPrice(task)
- if err != nil {
- return nil, err
- }
- if unitPrice == 0 {
- log.Debug("Finish startAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID)
- return nil, nil
- }
-
- return StartPeriodicTask(&models.StartPeriodicTaskOpts{
- SourceType: models.SourceTypeRunCloudbrainTask,
- SourceId: getCloudBrainPointTaskSourceId(task),
- TargetUserId: task.UserID,
- RequestId: getCloudBrainPointTaskSourceId(task),
- OperateType: models.OperateTypeDecrease,
- Delay: setting.CloudBrainPayDelay,
- Interval: setting.CloudBrainPayInterval,
- UnitAmount: unitPrice,
- RewardType: models.RewardTypePoint,
- StartTime: time.Unix(int64(task.StartTime), 0),
- Title: RUN_CLOUDBRAIN_TASK_TITTLE,
- })
- }
-
- func StopCloudBrainPointDeductTask(task models.Cloudbrain) {
- StopPeriodicTask(models.SourceTypeRunCloudbrainTask, getCloudBrainPointTaskSourceId(task), models.OperateTypeDecrease)
- }
-
- func getCloudBrainPointTaskSourceId(task models.Cloudbrain) string {
- return fmt.Sprint(task.ID)
- }
-
- var firstTimeFlag = true
-
- func StartCloudbrainPointDeductTask() {
- defer func() {
- if err := recover(); err != nil {
- combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
- log.Error("PANIC:%v", combinedErr)
- }
- }()
- log.Debug("try to run CloudbrainPointDeductTask")
- end := time.Now()
- start := end.Add(-1 * setting.DeductTaskRange)
- if firstTimeFlag {
- //When it is executed for the first time, it needs to process the tasks of the last 3 hours.
- //This is done to prevent the application from hanging for a long time
- start = end.Add(-1 * setting.DeductTaskRangeForFirst)
- firstTimeFlag = false
- }
- taskList, err := models.GetStartedCloudbrainTaskByUpdatedUnix(start, end)
- if err != nil {
- log.Error("GetStartedCloudbrainTaskByUpdatedUnix error. %v", err)
- return
- }
- if taskList == nil || len(taskList) == 0 {
- log.Debug("No cloudbrain task need handled")
- return
- }
- for _, t := range taskList {
- DeductPoint4Cloudbrain(t, end)
- }
- log.Debug("CloudbrainPointDeductTask completed")
- }
-
- func DeductPoint4Cloudbrain(t models.Cloudbrain, now time.Time) error {
- defer func() {
- if err := recover(); err != nil {
- combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
- log.Error("PANIC:%v", combinedErr)
- }
- }()
- log.Debug("start to deduct point for cloudbrain[%d]", t.ID)
- if t.StartTime == 0 {
- log.Debug("cloudbrain[%d] task not start", t.ID)
- return nil
- }
-
- task, err := StartAndGetCloudBrainPointDeductTask(t)
- if err != nil {
- log.Error("run cloudbrain point deduct task error,err=%v", err)
- return err
- }
- if task == nil {
- log.Debug("cloudbrain[%d] deduct task is nil")
- return nil
- }
- if task.Status == models.PeriodicTaskStatusFinished {
- log.Info("Periodic task is finished")
- return nil
- }
-
- if t.EndTime > 0 {
- endTime := time.Unix(int64(t.EndTime), 0)
- RunRewardTask(*task, endTime)
- models.StopPeriodicTask(task.ID, task.OperateSerialNo, endTime)
- } else {
- RunRewardTask(*task, now)
- }
- log.Debug("finished deduct point for cloudbrain[%d]", t.ID)
- return nil
- }
|