using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using CompatApiClient; using Microsoft.EntityFrameworkCore; namespace CompatBot.Database { internal class BotDb: DbContext { public DbSet BotState { get; set; } public DbSet Moderator { get; set; } public DbSet Piracystring { get; set; } public DbSet Warning { get; set; } public DbSet Explanation { get; set; } public DbSet DisabledCommands { get; set; } public DbSet WhitelistedInvites { get; set; } public DbSet EventSchedule { get; set; } public DbSet Stats { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dbPath = DbImporter.GetDbPath("bot.db", Environment.SpecialFolder.ApplicationData); optionsBuilder.UseSqlite($"Data Source=\"{dbPath}\""); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //configure indices modelBuilder.Entity().HasIndex(m => m.Key).IsUnique().HasName("bot_state_key"); modelBuilder.Entity().HasIndex(m => m.DiscordId).IsUnique().HasName("moderator_discord_id"); modelBuilder.Entity().HasIndex(ps => ps.String).IsUnique().HasName("piracystring_string"); modelBuilder.Entity().HasIndex(w => w.DiscordId).HasName("warning_discord_id"); modelBuilder.Entity().HasIndex(e => e.Keyword).IsUnique().HasName("explanation_keyword"); modelBuilder.Entity().HasIndex(c => c.Command).IsUnique().HasName("disabled_command_command"); modelBuilder.Entity().HasIndex(i => i.GuildId).IsUnique().HasName("whitelisted_invite_guild_id"); modelBuilder.Entity().HasIndex(e => new {e.Year, e.EventName}).HasName("event_schedule_year_event_name"); modelBuilder.Entity().HasIndex(s => new { s.Category, s.Key }).IsUnique().HasName("stats_category_key"); //configure default policy of Id being the primary key modelBuilder.ConfigureDefaultPkConvention(); //configure name conversion for all configured entities from CamelCase to snake_case modelBuilder.ConfigureMapping(NamingStyles.Underscore); } } internal class BotState { public int Id { get; set; } public string Key { get; set; } public string Value { get; set; } } internal class Moderator { public int Id { get; set; } public ulong DiscordId { get; set; } public bool Sudoer { get; set; } } internal class Piracystring { public int Id { get; set; } [Required, Column(TypeName = "varchar(255)")] public string String { get; set; } } internal class Warning { public int Id { get; set; } public ulong DiscordId { get; set; } public ulong IssuerId { get; set; } [Required] public string Reason { get; set; } [Required] public string FullReason { get; set; } public long? Timestamp { get; set; } public bool Retracted { get; set; } public ulong? RetractedBy { get; set; } public string RetractionReason { get; set; } public long? RetractionTimestamp { get; set; } } internal class Explanation { public int Id { get; set; } [Required] public string Keyword { get; set; } [Required] public string Text { get; set; } [MaxLength(7*1024*1024)] public byte[] Attachment { get; set; } public string AttachmentFilename { get; set; } } internal class DisabledCommand { public int Id { get; set; } [Required] public string Command { get; set; } } internal class WhitelistedInvite { public int Id { get; set; } public ulong GuildId { get; set; } public string Name { get; set; } public string InviteCode { get; set; } } internal class EventSchedule { public int Id { get; set; } public int Year { get; set; } public long Start { get; set; } public long End { get; set; } public string Name { get; set; } public string EventName { get; set; } } internal class Stats { public int Id { get; set; } [Required] public string Category { get; set; } [Required] public string Key { get; set; } public int Value { get; set; } public long ExpirationTimestamp { get; set; } } }