slotusermanager.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package usermanager
  2. import (
  3. "encoding/json"
  4. "os"
  5. "strconv"
  6. "sync"
  7. "time"
  8. "bet24.com/log"
  9. )
  10. var mgr *slotusermgr
  11. const (
  12. check_inteval = 300
  13. remove_interval = 1800
  14. )
  15. const newbie_lowest_amount = 10000000
  16. type newbie_info struct {
  17. LowestAmount int
  18. SetCount int
  19. }
  20. func newSlotUserManager() *slotusermgr {
  21. ret := new(slotusermgr)
  22. ret.ctor()
  23. log.Debug("slotusermgr running")
  24. return ret
  25. }
  26. type slotusermgr struct {
  27. lock *sync.RWMutex
  28. userlist map[int]*slotuser
  29. lockRemove *sync.RWMutex
  30. removingUsers map[int]int64
  31. //newbieLowest map[int]int
  32. maxNoneFreeCount map[int]int
  33. Whitelist []int
  34. newbieInfo newbie_info
  35. userTotalCountMgr *count_manager
  36. }
  37. func (um *slotusermgr) ctor() {
  38. um.lock = &sync.RWMutex{}
  39. um.userlist = make(map[int]*slotuser)
  40. um.lockRemove = &sync.RWMutex{}
  41. um.removingUsers = make(map[int]int64)
  42. //um.newbieLowest = make(map[int]int)
  43. um.maxNoneFreeCount = make(map[int]int)
  44. um.userTotalCountMgr = newCountManager()
  45. go um.checkRemoveUser()
  46. }
  47. /*
  48. func (um *slotusermgr) setNewbieLowest(gameId int, amount int) {
  49. um.lock.Lock()
  50. um.newbieLowest[gameId] = amount
  51. um.lock.Unlock()
  52. }
  53. */
  54. func (um *slotusermgr) setMaxNoneFreeCount(gameId int, count int) {
  55. um.lock.Lock()
  56. um.maxNoneFreeCount[gameId] = count
  57. um.lock.Unlock()
  58. }
  59. /*func (um *slotusermgr) getNewbieLowest(gameId int) int {
  60. um.lock.RLock()
  61. defer um.lock.RUnlock()
  62. v, ok := um.newbieLowest[gameId]
  63. if !ok {
  64. return newbie_lowest_amount
  65. }
  66. return v
  67. }*/
  68. func (um *slotusermgr) isNewbie(amount, setCount int) bool {
  69. if amount > um.newbieInfo.LowestAmount {
  70. return false
  71. }
  72. if setCount > um.newbieInfo.SetCount {
  73. return false
  74. }
  75. return true
  76. }
  77. func (um *slotusermgr) getMaxNoneFreeCount(gameId int) int {
  78. um.lock.RLock()
  79. defer um.lock.RUnlock()
  80. v, ok := um.maxNoneFreeCount[gameId]
  81. if !ok {
  82. return 0
  83. }
  84. return v
  85. }
  86. func (um *slotusermgr) loadWhitelist() {
  87. data, err := os.ReadFile("slotconf/whitelist.json")
  88. um.lock.Lock()
  89. err = json.Unmarshal(data, &um.Whitelist)
  90. um.lock.Unlock()
  91. if err != nil {
  92. log.Release("slotusermgr.loadWhitelist failed %v", err)
  93. }
  94. }
  95. func (um *slotusermgr) loadNewbieInfo() {
  96. data, err := os.ReadFile("slotconf/newbieinfo.json")
  97. um.lock.Lock()
  98. err = json.Unmarshal(data, &um.newbieInfo)
  99. um.lock.Unlock()
  100. if err != nil {
  101. log.Release("slotusermgr.loadNewbieInfo failed %v", err)
  102. }
  103. if um.newbieInfo.SetCount == 0 {
  104. um.newbieInfo.SetCount = 10
  105. }
  106. if um.newbieInfo.LowestAmount == 0 {
  107. um.newbieInfo.LowestAmount = newbie_lowest_amount
  108. }
  109. log.Debug("slotusermgr newbieInfo %v", um.newbieInfo)
  110. }
  111. func (um *slotusermgr) checkRemoveUser() {
  112. time.AfterFunc(check_inteval*time.Second, um.checkRemoveUser)
  113. um.loadWhitelist()
  114. um.loadNewbieInfo()
  115. var toRemove []int
  116. latestRemoveTime := time.Now().Unix() - remove_interval
  117. um.lockRemove.RLock()
  118. for k, v := range um.removingUsers {
  119. if v < latestRemoveTime {
  120. toRemove = append(toRemove, k)
  121. }
  122. }
  123. um.lockRemove.RUnlock()
  124. if len(toRemove) == 0 {
  125. return
  126. }
  127. um.lockRemove.Lock()
  128. for _, v := range toRemove {
  129. delete(um.removingUsers, v)
  130. }
  131. um.lockRemove.Unlock()
  132. um.lock.Lock()
  133. for _, v := range toRemove {
  134. delete(um.userlist, v)
  135. }
  136. um.lock.Unlock()
  137. }
  138. func (um *slotusermgr) addUser(userId int) {
  139. if userId == 0 {
  140. return
  141. }
  142. um.lockRemove.Lock()
  143. delete(um.removingUsers, userId)
  144. um.lockRemove.Unlock()
  145. um.userTotalCountMgr.onUserEnter(userId)
  146. um.lock.Lock()
  147. _, ok := um.userlist[userId]
  148. if !ok {
  149. um.userlist[userId] = newSlotUser(userId)
  150. }
  151. um.lock.Unlock()
  152. }
  153. func (um *slotusermgr) removeUser(userId int) {
  154. um.lockRemove.Lock()
  155. defer um.lockRemove.Unlock()
  156. um.removingUsers[userId] = time.Now().Unix()
  157. go um.userTotalCountMgr.onUserExit(userId)
  158. }
  159. func (um *slotusermgr) getUser(userId int) *slotuser {
  160. um.lock.RLock()
  161. u, ok := um.userlist[userId]
  162. um.lock.RUnlock()
  163. if ok {
  164. return u
  165. }
  166. u = newSlotUser(userId)
  167. um.lock.Lock()
  168. um.userlist[userId] = u
  169. um.lock.Unlock()
  170. return u
  171. }
  172. func (um *slotusermgr) addResult(userId int, gameId int, betAmount int, winAmount int, isFree bool) {
  173. u := um.getUser(userId)
  174. u.addResult(gameId, betAmount, winAmount, isFree)
  175. }
  176. func (um *slotusermgr) getUserReturnLevel(userId, gameId, betAmount int) int {
  177. if um.isWhitList(userId) {
  178. return SlotReturnLevel_WhiteList
  179. }
  180. u := um.getUser(userId)
  181. if u == nil {
  182. return 0
  183. }
  184. return u.getReturnLevel(gameId, betAmount)
  185. }
  186. func (um *slotusermgr) isNewbieUser(userId int, gameId int) bool {
  187. u := um.getUser(userId)
  188. if u == nil {
  189. log.Debug("slotusermgr.isNewbieUser %d not exist", userId)
  190. return false
  191. }
  192. return u.isNewbie(gameId)
  193. }
  194. func (sm *slotusermgr) dump(param1, param2 string) {
  195. log.Release("-------------------------------")
  196. log.Release("slotusermgr.dump %s %s", param1, param2)
  197. defer func() {
  198. log.Release("+++++++++++++++++++++++++++++++")
  199. log.Release("")
  200. }()
  201. switch param1 {
  202. case "user":
  203. userId, err := strconv.Atoi(param2)
  204. if err != nil {
  205. log.Release(" atoi error %v", err)
  206. return
  207. }
  208. u := sm.getUser(userId)
  209. if u == nil {
  210. log.Release(" %d not exist", userId)
  211. return
  212. }
  213. u.dump()
  214. default:
  215. for _, wl := range sm.Whitelist {
  216. log.Release(" Whitelist %d", wl)
  217. }
  218. }
  219. }
  220. func (sm *slotusermgr) isWhitList(userId int) bool {
  221. for _, v := range sm.Whitelist {
  222. if v == userId {
  223. return true
  224. }
  225. }
  226. return false
  227. }