using Cysharp.Threading.Tasks; using Newtonsoft.Json; using PhxhSDK; using System; using System.Collections.Generic; using UnityEngine; public partial class BIManager : Singlenton, IInitable { public BILevelInfo LevelInfo; private IBIService _biService; private StorageEvent _storageEvent; private Dictionary _tempEventDictionary = new(4); //由于尚未初始化,所以使用队列缓存的待上传事件 private Queue<(string, Dictionary)> eventQueue = new(); private bool _isInit; private bool SendPhxh = false; private string deviceInfo; private string deviceID; private string gameVersion; private string platform; private string channel; private int storageInfo; public void Init() { //TODO 替换为需要使用的BI系统 Firebase or 自己的系统 InitBiService(); #if BI_PHXH SendPhxh = true; #endif LevelInfo = new BILevelInfo(); _storageEvent = StorageMgr.Instance.GetStorage("StorageEvent"); _storageEvent ??= new StorageEvent(); _isInit = true; //初次启动游戏打点 //TrackEventOnce(BI_GameStart, param: new Dictionary() { { "event", "first_open" } }); } private void InitBiService() { //Firebase var helperName = SDKManager.SdkName.TapTap; #if SDK_FIREBASE helperName = SDKManager.SdkName.FireBase; _biService = SDKManager.Instance.GetSdkHelper(helperName) as IBIService; #endif #if SDK_TAPTAP helperName = SDKManager.SdkName.TapTap; _biService =SDKManager.Instance.GetSdkHelper(helperName) as IBIService; #endif #if SDK_TALKINGDATA helperName = SDKManager.SdkName.TalkingData; _biService = SDKManager.Instance.GetSdkHelper(helperName) as IBIService; //TD在登录后初始化 #endif if (_biService == null) { DebugUtil.Log("Get BI Service error, SDK helper name is {0}", helperName); return; } //记录一个账号,当账号登录时调用 _biService?.SetUser(SDKManager.Instance.ApplicationUserID); //设置通用属性 例如 服务器 _biService?.SetUserProperty("platform", DeviceHelper.GetPlatformString()); //设备信息 用户属性设置 机型 存储空间 deviceInfo = SystemInfo.deviceModel; storageInfo = SystemInfo.systemMemorySize; deviceID = SystemInfo.deviceUniqueIdentifier; gameVersion = Application.version; platform = DeviceHelper.GetPlatformString(); channel = PlayerPrefs.GetString("BI_Platform", "test"); DebugUtil.Log("device platform:{0}", platform); #if SDK_TALKINGDATA _biService?.SetUserProperty(TalkingDataProfileParamName.Param1, deviceInfo); _biService?.SetUserProperty(TalkingDataProfileParamName.Param2, storageInfo.ToString() + "MB"); #endif } public void BiAfterLoginInit(SDKManager.SdkName name) { _biService = SDKManager.Instance.GetSdkHelper(name) as IBIService; if(_biService == null) { DebugUtil.Log("Get BI Service error, SDK helper name is {0}", name); return; } _biService.SetUser(SDKManager.Instance.ApplicationUserID); while (eventQueue.Count > 0) { //将缓存的事件上报 var (eventName, param) = eventQueue.Dequeue(); _biService.ReportEvent(eventName, param); TrackEventPhxh(eventName, param); } } /// /// 设置用户属性 /// /// /// public void SetUserProperty(string key, string value) { if (!_isInit) return; _biService?.SetUserProperty(key, value); } /// /// 上报普通事件 /// public void TrackEvent(string eventName, string param1 = null, string param2 = null, string param3 = null) { if (!_isInit) return; try { _tempEventDictionary.Clear(); var userParam = _tempEventDictionary; if (!string.IsNullOrEmpty(param1)) { userParam.Add("param1", param1); } if (!string.IsNullOrEmpty(param2)) { userParam.Add("param2", param2); } if (!string.IsNullOrEmpty(param3)) { userParam.Add("param3", param3); } if (_biService != null) { _biService.ReportEvent(eventName, userParam); } else { eventQueue.Enqueue((eventName, userParam)); } _tempEventDictionary.Clear(); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEvent Error: {1}", eventName, e); } } public void TrackEvent(string eventName, object param1 = null, object param2 = null, object param3 = null) { if (!_isInit) return; try { _tempEventDictionary.Clear(); var userParam = _tempEventDictionary; if (param1 != null) { userParam.Add("param1", param1); } if (param2 != null) { userParam.Add("param2", param2); } if (param3 != null) { userParam.Add("param3", param3); } if (_biService != null) { _biService.ReportEvent(eventName, userParam); } else { eventQueue.Enqueue((eventName, userParam)); } _tempEventDictionary.Clear(); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEvent Error: {1}", eventName, e); } } /// /// 用于传输参数自定义命名事件 /// /// /// public void TrackEvent(string eventName, Dictionary param) { if (!_isInit) return; try { if (_biService != null) { _biService.ReportEvent(eventName, param); TrackEventPhxh(eventName, param); } else { eventQueue.Enqueue((eventName, param)); } } catch (Exception e) { DebugUtil.LogError("Track event fail! EventName:" + eventName + ",\n error msg: " + e.Message); } } /// /// 上报一次性事件 /// public void TrackEventOnce(string firstEventName, string param1 = null, string param2 = null, string param3 = null) { if (!_isInit) return; try { if (IsRecorded(firstEventName)) { DebugUtil.Log("已经上报过 {0} 事件, 不会再次上报", firstEventName); return; } _tempEventDictionary.Clear(); var userParam = _tempEventDictionary; if (!string.IsNullOrEmpty(param1)) { userParam.Add("param1", param1); } if (!string.IsNullOrEmpty(param2)) { userParam.Add("param2", param2); } if (!string.IsNullOrEmpty(param3)) { userParam.Add("param3", param3); } _storageEvent.EventList.Add(firstEventName); if (_biService != null) { _biService.ReportEvent(firstEventName, userParam); } else { eventQueue.Enqueue((firstEventName, userParam)); } StorageMgr.Instance.SyncForce = true; _tempEventDictionary.Clear(); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventOnce Error: {1}", firstEventName, e); } } public void TrackEventOnce(string firstEventName, object param1 = null, object param2 = null, object param3 = null) { if (!_isInit) return; try { if (IsRecorded(firstEventName)) { DebugUtil.Log("已经上报过 {0} 事件, 不会再次上报", firstEventName); return; } _tempEventDictionary.Clear(); var userParam = _tempEventDictionary; if (param1 != null) { userParam.Add("param1", param1); } if (param2 != null) { userParam.Add("param2", param2); } if (param3 != null) { userParam.Add("param3", param3); } _storageEvent.EventList.Add(firstEventName); if (_biService != null) { _biService.ReportEvent(firstEventName, userParam); } else { eventQueue.Enqueue((firstEventName, userParam)); } StorageMgr.Instance.SyncForce = true; _tempEventDictionary.Clear(); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventOnce Error: {1}", firstEventName, e); } } /// /// 用于传输参数自定义命名事件 /// /// /// public void TrackEventOnce(string firstEventName,Dictionary param) { if (!_isInit) return; try { if (IsRecorded(firstEventName)) { DebugUtil.Log("已经上报过 {0} 事件, 不会再次上报", firstEventName); return; } _storageEvent.EventList.Add(firstEventName); if (_biService != null) { _biService.ReportEvent(firstEventName, param); } else { eventQueue.Enqueue((firstEventName, param)); } StorageMgr.Instance.SyncForce = true; } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventOnce Error: {1}", firstEventName, e); } } /// /// 上报关卡内普通事件 /// public void TrackEventLevel(string eventName, string param1 = null, string param2 = null, string param3 = null) { if (!_isInit) return; try { var levelParam = new Dictionary(); //TODO 初始化需要上传的LevelInfo //LevelInfo.LevelID = ... levelParam = Utils.PropertiesNameValue2ObjectDictionary(LevelInfo); if (!string.IsNullOrEmpty(param1)) { levelParam.Add("param1", param1); } if (!string.IsNullOrEmpty(param2)) { levelParam.Add("param2", param2); } if (!string.IsNullOrEmpty(param3)) { levelParam.Add("param3", param3); } _biService?.ReportEvent(eventName, levelParam); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventLevel Error: {1}", eventName, e); } } public void TrackEventLevel(string eventName, object param1 = null, object param2 = null, object param3 = null) { if (!_isInit) return; try { var levelParam = new Dictionary(); //TODO 初始化需要上传的LevelInfo //LevelInfo.LevelID = ... levelParam = Utils.PropertiesNameValue2ObjectDictionary(LevelInfo); if (param1 != null) { levelParam.Add("param1", param1); } if (param2 != null) { levelParam.Add("param2", param2); } if (param3 != null) { levelParam.Add("param3", param3); } _biService?.ReportEvent(eventName, levelParam); } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventLevel Error: {1}", eventName, e); } } /// /// 上报关卡内一次性事件 /// public void TrackEventLevelOnce(string firstEventName, string param1 = null, string param2 = null, string param3 = null) { if (!_isInit) return; try { if (IsRecorded(firstEventName)) { DebugUtil.Log("已经上报过 {0} 关卡事件,不会再次上报", firstEventName); return; } var levelParam = new Dictionary(); //TODO 初始化需要上传的LevelInfo //LevelInfo.LevelID = ... levelParam = Utils.PropertiesNameValue2ObjectDictionary(LevelInfo); if (!string.IsNullOrEmpty(param1)) { levelParam.Add("param1", param1); } if (!string.IsNullOrEmpty(param2)) { levelParam.Add("param2", param2); } if (!string.IsNullOrEmpty(param3)) { levelParam.Add("param3", param3); } _biService?.ReportEvent(firstEventName, levelParam); _storageEvent.EventList.Add(firstEventName); StorageMgr.Instance.SyncForce = true; } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventLevelOnce Error: {1}", firstEventName, e); } } public void TrackEventLevelOnce(string firstEventName, object param1 = null, object param2 = null, object param3 = null) { if (!_isInit) return; try { if (IsRecorded(firstEventName)) { DebugUtil.Log("已经上报过 {0} 关卡事件,不会再次上报", firstEventName); return; } var levelParam = new Dictionary(); //TODO 初始化需要上传的LevelInfo //LevelInfo.LevelID = ... levelParam = Utils.PropertiesNameValue2ObjectDictionary(LevelInfo); if (param1 != null) { levelParam.Add("param1", param1); } if (param2 != null) { levelParam.Add("param2", param2); } if (param3 != null) { levelParam.Add("param3", param3); } _biService?.ReportEvent(firstEventName, levelParam); _storageEvent.EventList.Add(firstEventName); StorageMgr.Instance.SyncForce = true; } catch (Exception e) { DebugUtil.LogError("BI Event: {0}, TrackEventLevelOnce Error: {1}", firstEventName, e); } } private bool IsRecorded(string eventName) { return _storageEvent.EventList.Contains(eventName); } public void Release() { _tempEventDictionary = null; } private void TrackEventPhxh(string eventName, Dictionary param) { if (!_isInit || !SendPhxh) return; try { string url = "http://bi.kedrgame.com/api/v1/events"; //192.168.2.135:17777 string data = JsonConvert.SerializeObject(param); var sendData = new PhxhBIEvent(); sendData.event_name = eventName; sendData.event_key = eventName; if (param != null) sendData.event_value = data; sendData.actor_id = SDKManager.Instance.ApplicationUserID; sendData.model = deviceInfo; sendData.uuid = deviceID; sendData.version = gameVersion; sendData.platform = platform; sendData.channel = channel; Dictionary headData = PostHeader.BIPostHeader(new Dictionary { { "event_name", sendData.event_name },//string { "event_key",sendData.event_key}, { "event_value",sendData.event_value}, { "tag",sendData.tag}, { "game_id",sendData.game_id.ToString() }, { "actor_id", sendData.actor_id},//string { "details", sendData.details },//json { "uuid", sendData.uuid },//string { "model", sendData.model },//string { "version", sendData.version },//string { "platform",sendData.platform },//string { "channel", sendData.channel },//string { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString() }, }); HttpHelper.PostAsync(url, sendData, headData).Forget(); } catch (Exception e) { DebugUtil.LogError("Track event fail! EventName:" + eventName + ",\n error msg: " + e.Message); } } class PhxhBIEvent { public string event_name; // 标记类型 public string event_key; public string event_value; public string actor_id; public string details; public string version;// 游戏版本 public string tag;// tag: 区分多游戏 public string platform; // 平台:安卓和IOS public string model;// 手机型号 public string uuid;// 设备唯一标识 public string channel;// 渠道 public int game_id; } }