using Mogafa.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Mogafa.App.LogEvents
{
///
/// 理想的使用方式:
/// LogEventReporter.Init(commonEventParameters)
/// .EnableAbGroup(abGroups, abGroupEventNames)
/// .UseAppsflyer(appsflyerEventNameMap, appsflyerEventParameterNameMap)
/// .UseFirebase(firebaseEventNameMap, firebaseEventParameterNameMap);
/// LogEventReporter.LogEvent(name, parameters);
///
public abstract class EventReporterAbstract : MogafaBase, ILogEventReporter
{
///
/// 名称
///
public abstract string Name { get; }
protected List enabledEventNames;
///
/// 通用事件参数, 每次上报事件时都需要的事件参数 比如用户ID等
/// 这个配置是和不同log event Provider不想关
///
protected Dictionary commonEventParameters;
///
/// 事件名称映射表,
/// 每个不同的log event Provider配置不一样
///
protected Dictionary eventNameMap;
///
/// 时间参数名称映射表
/// 每个不同的log event Provider配置不一样
///
protected Dictionary eventParameterNameMap;
protected EventReporterAbstract()
{
commonEventParameters = new Dictionary();
}
public Task Initialize(List enabledEventNames,
Dictionary eventNameMap,
Dictionary eventParameterNameMap)
{
Logger.LogInformation($"Log event reporter {Name} init start.");
this.eventNameMap = eventNameMap;
if (this.eventNameMap == null)
{
this.eventNameMap = new Dictionary();
}
this.eventParameterNameMap = eventParameterNameMap;
if (this.eventParameterNameMap == null)
{
this.eventParameterNameMap = new Dictionary();
}
this.enabledEventNames = enabledEventNames;
if (this.enabledEventNames == null)
{
this.enabledEventNames = new List();
}
Logger.LogInformation($"Log event reporter {Name} init finished.");
AfterInitialize(this.enabledEventNames, this.eventNameMap, this.eventParameterNameMap);
return Task.CompletedTask;
}
protected virtual void AfterInitialize(List enabledEventNames,
Dictionary eventNameMap,
Dictionary eventParameterNameMap)
{
}
public void AddCommonEventParameter(string eventParameterName, string value)
{
if (commonEventParameters.ContainsKey(eventParameterName))
{
commonEventParameters.Remove(eventParameterName);
}
commonEventParameters.Add(eventParameterName, value);
AfterAddCommonEventParameter(eventParameterName, value);
}
protected virtual void AfterAddCommonEventParameter(string eventParameterName, string value)
{
}
public Task LogEvent(string name, Dictionary eventParameters)
{
if (enabledEventNames.Count > 0)
{
var needReportEvent = enabledEventNames.Where(en =>
(en.EndsWith("_") && (name.StartsWith(en) || name == en.Substring(0, en.Length - 1)) ||
(!en.EndsWith("_") && name == en)));
if (needReportEvent == null || needReportEvent.Count() == 0)
{
return Task.CompletedTask;
}
}
Logger.LogInformation($"Log event to: {Name}, event name: {name}");
var cloneEventParameters = new Dictionary();
foreach(var commonParameter in commonEventParameters)
{
cloneEventParameters.Add(commonParameter.Key, commonParameter.Value);
}
foreach (var parameter in eventParameters)
{
if (!cloneEventParameters.ContainsKey(parameter.Key))
{
cloneEventParameters.Add(parameter.Key, parameter.Value);
}
else
{
cloneEventParameters[parameter.Key] = parameter.Value;
}
}
var mapName = MapName(name, eventNameMap);
var mapEventParameters = new Dictionary();
foreach (var parameter in cloneEventParameters)
{
var mapParameterName = MapName(parameter.Key, eventParameterNameMap);
mapEventParameters.Add(mapParameterName, parameter.Value);
}
return LogEventInternal(mapName, mapEventParameters);
}
protected string MapName(string eventName, Dictionary nameMap)
{
if (nameMap == null || nameMap.Count == 0)
{
return eventName;
}
var needMapName = nameMap.Keys.FirstOrDefault(nm =>
(nm.EndsWith("_") && (eventName.StartsWith(nm) || eventName == nm.Substring(0, nm.Length - 1)) ||
(!nm.EndsWith("_") && eventName == nm)));
if (needMapName == null)
{
return eventName;
}
var mapName = nameMap[needMapName];
if (!needMapName.EndsWith("_"))
{
return mapName;
}
needMapName = needMapName.Substring(0, needMapName.Length - 1);
if (needMapName == eventName)
{
return mapName;
}
mapName = eventName.Replace($"{needMapName}_", $"{mapName}_");
if (mapName.EndsWith("_"))
{
mapName = mapName.Substring(0, mapName.Length - 1);
}
return mapName;
}
protected abstract Task LogEventInternal(string name, Dictionary eventParameters);
public void ChangeEnabledEventNames(params string[] eventNames)
{
enabledEventNames = new List(eventNames);
}
public void ChangeEventNameMap(Dictionary eventNameMap)
{
this.eventNameMap = eventNameMap;
if (this.eventNameMap == null)
{
this.eventNameMap = new Dictionary();
}
}
public void ChangeEventParameterNameMap(Dictionary eventParameterNameMap)
{
this.eventParameterNameMap = eventParameterNameMap;
if (this.eventParameterNameMap == null)
{
this.eventParameterNameMap = new Dictionary();
}
}
}
}