using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; namespace Mogafa.App.Assets { public class UserAsset { public event Action AssetIncreased; public event Action AssetReduced; public UserAsset() { Assets = new List(); PeriodicAssets = new List(); Records = new List(); } private string userId; [JsonProperty("userId")] public string UserId { get { return userId; } set { userId = value; } } [JsonProperty("assets")] public List Assets { get; set; } [JsonProperty("periodicAssets")] public List PeriodicAssets { get; set; } //[JsonProperty("records")] [JsonIgnore] public List Records { get; set; } public long GetAsset(string code) { var asset = Assets.FirstOrDefault(a => a.Code == code); if (asset == null) { return 0L; } return asset.Value; } public long AddAsset(string code, long value) { return AddAsset(code, value, "", ""); } public long AddAsset(string code, long value, string source, string sourceId) { var asset = Assets.FirstOrDefault(a => a.Code == code); if (asset == null) { asset = new Asset { Code = code, Value = 0L }; Assets.Add(asset); } var oldValue = asset.Value; if (Records == null) { Records = new List(); } Records.Add(new UserAssetRecord { Code = code, Source = source, SourceId = sourceId, Time = (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000, UserId = userId, Value = value, ValueOfBefore = oldValue }); asset.Value += value; if (value > 0) { AssetIncreased?.Invoke(code, asset.Value, oldValue); } return asset.Value; } public long SubAsset(string code, long value, string source = "", string sourceId = "") { var asset = Assets.FirstOrDefault(a => a.Code == code); if (asset == null) { asset = new Asset { Code = code, Value = 0L }; Assets.Add(asset); } var oldValue = asset.Value; if (Records == null) { Records = new List(); } Records.Add(new UserAssetRecord { Code = code, Source = source, SourceId = sourceId, //Time = UserId = userId, Value = -value, ValueOfBefore = oldValue }); asset.Value -= value; if (value != 0) { AssetReduced?.Invoke(code, asset.Value, oldValue); } return asset.Value; } public void ClearRecords() { Records.Clear(); } } }