calculate.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package controller
  2. import (
  3. "errors"
  4. "fmt"
  5. "ktogame/models"
  6. "strings"
  7. "github.com/go-xorm/xorm"
  8. )
  9. func UpdateSuperiorsPerformance(engine *xorm.Engine, superiorsStr string, amount float64) error {
  10. ids := strings.Split(superiorsStr, ",")
  11. if len(ids) <= 0 {
  12. return nil
  13. }
  14. var supers []models.UserInfo
  15. for _, sid := range ids {
  16. var tmpUser models.UserInfo
  17. ok, err := engine.Where("id = ?", sid).Get(&tmpUser)
  18. if err != nil {
  19. return err
  20. }
  21. if !ok {
  22. return errors.New("UpdateSuperiorsPerformance get super failed")
  23. }
  24. supers = append(supers, tmpUser)
  25. }
  26. var rp models.RewardsPool
  27. _, err := engine.Id(1).Get(&rp)
  28. if err != nil {
  29. return err
  30. }
  31. for _, user := range supers {
  32. var per models.Performance
  33. ok, err := engine.Id(user.Addr).Get(&per)
  34. if err != nil {
  35. return err
  36. }
  37. if !ok {
  38. return errors.New("UpdateSuperiorsPerformance get performance failed")
  39. }
  40. per.TotalPerformance += amount
  41. var level int = 0
  42. for i := 1; i < len(PerformanceLevel); i++ {
  43. if PerformanceLevel[i-1] <= per.TotalPerformance && per.TotalPerformance < PerformanceLevel[i] {
  44. level = i
  45. break
  46. }
  47. }
  48. if level > 0 {
  49. if level > per.PerformanceLevel {
  50. ratio := PerformanceRatio[level] - PerformanceRatio[per.PerformanceLevel]
  51. rewards := amount * ratio
  52. if rp.TeamPerformance >= rewards {
  53. rp.TeamPerformance -= rewards //pool sub rewards
  54. per.PerformanceRewards += rewards //user add rewards to PerformanceRewards
  55. per.PerformanceLevel = level
  56. //update available
  57. err := UpdateAvailableRewards(engine, rewards, user.Addr, false, false)
  58. if err != nil {
  59. return err
  60. }
  61. _, err = engine.ID(user.Addr).Cols("total_performance,performance_rewards,performance_level").Update(&per)
  62. if err != nil {
  63. return err
  64. }
  65. }
  66. }
  67. }
  68. }
  69. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  70. if err != nil {
  71. return err
  72. }
  73. return nil
  74. }
  75. func UpdateRewardsPool(engine *xorm.Engine, amount float64) error {
  76. var rp models.RewardsPool
  77. rp.TeamPerformance = amount * 0.2
  78. rp.TeamCultivate = amount * 0.05
  79. rp.TotalPool += amount
  80. _, err := engine.ID(1).Update(&rp)
  81. if err != nil {
  82. return err
  83. }
  84. return nil
  85. }
  86. func UpdateAvailableRewards(engine *xorm.Engine, rewards float64, uaddr string, join, isdirect bool) error {
  87. a_rewards := rewards * 60 / 100
  88. a_reinput := rewards * 40 / 100
  89. var user models.UserInfo
  90. ok, err := engine.Id(uaddr).Get(&user)
  91. if err != nil {
  92. return err
  93. }
  94. if !ok {
  95. return errors.New("engine get failed")
  96. }
  97. user.AvailableClaim = a_rewards
  98. user.AvailableReinput = a_reinput
  99. if join {
  100. if isdirect {
  101. user.DirectNumber += 1
  102. user.DirectRewards += rewards
  103. _, err = engine.ID(user.Addr).Cols("available_claim,available_reinput,direct_number,direct_rewards").Update(&user)
  104. if err != nil {
  105. return err
  106. }
  107. } else {
  108. user.IndirectNumber += 1
  109. user.IndirectRewards += rewards
  110. _, err = engine.ID(user.Addr).Cols("available_claim,available_reinput,indirect_number,indirect_rewards").Update(&user)
  111. if err != nil {
  112. return err
  113. }
  114. }
  115. } else {
  116. _, err = engine.ID(user.Addr).Cols("available_claim,available_reinput").Update(&user)
  117. if err != nil {
  118. return err
  119. }
  120. }
  121. return nil
  122. }
  123. func UpdateCommunityGift(engine *xorm.Engine, amount float64, uaddr string) error {
  124. var user, tmpUser models.UserInfo
  125. ok, err := engine.Id(uaddr).Get(&user)
  126. if err != nil {
  127. return err
  128. }
  129. if !ok {
  130. return errors.New("engine get info failed")
  131. }
  132. ok, err = engine.Desc("id").Get(&tmpUser)
  133. if err != nil {
  134. return err
  135. }
  136. if !ok {
  137. return errors.New("engine get info failed")
  138. }
  139. var leftNum, rightNum int64
  140. if user.Id >= 26 {
  141. leftNum = 25
  142. } else {
  143. leftNum = user.Id - 1
  144. }
  145. if tmpUser.Id-user.Id >= 25 {
  146. rightNum = 25
  147. } else {
  148. rightNum = tmpUser.Id - user.Id
  149. }
  150. rewards := amount * (float64(leftNum+rightNum) / 100)
  151. err = UpdateAvailableRewards(engine, rewards, user.Addr, false, false)
  152. if err != nil {
  153. return err
  154. }
  155. var per models.Performance
  156. ok, err = engine.Id(uaddr).Get(&per)
  157. if err != nil {
  158. return err
  159. }
  160. if !ok {
  161. return errors.New("engine get per failed")
  162. }
  163. per.CommunityGift += rewards
  164. _, err = engine.ID(uaddr).Cols("community_gift").Update(&per)
  165. if err != nil {
  166. return err
  167. }
  168. return nil
  169. }
  170. func UpdateCommunityNodes(engine *xorm.Engine, amount float64) error {
  171. var nodes []models.UserInfo
  172. err := engine.Where("state = ?", CommunityUsers).Find(&nodes)
  173. if err != nil {
  174. return err
  175. }
  176. if len(nodes) == 0 {
  177. return nil
  178. }
  179. rewards := (amount * 5 / 100) / float64(len(nodes))
  180. for _, node := range nodes {
  181. err = UpdateAvailableRewards(engine, rewards, node.Addr, false, false)
  182. if err != nil {
  183. fmt.Println(err)
  184. continue
  185. }
  186. }
  187. return nil
  188. }