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.

task.go 2.9 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package task
  2. import (
  3. "code.gitea.io/gitea/models"
  4. "code.gitea.io/gitea/modules/log"
  5. "code.gitea.io/gitea/services/reward"
  6. "code.gitea.io/gitea/services/reward/limiter"
  7. "fmt"
  8. )
  9. func Accomplish(action models.Action) {
  10. defer func() {
  11. if err := recover(); err != nil {
  12. combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
  13. log.Error("PANIC:%v", combinedErr)
  14. }
  15. }()
  16. action.OpType = models.GetTaskOptType(action)
  17. switch action.OpType {
  18. //only creating public repo can be rewarded
  19. case models.ActionCreateRepo:
  20. if action.Repo.IsPrivate {
  21. return
  22. }
  23. //only creating public image can be rewarded
  24. case models.ActionCreateImage:
  25. if action.IsPrivate {
  26. return
  27. }
  28. case models.ActionBindWechat:
  29. n, err := models.CountWechatBindLog(action.Content, models.WECHAT_BIND)
  30. if err != nil {
  31. log.Error("CountWechatBindLog error when accomplish task,err=%v", err)
  32. return
  33. }
  34. //if wechatOpenId has been bound before,the action can not get reward
  35. if n > 1 {
  36. log.Debug("the wechat account has been bound before,wechatOpenId = %s", action.Content)
  37. return
  38. }
  39. }
  40. go accomplish(action)
  41. }
  42. func accomplish(action models.Action) error {
  43. defer func() {
  44. if err := recover(); err != nil {
  45. combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
  46. log.Error("PANIC:%v", combinedErr)
  47. }
  48. }()
  49. userId := action.ActUserID
  50. taskType := fmt.Sprint(action.OpType)
  51. //get task config
  52. config, err := GetTaskConfig(taskType)
  53. if err != nil {
  54. log.Error("GetTaskConfig error,%v", err)
  55. return err
  56. }
  57. if config == nil {
  58. log.Info("task config not exist,userId=%d taskType=%s", userId, taskType)
  59. return nil
  60. }
  61. //is limited?
  62. if isLimited(userId, config, models.JustReject) {
  63. log.Info("task accomplish maximum times are reached,userId=%d taskType=%s", userId, taskType)
  64. return nil
  65. }
  66. //add log
  67. _, err = models.InsertTaskAccomplishLog(&models.TaskAccomplishLog{
  68. ConfigId: config.ID,
  69. TaskCode: config.TaskCode,
  70. UserId: userId,
  71. ActionId: action.ID,
  72. })
  73. if err != nil {
  74. log.Error("InsertTaskAccomplishLog error,%v", err)
  75. return err
  76. }
  77. //reward
  78. reward.Operate(&models.RewardOperateContext{
  79. SourceType: models.SourceTypeAccomplishTask,
  80. SourceId: fmt.Sprint(action.ID),
  81. SourceTemplateId: fmt.Sprint(action.OpType),
  82. Title: config.Title,
  83. Reward: models.Reward{
  84. Amount: config.AwardAmount,
  85. Type: models.GetRewardTypeInstance(config.AwardType),
  86. },
  87. TargetUserId: userId,
  88. RequestId: fmt.Sprint(action.ID),
  89. OperateType: models.OperateTypeIncrease,
  90. RejectPolicy: models.FillUp,
  91. })
  92. log.Debug("accomplish success,action=%v", action)
  93. return nil
  94. }
  95. func isLimited(userId int64, config *models.TaskConfig, rejectPolicy models.LimiterRejectPolicy) bool {
  96. if _, err := limiter.CheckLimit(config.TaskCode, models.LimitTypeTask, userId, 1, rejectPolicy); err != nil {
  97. log.Error(" isLimited CheckLimit error. %v", err)
  98. return true
  99. }
  100. return false
  101. }