NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/BI/BIManager.cs

608 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Cysharp.Threading.Tasks;
using Newtonsoft.Json;
using PhxhSDK;
using System;
using System.Collections.Generic;
using UnityEngine;
public partial class BIManager : Singlenton<BIManager>, IInitable
{
public BILevelInfo LevelInfo;
private IBIService _biService;
private StorageEvent _storageEvent;
private Dictionary<string, object> _tempEventDictionary = new(4);
//由于尚未初始化,所以使用队列缓存的待上传事件
private Queue<(string, Dictionary<string, object>)> 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");
_storageEvent ??= new StorageEvent();
_isInit = true;
//初次启动游戏打点
//TrackEventOnce(BI_GameStart, param: new Dictionary<string, object>() { { "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);
}
}
/// <summary>
/// 设置用户属性
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void SetUserProperty(string key, string value)
{
if (!_isInit)
return;
_biService?.SetUserProperty(key, value);
}
/// <summary>
/// 上报普通事件
/// </summary>
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);
}
}
/// <summary>
/// 用于传输参数自定义命名事件
/// </summary>
/// <param name="eventName"></param>
/// <param name="param"></param>
public void TrackEvent(string eventName, Dictionary<string, object> 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);
}
}
/// <summary>
/// 上报一次性事件
/// </summary>
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);
}
}
/// <summary>
/// 用于传输参数自定义命名事件
/// </summary>
/// <param name="firstEventName"></param>
/// <param name="param"></param>
public void TrackEventOnce(string firstEventName,Dictionary<string,object> 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);
}
}
/// <summary>
/// 上报关卡内普通事件
/// </summary>
public void TrackEventLevel(string eventName, string param1 = null, string param2 = null, string param3 = null)
{
if (!_isInit)
return;
try
{
var levelParam = new Dictionary<string, object>();
//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<string, object>();
//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);
}
}
/// <summary>
/// 上报关卡内一次性事件
/// </summary>
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<string, object>();
//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<string, object>();
//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<string, object> 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<string, string> headData = PostHeader.BIPostHeader(new Dictionary<string, string>
{
{ "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;
}
}