using Discord.WebSocket; using EventBot.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using System.Linq; namespace EventBot.Services { public abstract class DatabaseService : DbContext { private readonly IServiceProvider _services; private readonly DiscordSocketClient _discord; public DbSet GuildConfigs { get; set; } public DbSet Events { get; set; } public DbSet EventRoles { get; set; } public DbSet EventParticipants { get; set; } public DatabaseService(IServiceProvider services, DbContextOptions options) : base(options) { _services = services; _discord = services.GetRequiredService(); _discord.GuildAvailable += OnGuildAvaivable; } public DatabaseService(IServiceProvider services) : base() { _services = services; _discord = services.GetRequiredService(); _discord.GuildAvailable += OnGuildAvaivable; _discord.JoinedGuild += OnGuildAvaivable; } public DatabaseService(): base() {} protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseLazyLoadingProxies(); } public async Task InitializeAsync() { await Database.MigrateAsync(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().Property(e => e.Type) .HasConversion(new EnumToNumberConverter()); } protected async Task OnGuildAvaivable(SocketGuild guild) { GuildConfig config = default; if(await GuildConfigs.CountAsync() != 0) config = await GuildConfigs.FirstAsync(g => g.GuildId == guild.Id); if(config == null) { config = new GuildConfig() { GuildId = guild.Id }; Add(config); await SaveChangesAsync(); } } } }