BotDatabase.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using CardCollector.DataBase.Entity;
  6. using Microsoft.EntityFrameworkCore;
  7. // ReSharper disable UnusedAutoPropertyAccessor.Global
  8. namespace CardCollector.DataBase
  9. {
  10. using static Resources.AppSettings;
  11. /* Предоставляет доступ к базе данных */
  12. public class BotDatabase : DbContext
  13. {
  14. /* Скрываем конструктор, чтобы его нельзя было использовать извне */
  15. private BotDatabase() { }
  16. protected DateTime _lastSave = DateTime.Now;
  17. /* Объект базы данных */
  18. private static Dictionary<Type, BotDatabase> ClassInstances = new();
  19. public static BotDatabase GetClassInstance(Type t)
  20. {
  21. if (!ClassInstances.ContainsKey(t))
  22. {
  23. ClassInstances.Add(t, new BotDatabase());
  24. ClassInstances[t].Database.EnsureCreated();
  25. }
  26. return ClassInstances[t];
  27. }
  28. /* Таблицы базы данных, представленные Entity объектами */
  29. public DbSet<UserEntity> Users { get; set; }
  30. public DbSet<CashEntity> Cash { get; set; }
  31. public DbSet<UserStickerRelation> UserStickerRelations { get; set; }
  32. public DbSet<StickerEntity> Stickers { get; set; }
  33. public DbSet<AuctionEntity> Auction { get; set; }
  34. public DbSet<ShopEntity> Shop { get; set; }
  35. public DbSet<DailyTaskEntity> DailyTasks { get; set; }
  36. public DbSet<UserPacks> UsersPacks { get; set; }
  37. public DbSet<PackEntity> Packs { get; set; }
  38. public DbSet<SpecialOfferUsers> SpecialOfferUsers { get; set; }
  39. public DbSet<SessionToken> SessionTokens { get; set; }
  40. public DbSet<UserLevel> UserLevel { get; set; }
  41. public DbSet<Level> Levels { get; set; }
  42. public DbSet<UserSettings> Settings { get; set; }
  43. public DbSet<CountLogs> CountLogs { get; set; }
  44. public DbSet<UserMessages> UserMessages { get; set; }
  45. /* Конфигурация подключения к БД */
  46. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  47. {
  48. optionsBuilder.UseMySQL(
  49. $"server={DB_IP};" +
  50. $"port={DB_PORT};" +
  51. $"database={DB_SCHEMA};" +
  52. $"uid={DB_UID};" +
  53. $"pwd={DB_PWD}"
  54. );
  55. }
  56. public static async Task SaveData()
  57. {
  58. foreach (var instance in ClassInstances.Values)
  59. await instance.SaveChangesAsync();
  60. }
  61. public override void Dispose()
  62. {
  63. SaveChanges();
  64. base.Dispose();
  65. }
  66. public override async ValueTask DisposeAsync()
  67. {
  68. await SaveChangesAsync();
  69. await base.DisposeAsync();
  70. }
  71. public override int SaveChanges()
  72. {
  73. var count = base.SaveChanges();
  74. if (count > 0) _lastSave = DateTime.Now;
  75. return count;
  76. }
  77. public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = new())
  78. {
  79. try
  80. {
  81. var count = await base.SaveChangesAsync(cancellationToken);
  82. if (count > 0) _lastSave = DateTime.Now;
  83. return count;
  84. }
  85. catch (InvalidOperationException)
  86. {
  87. Thread.Sleep(Utilities.rnd.Next(30));
  88. return await SaveChangesAsync(cancellationToken);
  89. }
  90. }
  91. }
  92. }