AbsActBillboardMiddleLogic.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. -- 绝对时间排行榜活动 中心服逻辑
  2. local LuaMongo = _G.lua_mongo
  3. local InnerMsg = require("core.InnerMsg")
  4. local Util = require("common.Util")
  5. local HtmlUtil = require("common.HtmlUtil")
  6. local Lang = require("common.Lang")
  7. local CommonDB = require("common.CommonDB")
  8. local Msg = require("core.Msg")
  9. local ObjHuman = require("core.ObjHuman")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local Grid = require("bag.Grid")
  12. local BagLogic = require("bag.BagLogic")
  13. local ItemDefine = require("bag.ItemDefine")
  14. local MiddleManager = require("middle.MiddleManager")
  15. local AbsActDefine = require("absAct.AbsActDefine")
  16. local AbsActLogic = require("absAct.AbsActLogic")
  17. local Log = require("common.Log")
  18. local AbsActExcel = require("excel.absAct")
  19. local RoleLogic = require("role.RoleLogic")
  20. local DB = require("common.DB")
  21. local Log = require("common.Log")
  22. local MailManager = require("mail.MailManager")
  23. local MiddleLogic = require("middle.MiddleLogic")
  24. local MailExcel = require("excel.mail")
  25. local Lang = require("common.Lang")
  26. local Broadcast = require("broadcast.Broadcast")
  27. local YunYingLogic = require("yunying.YunYingLogic")
  28. db = db or {}
  29. -- 加载排行榜
  30. function loadBoard()
  31. -- 角色
  32. local cnt = 0
  33. LuaMongo.find(DB.db_abs_billboard, fields)
  34. while true do
  35. local data = { }
  36. if not LuaMongo.next(data) then
  37. break
  38. end
  39. cnt = cnt + 1
  40. if cnt % 1000 == 0 then
  41. _G.collectgarbage("step", 100000)
  42. end
  43. -- 充值榜
  44. updateData(data, true)
  45. end
  46. end
  47. -- 启动后初始化
  48. function initAfterStart()
  49. if _G.is_middle ~= true then return end
  50. loadBoard()
  51. end
  52. -- 初始data
  53. function initData()
  54. local data = {}
  55. data.value1 = 0
  56. data.value2 = 0
  57. data.time = 0
  58. data.uuid = nil
  59. return data
  60. end
  61. -- 获取
  62. function getBoard(mainId,actId, nosort)
  63. local board = db[mainId] and db[mainId][actId] or nil
  64. if not board then
  65. initBoard(mainId,actId)
  66. board = db[mainId] and db[mainId][actId] or nil
  67. end
  68. if board and board.dirty and (not nosort) then
  69. board.dirty = nil
  70. updateRank(board)
  71. end
  72. return board
  73. end
  74. -- 初始化
  75. function initBoard(mainId,actId)
  76. db[mainId] = db[mainId] or {}
  77. local board = {}
  78. board.uuid2rank = {} -- 根据UUID获取名次
  79. board.rank2data = {} -- 根据名次获取DATA
  80. board.dirty = nil -- 是否改变过
  81. board.actId = actId -- 类型
  82. board.mainId = mainId -- 类型
  83. db[mainId][actId] = board
  84. end
  85. -- 刷新上榜时间
  86. function refreshTime(data)
  87. data.billboard = data.billboard or {}
  88. data.billboard[data.mainId] = data.billboard[data.mainId] or {}
  89. data.billboard[data.actId] = os.time()
  90. end
  91. -- 获取上榜时间
  92. function getTime(data)
  93. if not data.billboard or not data.billboard[data.mainId] then
  94. return
  95. end
  96. return data.billboard[data.mainId][data.actId]
  97. end
  98. -- 排序
  99. function updateRank(board)
  100. if not board then return end
  101. for uuid in pairs(board.uuid2rank) do
  102. board.uuid2rank[uuid] = nil
  103. end
  104. for rank, data in ipairs(board.rank2data) do
  105. board.uuid2rank[data.uuid] = rank
  106. end
  107. end
  108. -- 获取排名名次
  109. function getRank(mainId,actId, uuid)
  110. local board = getBoard(mainId,actId)
  111. if not board then return end
  112. return board.uuid2rank[uuid]
  113. end
  114. -- 根据名次获取信息
  115. function getRankData(mainId,actId, rank)
  116. local board = getBoard(mainId,actId)
  117. if not board then return end
  118. return board.rank2data[rank]
  119. end
  120. -- 排名值
  121. function getValues(db)
  122. return db.param
  123. end
  124. -- 比较
  125. function cmpValues(data1, data2)
  126. if data1.value1 ~= data2.value1 then
  127. return data1.value1 > data2.value1
  128. end
  129. if data1.value2 ~= data2.value2 then
  130. return data1.value2 > data2.value2
  131. end
  132. if (data1.time or 0) ~=(data2.time or 0) then
  133. return(data1.time or 0) <(data2.time or 0)
  134. end
  135. return true
  136. end
  137. -- 设置值
  138. function setValues(tempData, data, value1, value2)
  139. tempData.uuid = data.uuid
  140. tempData.value1 = value1
  141. tempData.value2 = value2 or 0
  142. tempData.time = getTime(data)
  143. end
  144. --
  145. local TempData = nil
  146. function updateData(data, isInit)
  147. local board = getBoard(data.mainId,data.actId, isInit)
  148. if not board then return end
  149. local value1 = getValues(data)
  150. if not value1 then return end
  151. local dbrank = board.uuid2rank[data.uuid]
  152. local dbdata = dbrank and board.rank2data[dbrank]
  153. if dbdata then
  154. if dbdata.value1 == value1 and dbdata.value2 ==(value2 or 0) then
  155. return
  156. -- 优化,原来值跟新值一样
  157. end
  158. table.remove(board.rank2data, dbrank)
  159. end
  160. if not isInit then
  161. -- 刷新上榜时间
  162. refreshTime(data)
  163. end
  164. local maxRank = #board.rank2data
  165. local rank = maxRank + 1
  166. TempData = TempData or initData()
  167. setValues(TempData, data, value1, value2)
  168. for i = maxRank, 1, -1 do
  169. local tdata = board.rank2data[i]
  170. if cmpValues(tdata, TempData) then
  171. break
  172. end
  173. board.rank2data[i + 1] = tdata
  174. rank = i
  175. end
  176. if rank > AbsActDefine.BILLBOARD_MAX_CNT then return end
  177. local data2 = nil
  178. if maxRank < AbsActDefine.BILLBOARD_MAX_CNT then
  179. data2 = initData()
  180. else
  181. data2 = board.rank2data[AbsActDefine.BILLBOARD_MAX_CNT + 1]
  182. end
  183. setValues(data2, data, value1, value2)
  184. board.rank2data[rank] = data2
  185. board.rank2data[AbsActDefine.BILLBOARD_MAX_CNT + 1] = nil
  186. if rank ~= dbrank then
  187. board.dirty = true
  188. end
  189. return true
  190. end
  191. -----------------------------------------------------------------------
  192. --绝对时间活动 数据库操作 -start
  193. local tempTb = {}
  194. local queryByUuid = { uuid = nil }
  195. local auTb = {}
  196. local billboardData = {}
  197. -- 加入队列
  198. function add(msg)
  199. Util.cleanTable(auTb)
  200. auTb.uuid = msg.roleBase.uuid
  201. auTb.roleBase = {}
  202. RoleLogic.makeRoleBase(msg.roleBase,auTb.roleBase)
  203. auTb.svrIndex = msg.svrIndex
  204. auTb.svrName = msg.svrName
  205. auTb.mainId = msg.mainId
  206. auTb.actId = msg.actId
  207. local data = query(msg.roleBase.uuid)
  208. if data ~= nil then
  209. queryByUuid.uuid = msg.roleBase.uuid
  210. tempTb["$set"] = nil
  211. tempTb["$set"] = auTb
  212. LuaMongo.update(DB.db_abs_billboard, queryByUuid, tempTb)
  213. return auTb
  214. end
  215. LuaMongo.insert(DB.db_abs_billboard, auTb)
  216. return auTb
  217. end
  218. -- 查询队列
  219. function query(uuid, fileds)
  220. queryByUuid.uuid = uuid
  221. local data={}
  222. LuaMongo.find(DB.db_abs_billboard, queryByUuid, fileds)
  223. if not LuaMongo.next(data) then
  224. return nil
  225. end
  226. return data
  227. end
  228. -- 更新
  229. function chargeUpdate(uuid, param,actId,mainId)
  230. queryByUuid.uuid = uuid
  231. local updateTb = {["param"] = param,["actId"] = actId,["mainId"] = mainId}
  232. tempTb["$set"] = nil
  233. tempTb["$set"] = updateTb
  234. LuaMongo.update(DB.db_abs_billboard, queryByUuid, tempTb)
  235. end
  236. --绝对时间活动 数据库操作 -end
  237. ------------------------------------------------------------------------
  238. --绝对时间 排行榜 start
  239. function billboardSet(fd, msg)
  240. -- 加入数据库
  241. local data = add(msg)
  242. -- 更新数据
  243. chargeUpdate(msg.roleBase.uuid, msg.op.param,msg.actId,msg.mainId)
  244. data.param = msg.op.param
  245. updateData(data)
  246. end
  247. function LW_ABS_ACT_BILLBOARD_DB(fd,msg)
  248. local board = getBoard(msg.mainId,msg.actId)
  249. if not board then
  250. return
  251. end
  252. local msgRet = InnerMsg.wl.WL_ABS_ACT_BILLBOARD_DB_RETURN
  253. msgRet.actId = msg.actId
  254. msgRet.mainId = msg.mainId
  255. msgRet.rankDb = Util.copyTable(board)
  256. InnerMsg.sendMsg(fd,msgRet)
  257. end
  258. -- 数据查询
  259. function billboardQuery(fd, msg)
  260. local board = getBoard(msg.mainId,msg.actId)
  261. if board == nil then
  262. return
  263. end
  264. local boardLen = #board.rank2data
  265. boardLen = math.min(boardLen, AbsActDefine.BILLBOARD_MAX_CNT)
  266. local msgRet = InnerMsg.wl.WL_ABS_ACT_BILLBOARD_QUERY
  267. msgRet.uuid = msg.uuid
  268. msgRet.actId = msg.actId
  269. msgRet.mainId = msg.mainId
  270. msgRet.list = {}
  271. local len = 0
  272. for i = 1, boardLen do
  273. local data = board.rank2data[i]
  274. local uuid = data and data.uuid
  275. local db = query(uuid, fields)
  276. len = len + 1
  277. msgRet.list[len] = {}
  278. local net = msgRet.list[len]
  279. net.roleBase = net.roleBase or {}
  280. RoleLogic.makeRoleBase(db.roleBase,net.roleBase)
  281. net.rank = i
  282. net.param = db.param
  283. net.svrName = db.svrName
  284. end
  285. msgRet.list[0] = len
  286. InnerMsg.sendMsg(fd, msgRet)
  287. end
  288. --[[
  289. function billboardReward()
  290. --
  291. for k,v in pairs(db) do
  292. local state, endTime, starTime = AbsActLogic.isStarted(human, k)
  293. local absConfig = AbsActExcel.absActivity[k]
  294. for actId,data in pairs(v) do
  295. -- 如果活动开启状态为未开启,或者排行榜数据活动ID与当前开启活动ID不一致,则认为排行榜中活动已结束,该发放奖励
  296. if actId ~= absConfig.actId or not state then
  297. local config = Util.copyTable(AbsActExcel.billboard)
  298. if not config then return end
  299. local boardLen = #data.rank2data
  300. local configLen = #config
  301. if boardLen > 0 then
  302. boardLen = math.min(boardLen, AbsActDefine.BILLBOARD_MAX_CNT)
  303. for i = 1, boardLen do
  304. local dbData = board.rank2data[i]
  305. local uuid = dbData and dbData.uuid
  306. local pDb = query(uuid, fields)
  307. local dcId = 0
  308. -- 选出所在档次
  309. for i = 1,configLen do
  310. if config[i].actId == actId and config[i].mainId == k then
  311. if pDb.param >= config[i].param and config[i].cnt > 0 then
  312. if dcId == 0 then
  313. dcId = i
  314. else
  315. dcId = dcId > i and i or dcId
  316. end
  317. end
  318. end
  319. end
  320. if dcId ~= 0 then
  321. config[dcId].cnt = config[dcId].cnt - 1
  322. local mailConfig = MailExcel.mail[config[dcId].mailId]
  323. local title = mailConfig.title
  324. local senderName = mailConfig.senderName
  325. local content = Util.format(mailConfig.content, pDb.param, rank)
  326. MiddleLogic.sendWLMail(MailManager.SYSTEM, uuid, title, content, config[dcId].reward, senderName, pDb.svrIndex)
  327. else
  328. Log.write(Log.LOGID_DEBUG, "billboardReward: "..dcId.." uuid: "..uuid.." rank: "..i)
  329. end
  330. end
  331. initBoard(id)
  332. end
  333. -- 清空数据库
  334. LuaMongo.remove(DB.db_abs_billboard,{["mainId"] = k,["actId"] = actId})
  335. end
  336. end
  337. end
  338. end]]
  339. function LW_ABS_ACT_BILLBOARD_DB_CLEAN(fd,msg)
  340. initBoard(msg.mainId,msg.actId)
  341. LuaMongo.remove(DB.db_abs_billboard,{["mainId"] = msg.mainId,["actId"] = msg.actId})
  342. end