OpenServerRankDB.lua 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698
  1. local Msg = require("core.Msg")
  2. local Timer = require("core.Timer")
  3. local DB = require("common.DB")
  4. local CommonDB = require("common.CommonDB")
  5. local Log = require("common.Log")
  6. local LuaMongo = _G.lua_mongo
  7. local Util = require("common.Util")
  8. local Grid = require("bag.Grid")
  9. local OpenAct = require("present.OpenAct")
  10. local RoleDBLogic = require("role.RoleDBLogic")
  11. local YunYingLogic = require("yunying.YunYingLogic")
  12. local MailManager = require("mail.MailManager")
  13. local MailExcel = require("excel.mail")
  14. local OpenActExcel = require("excel.openAct")
  15. --[[
  16. 开服活动排行DB操作,封装了一些公共处理方法
  17. db字段只是缓存排名好的数据(只是内存数据)
  18. db = {
  19. [rankType] = { -- 排名类型
  20. rankType = xxx, -- 排名类型
  21. uuid2rank = { -- 根据UUID获取名次
  22. [uuid] = rank, -- 玩家uuid = 排行名次
  23. ...
  24. },
  25. sendUuid2rank = { -- 根据UUID获取发送名次
  26. [uuid] = rank, -- 玩家uuid = 真实发送的排行名次
  27. ...
  28. },
  29. rank2data = { -- 根据名次获取DATA
  30. [rank] = { -- 排行名次 = 玩家排名数据
  31. uuid = xxx, -- 玩家uuid
  32. rankType = xxx, -- 排名类型
  33. value = xxx, -- 排名值
  34. time = xxx, -- 排名值更新时间
  35. _id = xxx, -- db记录中的uuid
  36. },
  37. ...
  38. },
  39. sendRank2data = { -- 根据名次获取发送DATA
  40. [rank] = { -- 排行名次 = 真实发送玩家排名数据
  41. uuid = xxx, -- 玩家uuid
  42. rankType = xxx, -- 排名类型
  43. value = xxx, -- 排名值
  44. time = xxx, -- 排名值更新时间
  45. _id = xxx, -- db记录中的uuid
  46. },
  47. ...
  48. }
  49. },
  50. ...
  51. }
  52. DB:
  53. db_openServer_billboard = { -- 开服排行类活动
  54. [uuid] = {
  55. uuid = xxx, -- 玩家uuid
  56. rankType= xxx, -- 排名类型
  57. value = xxx, -- 排行值
  58. time = xxx, -- 排行值更新时间
  59. }
  60. }
  61. local:
  62. getOpenActConfig() -- 得到指定排名类型的活动配置
  63. getMinRankValue() -- 得到排行榜中最低上榜条件数
  64. getMaxRank() -- 得到活动最多排名名次
  65. getRankNeedValue() -- 得到排行榜中名次对应需要达到的条件数
  66. getRankInfo() -- 得到指定排行榜指定名次的配置信息
  67. getBoard() -- 获取指定排名类型DB数据
  68. getRank() -- 获取指定排名类型、指定用户的排名
  69. getSendRank() -- 获取指定排名类型、指定用户的发送排名
  70. cmpRank() -- 排名算法
  71. updateRank() -- 更新排名
  72. updateData() -- 更新数据
  73. loadBoard() -- 加载排行榜
  74. resertBoard() -- 重置排行数据
  75. initBoard() -- 初始排行榜
  76. getDBData() -- 根据类型+uuid从db中取data
  77. updateDBData() -- 更新DB数据
  78. billboardSet() -- 设置排名数据
  79. getMailID() -- 获取发送奖励的邮件ID
  80. getRewardInfoByInfo() -- 得到指定排行榜指定配置信息的奖励信息
  81. rewardSend() -- 奖励发送
  82. wrapOpenServerRankRewardList -- 包装档位奖励详情数据
  83. public:
  84. initAfterStart() -- 启动就初始化
  85. getMaxSendRank() -- 得到最大发送排行名次数据
  86. wrapOpenServerRankList() -- 包装档位名次数据
  87. wrapOwnerData() -- 包装自己名次数据
  88. rewardQuery() -- 发送奖励详情
  89. onValueAdd() -- 排行值增加回调
  90. onValueSet() -- 排行值设置回调
  91. onRewardSend() -- 奖励发送回调
  92. --]]
  93. RANK_TYPE_DAY_TOPUP = 1 -- 开服充值每日排名类型
  94. RANK_TYPE_TOTAL_TOPUP = 2 -- 开服充值累计排名类型
  95. RANK_TYPE_DAY_DRAW_CARD = 3 -- 开服招募每日排名类型
  96. RANK_TYPE_TOTAL_DRAW_CARD = 4 -- 开服招募累计排名类型
  97. RANK_TYPE_TOTAL_TOWER = 5 -- 开服爬塔累计排名类型
  98. MAX_SEND_RANK = 10 -- 最大发送排名数
  99. db = db or {} -- [rankType] = board
  100. QueryForData = {rankType = 1, uuid = 1} -- 通过排名类型和玩家uuid查找DB数据
  101. QueryByUuid = {_id = 1} -- 通过DB的uuid更新DB数据
  102. QueryByRankType = {rankType = 1} -- 通过排名类型查找DB数据
  103. local function OpenServerRankDB_WriteLog(sztext)
  104. Log.write(Log.LOGID_OSS_COMMON, sztext)
  105. end
  106. local function getOpenActConfig(rankType)
  107. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_TOTAL_TOPUP then
  108. return OpenActExcel.topupRank
  109. end
  110. if rankType == RANK_TYPE_DAY_DRAW_CARD or rankType == RANK_TYPE_TOTAL_DRAW_CARD then
  111. return OpenActExcel.drawCardRank
  112. end
  113. if rankType == RANK_TYPE_TOTAL_TOWER then
  114. return OpenActExcel.towerRank
  115. end
  116. end
  117. local MIN_RANK_VALUES
  118. local function getMinRankValue(rankType)
  119. MIN_RANK_VALUES = MIN_RANK_VALUES or {}
  120. if MIN_RANK_VALUES[rankType] then return MIN_RANK_VALUES[rankType] end
  121. local openActConfig = getOpenActConfig(rankType)
  122. if not openActConfig then return end
  123. local minRankValue
  124. for _,info in ipairs(openActConfig) do
  125. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  126. if not minRankValue or minRankValue > info.dayNeedValue then
  127. minRankValue = info.dayNeedValue
  128. end
  129. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  130. rankType == RANK_TYPE_TOTAL_TOWER then
  131. if not minRankValue or minRankValue > info.totalNeedValue then
  132. minRankValue = info.totalNeedValue
  133. end
  134. end
  135. end
  136. MIN_RANK_VALUES[rankType] = minRankValue
  137. return MIN_RANK_VALUES[rankType]
  138. end
  139. --local MAX_RANKS
  140. local function getMaxRank(rankType)
  141. return 200
  142. --[[
  143. MAX_RANKS = MAX_RANKS or {}
  144. if MAX_RANKS[rankType] then return MAX_RANKS[rankType] end
  145. local openActConfig = getOpenActConfig(rankType)
  146. if not openActConfig then return end
  147. local maxRank
  148. for _,info in ipairs(openActConfig) do
  149. if not maxRank or maxRank <= info.ranks[2] then
  150. maxRank = info.ranks[2]
  151. end
  152. end
  153. MAX_RANKS[rankType] = maxRank
  154. return maxRank
  155. --]]
  156. end
  157. local RANK_NEED_VALUES
  158. local function getRankNeedValue(rankType, rank)
  159. RANK_NEED_VALUES = RANK_NEED_VALUES or {}
  160. local minRankValue = getMinRankValue(rankType)
  161. if RANK_NEED_VALUES[rankType] then
  162. return RANK_NEED_VALUES[rankType][rank] or minRankValue
  163. end
  164. local openActConfig = getOpenActConfig(rankType)
  165. if not openActConfig then return end
  166. RANK_NEED_VALUES[rankType] = {}
  167. for _,info in ipairs(openActConfig) do
  168. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  169. if minRankValue < info.dayNeedValue then
  170. for i = info.ranks[1],info.ranks[2] do
  171. RANK_NEED_VALUES[rankType][i] = info.dayNeedValue
  172. end
  173. else
  174. break
  175. end
  176. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  177. rankType == RANK_TYPE_TOTAL_TOWER then
  178. if minRankValue < info.totalNeedValue then
  179. for i = info.ranks[1],info.ranks[2] do
  180. RANK_NEED_VALUES[rankType][i] = info.totalNeedValue
  181. end
  182. else
  183. break
  184. end
  185. end
  186. end
  187. return RANK_NEED_VALUES[rankType][rank] or minRankValue
  188. end
  189. local function getRankInfo(rankType, rank)
  190. local openActConfig = getOpenActConfig(rankType)
  191. if not openActConfig then return end
  192. local rankInfo
  193. for _,info in ipairs(openActConfig) do
  194. if rank >= info.ranks[1] and rank <= info.ranks[2] then
  195. rankInfo = info
  196. break
  197. end
  198. end
  199. return rankInfo
  200. end
  201. local function getRewardInfoByRank(rankType, rank)
  202. local openActConfig = getOpenActConfig(rankType)
  203. if not openActConfig then return end
  204. local rewardInfo
  205. for _,info in ipairs(openActConfig) do
  206. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  207. if rank >= info.ranks[1] and rank <= info.ranks[2] then
  208. rewardInfo = info.dayRewards
  209. break
  210. end
  211. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  212. rankType == RANK_TYPE_TOTAL_TOWER then
  213. if rank >= info.ranks[1] and rank <= info.ranks[2] then
  214. rewardInfo = info.totalRewards
  215. break
  216. end
  217. end
  218. end
  219. return rewardInfo
  220. end
  221. local function getBoard(rankType)
  222. return db[rankType]
  223. end
  224. local function getRank(rankType, uuid)
  225. local board = getBoard(rankType)
  226. if not board then return end
  227. return board.uuid2rank[uuid]
  228. end
  229. local function getSendRank(rankType, uuid)
  230. local board = getBoard(rankType)
  231. if not board then return end
  232. return board.sendUuid2rank[uuid]
  233. end
  234. local function cmpRank(rankType, data1, data2)
  235. if data1.value ~= data2.value then
  236. return data1.value > data2.value
  237. end
  238. return data1.time < data2.time
  239. end
  240. local function updateRank(board)
  241. if not board then return end
  242. -- 清空普通排名和发送排名玩家数据
  243. for uuid in pairs(board.uuid2rank) do
  244. board.uuid2rank[uuid] = nil
  245. board.sendUuid2rank[uuid] = nil
  246. end
  247. -- 设置普通排名
  248. for rank, data in ipairs(board.rank2data) do
  249. board.uuid2rank[data.uuid] = rank
  250. end
  251. -- 清空发送排名
  252. for rank in ipairs(board.sendRank2data) do
  253. board.sendRank2data[rank] = nil
  254. end
  255. local minRankValue = getMinRankValue(board.rankType) -- 排名最小需要的排名值
  256. local aleadyRankCnt = 0 -- 已经排好的玩家数
  257. local maxRank = getMaxRank(board.rankType) -- 最多排名玩家数量
  258. for rank = 1, maxRank do
  259. local rankNeedValue = getRankNeedValue(board.rankType, rank) -- 取当前排名需要的排名值
  260. local rank2data = board.rank2data[aleadyRankCnt + 1] -- 当前排的玩家
  261. if rank2data then -- 还有玩家需要排
  262. if rank2data.value >= rankNeedValue then -- 达到排名值,可以排名
  263. board.sendUuid2rank[rank2data.uuid] = rank -- 设置玩家发送排名
  264. board.sendRank2data[rank] = rank2data -- 设置发送排名数据
  265. aleadyRankCnt = aleadyRankCnt + 1 -- 排名玩家数量+1
  266. elseif rankNeedValue <= minRankValue then -- 未达到排名值 且 当前排名值 小于等于 最小需要的排名值了,则后面的玩家都不需要排了
  267. break
  268. else -- 未到达最低排名值,当前名次未有玩家达到
  269. board.sendRank2data[rank] = -1
  270. end
  271. else -- 没玩家排了直接停止
  272. break
  273. end
  274. end
  275. end
  276. local function updateData(rankType, data)
  277. local board = getBoard(rankType)
  278. if not board then return end
  279. local uuid = data.uuid
  280. local oldRank = getRank(rankType, uuid) or (#board.rank2data + 1)
  281. board.rank2data[oldRank] = data
  282. -- 向后比较(data.value 减少时),往排名低方向->
  283. for i = oldRank + 1, #board.rank2data do
  284. local data1 = board.rank2data[i - 1]
  285. local data2 = board.rank2data[i]
  286. if cmpRank(rankType, data1, data2) then
  287. break
  288. end
  289. board.rank2data[i - 1] = data2
  290. board.rank2data[i] = data1
  291. end
  292. -- 向前比较(data.value 增加时),往排名高方向<-
  293. for i = oldRank - 1, 1, -1 do
  294. local data1 = board.rank2data[i]
  295. local data2 = board.rank2data[i + 1]
  296. if cmpRank(rankType, data1, data2) then
  297. break
  298. end
  299. board.rank2data[i] = data2
  300. board.rank2data[i + 1] = data1
  301. end
  302. local maxRank = getMaxRank(rankType)
  303. board.rank2data[maxRank + 1] = nil
  304. return true
  305. end
  306. local function loadBoard()
  307. local cnt = 0
  308. LuaMongo.find(DB.db_openServer_billboard, nil)
  309. while true do
  310. local data = {}
  311. if not LuaMongo.next(data) then
  312. break
  313. end
  314. cnt = cnt + 1
  315. if cnt % 1000 == 0 then
  316. _G.collectgarbage("step", 100000)
  317. end
  318. updateData(data.rankType, data)
  319. end
  320. for _, board in pairs(db) do
  321. updateRank(board)
  322. end
  323. end
  324. local function resertBoard(board)
  325. board.uuid2rank = {} -- 根据UUID获取名次
  326. board.sendUuid2rank = {} -- 根据UUID获取发送名次
  327. board.rank2data = {} -- 根据名次获取DATA
  328. board.sendRank2data = {} -- 根据名次获取发送DATA
  329. end
  330. local function initBoard(rankType)
  331. local board = {}
  332. resertBoard(board)
  333. board.rankType = rankType
  334. db[rankType] = board
  335. end
  336. local function getDBData(rankType, uuid)
  337. QueryForData.rankType = rankType
  338. QueryForData.uuid = uuid
  339. local data = {}
  340. LuaMongo.find(DB.db_openServer_billboard, QueryForData)
  341. return LuaMongo.next(data) and data
  342. end
  343. local function updateDBData(data)
  344. local oldData = getDBData(data.rankType, data.uuid)
  345. if oldData then
  346. QueryByUuid._id = oldData._id
  347. LuaMongo.update(DB.db_openServer_billboard, QueryByUuid, data)
  348. else
  349. LuaMongo.insert(DB.db_openServer_billboard, data)
  350. end
  351. end
  352. local function billboardSet(data)
  353. local board = getBoard(data.rankType)
  354. if not board then return end
  355. updateData(data.rankType, data)
  356. updateRank(board)
  357. updateDBData(data)
  358. end
  359. local function getMailID(rankType, rankInfo)
  360. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  361. return rankInfo.dayMailID
  362. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  363. rankType == RANK_TYPE_TOTAL_TOWER then
  364. return rankInfo.totalMailID
  365. end
  366. end
  367. local function getRewardInfoByInfo(rankType, rankInfo)
  368. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  369. return rankInfo.dayRewards
  370. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  371. rankType == RANK_TYPE_TOTAL_TOWER then
  372. return rankInfo.totalRewards
  373. end
  374. end
  375. MAIL_SEND_CACHE = MAIL_SEND_CACHE or nil
  376. local function rewardSend(rankType)
  377. local board = getBoard(rankType)
  378. if not board then return end
  379. MAIL_SEND_CACHE = MAIL_SEND_CACHE or {}
  380. MAIL_SEND_CACHE[rankType] = {}
  381. local mailID
  382. for rank, rankData in ipairs(board.sendRank2data) do
  383. if rankData and rankData ~= -1 then
  384. local rankInfo = getRankInfo(rankType, rank)
  385. if rankInfo then
  386. MAIL_SEND_CACHE[rankType][rank] = rankData.uuid
  387. mailID = getMailID(rankType, rankInfo)
  388. --[[
  389. local mailID = getMailID(rankType, rankInfo)
  390. local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
  391. local mailConfig = MailExcel.mail[mailID]
  392. local title = mailConfig.title
  393. local senderName = mailConfig.senderName
  394. local content = mailConfig.content
  395. MailManager.add(MailManager.SYSTEM, rankData.uuid,
  396. title, Util.format(content, rank), rewardInfo, senderName) --]]
  397. end
  398. end
  399. end
  400. Timer.addLater(10, boardReward, mailID, rankType)
  401. -- 把内存中的数据重置,并移除DB中数据
  402. resertBoard(board)
  403. QueryByRankType.rankType = rankType
  404. LuaMongo.remove(DB.db_openServer_billboard, QueryByRankType)
  405. end
  406. local function wrapOpenServerRankRewardList(rankType, net, info)
  407. net.minRank = info.ranks[1]
  408. net.maxRank = info.ranks[2]
  409. local rewardInfo
  410. if rankType == RANK_TYPE_DAY_TOPUP or rankType == RANK_TYPE_DAY_DRAW_CARD then
  411. net.rankNeedValue = info.dayNeedValue
  412. rewardInfo = info.dayRewards
  413. elseif rankType == RANK_TYPE_TOTAL_TOPUP or rankType == RANK_TYPE_TOTAL_DRAW_CARD or
  414. rankType == RANK_TYPE_TOTAL_TOWER then
  415. net.rankNeedValue = info.totalNeedValue
  416. rewardInfo = info.totalRewards
  417. end
  418. local len = 0
  419. for index,itemInfo in ipairs(rewardInfo) do
  420. len = len + 1
  421. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  422. end
  423. net.items[0] = len
  424. end
  425. function initAfterStart()
  426. if _G.is_middle == true then return end
  427. initBoard(RANK_TYPE_DAY_TOPUP)
  428. initBoard(RANK_TYPE_TOTAL_TOPUP)
  429. initBoard(RANK_TYPE_DAY_DRAW_CARD)
  430. initBoard(RANK_TYPE_TOTAL_DRAW_CARD)
  431. initBoard(RANK_TYPE_TOTAL_TOWER)
  432. loadBoard()
  433. end
  434. function getMaxSendRank(rankType)
  435. return MAX_SEND_RANK
  436. end
  437. function wrapOpenServerRankList(rankType, net, rank)
  438. local board = getBoard(rankType)
  439. local sendRankData = board.sendRank2data[rank]
  440. net.rank = rank
  441. net.rankNeedValue = getRankNeedValue(rankType, rank)
  442. if sendRankData and sendRankData ~= -1 then
  443. local userDB = RoleDBLogic.getDb(sendRankData.uuid)
  444. net.uid = sendRankData.uuid
  445. net.name = userDB.name
  446. net.head = userDB.head
  447. net.rankValue = sendRankData.value
  448. net.headFrame = userDB.headFrame
  449. else
  450. net.uid = "-1"
  451. net.name = ""
  452. net.head = -1
  453. net.rankValue = 0
  454. net.headFrame = -1
  455. end
  456. local rewardInfo = getRewardInfoByRank(rankType, rank)
  457. local len = 0
  458. if rewardInfo then
  459. for index,itemInfo in ipairs(rewardInfo) do
  460. len = len + 1
  461. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  462. end
  463. end
  464. net.items[0] = len
  465. end
  466. function wrapOwnerData(rankType, net, uuid)
  467. local maxRank = getMaxRank(rankType)
  468. local sendRank = getSendRank(rankType, uuid)
  469. local board = getBoard(rankType)
  470. local rankData
  471. if sendRank then
  472. rankData = board.sendRank2data[sendRank]
  473. else
  474. local rank = getRank(rankType, uuid)
  475. rankData = rank and board.rank2data[rank]
  476. end
  477. net.rank = sendRank or -1
  478. net.rankValue = rankData and rankData.value or 0
  479. local len = 0
  480. if sendRank then
  481. local rewardInfo = getRewardInfoByRank(rankType, sendRank)
  482. for index,itemInfo in ipairs(rewardInfo) do
  483. len = len + 1
  484. Grid.makeItem(net.items[index], itemInfo[1], itemInfo[2])
  485. end
  486. end
  487. net.items[0] = len
  488. end
  489. function rewardQuery(human, rankType)
  490. local openActConfig = getOpenActConfig(rankType)
  491. local msgRet = Msg.gc.GC_OPEN_SERVER_RANK_REWARD_QUERY
  492. msgRet.type = rankType
  493. local len = 0
  494. for _,info in ipairs(openActConfig) do
  495. len = len + 1
  496. wrapOpenServerRankRewardList(rankType, msgRet.list[len], info)
  497. end
  498. msgRet.list[0] = len
  499. Msg.send(msgRet, human.fd)
  500. end
  501. function onValueAdd(human, rankType, value)
  502. local dbData = getDBData(rankType, human.db._id) or {}
  503. local tValue = (dbData.value or 0) + value
  504. onValueSet(human, rankType, tValue)
  505. end
  506. function onValueSet(human, rankType, tValue)
  507. local dbData = getDBData(rankType, human.db._id) or {}
  508. dbData.value = tValue
  509. dbData.time = os.time()
  510. dbData.rankType = rankType
  511. dbData.uuid = human.db._id
  512. local szText = "[OpenServerRankDB_onValueSet] 设置玩家排行榜数据 uuid = "..dbData.uuid.." name = "..human.db.name.." rankType ="..rankType.." Value = "..tValue
  513. OpenServerRankDB_WriteLog(szText)
  514. billboardSet(dbData)
  515. end
  516. function onRewardSend(funcID)
  517. local funcConfig = YunYingLogic.getFuncConfig(funcID)
  518. if not funcConfig then return end
  519. local config = OpenActExcel.openAct[funcConfig.param]
  520. if not config then return end
  521. local openDay = CommonDB.getServerOpenDay()
  522. if not openDay then return end
  523. if openDay > (config.eDay + 1) then return end
  524. if funcConfig.param == OpenAct.OPEN_ACT_TOPUP_RANK then
  525. rewardSend(RANK_TYPE_DAY_TOPUP)
  526. if openDay == (config.eDay + 1) then
  527. rewardSend(RANK_TYPE_TOTAL_TOPUP)
  528. end
  529. elseif funcConfig.param == OpenAct.OPEN_ACT_DRAW_CARD_RANK then
  530. rewardSend(RANK_TYPE_DAY_DRAW_CARD)
  531. if openDay == (config.eDay + 1) then
  532. rewardSend(RANK_TYPE_TOTAL_DRAW_CARD)
  533. end
  534. elseif funcConfig.param == OpenAct.OPEN_ACT_TOWER_RANK then
  535. if openDay == (config.eDay + 1) then
  536. rewardSend(RANK_TYPE_TOTAL_TOWER)
  537. end
  538. end
  539. end
  540. -- 定时器 邮件分开发,预防崩溃
  541. function boardReward(mailID, rankType)
  542. if mailID and MAIL_SEND_CACHE and MAIL_SEND_CACHE[rankType] then
  543. local mailConfig = MailExcel.mail[mailID]
  544. local title = mailConfig.title
  545. local senderName = mailConfig.senderName
  546. local content = mailConfig.content
  547. local mailSends = MAIL_SEND_CACHE[rankType]
  548. for rank,uuid in pairs(mailSends) do
  549. local rankInfo = getRankInfo(rankType, rank)
  550. local szText = "[OpenServerRankDB_boardReward] rankType = "..rankType.." rank = "..rank.." uuid = "..uuid
  551. if rankInfo then
  552. local rewardInfo = getRewardInfoByInfo(rankType, rankInfo)
  553. if rewardInfo then
  554. MailManager.add(MailManager.SYSTEM, uuid,
  555. title, Util.format(content, rank), rewardInfo, senderName)
  556. szText = szText.." 正常发送奖励"
  557. else
  558. szText = szText.." 获取不到玩家对应位置奖励配置数据!"
  559. end
  560. else
  561. szText = szText.." 获取不到玩家的相关排行榜数据!!"
  562. end
  563. OpenServerRankDB_WriteLog(szText)
  564. end
  565. MAIL_SEND_CACHE[rankType] = nil
  566. end
  567. --[[
  568. -- 发完奖励后,把内存中的数据重置,并移除DB中数据
  569. local board = getBoard(rankType)
  570. if board then
  571. resertBoard(board)
  572. QueryByRankType.rankType = rankType
  573. LuaMongo.remove(DB.db_openServer_billboard, QueryByRankType)
  574. end--]]
  575. end
  576. --[[
  577. function gmSendReward()
  578. print("OpenServerRankDB gmSendReward start")
  579. local rankType = RANK_TYPE_DAY_TOPUP
  580. local board = getBoard(rankType)
  581. if not board then return end
  582. MAIL_SEND_CACHE = MAIL_SEND_CACHE or {}
  583. MAIL_SEND_CACHE[rankType] = {}
  584. local mailID
  585. for rank, rankData in ipairs(board.sendRank2data) do
  586. if rankData and rankData ~= -1 then
  587. local rankInfo = getRankInfo(rankType, rank)
  588. if rankInfo then
  589. MAIL_SEND_CACHE[rankType][rank] = rankData.uuid
  590. mailID = getMailID(rankType, rankInfo)
  591. end
  592. end
  593. end
  594. Timer.addLater(10, boardReward, mailID, rankType)
  595. -- 日志
  596. Log.write(Log.LOGID_DEBUG, "OpenServerRank", rankType)
  597. print("OpenServerRankDB gmSendReward end")
  598. end--]]