You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

cloudbrain_deduct.go 4.0 kB

3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
3 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package reward
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/modules/setting"
  6. "fmt"
  7. "time"
  8. )
  9. var (
  10. ResourceSpecs *models.ResourceSpecs
  11. TrainResourceSpecs *models.ResourceSpecs
  12. )
  13. const RUN_CLOUDBRAIN_TASK_TITTLE = "运行云脑任务"
  14. func AcceptStatusChangeAction() {
  15. for {
  16. select {
  17. case task := <-models.StatusChangeChan:
  18. DeductPoint4Cloudbrain(*task, time.Now())
  19. }
  20. }
  21. }
  22. func StartAndGetCloudBrainPointDeductTask(task models.Cloudbrain) (*models.RewardPeriodicTask, error) {
  23. sourceId := getCloudBrainPointTaskSourceId(task)
  24. r, err := GetPeriodicTask(models.SourceTypeRunCloudbrainTask, sourceId, sourceId, models.OperateTypeDecrease)
  25. if err != nil {
  26. return nil, err
  27. }
  28. if r != nil {
  29. log.Debug("PeriodicTask is already exist.cloudbrain.ID = %d", task.ID)
  30. return r, nil
  31. }
  32. if !setting.CloudBrainPaySwitch {
  33. log.Debug("CloudBrainPaySwitch is off")
  34. return nil, nil
  35. }
  36. unitPrice, err := models.GetCloudbrainTaskUnitPrice(task)
  37. if err != nil {
  38. return nil, err
  39. }
  40. if unitPrice == 0 {
  41. log.Debug("Finish startAndGetCloudBrainPointDeductTask, UnitPrice = 0 task.ID=%d", task.ID)
  42. return nil, nil
  43. }
  44. return StartPeriodicTask(&models.StartPeriodicTaskOpts{
  45. SourceType: models.SourceTypeRunCloudbrainTask,
  46. SourceId: getCloudBrainPointTaskSourceId(task),
  47. TargetUserId: task.UserID,
  48. RequestId: getCloudBrainPointTaskSourceId(task),
  49. OperateType: models.OperateTypeDecrease,
  50. Delay: setting.CloudBrainPayDelay,
  51. Interval: setting.CloudBrainPayInterval,
  52. UnitAmount: unitPrice,
  53. RewardType: models.RewardTypePoint,
  54. StartTime: time.Unix(int64(task.StartTime), 0),
  55. Title: RUN_CLOUDBRAIN_TASK_TITTLE,
  56. })
  57. }
  58. func StopCloudBrainPointDeductTask(task models.Cloudbrain) {
  59. StopPeriodicTask(models.SourceTypeRunCloudbrainTask, getCloudBrainPointTaskSourceId(task), models.OperateTypeDecrease)
  60. }
  61. func getCloudBrainPointTaskSourceId(task models.Cloudbrain) string {
  62. return fmt.Sprint(task.ID)
  63. }
  64. var firstTimeFlag = true
  65. func StartCloudbrainPointDeductTask() {
  66. defer func() {
  67. if err := recover(); err != nil {
  68. combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
  69. log.Error("PANIC:%v", combinedErr)
  70. }
  71. }()
  72. log.Debug("try to run CloudbrainPointDeductTask")
  73. end := time.Now()
  74. start := end.Add(-1 * setting.DeductTaskRange)
  75. if firstTimeFlag {
  76. //When it is executed for the first time, it needs to process the tasks of the last 3 hours.
  77. //This is done to prevent the application from hanging for a long time
  78. start = end.Add(-1 * setting.DeductTaskRangeForFirst)
  79. firstTimeFlag = false
  80. }
  81. taskList, err := models.GetStartedCloudbrainTaskByUpdatedUnix(start, end)
  82. if err != nil {
  83. log.Error("GetStartedCloudbrainTaskByUpdatedUnix error. %v", err)
  84. return
  85. }
  86. if taskList == nil || len(taskList) == 0 {
  87. log.Debug("No cloudbrain task need handled")
  88. return
  89. }
  90. for _, t := range taskList {
  91. DeductPoint4Cloudbrain(t, end)
  92. }
  93. log.Debug("CloudbrainPointDeductTask completed")
  94. }
  95. func DeductPoint4Cloudbrain(t models.Cloudbrain, now time.Time) error {
  96. defer func() {
  97. if err := recover(); err != nil {
  98. combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
  99. log.Error("PANIC:%v", combinedErr)
  100. }
  101. }()
  102. log.Debug("start to deduct point for cloudbrain[%d]", t.ID)
  103. if t.StartTime == 0 {
  104. log.Debug("cloudbrain[%d] task not start", t.ID)
  105. return nil
  106. }
  107. task, err := StartAndGetCloudBrainPointDeductTask(t)
  108. if err != nil {
  109. log.Error("run cloudbrain point deduct task error,err=%v", err)
  110. return err
  111. }
  112. if task == nil {
  113. log.Debug("cloudbrain[%d] deduct task is nil")
  114. return nil
  115. }
  116. if task.Status == models.PeriodicTaskStatusFinished {
  117. log.Info("Periodic task is finished")
  118. return nil
  119. }
  120. if t.EndTime > 0 {
  121. endTime := time.Unix(int64(t.EndTime), 0)
  122. RunRewardTask(*task, endTime)
  123. models.StopPeriodicTask(task.ID, task.OperateSerialNo, endTime)
  124. } else {
  125. RunRewardTask(*task, now)
  126. }
  127. log.Debug("finished deduct point for cloudbrain[%d]", t.ID)
  128. return nil
  129. }