zxl
/
CTT
forked from Cal/CTT
1
0
Fork 0
CTT/Server/Hotfix/Game/System/Log/StatisticComponentSystem.cs

137 lines
5.6 KiB
C#
Executable File

using ET.EventType;
using System;
using System.Collections.Generic;
using System.Text;
using static ET.StatisticComponent;
namespace ET
{
public class StatisticComponentAwakeSystem : AwakeSystem<StatisticComponent>
{
public override void Awake(StatisticComponent self)
{
StatisticComponent.instance = self;
//从数据库拿
self.Awake().Coroutine();
}
}
public static class StatisticComponentSystem
{
class StatisticPrintPerDay : AEvent<EventType.UpdatePer1DayOfMonth>
{
public override async ETTask Run(UpdatePer1DayOfMonth args)
{
StatisticComponent.instance.Clear();
await ETTask.CompletedTask;
}
}
class StatisticPrintPer5Minute : AEvent<EventType.UpdatePer5MinuteOfDay>
{
public override async ETTask Run(UpdatePer5MinuteOfDay args)
{
await StatisticComponent.instance.Save();
await ETTask.CompletedTask;
}
}
public static async ETVoid Awake(this StatisticComponent self)
{
DateTime time = DateTime.UtcNow;
long Id = time.Year * 10000 + time.Month * 100 + time.Day;
StatisticComponent statisticComponent = await DBComponent.Instance.Query<StatisticComponent>(Id);
if (statisticComponent != null)
{
self.gemDic = statisticComponent.gemDic;
self.coinDic = statisticComponent.coinDic;
self.energyCostDic = statisticComponent.energyCostDic;
self.statisticDic = statisticComponent.statisticDic;
}
}
public static void AddEnergyCost(this StatisticComponent self, long id, string costType, int count)
{
if (!self.energyCostDic.TryGetValue(id, out Dictionary<string, int> dic))
{
self.energyCostDic[id] = dic = new();
}
if(!dic.TryGetValue(costType,out int value))
{
dic[costType] = value = 0;
}
dic[costType] = value + count;
}
public static void AddInfo(this StatisticComponent self, long id, StatisticType name,string sources, long count)
{
if (name == StatisticType.Coin)
self.AddInfo(id,self.coinDic,sources, count/1000);
else if (name == StatisticType.Gem)
self.AddInfo(id, self.gemDic, sources, count/1000);
}
private static void AddInfo(this StatisticComponent self, long id,Dictionary<long,Dictionary<string,long>> dic, string sources, long add)
{
if (!dic.TryGetValue(id, out Dictionary<string, long> sourcesDic))
{
dic[id] = sourcesDic = new();
}
if (!sourcesDic.TryGetValue(sources, out long count))
{
sourcesDic[sources] = 0;
}
sourcesDic[sources] = count + add;
}
public static void Clear(this StatisticComponent self)
{
self.coinDic.Clear();
self.gemDic.Clear();
self.energyCostDic.Clear();
self.statisticDic.Clear();
}
public static async ETTask Save(this StatisticComponent self)
{
foreach ((long id, Dictionary<string, long> dic) in self.gemDic)
{
User user = await UserComponent.Instance.Query(id);
foreach ((string sources, long count) in dic)
{
if(sources == StatisticsTypes.GemSources_MainStory)
{
int energy = 0;
if(self.energyCostDic.TryGetValue(id,out Dictionary<string, int> costDic)){
costDic.TryGetValue(StatisticsTypes.EnergyCostType_MainStory, out energy);
}
string key = $"{id},{user?.NickName.Replace(".","_")}";
if(!self.statisticDic.TryGetValue(key,out Dictionary<string, string> statisticDic))
{
self.statisticDic[key] = statisticDic = new();
}
statisticDic[sources] = $"[消耗:{energy}] [{count}] [{count * 1f / energy}]";
}
}
}
foreach ((long id, Dictionary<string, long> dic) in self.coinDic)
{
User user = await UserComponent.Instance.Query(id);
foreach ((string sources, long count) in dic)
{
if (sources == StatisticsTypes.CoinSources_IdleBattle)
{
int energy = 0;
if (self.energyCostDic.TryGetValue(id, out Dictionary<string, int> costDic))
{
costDic.TryGetValue(StatisticsTypes.EnergyCostType_IdleBattle, out energy);
}
string key = $"{id},{user?.NickName}";
if (!self.statisticDic.TryGetValue(key, out Dictionary<string, string> statisticDic))
{
self.statisticDic[key] = statisticDic = new();
}
statisticDic[sources] = $"[消耗:{energy}] [{count}] [{count * 1f / energy}]";
}
}
}
DateTime time = DateTime.UtcNow;
//20210323
self.Id = time.Year*10000+time.Month*100+time.Day;
await DBComponent.Instance.Save(self);
}
}
}