MaiDianLogic.lua 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. --------------------------------
  2. -- 文件名 : MaiDianLogic.lua
  3. -- 文件说明 : 埋点处理
  4. -- 创建时间 : 2024/12/03
  5. -- 创建人 : FC
  6. --------------------------------
  7. local MaiDianDefine = require("MaiDian.MaiDianDefine")
  8. local Util = require("common.Util")
  9. local Log = require("common.Log")
  10. local Timer = require("core.Timer")
  11. -- 埋点玩家信息
  12. tMaiDianPlay =
  13. {
  14. --[[
  15. [human.db._id] =
  16. {
  17. [类型] = value -- 当前类型所在的值
  18. }
  19. ]]
  20. }
  21. -- 埋点区间
  22. local RANGES = {
  23. {1,10}, -- 1-10次
  24. {11,30}, -- 11-30次
  25. {31,50}, -- 31-50次
  26. {51,100}, -- 51-100次
  27. {101,200}, -- 101-200次
  28. {201,500}, -- 201-500次
  29. {501, math.huge} -- 500+次 (math.huge表示无限大)
  30. }
  31. -- 写日志
  32. local function MaiDian_WriteLog(sztext)
  33. Log.write(Log.LOGID_OSS_MAIDIAN, sztext)
  34. end
  35. -- 排序
  36. local function MainDian_Sort(l, r)
  37. return l.key < r.key
  38. end
  39. -- 写日志
  40. function MaiDian_DoWrite()
  41. print("[MaiDian_DoWrite] 写日志开始")
  42. if not tMaiDianPlay or not _G.next(tMaiDianPlay) then
  43. print("[MaiDian_DoWrite] 无数据直接返回")
  44. return
  45. end
  46. local tTotalInfo = {}
  47. -- table.print_lua_table(tMaiDianPlay)
  48. -- 先汇总
  49. for _, tTypeData in pairs(tMaiDianPlay) do
  50. for nType, v in pairs(tTypeData) do
  51. if not tTotalInfo[nType] then
  52. tTotalInfo[nType] = {}
  53. end
  54. if not tTotalInfo[nType][v] then
  55. tTotalInfo[nType][v] = {
  56. key = v,
  57. nValue = 0
  58. }
  59. end
  60. tTotalInfo[nType][v].nValue = tTotalInfo[nType][v].nValue + 1
  61. end
  62. end
  63. print("[MaiDian_DoWrite] 汇总结束")
  64. table.print_lua_table(tTotalInfo)
  65. local tSortData ={}
  66. for nType, tData in pairs(tTotalInfo) do
  67. if not tSortData[nType] then
  68. tSortData[nType] = {}
  69. end
  70. for key, v in pairs(tData) do
  71. table.insert(tSortData[nType], v)
  72. end
  73. table.sort(tSortData[nType], MainDian_Sort)
  74. end
  75. table.print_lua_table(tSortData)
  76. -- 新增区间统计
  77. local tRangeStats = {
  78. [MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON] = {},
  79. [MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN] = {}
  80. }
  81. -- 初始化区间计数器
  82. for _, range in ipairs(RANGES) do
  83. local rangeKey = range[1].."-"..(range[2] == math.huge and "+" or range[2])
  84. tRangeStats[MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON][rangeKey] = 0
  85. tRangeStats[MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN][rangeKey] = 0
  86. end
  87. -- 统计玩家累计值
  88. local tPlayerTotals = {}
  89. for playerId, tData in pairs(tMaiDianPlay) do
  90. tPlayerTotals[playerId] = {
  91. [MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON] = 0,
  92. [MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN] = 0
  93. }
  94. for nType, nValue in pairs(tData) do
  95. if nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON
  96. or nType == MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN then
  97. tPlayerTotals[playerId][nType] = (tPlayerTotals[playerId][nType] or 0) + nValue
  98. end
  99. end
  100. end
  101. print("[MaiDian_DoWrite] 统计玩家累计值结束")
  102. -- 计算区间分布
  103. for playerId, totals in pairs(tPlayerTotals) do
  104. for nType, total in pairs(totals) do
  105. for _, range in ipairs(RANGES) do
  106. if total >= range[1] and total <= range[2] then
  107. local rangeKey = range[1].."-"..(range[2] == math.huge and "+" or range[2])
  108. tRangeStats[nType][rangeKey] = tRangeStats[nType][rangeKey] + 1
  109. break
  110. end
  111. end
  112. end
  113. end
  114. print("[MaiDian_DoWrite] 计算区间分布结束")
  115. table.print_lua_table(tSortData)
  116. for nType, tData in pairs(tSortData) do
  117. local sztext = " nType = "..nType.." "
  118. for key, v in pairs(tData) do
  119. sztext = sztext.."{"..v.key..","..v.nValue.."},"
  120. end
  121. MaiDian_WriteLog(sztext)
  122. end
  123. for nType, ranges in pairs(tRangeStats) do
  124. local szType = nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON and "高级召唤" or "宝箱开启"
  125. local sztext = "[区间统计] "..szType.." "
  126. for rangeKey, count in pairs(ranges) do
  127. sztext = sztext..rangeKey.."="..count.." "
  128. end
  129. MaiDian_WriteLog(sztext)
  130. end
  131. print("[MaiDian_DoWrite] 区间统计结束")
  132. print("[MaiDian_DoWrite] 写日志结束 ")
  133. -- 重置
  134. tMaiDianPlay = {}
  135. end
  136. -- 定时写日志
  137. function MaiDian_OnTime()
  138. Timer.addLater(10*60, MaiDian_DoWrite)
  139. end
  140. -- 回调
  141. function MaiDian_Begin(human, nType, tData)
  142. table.print_lua_table(tData)
  143. if not human or MaiDianDefine.MAIDIAN_TYPE_MIN > nType or MaiDianDefine.MAIDIAN_TYPE_MAX < nType or not tData then
  144. return
  145. end
  146. if "table" ~= type(tData) then
  147. print("[MaiDian_Begin] 不正确的value")
  148. return
  149. end
  150. local nValue = tData.nValue
  151. local nHumanID = human.db._id
  152. if not tMaiDianPlay[nHumanID] then
  153. tMaiDianPlay[nHumanID] = {}
  154. end
  155. if nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON or nType == MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN then
  156. tMaiDianPlay[nHumanID][nType] = (tMaiDianPlay[nHumanID][nType] or 0) + nValue
  157. return
  158. end
  159. tMaiDianPlay[nHumanID][nType] = nValue
  160. end
  161. function MaiDianLogic_GM()
  162. MaiDian_OnTime()
  163. end