using Thousandto.Code.Center; using Thousandto.Code.Logic; using Thousandto.Core.Base; using Thousandto.CoreSDK; using MSG_BI; using System.Collections; using System.Collections.Generic; using UnityEngine; using Thousandto.Cfg.Data; using System.Text; using System; namespace Thousandto.Code.Logic { //打点系统 public class BISystem { private ValMap _tempValMap = new ValMap(); //点击数据{[0]=1,[1]=1598607932,[2]=2,[3]=1598607955,...} id、时间戳 private int[] _clickInfoArr = new int[256]; //当前可写入的位置 private int _writePos = 0; //下一次保存到本地的时间戳 private double _nextSaveUTCTime = 0; //下一次发送到服务器的时间戳 private double _nextReqUTCTime = 0; //缓存数量+本地存储数量 的最大值 private int _maxCount = 128; //发送到服务器的时间间隔 秒 private double _reqSpacingTime = 300; //保存到本地的时间间隔 秒 private double _saveSpacingTime = 10; //是否检测 private bool _isCheck = false; //本地保存的角色Id private ulong _playerPrefsRoleId = 0; //当前玩家id private ulong _curRoleId = 0; public void Initialize() { GameCenter.RegFixEventHandle(Global.LogicEventDefine.EID_EVENT_FIRSTENTERMAP, OnFirstEnterMap); if (PlayerPrefs.HasKey("[Bi_RoleId]")) { var strId = PlayerPrefs.GetString("[Bi_RoleId]"); ulong id = 0; if (ulong.TryParse(strId, out id)) { _playerPrefsRoleId = id; } else { PlayerPrefs.DeleteKey("[Bi_RoleId]"); } } } //首次进入场景 private void OnFirstEnterMap(object param, object sender) { _curRoleId = GameCenter.GameSceneSystem.GetLocalPlayerID(); if (_playerPrefsRoleId != 0) { ReqAllClickEvent(); } if (_playerPrefsRoleId != _curRoleId) { PlayerPrefs.SetString("[Bi_RoleId]", _curRoleId.ToString()); _playerPrefsRoleId = _curRoleId; } Start(); } public void Uninitialize() { GameCenter.UnRegFixEventHandle(Global.LogicEventDefine.EID_EVENT_FIRSTENTERMAP, OnFirstEnterMap); Stop(); _curRoleId = 0; } #region//消息 //message ValMap //{ // required string key = 1; // key // required string value = 2; // value //} // message ReqBiDevice // { // enum MsgID { eMsgID = 185201; }; // required int32 appId = 1; // 平台游戏的游戏id,用于区分游戏,由sdk获取 // required int32 roleId = 2; // 角色ID // required string channelId = 3; // 平台唯一的渠道id,用于区分渠道厂商,由sdk获取 // required string sourceId = 4; // 游戏包体id,由sdk获取 // required string deviceId = 5; // 平台唯一的设备id,由sdk获取 // required int32 platform = 6; // 运行平台,IOS=1/安卓=2/H5=3 //} public void ReqBiDevice() { var _reqBiDevice = new ReqBiDevice(); _reqBiDevice.device = CreatDevictData(); _reqBiDevice.Send(); } //创建设备信息 public Device CreatDevictData() { var _device = new Device(); //绿岸 // app id int appId = 0; if (!string.IsNullOrEmpty(SDKCacheData.AppID)) int.TryParse(SDKCacheData.AppID, out appId); _device.appId = appId; // 角色ID int roleID = 0; if (!string.IsNullOrEmpty(SDKCacheData.RoleID)) int.TryParse(SDKCacheData.RoleID, out roleID); _device.roleId = roleID; // 渠道ID _device.channelId = SDKCacheData.ChannelID != null ? SDKCacheData.ChannelID : ""; // 游戏包体ID _device.sourceId = SDKCacheData.SourceId != null ? SDKCacheData.SourceId : ""; // 设备ID _device.deviceId = SDKCacheData.DevicesId != null ? SDKCacheData.DevicesId : ""; // 运行平台,IOS=1/安卓=2/H5=3/web=4/pc=5 _device.platform = Application.platform == RuntimePlatform.IPhonePlayer ? 1 : Application.platform == RuntimePlatform.Android ? 2 : 4; //通用 // 客户端资源版本6.21.3 _device.app_version = GameGlobalData.RES_VERSION != string.Empty ? GameGlobalData.RES_VERSION :GameCenter.SDKSystem.AppVersion; // 运营商中国联通 _device.merchant = SDKCacheData.Merchant != null ? SDKCacheData.Merchant : ""; // 网络类型5G _device.net_type = Application.internetReachability == NetworkReachability.ReachableViaCarrierDataNetwork ? "CarrierData" : "WIFI"; // 屏幕分辨率,如:480*800 _device.screen = string.Format("{0}*{1}", Screen.width, Screen.height); // 手机操作系统,如:android、iOS string operatingSystem = SystemInfo.operatingSystem; _device.os = operatingSystem.IndexOf("Android OS") > -1 ? "android" : (operatingSystem.IndexOf("iPhone OS") > -1 ? "ios" : ""); // 操作系统版本号,如:2.3.4 if (_device.os == "android") { _device.os_version = operatingSystem.Substring(10).Trim(); } else if (_device.os == "ios") { _device.os_version = operatingSystem.Substring(9).Trim(); } else { _device.os_version = ""; } // 服务器名字 _device.server_name = GameCenter.LuaSystem.Adaptor.GetCurrServerName();// .ServerListSystem.GetCurrentServer().Name; //第三方 // SDK获取的gameID int cpgameId = 0; if (!string.IsNullOrEmpty(SDKCacheData.CPGameId)) int.TryParse(SDKCacheData.CPGameId, out cpgameId); _device.cpgameId = cpgameId; // 用户设备ID,Android系统取IMEI码;iOS6.0以前系统取设备号,iOS6.0及以后的系统取广告标示符(IDFA -Identifier For Advertising), PC可以采用mac地址。请注意不要用MD5加密did字段 _device.cpdid = SDKCacheData.CPDid; // 设备名称,如:三星GT-S5830 _device.cpdevice_name = SystemInfo.deviceModel; // 这个是设备的自定义名字 //_device.cpdevice_name = SystemInfo.deviceName; // SDK获取的平台ID int platformId = 0; if (!string.IsNullOrEmpty(SDKCacheData.CPPlatformId)) int.TryParse(SDKCacheData.CPPlatformId, out platformId); _device.cpplatformId = platformId; // SDK获取的平台ID // 渠道账号ID _device.cpuserid = SDKCacheData.CPUserID; // 渠道账号名 _device.cpuserName = SDKCacheData.CPUserName; // 游戏简称 _device.cpgameName = SDKCacheData.CPGameName; // 游戏平台简称 _device.cpPlatformGname = SDKCacheData.CPPlatformGname; return _device; } //// 具体的BI数据,内部数据格式由对接人协商负责 //message ReqBi //{ // enum MsgID { eMsgID = 185202; }; //required int32 roleId = 1; // 角色ID // required string biName = 2; // BI数据名,表名 //repeated ValMap valMaps = 3; // 数据列表key,value //} public void ReqBi(string biName, List valMaps) { ReqBi reqBi = new ReqBi(); reqBi.biName = biName; int roleID = 0; int.TryParse(SDKCacheData.RoleID, out roleID); reqBi.roleId = roleID; for (int i = 0; i < valMaps.Count; i++) { reqBi.valMaps.Add(valMaps[i]); } reqBi.Send(); } public void ReqBi(string biName, string key, string value = "") { ReqBi reqBi = new ReqBi(); reqBi.biName = biName; int roleID = 0; int.TryParse(SDKCacheData.RoleID, out roleID); reqBi.roleId = roleID; _tempValMap.Clear(); _tempValMap.key = key; _tempValMap.value = value; reqBi.valMaps.Add(_tempValMap); reqBi.Send(); } public void ReqBi(string biName, params string[] strArr) { ReqBi reqBi = new ReqBi(); reqBi.biName = biName; int roleID = 0; int.TryParse(SDKCacheData.RoleID, out roleID); reqBi.roleId = roleID; int count = strArr.Length; for (int i = 0; i < count; i += 2) { var _map = new ValMap(); _map.key = strArr[i]; if (i + 1 < count) { _map.value = strArr[i + 1]; } else { _map.value = ""; } reqBi.valMaps.Add(_map); } reqBi.Send(); } //发送ui埋点 public void ReqClickEvent(int id) { if (DeclareBi.Get(id).IsOpen == 1) { if (_writePos > _clickInfoArr.Length) { //保存到本地 Save(); _writePos = 0; } _clickInfoArr[_writePos++] = id; _clickInfoArr[_writePos++] = (int)GameCenter.HeartSystem.ServerTime; } } //发送ui埋点 public void ReqAllClickEvent() { int playerPrefsCnt = 0; if (PlayerPrefs.HasKey("[Bi_Count]")) { playerPrefsCnt = PlayerPrefs.GetInt("[Bi_Count]"); } if (playerPrefsCnt + _writePos > 0) { List uIDatas = new List(playerPrefsCnt + _writePos); if (_writePos > 0) { for (int i = 0; i < _writePos; i += 2) { UIData uIData = new UIData(); uIData.id = _clickInfoArr[i]; uIData.time = _clickInfoArr[i + 1]; uIDatas.Add(uIData); } } if (playerPrefsCnt > 0) { int row = PlayerPrefs.GetInt("[Bi_DataRow]"); for (int i = 0; i < row; i++) { var key = string.Format("[Bi_Data{0:D3}]", i + 1); var s = PlayerPrefs.GetString(key); if (s != "") { var arr = s.Split(','); var cnt = arr.Length; for (int j = 0; j < cnt; j += 2) { UIData uIData = new UIData(); int id = -1; int time = -1; if (int.TryParse(arr[j], out id)) { uIData.id = id; } if (int.TryParse(arr[j + 1], out time)) { uIData.time = time; } if (id != -1 && time != -1) { uIDatas.Add(uIData); } } } PlayerPrefs.DeleteKey(key); } } ReqUiBi reqUiBi = new ReqUiBi(); reqUiBi.roleId = (long)_playerPrefsRoleId; reqUiBi.uiData = uIDatas; reqUiBi.Send(); PlayerPrefs.SetInt("[Bi_Count]", 0); PlayerPrefs.SetInt("[Bi_DataRow]", 0); } var t = GameCenter.HeartSystem.ServerTime; _nextSaveUTCTime = t + _saveSpacingTime; _nextReqUTCTime = t + _reqSpacingTime; } //保存到本地 public void Save() { if (_writePos > 0) { int cnt = _writePos; if (PlayerPrefs.HasKey("[Bi_Count]")) { cnt = PlayerPrefs.GetInt("[Bi_Count]") + _writePos; } if (cnt >= _maxCount) { ReqAllClickEvent(); return; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < _writePos; i++) { if (i == _writePos - 1) { sb.Append(_clickInfoArr[i]); } else { sb.Append(_clickInfoArr[i] + ","); } } int row = 0; if (PlayerPrefs.HasKey("[Bi_DataRow]")) { row = PlayerPrefs.GetInt("[Bi_DataRow]"); } PlayerPrefs.SetInt("[Bi_DataRow]", row + 1); PlayerPrefs.SetString(string.Format("[Bi_Data{0:D3}]", row + 1), sb.ToString()); PlayerPrefs.SetInt("[Bi_Count]", cnt); PlayerPrefs.Save(); _writePos = 0; } var t = GameCenter.HeartSystem.ServerTime; _nextSaveUTCTime = t + _saveSpacingTime; } public void Start() { ReqAllClickEvent(); _isCheck = true; } public void Stop() { _isCheck = true; } public void Update(float dt) { if (_isCheck) { var t = GameCenter.HeartSystem.ServerTime; if (t >= _nextSaveUTCTime) { Save(); } if (t > _nextReqUTCTime) { ReqAllClickEvent(); } } } #endregion } }