CashEntity.cs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. using System.Threading.Tasks;
  6. using CardCollector.DataBase.EntityDao;
  7. namespace CardCollector.DataBase.Entity
  8. {
  9. /* Объект таблицы cash (одна строка)
  10. В таблице хранится Id пользователя, количество монет и алмазов*/
  11. [Table("cash")]
  12. public class CashEntity
  13. {
  14. /* Id пользователя */
  15. [Key]
  16. [Column("user_id"), MaxLength(127)] public long UserId { get; set; }
  17. /* Количество монет */
  18. [Column("coins"), MaxLength(32)] public int Coins { get; set; } = 0;
  19. /* Количество алмазов */
  20. [Column("gems"), MaxLength(32)] public int Gems { get; set; } = 0;
  21. /* Размер копилки */
  22. [Column("max_capacity"), MaxLength(32)] public int MaxCapacity { get; set; } = 200;
  23. [NotMapped] private DateTime LastPayout = DateTime.Now;
  24. public async Task<int> CalculateIncome(Dictionary<string, UserStickerRelation> stickers)
  25. {
  26. LastPayout = DateTime.Now;
  27. var result = await stickers.Values.SumAsync(async sticker => await Payout(sticker));
  28. return result > MaxCapacity ? MaxCapacity : result;
  29. }
  30. public async Task<int> Payout(Dictionary<string, UserStickerRelation> stickers)
  31. {
  32. var result = await stickers.Values.SumAsync(async sticker => await Payout(sticker, true));
  33. result = result > MaxCapacity ? MaxCapacity : result;
  34. Coins += result;
  35. return result;
  36. }
  37. private async Task<int> Payout(UserStickerRelation relation, bool updatePayout = false)
  38. {
  39. var stickerInfo = await StickerDao.GetById(relation.StickerId);
  40. var payoutInterval = LastPayout - relation.Payout;
  41. var payoutsCount = (int) (payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
  42. if (updatePayout) relation.Payout = LastPayout;
  43. if (payoutsCount < 1) return 0;
  44. return stickerInfo.Income * payoutsCount * relation.Count;
  45. }
  46. }
  47. }