mirror of
https://github.com/RPCS3/discord-bot.git
synced 2026-01-31 01:25:22 +01:00
139 lines
4.7 KiB
C#
139 lines
4.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using CompatApiClient;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace CompatBot.Database
|
|
{
|
|
internal class ThumbnailDb : DbContext
|
|
{
|
|
public DbSet<State> State { get; set; } = null!;
|
|
public DbSet<Thumbnail> Thumbnail { get; set; } = null!;
|
|
public DbSet<SyscallInfo> SyscallInfo { get; set; } = null!;
|
|
public DbSet<SyscallToProductMap> SyscallToProductMap { get; set; } = null!;
|
|
public DbSet<Metacritic> Metacritic { get; set; } = null!;
|
|
public DbSet<Fortune> Fortune { get; set; } = null!;
|
|
public DbSet<NamePool> NamePool { get; set; } = null!;
|
|
|
|
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
|
{
|
|
var dbPath = DbImporter.GetDbPath("thumbs.db", Environment.SpecialFolder.LocalApplicationData);
|
|
#if DEBUG
|
|
optionsBuilder.UseLoggerFactory(Config.LoggerFactory);
|
|
#endif
|
|
optionsBuilder.UseSqlite($"Data Source=\"{dbPath}\"");
|
|
}
|
|
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
{
|
|
//configure indices
|
|
modelBuilder.Entity<State>().HasIndex(s => s.Locale).IsUnique().HasDatabaseName("state_locale");
|
|
modelBuilder.Entity<State>().HasIndex(s => s.Timestamp).HasDatabaseName("state_timestamp");
|
|
modelBuilder.Entity<Thumbnail>().HasIndex(m => m.ProductCode).IsUnique().HasDatabaseName("thumbnail_product_code");
|
|
modelBuilder.Entity<Thumbnail>().HasIndex(m => m.ContentId).IsUnique().HasDatabaseName("thumbnail_content_id");
|
|
modelBuilder.Entity<Thumbnail>().HasIndex(m => m.Timestamp).HasDatabaseName("thumbnail_timestamp");
|
|
modelBuilder.Entity<SyscallInfo>().HasIndex(sci => sci.Function).HasDatabaseName("syscall_info_function");
|
|
modelBuilder.Entity<SyscallToProductMap>().HasKey(m => new {m.ProductId, m.SyscallInfoId});
|
|
modelBuilder.Entity<Fortune>();
|
|
modelBuilder.Entity<NamePool>();
|
|
|
|
//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 State
|
|
{
|
|
public int Id { get; set; }
|
|
public string? Locale { get; set; }
|
|
public long Timestamp { get; set; }
|
|
}
|
|
|
|
internal class Thumbnail
|
|
{
|
|
public int Id { get; set; }
|
|
[Required]
|
|
public string ProductCode { get; set; } = null!;
|
|
public string? ContentId { get; set; }
|
|
public string? Name { get; set; }
|
|
public string? Url { get; set; }
|
|
public string? EmbeddableUrl { get; set; }
|
|
public long Timestamp { get; set; }
|
|
public int? EmbedColor { get; set; }
|
|
public CompatStatus? CompatibilityStatus { get; set; }
|
|
public long? CompatibilityChangeDate { get; set; }
|
|
|
|
public int? MetacriticId { get; set; }
|
|
public Metacritic? Metacritic { get; set; }
|
|
|
|
public List<SyscallToProductMap> SyscallToProductMap { get; set; } = null!;
|
|
}
|
|
|
|
public enum CompatStatus : byte
|
|
{
|
|
Unknown = 0,
|
|
Nothing = 10,
|
|
Loadable = 20,
|
|
Intro = 30,
|
|
Ingame = 40,
|
|
Playable = 50,
|
|
}
|
|
|
|
internal class SyscallInfo
|
|
{
|
|
public int Id { get; set; }
|
|
[Required]
|
|
public string Function { get; set; } = null!;
|
|
|
|
public List<SyscallToProductMap> SyscallToProductMap { get; set; } = null!;
|
|
}
|
|
|
|
internal class SyscallToProductMap
|
|
{
|
|
public int ProductId { get; set; }
|
|
public Thumbnail Product { get; set; } = null!;
|
|
|
|
public int SyscallInfoId { get; set; }
|
|
public SyscallInfo SyscallInfo { get; set; } = null!;
|
|
}
|
|
|
|
internal class Metacritic
|
|
{
|
|
public int Id { get; set; }
|
|
[Required]
|
|
public string Title { get; set; } = null!;
|
|
public byte? CriticScore { get; set; }
|
|
public byte? UserScore { get; set; }
|
|
public string? Notes { get; set; }
|
|
|
|
public Metacritic WithTitle(string title)
|
|
{
|
|
return new()
|
|
{
|
|
Title = title,
|
|
CriticScore = CriticScore,
|
|
UserScore = UserScore,
|
|
Notes = Notes,
|
|
};
|
|
}
|
|
}
|
|
|
|
internal class Fortune
|
|
{
|
|
public int Id { get; set; }
|
|
[Required]
|
|
public string Content { get; set; } = null!;
|
|
}
|
|
|
|
internal class NamePool
|
|
{
|
|
public int Id { get; set; }
|
|
[Required]
|
|
public string Name { get; set; } = null!;
|
|
}
|
|
}
|