calculate.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package controller
  2. import (
  3. "fmt"
  4. "ktogame/models"
  5. "strings"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/go-xorm/xorm"
  8. )
  9. func UpdateSuperiorsPerformance(engine *xorm.Session, superiorsStr string, amount float64) error {
  10. logs.Info("into UpdateSuperiorsPerformance:", superiorsStr, amount)
  11. ids := strings.Split(superiorsStr, ",")
  12. if len(ids) <= 0 {
  13. return nil
  14. }
  15. logs.Info("UpdateSuperiorsPerformance ids::::::", ids)
  16. var supers []models.UserInfo
  17. for _, sid := range ids {
  18. var tmpUser models.UserInfo
  19. ok, err := engine.Where("id = ?", sid).Get(&tmpUser)
  20. if err != nil {
  21. return err
  22. }
  23. if !ok {
  24. continue
  25. }
  26. supers = append(supers, tmpUser)
  27. }
  28. logs.Info("UpdateSuperiorsPerformance supers::::::%v", len(supers))
  29. if len(supers) == 0 {
  30. return nil
  31. }
  32. var rp models.RewardsPool
  33. _, err := engine.ID(1).Get(&rp)
  34. if err != nil {
  35. return err
  36. }
  37. for _, super := range supers {
  38. var per models.Performance
  39. ok, err := engine.ID(super.Addr).Get(&per)
  40. if err != nil {
  41. fmt.Println(err)
  42. continue
  43. }
  44. if !ok {
  45. logs.Info("%v not exist!", super.Addr)
  46. continue
  47. }
  48. per.TotalPerformance += amount
  49. if per.TotalPerformance >= float64(CommunityMarket) {
  50. var super models.Performance
  51. ok, err := engine.ID(per.Addr).Get(&super)
  52. if err != nil {
  53. fmt.Println(err)
  54. continue
  55. }
  56. if !ok {
  57. logs.Info("%v not exist!", per.Addr)
  58. continue
  59. }
  60. super.MarketNum = int(per.TotalPerformance / float64(CommunityMarket))
  61. logs.Debug("matket check=====,", per.Addr, per.TotalPerformance, CommunityMarket, super.MarketNum)
  62. _, err = engine.ID(super.Addr).Cols("market_num").Update(&super)
  63. if err != nil {
  64. fmt.Println(err)
  65. continue
  66. }
  67. }
  68. var level int = 0
  69. for i := 1; i < len(PerformanceLevel); i++ {
  70. if PerformanceLevel[i-1] <= per.TotalPerformance && per.TotalPerformance < PerformanceLevel[i] {
  71. level = i
  72. break
  73. }
  74. }
  75. logs.Debug("Performance check=====1,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, level, per.PerformanceLevel)
  76. if level > 0 {
  77. if level > per.PerformanceLevel {
  78. ratio := PerformanceRatio[level] - PerformanceRatio[per.PerformanceLevel]
  79. rewards := amount * ratio
  80. if rp.TeamPerformance >= rewards {
  81. rp.TeamPerformance -= rewards //pool sub rewards
  82. per.PerformanceRewards += rewards //user add rewards to PerformanceRewards
  83. per.PerformanceLevel = level
  84. //update available
  85. logs.Debug("Performance check=====2,", per.Addr, level, amount, ratio, rewards)
  86. err := UpdateAvailableRewards(engine, rewards, super.Addr, false, false)
  87. if err != nil {
  88. return err
  89. }
  90. }
  91. }
  92. }
  93. _, err = engine.ID(super.Addr).Cols("total_performance,performance_level,performance_rewards").Update(&per)
  94. if err != nil {
  95. return err
  96. }
  97. logs.Debug("Performance check=====3,", per.Addr, rp.TeamPerformance, per.TotalPerformance, per.PerformanceRewards, per.PerformanceLevel)
  98. }
  99. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  100. if err != nil {
  101. return err
  102. }
  103. logs.Info("UpdateSuperiorsPerformance end:", rp)
  104. return nil
  105. }
  106. func UpdateRewardsPool(engine *xorm.Session, amount float64) error {
  107. logs.Info("into UpdateRewardsPool:", amount)
  108. var rp models.RewardsPool
  109. _, err := engine.ID(1).Get(&rp)
  110. if err != nil {
  111. return err
  112. }
  113. rp.TeamPerformance += amount * 0.15
  114. rp.TeamCultivate += amount * 0.10
  115. rp.TotalPool += amount
  116. _, err = engine.ID(1).Update(&rp)
  117. if err != nil {
  118. return err
  119. }
  120. logs.Info("UpdateRewardsPool end:", rp)
  121. return nil
  122. }
  123. func UpdateAvailableRewards(engine *xorm.Session, rewards float64, uaddr string, join, isdirect bool) error {
  124. logs.Info("into UpdateAvailableRewards:", rewards, uaddr, join, isdirect)
  125. a_rewards := rewards * 60 / 100
  126. a_reinput := rewards * 40 / 100
  127. var user models.UserInfo
  128. ok, err := engine.ID(uaddr).Get(&user)
  129. if err != nil {
  130. return err
  131. }
  132. if !ok {
  133. logs.Info("%v not exist!", uaddr)
  134. return nil
  135. }
  136. user.AvailableClaim += a_rewards
  137. user.AvailableReinput += a_reinput
  138. if join {
  139. if isdirect {
  140. user.DirectNumber += 1
  141. user.DirectRewards += rewards
  142. logs.Info("check direct info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  143. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput,direct_number,direct_rewards").Update(&user)
  144. if err != nil {
  145. return err
  146. }
  147. } else {
  148. user.IndirectNumber += 1
  149. user.IndirectRewards += rewards
  150. logs.Info("check indirect info=====:", rewards, a_rewards, a_reinput, user.AvailableClaim, user.AvailableReinput, user.DirectNumber, user.DirectRewards)
  151. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput,indirect_number,indirect_rewards").Update(&user)
  152. if err != nil {
  153. return err
  154. }
  155. }
  156. } else {
  157. logs.Info("check else info=====:", user.AvailableClaim, user.AvailableReinput)
  158. _, err := engine.ID(user.Addr).Cols("available_claim,available_reinput").Update(&user)
  159. if err != nil {
  160. return err
  161. }
  162. }
  163. logs.Info("UpdateAvailableRewards end:", user)
  164. return nil
  165. }
  166. func UpdateCommunityGift(engine *xorm.Session, amount float64, uaddr string) error {
  167. logs.Info("into UpdateCommunityGift:", amount, uaddr)
  168. var user, tmpUser models.UserInfo
  169. ok, err := engine.ID(uaddr).Get(&user)
  170. if err != nil {
  171. return err
  172. }
  173. if !ok {
  174. return nil
  175. }
  176. ok, err = engine.Desc("id").Get(&tmpUser)
  177. if err != nil {
  178. return err
  179. }
  180. if !ok {
  181. logs.Info("%v not exist!", uaddr)
  182. return nil
  183. }
  184. var leftNum, rightNum int64
  185. if user.Id >= 26 {
  186. leftNum = 25
  187. } else {
  188. leftNum = user.Id - 1
  189. }
  190. if tmpUser.Id-user.Id >= 25 {
  191. rightNum = 25
  192. } else {
  193. rightNum = tmpUser.Id - user.Id
  194. }
  195. rewards := amount * (float64(leftNum+rightNum) / 100)
  196. err = UpdateAvailableRewards(engine, rewards, user.Addr, false, false)
  197. if err != nil {
  198. return err
  199. }
  200. var per models.Performance
  201. ok, err = engine.ID(uaddr).Get(&per)
  202. if err != nil {
  203. return err
  204. }
  205. if !ok {
  206. return nil
  207. }
  208. per.CommunityGift += rewards
  209. _, err = engine.ID(uaddr).Cols("community_gift").Update(&per)
  210. if err != nil {
  211. return err
  212. }
  213. logs.Info("UpdateCommunityGift end:", amount, uaddr)
  214. return nil
  215. }
  216. func UpdateCommunityNodes(engine *xorm.Session, amount float64) error {
  217. logs.Info("into UpdateCommunityNodes:", amount)
  218. var nodes []models.UserInfo
  219. err := engine.Where("state = ?", CommunityUsers).Find(&nodes)
  220. if err != nil {
  221. return err
  222. }
  223. if len(nodes) == 0 {
  224. return nil
  225. }
  226. rewards := (amount * 5 / 100) / float64(len(nodes))
  227. for _, node := range nodes {
  228. err = UpdateAvailableRewards(engine, rewards, node.Addr, false, false)
  229. if err != nil {
  230. fmt.Println(err)
  231. continue
  232. }
  233. var per models.Performance
  234. _, err = engine.ID(node.Addr).Get(&per)
  235. if err != nil {
  236. fmt.Println(err)
  237. continue
  238. }
  239. per.CommunityNode += rewards
  240. _, err = engine.ID(node.Addr).Cols("community_node").Update(&per)
  241. if err != nil {
  242. fmt.Println(err)
  243. continue
  244. }
  245. }
  246. logs.Info("UpdateCommunityNodes end:", amount)
  247. return nil
  248. }
  249. func UpdateMarket(engine *xorm.Session, amount float64) error {
  250. logs.Info("into UpdateMarket:", amount)
  251. var pers []models.Performance
  252. err := engine.Where("market_num >= ?", 2).Find(&pers)
  253. if err != nil {
  254. return err
  255. }
  256. var rp models.RewardsPool
  257. ok, err := engine.ID(1).Get(&rp)
  258. if err != nil {
  259. return err
  260. }
  261. if !ok {
  262. return nil
  263. }
  264. for _, per := range pers {
  265. var level int = 0
  266. for i := 1; i < len(MarketLevel); i++ {
  267. if MarketLevel[i-1] <= per.MarketNum && per.MarketNum < MarketLevel[i] {
  268. level = i
  269. break
  270. }
  271. }
  272. logs.Debug(" UpdateMarket=====1,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  273. if level > 0 {
  274. if level > per.MarketLevel {
  275. ratio := MarketRatio[level] - MarketRatio[per.MarketLevel]
  276. rewards := amount * ratio
  277. if rp.TeamCultivate >= rewards {
  278. rp.TeamCultivate -= rewards //pool sub rewards
  279. per.MarketRewards += rewards //user add rewards to PerformanceRewards
  280. per.MarketLevel = level
  281. //update available
  282. logs.Debug(" UpdateMarket=====2,", per.Addr, rewards)
  283. err := UpdateAvailableRewards(engine, rewards, per.Addr, false, false)
  284. if err != nil {
  285. return err
  286. }
  287. _, err = engine.ID(per.Addr).Cols("market_level,market_rewards").Update(&per)
  288. if err != nil {
  289. return err
  290. }
  291. }
  292. }
  293. }
  294. logs.Debug(" UpdateMarket=====3,", per.Addr, rp.TeamCultivate, per.MarketRewards, level, per.MarketLevel)
  295. }
  296. _, err = engine.ID(1).Cols("team_performance").Update(&rp)
  297. if err != nil {
  298. return err
  299. }
  300. logs.Info("UpdateMarket end:", amount)
  301. return nil
  302. }