MaiDianLogic.lua 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  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. -- 先汇总
  47. for _, tTypeData in pairs(tMaiDianPlay) do
  48. for nType, v in pairs(tTypeData) do
  49. if not tTotalInfo[nType] then
  50. tTotalInfo[nType] = {}
  51. end
  52. if not tTotalInfo[nType][v] then
  53. tTotalInfo[nType][v] = {
  54. key = v,
  55. nValue = 0
  56. }
  57. end
  58. tTotalInfo[nType][v].nValue = tTotalInfo[nType][v].nValue + 1
  59. end
  60. end
  61. print("[MaiDian_OnTime] 汇总结束")
  62. local tSortData ={}
  63. for nType, tData in pairs(tTotalInfo) do
  64. if not tSortData[nType] then
  65. tSortData[nType] = {}
  66. end
  67. for key, v in pairs(tData) do
  68. table.insert(tSortData[nType], v)
  69. end
  70. table.sort(tSortData[nType], MainDian_Sort)
  71. end
  72. -- 新增区间统计
  73. local tRangeStats = {
  74. [MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON] = {},
  75. [MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN] = {}
  76. }
  77. -- 初始化区间计数器
  78. for _, range in ipairs(RANGES) do
  79. local rangeKey = range[1].."-"..(range[2] == math.huge and "+" or range[2])
  80. tRangeStats[MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON][rangeKey] = 0
  81. tRangeStats[MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN][rangeKey] = 0
  82. end
  83. -- 统计玩家累计值
  84. local tPlayerTotals = {}
  85. for playerId, tData in pairs(tMaiDianPlay) do
  86. tPlayerTotals[playerId] = {
  87. [MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON] = 0,
  88. [MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN] = 0
  89. }
  90. for nType, nValue in pairs(tData) do
  91. if nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON
  92. or nType == MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN then
  93. tPlayerTotals[playerId][nType] = (tPlayerTotals[playerId][nType] or 0) + nValue
  94. end
  95. end
  96. end
  97. print("[MaiDian_OnTime] 统计玩家累计值结束")
  98. -- 计算区间分布
  99. for playerId, totals in pairs(tPlayerTotals) do
  100. for nType, total in pairs(totals) do
  101. for _, range in ipairs(RANGES) do
  102. if total >= range[1] and total <= range[2] then
  103. local rangeKey = range[1].."-"..(range[2] == math.huge and "+" or range[2])
  104. tRangeStats[nType][rangeKey] = tRangeStats[nType][rangeKey] + 1
  105. break
  106. end
  107. end
  108. end
  109. end
  110. print("[MaiDian_OnTime] 计算区间分布结束")
  111. for nType, tData in pairs(tSortData) do
  112. local sztext = " nType = "..nType.." "
  113. for key, v in pairs(tData) do
  114. sztext = sztext.."{"..v.key..","..v.nValue.."},"
  115. end
  116. MaiDian_WriteLog(sztext)
  117. end
  118. for nType, ranges in pairs(tRangeStats) do
  119. local szType = nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON and "高级召唤" or "宝箱开启"
  120. local sztext = "[区间统计] "..szType.." "
  121. for rangeKey, count in pairs(ranges) do
  122. sztext = sztext..rangeKey.."="..count.." "
  123. end
  124. MaiDian_WriteLog(sztext)
  125. end
  126. print("[MaiDian_OnTime] 区间统计结束")
  127. print("[MaiDian_OnTime] 写日志结束 ")
  128. -- 重置
  129. tMaiDianPlay = {}
  130. end
  131. -- 回调
  132. function MaiDian_Begin(human, nType, tData)
  133. if not human or MaiDianDefine.MAIDIAN_TYPE_MIN > nType or MaiDianDefine.MAIDIAN_TYPE_MAX < nType or not tData then
  134. return
  135. end
  136. if "table" ~= type(tData) then
  137. print("[MaiDian_Begin] 不正确的value")
  138. return
  139. end
  140. local nValue = tData.nValue
  141. local nHumanID = human.db._id
  142. if not tMaiDianPlay[nHumanID] then
  143. tMaiDianPlay[nHumanID] = {}
  144. end
  145. local nType = tMaiDianPlay[nHumanID]
  146. if nType == MaiDianDefine.MAIDIAN_TYPE_ADV_SUMMON or nType == MaiDianDefine.MAIDIAN_TYPE_CHEST_OPEN then
  147. tMaiDianPlay[nHumanID][nType] = (tMaiDianPlay[nHumanID][nType] or 0) + nValue
  148. return
  149. end
  150. tMaiDianPlay[nHumanID][nType] = nValue
  151. end
  152. function MaiDianLogic_GM()
  153. MaiDian_OnTime()
  154. end