using System;
using System.Collections.Generic;
using Firebase.RemoteConfig;
using Guru;
using Guru.LitJson;
using UnityEngine;
namespace Guru
{
///
/// ABTEST 管理器
///
public class ABTestManager : Singleton
{
private FirebaseRemoteConfig _remoteConfig;
private List _params;
#region 初始化
///
/// 初始化
///
public static void Init()
{
try
{
Instance.Setup();
}
catch (Exception e)
{
Debug.LogError(e);
}
}
///
/// 安装服务
///
private void Setup()
{
Debug.Log($"[AB] --- ABTest Init");
_params = new List();
_remoteConfig = FirebaseRemoteConfig.DefaultInstance;
string strValue;
foreach (var key in _remoteConfig.Keys)
{
strValue = _remoteConfig.GetValue(key).StringValue;
AddParam(strValue);
}
// ------- ABTest -----------
// Debug.Log($" --- start parse test string --- ");
// var testStr = @"{""enabled"":true,""value"":2,""id"":""B"",""guru_ab_23100715"":""B""}";
// AddParam(testStr);
if (_params.Count > 0)
{
for (int i = 0; i < _params.Count; i++)
{
// 上报实验AB属性
GuruAnalytics.SetUserProperty(_params[i].id, _params[i].group);
#if UNITY_EDITOR
Debug.Log($"[AB] --- Add AB Param {_params[i].ToString()}");
#else
Debug.Log($"[AB] --- Add AB Param {_params[i].ToString()}");
#endif
}
}
}
#endregion
#region 添加AB参数
///
/// 添加AB参数
///
///
private void AddParam(string value)
{
if (!string.IsNullOrEmpty(value) && value.Contains("guru_ab_"))
{
_params.Add(ABParamData.Parse(value)); // 添加参数
}
}
#endregion
#region 单元测试
public static void TestConfig(string json)
{
var p = ABParamData.Parse(json);
if (p == null)
{
Debug.LogError($"Could not parse config: {json}");
return;
}
if (!string.IsNullOrEmpty(p.group))
{
Debug.Log($"ID: {p.id}");
Debug.Log($"Group: {p.group}");
Debug.Log($"Value: {p.value}");
}
}
#endregion
}
[Serializable]
internal class ABParamData
{
private const int PARAM_NAME_LENGTH = 23; // 从开始"ab_" 计算, 往后20个字符
public string id;
public string group;
public string value;
public static ABParamData Parse(string value)
{
Debug.Log($"--- ABParamData.Parse: {value}");
var p = new ABParamData();
p.value = value;
// 发现Guru AB测试标志位
var dict = JsonMapper.ToObject>(value);
if (null != dict)
{
foreach (var k in dict.Keys)
{
if (k.StartsWith("guru_ab"))
{
p.id = GetItemKey(k);
p.group = dict[k].ToString();
// Debug.Log($"[AB] add property {k}: {dict[k]}");
break;
}
}
}
return p;
}
private static string GetItemKey(string raw)
{
var h = raw.Replace("guru_", "");
var key = h.Substring(0, Mathf.Min(PARAM_NAME_LENGTH, h.Length)); // 最大长度23
return key;
}
///
/// 输出字符串
///
///
public override string ToString()
{
return $"{id} : {group}";
}
}
}