MaiDianLogic.lua 5.3 KB

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