local HttpReq = require('Http/HttpReq') local JSON = require('cjson') local HttpBIManager = {} local private = { url = "", timeDiffThreshold = 5000, --服务器与本地时间差的阈值 单位ms } local HeaderKey = "TYX-Request-Id" local HeaderValue = "f88a78a83463f1e03bbf0acb3883aefb" function HttpBIManager.Init() private.baseFieldID = HttpReq.AskForBaseFields() private.SetStaticBaseFields() end function HttpBIManager.SetURL(url) if string.sub(url, string.len(url)) == "/" then private.url = url .. "log/v2/clienttimeevent" else private.url = url .. "/log/v2/clienttimeevent" end end function HttpBIManager.SendNormalEvent(key, content) private.SetDynamicBaseFields(key,content) local handle = private.CreateRequestWithHeader() --HttpReq.Send(handle, private.baseFieldID, true) end function HttpBIManager.SendTriggerItemEvent(levelID, isItem, itemID, itemEvent) private.SetDynamicBaseFields("TriggerFlowInFreeLevel","") local handle = private.CreateRequestWithHeader() HttpReq.SetField(handle, "levelid", tostring(levelID)) HttpReq.SetField(handle, "isitem", tostring(isItem)) HttpReq.SetField(handle, "itemid", tostring(itemID)) HttpReq.SetField(handle, "itemevent", itemEvent) --HttpReq.Send(handle, private.baseFieldID, true) end function HttpBIManager.SendDownloadEvent(key, content, downloadSpeed) private.SetDynamicBaseFields(key, content) local handle = private.CreateRequestWithHeader() HttpReq.SetField(handle, "downloadspeed", tostring(downloadSpeed)) --HttpReq.Send(handle, private.baseFieldID, true) end function HttpBIManager.SetABTestModel(mode) HttpReq.SetBaseField(private.baseFieldID, "abtestmode", mode) end function private.SetStaticBaseFields() --本地数据迁移开始 if UIUtils.HasPlayerPrefsKey("FirstInstallGame") then UIUtils.DeletePlayerPrefsValue("FirstInstallGame") PersistentData.DeviceData:Set("IsFirstInstallGame", false, true) end --本地数据迁移结束 local isFirstInstallGame = PersistentData.DeviceData:Get("IsFirstInstallGame", true) if isFirstInstallGame then PersistentData.DeviceData:Set("IsFirstInstallGame", false, true) end HttpReq.SetBaseField(private.baseFieldID, "devtyp", SystemInfo.deviceModel) HttpReq.SetBaseField(private.baseFieldID, "os", SystemInfo.operatingSystem) HttpReq.SetBaseField(private.baseFieldID, "cpu", SystemInfo.graphicsDeviceName) HttpReq.SetBaseField(private.baseFieldID, "ram", tostring(SystemInfo.systemMemorySize)) HttpReq.SetBaseField(private.baseFieldID, "devid", SystemInfo.deviceUniqueIdentifier) --刘一帆需求 当渠道是英雄时 上报ProjectID作为ChannelID 区分英雄的子渠道 HttpReq.SetBaseField(private.baseFieldID, "channel", BIManager.GetBIChannelID()) HttpReq.SetBaseField(private.baseFieldID, "idfa", SDKUtil.AdvertisingID) HttpReq.SetBaseField(private.baseFieldID, "gid", GameAppInfo.Global_ProductId) HttpReq.SetBaseField(private.baseFieldID, "ver", AppInfo.marketVersion) HttpReq.SetBaseField(private.baseFieldID, "isemulator", tostring(IsEmulator)) HttpReq.SetBaseField(private.baseFieldID, "IsFirst", tostring(isFirstInstallGame)) HttpReq.SetBaseField(private.baseFieldID, "country", "") HttpReq.SetBaseField(private.baseFieldID, "region", "") HttpReq.SetBaseField(private.baseFieldID, "clientplatform", SDKUtil.PlatformType) HttpReq.SetBaseField(private.baseFieldID, "packagetype", tostring(DEF.USE_SMALL_APK and 2 or 1)) if not GameAppInfo.IsPCOrMacPackage() and GameAppInfo.IsOverseaPackage() and GameAppInfo.IsVersionGreaterThan110000() then HttpReq.SetBaseField(private.baseFieldID, "distinctid", SDKUtil.GetTEDistinctId()) else HttpReq.SetBaseField(private.baseFieldID, "distinctid", SystemInfo.deviceUniqueIdentifier) end end function private.SetDynamicBaseFields(key, value) HttpReq.SetBaseField(private.baseFieldID, "clienttime", string.format("%d",AuxUtil.GetLocalTimeStampMS())) HttpReq.SetBaseField(private.baseFieldID, "graphics", tostring(SettingAPI.lodLevel)) HttpReq.SetBaseField(private.baseFieldID, "FirstGraphics", tostring(SettingAPI.deviceLevel)) HttpReq.SetBaseField(private.baseFieldID, "netstate", tostring(AuxUtil.InternetReachability)) HttpReq.SetBaseField(private.baseFieldID, "Language", AuxUtil.Abbreviation); HttpReq.SetBaseField(private.baseFieldID, "step", key) HttpReq.SetBaseField(private.baseFieldID, "extra", value) end function private.CreateRequestWithHeader() local handle = HttpReq.Create(private.url, HttpReq.HTTPMethods.Post, private.OnHttpResponse, private.baseFieldID) HttpReq.AddHeader(handle, HeaderKey, HeaderValue) return handle end function private.OnHttpResponse(handle, success, state, absoluteUri, message, respCode, respJson) if success and not string.isNilOrEmpty(respJson) then local t = JSON.decode(respJson) if t["country"] then HttpReq.SetBaseField(private.baseFieldID, "country", tostring(t["country"])) end if t["region"] then HttpReq.SetBaseField(private.baseFieldID, "region", tostring(t["region"])) end if t["ser_time"] then local localTime = AuxUtil.GetLocalTimeStampMS() local serverTime = tonumber(t["ser_time"]) local diff = localTime - serverTime if math.abs(diff) > private.timeDiffThreshold then logging.crit(LTAG.CRIT, "client bi log time error, local = ", localTime," server = ", serverTime," diff = ", diff) end end if t["ip"] then HttpReq.SetBaseField(private.baseFieldID, "ip", tostring(t["ip"])) AuxUtil.BIIpAddress = tostring(t["ip"]) end end end function HttpBIManager.SendNetExceptionBI(key, tcpState, kcpState, disConnectCode, levelID, battleId, battleServerId) private.SetDynamicBaseFields(key, "") local handle = private.CreateRequestWithHeader() HttpReq.SetField(handle, "acid", BattleDataGetter.GetAcID() or "") HttpReq.SetField(handle, "tcpstate", tcpState) HttpReq.SetField(handle, "kcpstate", kcpState) HttpReq.SetField(handle, "netexceptioncode", disConnectCode) HttpReq.SetField(handle, "battleid", battleId) HttpReq.SetField(handle, "battleserverid", battleServerId) HttpReq.SetField(handle, "levelid", levelID) --HttpReq.Send(handle, private.baseFieldID, true) end return HttpBIManager