local DebugProxy = requireProxy( "DebugProxy" )
local DataRePortProxy = class( "DataRePortProxy", DebugProxy )
DataRePortProxy.NAME = global.ProxyTable.DataRePortProxy
local cjson = require("cjson")
local simpleEncryKey = {50,30,20,43}
local stringToByteSimpleDecry = function(byteStr)
local bytes = cjson.decode(byteStr)
local newBytes = {}
local i = 1
local str = ""
for k,v in ipairs(bytes) do
newBytes[k] = v-simpleEncryKey[i]
if i > #simpleEncryKey then
i = 1
end
end
local str = string.char(unpack(newBytes))
return str
end
-- 获取系统版本
local function getWindownVersion()
if getWindowsVersion then
local windowVersion = getWindowsVersion()
local versions = string.split(windowVersion,"_")
local majorVer = tonumber(versions[1])
local minorVer = tonumber(versions[2])
local buildNum = tonumber(versions[3])
if majorVer >= 10 then
if buildNum >= 22000 then
return "Win11"
end
return "Win10"
elseif majorVer >= 6 then
if minorVer >= 3 then
return "Win8.1"
elseif minorVer >= 2 then
return "Win8"
elseif minorVer >= 1 then
return "Win7"
end
elseif majorVer >= 5 then
return "WinXP"
end
end
return "windows"
end
function DataRePortProxy:ctor()
DataRePortProxy.super.ctor(self)
self._infoData = nil
self._login_game_time = -1
self._game_duration_schedule_id = -1
self._task_check = {}
self:InitData()
end
-- 初始化数据
function DataRePortProxy:InitData()
local isMac = global.L_GameEnvManager:GetEnvDataByKey("platform") == "mac"
if not (SL:GetMetaValue("WINPLAYMODE") or isMac) then
return
end
local LuaBridgeCtl = LuaBridgeCtl:Inst()
if not LuaBridgeCtl or LuaBridgeCtl:GetModulesSwitch( global.MMO.Modules_Index_Protobuf_Pbc ) ~= 1 then
return
end
-- 读取launch位置的userdata数据
UserData:Cleanup()
UserData:setVersionPath("")
local userData = UserData:new("data_report")
local deviceID = userData:getStringForKey( "id" )
-- 统一文件夹//localUserData
self:InitUserData()
if not isMac then
if not deviceID or deviceID == "" then
return
end
deviceID = stringToByteSimpleDecry(deviceID)
end
local appid = global.L_GameEnvManager:GetEnvDataByKey("sdkAppid")
if not appid then
return
end
local secretKey = global.L_GameEnvManager:GetEnvDataByKey("sdkAppkey")
if not secretKey then
return
end
local channelid = global.L_GameEnvManager:GetEnvDataByKey("sdkChannel")
if not channelid then
return
end
local boxID = nil
if global.L_GameEnvManager:GetEnvDataByKey("isBoxLogin") == 1 then
local boxBoxGameID = global.L_ModuleManager:GetCurrentModule():GetOperID() or ""
local boxChannelID = global.L_GameEnvManager:GetChannelID() or ""
boxID = boxBoxGameID .. ":" .. boxChannelID
end
local type = isMac and "mac" or "pc"
local macID = isMac and (global.L_GameEnvManager:GetEnvDataByKey("macAddress") or "") or (deviceID)
local width = isMac and (global.L_GameEnvManager:GetEnvDataByKey("displayWidth") or 1136) or (getWindowWidth and getWindowWidth() or 1136)
local height = isMac and (global.L_GameEnvManager:GetEnvDataByKey("displayHeight") or 1136) or (getWindowHeight and getWindowHeight() or 640)
local model = isMac and (global.L_GameEnvManager:GetEnvDataByKey("model") or "") or "pc"
local osVersion = isMac and (global.L_GameEnvManager:GetEnvDataByKey("osVersion") or "") or (getWindownVersion() or "")
self._infoData = {
["device"] = {
type = type,
id = macID,
width = width,
height = height,
model = model,
os = osVersion
},
appid = appid,
boxid = boxID,
channel = channelid or "",
sdk_ver = "1.0.0",
app_ver = isMac and (global.L_GameEnvManager:GetEnvDataByKey("app_ver") or "") or (global.L_GameEnvManager:GetAPKVersionName() or ""),
net_type = "UNKNOWN",
}
end
function DataRePortProxy:GetDeviceInfo()
return self._infoData or {}
end
--统一文件夹//localUserData
function DataRePortProxy:InitUserData()
local module = global.L_ModuleManager:GetCurrentModule()
local modulePath = module.GetSubModPath and module:GetSubModPath() or module:GetStabPath()
local moduleGameEnv = module:GetGameEnv()
local storagePath = string.format("%s%s", modulePath,global.MMO.LOCAL_USERDATA)
local WritablePath = cc.FileUtils:getInstance():getWritablePath()
-- 文件夹创建
local modulePathDir = WritablePath..modulePath
if not global.FileUtilCtl:isDirectoryExist(modulePathDir) then
global.FileUtilCtl:createDirectory(modulePathDir)
end
if not global.FileUtilCtl:isDirectoryExist(WritablePath..storagePath) then
global.FileUtilCtl:createDirectory(WritablePath..storagePath)
end
UserData:Cleanup()
UserData:setVersionPath(storagePath)
end
function DataRePortProxy:CheckValid()
if not self._infoData then
return false
end
local isMac = global.L_GameEnvManager:GetEnvDataByKey("platform") == "mac"
if not (SL:GetMetaValue("WINPLAYMODE") or isMac) then
return false
end
return true
end
-- 用户登录
function DataRePortProxy:UserLogin()
if not self:CheckValid() then
return
end
local dataParam = {
event={time=os.time(),name = "user_login",type = "track"}
}
table.merge(dataParam, self._infoData)
return string.urlencode(cjson.encode(dataParam))
end
-- 用户注册
function DataRePortProxy:UserRegister()
if not self:CheckValid() then
return
end
local dataParam = {
event={time=os.time(),name = "user_register",type = "track"}
}
table.merge(dataParam, self._infoData)
return string.urlencode(cjson.encode(dataParam))
end
-- 创建订单(预支付)
function DataRePortProxy:PrePay()
if not self:CheckValid() then
return
end
local dataParam = {
event={time=os.time(),name = "prepay",type = "track"},
channel_report = global.L_GameEnvManager:GetEnvDataByKey("channelReportKey")
}
table.merge(dataParam, self._infoData)
return string.urlencode(cjson.encode(dataParam))
end
-- 进入游戏 (直接上报ali)
function DataRePortProxy:GameLogin(data)
if not self:CheckValid() then
return
end
if not global.L_DataRePort then
return
end
local LoginProxy = global.Facade:retrieveProxy(global.ProxyTable.Login)
local serviceVer = " " .. LoginProxy:GetServiceVer()
self._login_game_time = os.time()
local dataParam = {
event={time=os.time(),name = "game_login",type = "track"},
user={id=tostring( data.userId )},
properities={
servid=tostring(data.zoneId),
server_name=tostring(data.zoneName),
role_id=tostring(data.roleId),
role_name=data.roleName,
role_level=data.roleLevel,
job_id=tostring(data.roleJobId),
job_name=tostring(data.roleJobName),
server_version = string.gsub(serviceVer, "^%S*(.-).%d$", "%1"),
}
}
local selSerInfo = LoginProxy:GetSelectedServer()
local main_servid = selSerInfo and selSerInfo.mainServerId
local main_server_name = selSerInfo and selSerInfo.mainServerName
dataParam.properities.main_servid = main_servid and tostring(main_servid) or dataParam.properities.servid
dataParam.properities.main_server_name = main_server_name and tostring(main_server_name) or dataParam.properities.server_name
global.L_DataRePort:SendRePortData(dataParam)
self._game_duration_schedule_id = Schedule(function()
self:PlayGame({isScheduleFunc=true})
if self._login_game_time > 0 then
self._login_game_time = os.time()
end
end,5 * 60)
end
--游戏时长 (直接上报ali)
function DataRePortProxy:PlayGame(data)
if not self:CheckValid() then
return
end
if not global.L_DataRePort then
return
end
if self._login_game_time < 0 then
return
end
local AuthProxy = global.Facade:retrieveProxy(global.ProxyTable.AuthProxy)
local loginProxy = global.Facade:retrieveProxy( global.ProxyTable.Login )
local PlayerProperty = global.Facade:retrieveProxy( global.ProxyTable.PlayerProperty )
local AutoProxy = global.Facade:retrieveProxy( global.ProxyTable.Auto )
local MapProxy = global.Facade:retrieveProxy( global.ProxyTable.Map )
local diffTimes = os.time() - self._login_game_time
local isAfk = 0
local mapId = MapProxy and MapProxy:GetMapID() or ""
if AutoProxy and AutoProxy:IsAFKState() then
isAfk = 1
end
if not data or not data.isScheduleFunc then
UnSchedule(self._game_duration_schedule_id)
self._login_game_time = -1
end
local jobID = PlayerProperty:GetRoleJob()
local PShowAttType = GUIFunction:PShowAttType()
local JOB_ATT_TYPE = {
[0] = PShowAttType.Max_ATK,
[1] = PShowAttType.Max_MAT,
[2] = PShowAttType.Max_Daoshu,
}
local dataParam = {
event={time=os.time(),name = "game_duration",type = "track"},
user={id=tostring( AuthProxy:GetUID() )},
properities={
servid=tostring(loginProxy:GetSelectedServerId()),
server_name=tostring(loginProxy:GetSelectedServerName()),
role_id=tostring(PlayerProperty:GetRoleUID()),
role_name=PlayerProperty:GetName(),
role_level=PlayerProperty:GetRoleLevel(),
times=diffTimes,
duration=diffTimes,
job_id=tostring(PlayerProperty:GetRoleJob()),
job_name=tostring(PlayerProperty:GetRoleJobName()),
role_att=PlayerProperty:GetRoleAttByAttType( JOB_ATT_TYPE[jobID] or PShowAttType.Max_ATK) or 0,
is_afk = isAfk,
map_id = mapId,
}
}
local selSerInfo = loginProxy:GetSelectedServer()
local main_servid = selSerInfo and selSerInfo.mainServerId
local main_server_name = selSerInfo and selSerInfo.mainServerName
dataParam.properities.main_servid = main_servid and tostring(main_servid) or dataParam.properities.servid
dataParam.properities.main_server_name = main_server_name and tostring(main_server_name) or dataParam.properities.server_name
global.L_DataRePort:SendRePortData(dataParam)
end
-- 创建角色 (直接上报ali)
function DataRePortProxy:CreateRole(data)
if not self:CheckValid() then
return
end
if not global.L_DataRePort then
return
end
local dataParam = {
event={time=os.time(),name = "create_role",type = "track"},
user={id=tostring( data.userId )},
properities={
servid=tostring(data.zoneId),
server_name=tostring(data.zoneName),
role_id=tostring(data.roleId),
role_name=data.roleName,
role_level=data.roleLevel,
job_id=tostring(data.roleJobId),
job_name=tostring(data.roleJobName)
}
}
local LoginProxy = global.Facade:retrieveProxy( global.ProxyTable.Login )
local selSerInfo = LoginProxy:GetSelectedServer()
local main_servid = selSerInfo and selSerInfo.mainServerId
local main_server_name = selSerInfo and selSerInfo.mainServerName
dataParam.properities.main_servid = main_servid and tostring(main_servid) or dataParam.properities.servid
dataParam.properities.main_server_name = main_server_name and tostring(main_server_name) or dataParam.properities.server_name
global.L_DataRePort:SendRePortData(dataParam)
end
-- 检测是重复检测的任务上报
function DataRePortProxy:CheckRepeatTask(data)
if not data or not data.taskid then
return false
end
local checkTask = self._task_check[data.taskid]
local isRepeat = checkTask and checkTask.flag == data.flag or false
if data.flag == 0 or data.flag == 2 or data.flag == 3 then
self._task_check[data.taskid] = {
flag = data.flag
}
-- 如果内容是空的, 不上报
if data.flag == 3 then
local taskName = ""
local headData = data.oldHead or data.head
if headData and headData.content then
taskName = headData.content
end
if string.len(string.trim(taskName)) == 0 then
isRepeat = true
else
taskName = string.gsub(taskName,"","") --替换
taskName = string.gsub(taskName,"","") --替换
isRepeat = string.len(string.trim(taskName)) == 0
end
end
else
self._task_check[data.taskid] = nil
end
return isRepeat
end
-- 任务数据 (直接上报ali)
function DataRePortProxy:RoleTask(data)
if not self:CheckValid() then
return
end
if not data or not data.taskid then
return
end
local starTime = 0
local endTime = 0
if data.flag == 0 or data.flag == 2 or data.flag == 3 then
endTime = os.time()
else
return
end
if not global.L_DataRePort then
return
end
local taskName = ""
local headData = data.oldHead or data.head
if headData and headData.content then
taskName = headData.content
end
taskName = string.gsub(taskName,"","") --替换
taskName = string.gsub(taskName,"","") --替换
local AuthProxy = global.Facade:retrieveProxy(global.ProxyTable.AuthProxy)
local loginProxy = global.Facade:retrieveProxy( global.ProxyTable.Login )
local PlayerProperty = global.Facade:retrieveProxy( global.ProxyTable.PlayerProperty )
local dataParam = {
event={time=os.time(),name = "role_task",type = "track"},
user={id=tostring( AuthProxy:GetUID() )},
properities={
servid=tostring(loginProxy:GetSelectedServerId()),
server_name=tostring(loginProxy:GetSelectedServerName()),
role_id=tostring(PlayerProperty:GetRoleUID()),
role_name=PlayerProperty:GetName(),
role_level=PlayerProperty:GetRoleLevel(),
task_id = data.taskid,
task_name = taskName,
start_time = starTime,
end_time = endTime,
flag = data.flag,
}
}
local selSerInfo = loginProxy:GetSelectedServer()
local main_servid = selSerInfo and selSerInfo.mainServerId
local main_server_name = selSerInfo and selSerInfo.mainServerName
dataParam.properities.main_servid = main_servid and tostring(main_servid) or dataParam.properities.servid
dataParam.properities.main_server_name = main_server_name and tostring(main_server_name) or dataParam.properities.server_name
global.L_DataRePort:SendRePortData(dataParam)
end
-- 自定义数据上报 (直接上报ali)
function DataRePortProxy:ReportCustomEvent(data)
if not self:CheckValid() then
return
end
if not data then
return
end
local AuthProxy = global.Facade:retrieveProxy( global.ProxyTable.AuthProxy )
local dataParam = {
event={time=os.time(),name = data.event_name or "",type = "track"},
properities=data.map,
user_id=tostring( AuthProxy:GetUID() ),
}
global.L_DataRePort:SendRePortData(dataParam)
end
-- 主界面按钮/图片点击上报
function DataRePortProxy:MainUIClickEvent(data)
if not self:CheckValid() then
return
end
if not data then
return
end
local AuthProxy = global.Facade:retrieveProxy(global.ProxyTable.AuthProxy)
local loginProxy = global.Facade:retrieveProxy( global.ProxyTable.Login )
local PlayerProperty = global.Facade:retrieveProxy( global.ProxyTable.PlayerProperty )
local PShowAttType = GUIFunction:PShowAttType()
local dataParam = {
event={time=os.time(),name = "click_xmb",type = "track"},
user={id=tostring( AuthProxy:GetUID() )},
properities={
servid=tostring(loginProxy:GetSelectedServerId()),
server_name=tostring(loginProxy:GetSelectedServerName()),
job_id=tostring(PlayerProperty:GetRoleJob()),
job_name=tostring(PlayerProperty:GetRoleJobName()),
role_id=tostring(PlayerProperty:GetRoleUID()),
role_name=PlayerProperty:GetName(),
role_level=PlayerProperty:GetRoleLevel(),
consumable_grade=PlayerProperty:GetRoleReinLv(),
role_att=PlayerProperty:GetRoleAttByAttType(PShowAttType.Max_ATK) or 0,
main_id=data.index or "",
node_id=data.id or "",
func_tag=data.link or "",
}
}
global.L_DataRePort:SendRePortData(dataParam)
end
----------------------云真机 货币上报begin------------------------------
function DataRePortProxy:SetCloundCheckMoneyList(data)
-- body
if data and data[1] then
local cloudList = {}
local moneyIdNmber = 0
for k,moneyId in ipairs(data) do
moneyIdNmber = tonumber(moneyId)
if moneyIdNmber then
cloudList[moneyIdNmber] = moneyIdNmber
end
end
if moneyIdNmber and moneyIdNmber > 0 then
self.m_cloudMoneyList = cloudList
self:InitCloudMoney()
end
end
end
function DataRePortProxy:InitCloudMoney()
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
if self.m_moneyScheduleID then
UnSchedule(self.m_moneyScheduleID)
self.m_moneyScheduleID = nil
end
self.m_moneyMaxID = 99 --货币的最大道具id
self.m_moneys = {} --监听的money
self.m_moneyScheduleID = nil --监听事件ID
self.m_moneyListenTimes = 5 * 60 --5分钟
local MoneyProxy = global.Facade:retrieveProxy(global.ProxyTable.MoneyProxy)
for k,moneyID in pairs(self.m_cloudMoneyList) do
if moneyID < self.m_moneyMaxID then
if not self.m_moneys[moneyID] then
local itemMeonyData = SL:GetMetaValue("ITEM_DATA", moneyID)
if itemMeonyData and itemMeonyData.Name then
self.m_moneys[moneyID] = {
currencyId = moneyID,
currencyNum = MoneyProxy:GetMoneyCountById(moneyID) or 0,
currencyName = itemMeonyData.Name
}
end
end
end
end
self.m_moneyScheduleID = Schedule(function()
self:ReportCloudMoney()
end,self.m_moneyListenTimes)
releasePrint("=======InitCloudMoney")
end
end
function DataRePortProxy:ReportCloudMoney()
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
-- 经验不在监听范围内
local MoneyProxy = global.Facade:retrieveProxy(global.ProxyTable.MoneyProxy)
local ExpID = MoneyProxy:GetMoneyType().Exp
-- 重新获取下 有些没按照顺序注销配置就不是数组了
local moneyList = {}
local count = 0
for k,v in pairs(self.m_moneys) do
if v.currencyId == ExpID then
v.currencyNum = SL:GetMetaValue("EXP")
end
count = count + 1
moneyList[count] = v
end
if count > 0 then
local AuthProxy = global.Facade:retrieveProxy( global.ProxyTable.AuthProxy )
AuthProxy:RequestCloudMoney( cjson.encode(moneyList) )
end
releasePrint("=======ReportCloudMoney")
end
end
function DataRePortProxy:HandlerOnEnterWorld()
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
-- 检测云机货币列表
local AuthProxy = global.Facade:retrieveProxy( global.ProxyTable.AuthProxy )
AuthProxy:RequestCloudMoneyCheckList()
releasePrint("=======*HandlerOnEnterWorld")
end
end
function DataRePortProxy:HandlerOnUpdateMoney( data )
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
if not data or not self.m_moneyMaxID then
return
end
local moneyID = data.id
if moneyID > self.m_moneyMaxID then
return
end
if not self.m_cloudMoneyList or not self.m_cloudMoneyList[moneyID] then
return
end
if not self.m_moneys then
self.m_moneys = {}
end
if not self.m_moneys[moneyID] then
self.m_moneys[moneyID] = {
currencyId = data.id,
currencyNum = 0,
currencyName = SL:GetMetaValue("ITEM_NAME", moneyID)
}
end
if data.count and self.m_moneys[moneyID].currencyNum ~= data.count then
self.m_moneys[moneyID].currencyNum = data.count
end
end
end
----------------------云真机 货币上报end------------------------------
function DataRePortProxy:onRemove()
-- 检测是否云手机
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
SL:UnRegisterLUAEvent(LUA_EVENT_ENTER_WORLD, "DataRePortProxy")
SL:UnRegisterLUAEvent(LUA_EVENT_MONEYCHANGE, "DataRePortProxy")
end
DataRePortProxy.super.onRemove(self)
end
function DataRePortProxy:onRegister()
-- 检测是否云手机
if global.L_GameEnvManager:GetEnvDataByKey("isCloudLogin") then
SL:RegisterLUAEvent(LUA_EVENT_ENTER_WORLD, "DataRePortProxy", handler(self, self.HandlerOnEnterWorld))
SL:RegisterLUAEvent(LUA_EVENT_MONEYCHANGE, "DataRePortProxy", handler(self, self.HandlerOnUpdateMoney))
end
DataRePortProxy.super.onRegister(self)
end
return DataRePortProxy