UserStickerRelationDao.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using CardCollector.DataBase.Entity;
  8. using Microsoft.EntityFrameworkCore;
  9. namespace CardCollector.DataBase.EntityDao
  10. {
  11. /* Предоставляет доступ к соотношениям таблицы user_to_sticker_relation */
  12. public static class UserStickerRelationDao
  13. {
  14. public static BotDatabase Instance;
  15. public static DbSet<UserStickerRelation> Table;
  16. static UserStickerRelationDao()
  17. {
  18. Instance = BotDatabase.GetClassInstance(typeof(UserStickerRelationDao));
  19. Table = Instance.UserStickerRelations;
  20. }
  21. /* Возвращает словарь стикеров по Id пользователя */
  22. public static async Task<Dictionary<string, UserStickerRelation>> GetListById(long userId)
  23. {
  24. try
  25. {
  26. return await Table.Where(i => i.UserId == userId).ToDictionaryAsync(p => p.ShortHash, p => p);
  27. }
  28. catch (InvalidOperationException)
  29. {
  30. Thread.Sleep(Utilities.rnd.Next(30));
  31. return await GetListById(userId);
  32. }
  33. }
  34. /* Добавляет новое отношение в таблицу */
  35. public static async Task<UserStickerRelation> AddSticker(UserEntity user, StickerEntity sticker, int count = 1)
  36. {
  37. try
  38. {
  39. if (user.Stickers.ContainsKey(sticker.Md5Hash))
  40. {
  41. user.Stickers[sticker.Md5Hash].Count += count;
  42. return user.Stickers[sticker.Md5Hash];
  43. }
  44. var relation = new UserStickerRelation
  45. {
  46. UserId = user.Id,
  47. StickerId = sticker.Id,
  48. Count = count,
  49. ShortHash = sticker.Md5Hash
  50. };
  51. await sticker.ApplyEffect(user, relation);
  52. var result = await Table.AddAsync(relation);
  53. user.Stickers.Add(sticker.Md5Hash, result.Entity);
  54. await BotDatabase.SaveData();
  55. return result.Entity;
  56. }
  57. catch (InvalidOperationException)
  58. {
  59. Thread.Sleep(Utilities.rnd.Next(30));
  60. return await AddSticker(user, sticker, count);
  61. }
  62. }
  63. public static async Task<List<UserStickerRelation>> GetListWhere(
  64. Expression<Func<UserStickerRelation, bool>> predicate)
  65. {
  66. try
  67. {
  68. return await Table.Where(predicate).ToListAsync();
  69. }
  70. catch (InvalidOperationException)
  71. {
  72. Thread.Sleep(Utilities.rnd.Next(30));
  73. return await GetListWhere(predicate);
  74. }
  75. }
  76. }
  77. }