UserEntity.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. using System.Collections.Generic;
  2. using System.ComponentModel.DataAnnotations;
  3. using System.ComponentModel.DataAnnotations.Schema;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using CardCollector.Controllers;
  7. using CardCollector.DataBase.EntityDao;
  8. using CardCollector.Resources;
  9. using CardCollector.Session;
  10. using CardCollector.StickerEffects;
  11. namespace CardCollector.DataBase.Entity
  12. {
  13. /* Этот класс представляет собой строку таблицы users и описывает объект пользователя */
  14. [Table("users")]
  15. public class UserEntity
  16. {
  17. /* Id пользователя */
  18. [Key]
  19. [Column("id"), MaxLength(127)] public long Id { get; set; }
  20. /* Id чата */
  21. [Column("chat_id"), MaxLength(127)] public long ChatId { get; set; }
  22. /* Имя пользователя */
  23. [Column("username"), MaxLength(256)] public string Username { get; set; } = "";
  24. /* Заблокирован ли пользователь */
  25. [Column("is_blocked"), MaxLength(11)] public bool IsBlocked { get; set; } = false;
  26. /* Уровень привилегий пользователя */
  27. [Column("privilege_level"), MaxLength(32)] public int PrivilegeLevel { get; set; } = 0;
  28. /* Счет пользователя */
  29. [NotMapped] public CashEntity Cash { get; set; }
  30. /*Уровень пользователя*/
  31. [NotMapped] public UserLevel CurrentLevel { get; set; }
  32. [NotMapped] public UserSettings Settings { get; set; }
  33. /* Стикеры пользователя */
  34. [NotMapped] public Dictionary<string, UserStickerRelationEntity> Stickers { get; set; }
  35. /* Данные, хранящиеся в рамках одной сессии */
  36. [NotMapped] public UserSession Session;
  37. /* Удаляет из чата все сообщения, добавленные в список выше */
  38. public async Task ClearChat()
  39. {
  40. await Session.ClearMessages();
  41. }
  42. /* Возвращает стикеры пользователя */
  43. public async Task<IEnumerable<StickerEntity>> GetStickersList(string filter, int tier = -1)
  44. {
  45. if (Constants.UNLIMITED_ALL_STICKERS) return await StickerDao.GetAll(filter);
  46. var relationStickers = Stickers.Values.Where(relation => relation.Count > 0);
  47. var stickerList = await Task.WhenAll(relationStickers
  48. .Select(async rel => await StickerDao.GetByHash(rel.ShortHash)));
  49. return stickerList.Where(sticker => sticker.Contains(filter) && (tier == -1 || sticker.Tier == tier));
  50. }
  51. public async Task<int> AuctionDiscount()
  52. {
  53. return await AuctionDiscount5.IsApplied(Stickers) ? 5 : 0;
  54. }
  55. public async Task GiveExp(long count)
  56. {
  57. CurrentLevel.CurrentExp += count;
  58. CurrentLevel.TotalExp += count;
  59. var levelInfo = await LevelDao.GetLevel(CurrentLevel.Level + 1);
  60. if (levelInfo?.LevelExpGoal <= CurrentLevel.CurrentExp) await ClearChat();
  61. while (levelInfo?.LevelExpGoal <= CurrentLevel.CurrentExp)
  62. {
  63. CurrentLevel.CurrentExp -= levelInfo.LevelExpGoal;
  64. CurrentLevel.Level++;
  65. var levelReward = levelInfo.GetRewardInstance();
  66. var message = $"{Messages.congratulation_new_level} {CurrentLevel.Level}" +
  67. $"\n{await levelReward.GetReward(this)}";
  68. await MessageController.SendMessage(this, message, addToList: false);
  69. levelInfo = await LevelDao.GetLevel(CurrentLevel.Level + 1);
  70. }
  71. }
  72. public UserEntity()
  73. {
  74. Session = new UserSession(this);
  75. }
  76. }
  77. }