608 lines
18 KiB
C#
608 lines
18 KiB
C#
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;
|
||
}
|
||
} |