util_roll.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. --[[
  2. Descripttion:roll房
  3. version:
  4. Author: Neo,Huang
  5. Date: 2023-11-21 23:01:45
  6. LastEditors: Neo,Huang
  7. LastEditTime: 2023-11-21 23:01:59
  8. --]]
  9. local code = require("code")
  10. local lib_game_redis = require("lib_game_redis")
  11. local redisUtil = require("utils.redisUtil")
  12. local util_player = require("utils.util_player")
  13. local timeUtil = require("utils.timeUtil")
  14. local nodeMgr = require("nodeMgr")
  15. local mysqlUtil = require("utils.mysqlUtil")
  16. local userData = require("data.user")
  17. local payData = require("data.pay")
  18. local ROLL_MAIN_KEY = "roll:room"
  19. local root = {}
  20. local function _get_roll_room_key(rid)
  21. return string.format("%s:%s", ROLL_MAIN_KEY, tostring(rid))
  22. end
  23. -- 打包 - 房间信息
  24. function root:pack_roll_room_info(rid)
  25. if is_empty(rid) then
  26. return
  27. end
  28. local key = _get_roll_room_key(rid)
  29. local isExist = lib_game_redis:exists(key)
  30. if not isExist then
  31. -- 房间已不存在
  32. return
  33. end
  34. local info = {
  35. roomId = rid,
  36. name = redisUtil.hget(key, "name"),
  37. bandShareCode = redisUtil.hget(key, "bandShareCode"),
  38. createTime = redisUtil.hget_int(key, "createTime"),
  39. showStartTime = redisUtil.hget_int(key, "showStartTime"),
  40. signupStartTime = redisUtil.hget_int(key, "signupStartTime"),
  41. signupEndTime = redisUtil.hget_int(key, "signupEndTime"),
  42. awardTime = redisUtil.hget_int(key, "awardTime"),
  43. conditions = redisUtil.hget_json(key, "conditions"),
  44. itemIdList = redisUtil.hget_json(key, "itemIdList"),
  45. settleList = redisUtil.hget_json(key, "settle")
  46. }
  47. -- 玩家信息
  48. local signupUidList = redisUtil.hget_json(key, "signupUidList")
  49. if not is_empty(signupUidList) then
  50. for _, uid in ipairs(signupUidList) do
  51. local playerInfo = util_player:get_base_info(uid)
  52. if not is_empty(playerInfo) then
  53. if info.signupPlayerList == nil then
  54. info.signupPlayerList = {}
  55. end
  56. table.insert(info.signupPlayerList, playerInfo)
  57. end
  58. end
  59. end
  60. -- 结算
  61. return info
  62. end
  63. -- 打包 - 所有活跃房间
  64. function root:pack_roll_room_info_list()
  65. local roomIdList = lib_game_redis:smembers(ROLL_MAIN_KEY)
  66. if is_empty(roomIdList) then
  67. return
  68. end
  69. local roomInfoList = {}
  70. for _, v in ipairs(roomIdList) do
  71. local rid = tonumber(v)
  72. local roomInfo = self:pack_roll_room_info(rid)
  73. if not is_empty(roomInfo) then
  74. table.insert(roomInfoList, roomInfo)
  75. end
  76. end
  77. return roomInfoList
  78. end
  79. -- 打包 - 玩家房间信息
  80. function root:pack_player_roll_room_info_list(uid)
  81. if is_empty(uid) then
  82. return
  83. end
  84. local sql = string.format("SELECT * FROM `mdl_roll` WHERE signupUidList like '%%s%';", tostring(uid))
  85. local ok, ret = mysqlUtil:select(sql)
  86. log.info("pack_player_roll_room_info_list sql[%s] ret[%s]", sql, tostring(ret))
  87. if not ok or is_empty(ret) then
  88. return
  89. end
  90. local roomInfoList = {}
  91. for _, v in ipairs(ret) do
  92. local id = tonumber(v.id)
  93. local info = self:pack_roll_room_info(id)
  94. if is_empty(info) then
  95. info = {
  96. roomId = id,
  97. name = v.name,
  98. bandShareCode = v.bandShareCode,
  99. createTime = tonumber(v.createTime),
  100. showStartTime = tonumber(v.showStartTime),
  101. signupStartTime = tonumber(v.signupStartTime),
  102. signupEndTime = tonumber(v.signupEndTime),
  103. awardTime = tonumber(v.awardTime),
  104. conditions = cjson_decode(v.conditions),
  105. itemIdList = cjson_decode(v.itemIdList),
  106. settleList = cjson_decode(v.settle)
  107. }
  108. -- 玩家信息
  109. local signupUidList = nil
  110. if not is_empty(v.signupUidList) then
  111. signupUidList = cjson_decode(v.signupUidList)
  112. end
  113. if not is_empty(signupUidList) then
  114. for _, uid in ipairs(signupUidList) do
  115. local playerInfo = util_player:get_base_info(uid)
  116. if not is_empty(playerInfo) then
  117. if info.signupPlayerList == nil then
  118. info.signupPlayerList = {}
  119. end
  120. table.insert(info.signupPlayerList, playerInfo)
  121. end
  122. end
  123. end
  124. end
  125. table.insert(roomInfoList, info)
  126. end
  127. return roomInfoList
  128. end
  129. -- 报名
  130. function root:sign_up(uid, roomId)
  131. if is_empty(uid) or is_empty(roomId) then
  132. return code.PARAMTER_ERROR
  133. end
  134. local key = _get_roll_room_key(roomId)
  135. local isExist = lib_game_redis:exists(key)
  136. if not isExist then
  137. -- 房间已不存在
  138. return code.UNKNOWN
  139. end
  140. -- 是否已报名
  141. local signupUidList = redisUtil.hget_json(key, "signupUidList")
  142. if table.include(signupUidList, uid) then
  143. return code.UNKNOWN
  144. end
  145. -- 是否绑定推广码
  146. local bandShareCode = redisUtil.hget(key, "bandShareCode")
  147. if not is_empty(bandShareCode) then
  148. local _bandShareCode = userData:get_key_info(uid, "bandShareCode")
  149. if bandShareCode ~= _bandShareCode then
  150. return code.UNKNOWN
  151. end
  152. end
  153. -- 报名时间
  154. local currTime = timeUtil.now(uid)
  155. local signupStartTime = redisUtil.hget_int(key, "signupStartTime")
  156. if signupStartTime > currTime then
  157. -- 未开始报名
  158. return code.UNKNOWN
  159. end
  160. local signupEndTime = redisUtil.hget_int(key, "signupEndTime")
  161. if currTime > signupEndTime then
  162. -- 报名已结束
  163. return code.UNKNOWN
  164. end
  165. -- 报名条件
  166. local conditions = redisUtil.hget_json(key, "conditions")
  167. if not is_empty(conditions) then
  168. for _, v in ipairs(conditions) do
  169. local playerValue = nil
  170. if v.c == "pay_day_totalAmount" then
  171. -- 今日充值
  172. playerValue = payData:get_day_total_amount(uid)
  173. end
  174. if v.cv > playerValue then
  175. return code.UNKNOWN
  176. end
  177. end
  178. end
  179. -- 报名成功
  180. table.insert(signupUidList, uid)
  181. redisUtil.hset(key, "signupUidList", signupUidList)
  182. -- 广播
  183. local pack = {
  184. roomId = roomId,
  185. playerInfo = util_player:get_base_info(uid)
  186. }
  187. nodeMgr.broadcast_proto_notify("on_roll_player", pack)
  188. return code.OK
  189. end
  190. -- 备份房间信息
  191. function root:backup_roll_room_info(rid)
  192. if is_empty(rid) then
  193. return
  194. end
  195. local key = _get_roll_room_key(rid)
  196. local isExist = lib_game_redis:exists(key)
  197. if not isExist then
  198. -- 房间已不存在
  199. return
  200. end
  201. local rollModule = require("modules.roll").new(rid)
  202. rollModule:backup_to_db()
  203. lib_game_redis:del(key)
  204. end
  205. return root