diff --git a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs index a034f503b4..dc263d6055 100644 --- a/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs +++ b/Content.Client/Administration/UI/BanPanel/BanPanel.xaml.cs @@ -22,11 +22,11 @@ namespace Content.Client.Administration.UI.BanPanel; [GenerateTypedNameReferences] public sealed partial class BanPanel : DefaultWindow { - public event Action? BanSubmitted; + public event Action? BanSubmitted; public event Action? PlayerChanged; private string? PlayerUsername { get; set; } private (IPAddress, int)? IpAddress { get; set; } - private ImmutableTypedHwid? Hwid { get; set; } + private byte[]? Hwid { get; set; } private double TimeEntered { get; set; } private uint Multiplier { get; set; } private bool HasBanFlag { get; set; } @@ -371,8 +371,9 @@ private void OnIpChanged() private void OnHwidChanged() { var hwidString = HwidLine.Text; - ImmutableTypedHwid? hwid = null; - if (HwidCheckbox.Pressed && !(string.IsNullOrEmpty(hwidString) && LastConnCheckbox.Pressed) && !ImmutableTypedHwid.TryParse(hwidString, out hwid)) + var length = 3 * (hwidString.Length / 4) - hwidString.TakeLast(2).Count(c => c == '='); + Hwid = new byte[length]; + if (HwidCheckbox.Pressed && !(string.IsNullOrEmpty(hwidString) && LastConnCheckbox.Pressed) && !Convert.TryFromBase64String(hwidString, Hwid, out _)) { ErrorLevel |= ErrorLevelEnum.Hwid; HwidLine.ModulateSelfOverride = Color.Red; @@ -389,7 +390,7 @@ private void OnHwidChanged() Hwid = null; return; } - Hwid = hwid; + Hwid = Convert.FromHexString(hwidString); } private void OnTypeChanged() diff --git a/Content.IntegrationTests/Tests/Commands/PardonCommand.cs b/Content.IntegrationTests/Tests/Commands/PardonCommand.cs index 9e57cd4b0e..4db9eabf5c 100644 --- a/Content.IntegrationTests/Tests/Commands/PardonCommand.cs +++ b/Content.IntegrationTests/Tests/Commands/PardonCommand.cs @@ -32,9 +32,9 @@ public async Task PardonTest() // No bans on record Assert.Multiple(async () => { - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Null); Assert.That(await sDatabase.GetServerBanAsync(1), Is.Null); - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Is.Empty); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Is.Empty); }); // Try to pardon a ban that does not exist @@ -43,9 +43,9 @@ public async Task PardonTest() // Still no bans on record Assert.Multiple(async () => { - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Null); Assert.That(await sDatabase.GetServerBanAsync(1), Is.Null); - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Is.Empty); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Is.Empty); }); var banReason = "test"; @@ -57,9 +57,9 @@ public async Task PardonTest() // Should have one ban on record now Assert.Multiple(async () => { - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Not.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Not.Null); Assert.That(await sDatabase.GetServerBanAsync(1), Is.Not.Null); - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1)); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Has.Count.EqualTo(1)); }); await pair.RunTicksSync(5); @@ -70,13 +70,13 @@ public async Task PardonTest() await server.WaitPost(() => sConsole.ExecuteCommand("pardon 2")); // The existing ban is unaffected - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Not.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Not.Null); var ban = await sDatabase.GetServerBanAsync(1); Assert.Multiple(async () => { Assert.That(ban, Is.Not.Null); - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1)); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Has.Count.EqualTo(1)); // Check that it matches Assert.That(ban.Id, Is.EqualTo(1)); @@ -95,7 +95,7 @@ public async Task PardonTest() await server.WaitPost(() => sConsole.ExecuteCommand("pardon 1")); // No bans should be returned - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Null); // Direct id lookup returns a pardoned ban var pardonedBan = await sDatabase.GetServerBanAsync(1); @@ -105,7 +105,7 @@ public async Task PardonTest() Assert.That(pardonedBan, Is.Not.Null); // The list is still returned since that ignores pardons - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1)); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Has.Count.EqualTo(1)); Assert.That(pardonedBan.Id, Is.EqualTo(1)); Assert.That(pardonedBan.UserId, Is.EqualTo(clientId)); @@ -133,13 +133,13 @@ public async Task PardonTest() Assert.Multiple(async () => { // No bans should be returned - Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null, null), Is.Null); + Assert.That(await sDatabase.GetServerBanAsync(null, clientId, null), Is.Null); // Direct id lookup returns a pardoned ban Assert.That(await sDatabase.GetServerBanAsync(1), Is.Not.Null); // The list is still returned since that ignores pardons - Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null, null), Has.Count.EqualTo(1)); + Assert.That(await sDatabase.GetServerBansAsync(null, clientId, null), Has.Count.EqualTo(1)); }); // Reconnect client. Slightly faster than dirtying the pair. diff --git a/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.Designer.cs b/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.Designer.cs deleted file mode 100644 index 155d6a163f..0000000000 --- a/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.Designer.cs +++ /dev/null @@ -1,2072 +0,0 @@ -// -using System; -using System.Net; -using System.Text.Json; -using Content.Server.Database; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using NpgsqlTypes; - -#nullable disable - -namespace Content.Server.Database.Migrations.Postgres -{ - [DbContext(typeof(PostgresServerDbContext))] - [Migration("20241111170112_ModernHwid")] - partial class ModernHwid - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("AdminRankId") - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - b.Property("Title") - .HasColumnType("text") - .HasColumnName("title"); - - b.HasKey("UserId") - .HasName("PK_admin"); - - b.HasIndex("AdminRankId") - .HasDatabaseName("IX_admin_admin_rank_id"); - - b.ToTable("admin", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_flag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminId") - .HasColumnType("uuid") - .HasColumnName("admin_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flag"); - - b.Property("Negative") - .HasColumnType("boolean") - .HasColumnName("negative"); - - b.HasKey("Id") - .HasName("PK_admin_flag"); - - b.HasIndex("AdminId") - .HasDatabaseName("IX_admin_flag_admin_id"); - - b.HasIndex("Flag", "AdminId") - .IsUnique(); - - b.ToTable("admin_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Id") - .HasColumnType("integer") - .HasColumnName("admin_log_id"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Impact") - .HasColumnType("smallint") - .HasColumnName("impact"); - - b.Property("Json") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("json"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message"); - - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("type"); - - b.HasKey("RoundId", "Id") - .HasName("PK_admin_log"); - - b.HasIndex("Date"); - - b.HasIndex("Message") - .HasAnnotation("Npgsql:TsVectorConfig", "english"); - - NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Message"), "GIN"); - - b.HasIndex("Type") - .HasDatabaseName("IX_admin_log_type"); - - b.ToTable("admin_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("LogId") - .HasColumnType("integer") - .HasColumnName("log_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.HasKey("RoundId", "LogId", "PlayerUserId") - .HasName("PK_admin_log_player"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_log_player_player_user_id"); - - b.ToTable("admin_log_player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_messages_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("Dismissed") - .HasColumnType("boolean") - .HasColumnName("dismissed"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Seen") - .HasColumnType("boolean") - .HasColumnName("seen"); - - b.HasKey("Id") - .HasName("PK_admin_messages"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_messages_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_messages_round_id"); - - b.ToTable("admin_messages", null, t => - { - t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_notes_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Secret") - .HasColumnType("boolean") - .HasColumnName("secret"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_admin_notes"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_notes_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_notes_round_id"); - - b.ToTable("admin_notes", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_admin_rank"); - - b.ToTable("admin_rank", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_rank_flag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminRankId") - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flag"); - - b.HasKey("Id") - .HasName("PK_admin_rank_flag"); - - b.HasIndex("AdminRankId"); - - b.HasIndex("Flag", "AdminRankId") - .IsUnique(); - - b.ToTable("admin_rank_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_watchlists_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.HasKey("Id") - .HasName("PK_admin_watchlists"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_watchlists_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_watchlists_round_id"); - - b.ToTable("admin_watchlists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("antag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AntagName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("antag_name"); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_antag"); - - b.HasIndex("ProfileId", "AntagName") - .IsUnique(); - - b.ToTable("antag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("assigned_user_id_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_assigned_user_id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("assigned_user_id", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.BanTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("ban_template_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AutoDelete") - .HasColumnType("boolean") - .HasColumnName("auto_delete"); - - b.Property("ExemptFlags") - .HasColumnType("integer") - .HasColumnName("exempt_flags"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("Length") - .HasColumnType("interval") - .HasColumnName("length"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("PK_ban_template"); - - b.ToTable("ban_template", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("connection_log_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .IsRequired() - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("Denied") - .HasColumnType("smallint") - .HasColumnName("denied"); - - b.Property("ServerId") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("server_id"); - - b.Property("Time") - .HasColumnType("timestamp with time zone") - .HasColumnName("time"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_connection_log"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_connection_log_server_id"); - - b.HasIndex("Time"); - - b.HasIndex("UserId"); - - b.ToTable("connection_log", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("job_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("JobName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("job_name"); - - b.Property("Priority") - .HasColumnType("integer") - .HasColumnName("priority"); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_job"); - - b.HasIndex("ProfileId"); - - b.HasIndex("ProfileId", "JobName") - .IsUnique(); - - b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") - .IsUnique() - .HasFilter("priority = 3"); - - b.ToTable("job", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.PlayTime", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("play_time_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("PlayerId") - .HasColumnType("uuid") - .HasColumnName("player_id"); - - b.Property("TimeSpent") - .HasColumnType("interval") - .HasColumnName("time_spent"); - - b.Property("Tracker") - .IsRequired() - .HasColumnType("text") - .HasColumnName("tracker"); - - b.HasKey("Id") - .HasName("PK_play_time"); - - b.HasIndex("PlayerId", "Tracker") - .IsUnique(); - - b.ToTable("play_time", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("player_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("FirstSeenTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("first_seen_time"); - - b.Property("LastReadRules") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_read_rules"); - - b.Property("LastSeenAddress") - .IsRequired() - .HasColumnType("inet") - .HasColumnName("last_seen_address"); - - b.Property("LastSeenTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_seen_time"); - - b.Property("LastSeenUserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("last_seen_user_name"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_player"); - - b.HasAlternateKey("UserId") - .HasName("ak_player_user_id"); - - b.HasIndex("LastSeenUserName"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("player", null, t => - { - t.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("preference_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminOOCColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("admin_ooc_color"); - - b.Property("SelectedCharacterSlot") - .HasColumnType("integer") - .HasColumnName("selected_character_slot"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_preference"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("preference", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("integer") - .HasColumnName("age"); - - b.Property("CharacterName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("char_name"); - - b.Property("EyeColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("eye_color"); - - b.Property("FacialHairColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("facial_hair_color"); - - b.Property("FacialHairName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("facial_hair_name"); - - b.Property("FlavorText") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flavor_text"); - - b.Property("Gender") - .IsRequired() - .HasColumnType("text") - .HasColumnName("gender"); - - b.Property("HairColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("hair_color"); - - b.Property("HairName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("hair_name"); - - b.Property("Markings") - .HasColumnType("jsonb") - .HasColumnName("markings"); - - b.Property("PreferenceId") - .HasColumnType("integer") - .HasColumnName("preference_id"); - - b.Property("PreferenceUnavailable") - .HasColumnType("integer") - .HasColumnName("pref_unavailable"); - - b.Property("Sex") - .IsRequired() - .HasColumnType("text") - .HasColumnName("sex"); - - b.Property("SkinColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("skin_color"); - - b.Property("Slot") - .HasColumnType("integer") - .HasColumnName("slot"); - - b.Property("SpawnPriority") - .HasColumnType("integer") - .HasColumnName("spawn_priority"); - - b.Property("Species") - .IsRequired() - .HasColumnType("text") - .HasColumnName("species"); - - b.HasKey("Id") - .HasName("PK_profile"); - - b.HasIndex("PreferenceId") - .HasDatabaseName("IX_profile_preference_id"); - - b.HasIndex("Slot", "PreferenceId") - .IsUnique(); - - b.ToTable("profile", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_loadout_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("LoadoutName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("loadout_name"); - - b.Property("ProfileLoadoutGroupId") - .HasColumnType("integer") - .HasColumnName("profile_loadout_group_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout"); - - b.HasIndex("ProfileLoadoutGroupId"); - - b.ToTable("profile_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_loadout_group_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("GroupName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("group_name"); - - b.Property("ProfileRoleLoadoutId") - .HasColumnType("integer") - .HasColumnName("profile_role_loadout_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout_group"); - - b.HasIndex("ProfileRoleLoadoutId"); - - b.ToTable("profile_loadout_group", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_role_loadout_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.Property("RoleName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("role_name"); - - b.HasKey("Id") - .HasName("PK_profile_role_loadout"); - - b.HasIndex("ProfileId"); - - b.ToTable("profile_role_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("RoleId") - .HasColumnType("text") - .HasColumnName("role_id"); - - b.HasKey("PlayerUserId", "RoleId") - .HasName("PK_role_whitelists"); - - b.ToTable("role_whitelists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("round_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ServerId") - .HasColumnType("integer") - .HasColumnName("server_id"); - - b.Property("StartDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("start_date"); - - b.HasKey("Id") - .HasName("PK_round"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_round_server_id"); - - b.HasIndex("StartDate"); - - b.ToTable("round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_server"); - - b.ToTable("server", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_ban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("AutoDelete") - .HasColumnType("boolean") - .HasColumnName("auto_delete"); - - b.Property("BanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("uuid") - .HasColumnName("banning_admin"); - - b.Property("ExemptFlags") - .HasColumnType("integer") - .HasColumnName("exempt_flags"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_ban_round_id"); - - b.ToTable("server_ban", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("Flags") - .HasColumnType("integer") - .HasColumnName("flags"); - - b.HasKey("UserId") - .HasName("PK_server_ban_exemption"); - - b.ToTable("server_ban_exemption", null, t => - { - t.HasCheckConstraint("FlagsNotZero", "flags != 0"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_ban_hit_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("ConnectionId") - .HasColumnType("integer") - .HasColumnName("connection_id"); - - b.HasKey("Id") - .HasName("PK_server_ban_hit"); - - b.HasIndex("BanId") - .HasDatabaseName("IX_server_ban_hit_ban_id"); - - b.HasIndex("ConnectionId") - .HasDatabaseName("IX_server_ban_hit_connection_id"); - - b.ToTable("server_ban_hit", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_role_ban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("BanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("uuid") - .HasColumnName("banning_admin"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text") - .HasColumnName("role_id"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_role_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_role_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_role_ban_round_id"); - - b.ToTable("server_role_ban", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("role_unban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("uuid") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_role_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_role_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("unban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("uuid") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("trait_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.Property("TraitName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("trait_name"); - - b.HasKey("Id") - .HasName("PK_trait"); - - b.HasIndex("ProfileId", "TraitName") - .IsUnique(); - - b.ToTable("trait", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("uploaded_resource_log_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Data") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("data"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Path") - .IsRequired() - .HasColumnType("text") - .HasColumnName("path"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_uploaded_resource_log"); - - b.ToTable("uploaded_resource_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Whitelist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_whitelist"); - - b.ToTable("whitelist", (string)null); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.Property("PlayersId") - .HasColumnType("integer") - .HasColumnName("players_id"); - - b.Property("RoundsId") - .HasColumnType("integer") - .HasColumnName("rounds_id"); - - b.HasKey("PlayersId", "RoundsId") - .HasName("PK_player_round"); - - b.HasIndex("RoundsId") - .HasDatabaseName("IX_player_round_rounds_id"); - - b.ToTable("player_round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.HasOne("Content.Server.Database.AdminRank", "AdminRank") - .WithMany("Admins") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); - - b.Navigation("AdminRank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.HasOne("Content.Server.Database.Admin", "Admin") - .WithMany("Flags") - .HasForeignKey("AdminId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_flag_admin_admin_id"); - - b.Navigation("Admin"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany("AdminLogs") - .HasForeignKey("RoundId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_round_round_id"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminLogs") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_player_player_user_id"); - - b.HasOne("Content.Server.Database.AdminLog", "Log") - .WithMany("Players") - .HasForeignKey("RoundId", "LogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); - - b.Navigation("Log"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminMessagesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminMessagesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminMessagesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminMessagesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_messages_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_messages_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminNotesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminNotesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminNotesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminNotesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_notes_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_notes_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.HasOne("Content.Server.Database.AdminRank", "Rank") - .WithMany("Flags") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); - - b.Navigation("Rank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminWatchlistsCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminWatchlistsDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminWatchlistsLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminWatchlistsReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_watchlists_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_watchlists_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Antags") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_antag_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("ConnectionLogs") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired() - .HasConstraintName("FK_connection_log_server_server_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("integer") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Jobs") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_job_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("integer") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.HasOne("Content.Server.Database.Preference", "Preference") - .WithMany("Profiles") - .HasForeignKey("PreferenceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_preference_preference_id"); - - b.Navigation("Preference"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.HasOne("Content.Server.Database.ProfileLoadoutGroup", "ProfileLoadoutGroup") - .WithMany("Loadouts") - .HasForeignKey("ProfileLoadoutGroupId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_profile_loadout_group_profile_loadout_group~"); - - b.Navigation("ProfileLoadoutGroup"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.HasOne("Content.Server.Database.ProfileRoleLoadout", "ProfileRoleLoadout") - .WithMany("Groups") - .HasForeignKey("ProfileRoleLoadoutId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_group_profile_role_loadout_profile_role_loa~"); - - b.Navigation("ProfileRoleLoadout"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Loadouts") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_role_loadout_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("JobWhitelists") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_role_whitelists_player_player_user_id"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("Rounds") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_round_server_server_id"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("integer") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithMany("BanHits") - .HasForeignKey("BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); - - b.HasOne("Content.Server.Database.ConnectionLog", "Connection") - .WithMany("BanHits") - .HasForeignKey("ConnectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); - - b.Navigation("Ban"); - - b.Navigation("Connection"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerRoleBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerRoleBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_role_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("integer") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_unban_server_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Traits") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_trait_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.HasOne("Content.Server.Database.Player", null) - .WithMany() - .HasForeignKey("PlayersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_player_players_id"); - - b.HasOne("Content.Server.Database.Round", null) - .WithMany() - .HasForeignKey("RoundsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_round_rounds_id"); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Navigation("Players"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Navigation("Admins"); - - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Navigation("BanHits"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Navigation("AdminLogs"); - - b.Navigation("AdminMessagesCreated"); - - b.Navigation("AdminMessagesDeleted"); - - b.Navigation("AdminMessagesLastEdited"); - - b.Navigation("AdminMessagesReceived"); - - b.Navigation("AdminNotesCreated"); - - b.Navigation("AdminNotesDeleted"); - - b.Navigation("AdminNotesLastEdited"); - - b.Navigation("AdminNotesReceived"); - - b.Navigation("AdminServerBansCreated"); - - b.Navigation("AdminServerBansLastEdited"); - - b.Navigation("AdminServerRoleBansCreated"); - - b.Navigation("AdminServerRoleBansLastEdited"); - - b.Navigation("AdminWatchlistsCreated"); - - b.Navigation("AdminWatchlistsDeleted"); - - b.Navigation("AdminWatchlistsLastEdited"); - - b.Navigation("AdminWatchlistsReceived"); - - b.Navigation("JobWhitelists"); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Navigation("Profiles"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Navigation("Antags"); - - b.Navigation("Jobs"); - - b.Navigation("Loadouts"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Navigation("Loadouts"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Navigation("Groups"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Navigation("AdminLogs"); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Navigation("ConnectionLogs"); - - b.Navigation("Rounds"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Navigation("BanHits"); - - b.Navigation("Unban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Navigation("Unban"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.cs b/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.cs deleted file mode 100644 index c70a5ffaa5..0000000000 --- a/Content.Server.Database/Migrations/Postgres/20241111170112_ModernHwid.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Content.Server.Database.Migrations.Postgres -{ - /// - public partial class ModernHwid : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "hwid_type", - table: "server_role_ban", - type: "integer", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "hwid_type", - table: "server_ban", - type: "integer", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "last_seen_hwid_type", - table: "player", - type: "integer", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "hwid_type", - table: "connection_log", - type: "integer", - nullable: true, - defaultValue: 0); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "hwid_type", - table: "server_role_ban"); - - migrationBuilder.DropColumn( - name: "hwid_type", - table: "server_ban"); - - migrationBuilder.DropColumn( - name: "last_seen_hwid_type", - table: "player"); - - migrationBuilder.DropColumn( - name: "hwid_type", - table: "connection_log"); - } - } -} diff --git a/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.Designer.cs b/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.Designer.cs deleted file mode 100644 index dc1b4a0eeb..0000000000 --- a/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.Designer.cs +++ /dev/null @@ -1,2076 +0,0 @@ -// -using System; -using System.Net; -using System.Text.Json; -using Content.Server.Database; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using NpgsqlTypes; - -#nullable disable - -namespace Content.Server.Database.Migrations.Postgres -{ - [DbContext(typeof(PostgresServerDbContext))] - [Migration("20241111193608_ConnectionTrust")] - partial class ConnectionTrust - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("AdminRankId") - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - b.Property("Title") - .HasColumnType("text") - .HasColumnName("title"); - - b.HasKey("UserId") - .HasName("PK_admin"); - - b.HasIndex("AdminRankId") - .HasDatabaseName("IX_admin_admin_rank_id"); - - b.ToTable("admin", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_flag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminId") - .HasColumnType("uuid") - .HasColumnName("admin_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flag"); - - b.Property("Negative") - .HasColumnType("boolean") - .HasColumnName("negative"); - - b.HasKey("Id") - .HasName("PK_admin_flag"); - - b.HasIndex("AdminId") - .HasDatabaseName("IX_admin_flag_admin_id"); - - b.HasIndex("Flag", "AdminId") - .IsUnique(); - - b.ToTable("admin_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Id") - .HasColumnType("integer") - .HasColumnName("admin_log_id"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Impact") - .HasColumnType("smallint") - .HasColumnName("impact"); - - b.Property("Json") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("json"); - - b.Property("Message") - .IsRequired() - .HasColumnType("text") - .HasColumnName("message"); - - b.Property("Type") - .HasColumnType("integer") - .HasColumnName("type"); - - b.HasKey("RoundId", "Id") - .HasName("PK_admin_log"); - - b.HasIndex("Date"); - - b.HasIndex("Message") - .HasAnnotation("Npgsql:TsVectorConfig", "english"); - - NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Message"), "GIN"); - - b.HasIndex("Type") - .HasDatabaseName("IX_admin_log_type"); - - b.ToTable("admin_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("LogId") - .HasColumnType("integer") - .HasColumnName("log_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.HasKey("RoundId", "LogId", "PlayerUserId") - .HasName("PK_admin_log_player"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_log_player_player_user_id"); - - b.ToTable("admin_log_player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_messages_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("Dismissed") - .HasColumnType("boolean") - .HasColumnName("dismissed"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Seen") - .HasColumnType("boolean") - .HasColumnName("seen"); - - b.HasKey("Id") - .HasName("PK_admin_messages"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_messages_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_messages_round_id"); - - b.ToTable("admin_messages", null, t => - { - t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_notes_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Secret") - .HasColumnType("boolean") - .HasColumnName("secret"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_admin_notes"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_notes_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_notes_round_id"); - - b.ToTable("admin_notes", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_admin_rank"); - - b.ToTable("admin_rank", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_rank_flag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminRankId") - .HasColumnType("integer") - .HasColumnName("admin_rank_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flag"); - - b.HasKey("Id") - .HasName("PK_admin_rank_flag"); - - b.HasIndex("AdminRankId"); - - b.HasIndex("Flag", "AdminRankId") - .IsUnique(); - - b.ToTable("admin_rank_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("admin_watchlists_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("uuid") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("boolean") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("character varying(4096)") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.HasKey("Id") - .HasName("PK_admin_watchlists"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_watchlists_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_watchlists_round_id"); - - b.ToTable("admin_watchlists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("antag_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AntagName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("antag_name"); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_antag"); - - b.HasIndex("ProfileId", "AntagName") - .IsUnique(); - - b.ToTable("antag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("assigned_user_id_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_assigned_user_id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("assigned_user_id", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.BanTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("ban_template_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AutoDelete") - .HasColumnType("boolean") - .HasColumnName("auto_delete"); - - b.Property("ExemptFlags") - .HasColumnType("integer") - .HasColumnName("exempt_flags"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("Length") - .HasColumnType("interval") - .HasColumnName("length"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("PK_ban_template"); - - b.ToTable("ban_template", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("connection_log_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .IsRequired() - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("Denied") - .HasColumnType("smallint") - .HasColumnName("denied"); - - b.Property("ServerId") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("server_id"); - - b.Property("Time") - .HasColumnType("timestamp with time zone") - .HasColumnName("time"); - - b.Property("Trust") - .HasColumnType("real") - .HasColumnName("trust"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_connection_log"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_connection_log_server_id"); - - b.HasIndex("Time"); - - b.HasIndex("UserId"); - - b.ToTable("connection_log", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("job_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("JobName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("job_name"); - - b.Property("Priority") - .HasColumnType("integer") - .HasColumnName("priority"); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_job"); - - b.HasIndex("ProfileId"); - - b.HasIndex("ProfileId", "JobName") - .IsUnique(); - - b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") - .IsUnique() - .HasFilter("priority = 3"); - - b.ToTable("job", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.PlayTime", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("play_time_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("PlayerId") - .HasColumnType("uuid") - .HasColumnName("player_id"); - - b.Property("TimeSpent") - .HasColumnType("interval") - .HasColumnName("time_spent"); - - b.Property("Tracker") - .IsRequired() - .HasColumnType("text") - .HasColumnName("tracker"); - - b.HasKey("Id") - .HasName("PK_play_time"); - - b.HasIndex("PlayerId", "Tracker") - .IsUnique(); - - b.ToTable("play_time", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("player_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("FirstSeenTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("first_seen_time"); - - b.Property("LastReadRules") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_read_rules"); - - b.Property("LastSeenAddress") - .IsRequired() - .HasColumnType("inet") - .HasColumnName("last_seen_address"); - - b.Property("LastSeenTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_seen_time"); - - b.Property("LastSeenUserName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("last_seen_user_name"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_player"); - - b.HasAlternateKey("UserId") - .HasName("ak_player_user_id"); - - b.HasIndex("LastSeenUserName"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("player", null, t => - { - t.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("preference_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AdminOOCColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("admin_ooc_color"); - - b.Property("SelectedCharacterSlot") - .HasColumnType("integer") - .HasColumnName("selected_character_slot"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_preference"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("preference", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Age") - .HasColumnType("integer") - .HasColumnName("age"); - - b.Property("CharacterName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("char_name"); - - b.Property("EyeColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("eye_color"); - - b.Property("FacialHairColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("facial_hair_color"); - - b.Property("FacialHairName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("facial_hair_name"); - - b.Property("FlavorText") - .IsRequired() - .HasColumnType("text") - .HasColumnName("flavor_text"); - - b.Property("Gender") - .IsRequired() - .HasColumnType("text") - .HasColumnName("gender"); - - b.Property("HairColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("hair_color"); - - b.Property("HairName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("hair_name"); - - b.Property("Markings") - .HasColumnType("jsonb") - .HasColumnName("markings"); - - b.Property("PreferenceId") - .HasColumnType("integer") - .HasColumnName("preference_id"); - - b.Property("PreferenceUnavailable") - .HasColumnType("integer") - .HasColumnName("pref_unavailable"); - - b.Property("Sex") - .IsRequired() - .HasColumnType("text") - .HasColumnName("sex"); - - b.Property("SkinColor") - .IsRequired() - .HasColumnType("text") - .HasColumnName("skin_color"); - - b.Property("Slot") - .HasColumnType("integer") - .HasColumnName("slot"); - - b.Property("SpawnPriority") - .HasColumnType("integer") - .HasColumnName("spawn_priority"); - - b.Property("Species") - .IsRequired() - .HasColumnType("text") - .HasColumnName("species"); - - b.HasKey("Id") - .HasName("PK_profile"); - - b.HasIndex("PreferenceId") - .HasDatabaseName("IX_profile_preference_id"); - - b.HasIndex("Slot", "PreferenceId") - .IsUnique(); - - b.ToTable("profile", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_loadout_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("LoadoutName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("loadout_name"); - - b.Property("ProfileLoadoutGroupId") - .HasColumnType("integer") - .HasColumnName("profile_loadout_group_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout"); - - b.HasIndex("ProfileLoadoutGroupId"); - - b.ToTable("profile_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_loadout_group_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("GroupName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("group_name"); - - b.Property("ProfileRoleLoadoutId") - .HasColumnType("integer") - .HasColumnName("profile_role_loadout_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout_group"); - - b.HasIndex("ProfileRoleLoadoutId"); - - b.ToTable("profile_loadout_group", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("profile_role_loadout_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.Property("RoleName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("role_name"); - - b.HasKey("Id") - .HasName("PK_profile_role_loadout"); - - b.HasIndex("ProfileId"); - - b.ToTable("profile_role_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("RoleId") - .HasColumnType("text") - .HasColumnName("role_id"); - - b.HasKey("PlayerUserId", "RoleId") - .HasName("PK_role_whitelists"); - - b.ToTable("role_whitelists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("round_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ServerId") - .HasColumnType("integer") - .HasColumnName("server_id"); - - b.Property("StartDate") - .HasColumnType("timestamp with time zone") - .HasColumnName("start_date"); - - b.HasKey("Id") - .HasName("PK_round"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_round_server_id"); - - b.HasIndex("StartDate"); - - b.ToTable("round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_server"); - - b.ToTable("server", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_ban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("AutoDelete") - .HasColumnType("boolean") - .HasColumnName("auto_delete"); - - b.Property("BanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("uuid") - .HasColumnName("banning_admin"); - - b.Property("ExemptFlags") - .HasColumnType("integer") - .HasColumnName("exempt_flags"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_ban_round_id"); - - b.ToTable("server_ban", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.Property("Flags") - .HasColumnType("integer") - .HasColumnName("flags"); - - b.HasKey("UserId") - .HasName("PK_server_ban_exemption"); - - b.ToTable("server_ban_exemption", null, t => - { - t.HasCheckConstraint("FlagsNotZero", "flags != 0"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_ban_hit_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("ConnectionId") - .HasColumnType("integer") - .HasColumnName("connection_id"); - - b.HasKey("Id") - .HasName("PK_server_ban_hit"); - - b.HasIndex("BanId") - .HasDatabaseName("IX_server_ban_hit_ban_id"); - - b.HasIndex("ConnectionId") - .HasDatabaseName("IX_server_ban_hit_connection_id"); - - b.ToTable("server_ban_hit", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("server_role_ban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .HasColumnType("inet") - .HasColumnName("address"); - - b.Property("BanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("uuid") - .HasColumnName("banning_admin"); - - b.Property("ExpirationTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("boolean") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("timestamp with time zone") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("uuid") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("uuid") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("interval") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("text") - .HasColumnName("reason"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text") - .HasColumnName("role_id"); - - b.Property("RoundId") - .HasColumnType("integer") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("integer") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_role_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_role_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_role_ban_round_id"); - - b.ToTable("server_role_ban", null, t => - { - t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); - - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("role_unban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("uuid") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_role_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_role_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("unban_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("BanId") - .HasColumnType("integer") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("timestamp with time zone") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("uuid") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("trait_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ProfileId") - .HasColumnType("integer") - .HasColumnName("profile_id"); - - b.Property("TraitName") - .IsRequired() - .HasColumnType("text") - .HasColumnName("trait_name"); - - b.HasKey("Id") - .HasName("PK_trait"); - - b.HasIndex("ProfileId", "TraitName") - .IsUnique(); - - b.ToTable("trait", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasColumnName("uploaded_resource_log_id"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Data") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("data"); - - b.Property("Date") - .HasColumnType("timestamp with time zone") - .HasColumnName("date"); - - b.Property("Path") - .IsRequired() - .HasColumnType("text") - .HasColumnName("path"); - - b.Property("UserId") - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_uploaded_resource_log"); - - b.ToTable("uploaded_resource_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Whitelist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_whitelist"); - - b.ToTable("whitelist", (string)null); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.Property("PlayersId") - .HasColumnType("integer") - .HasColumnName("players_id"); - - b.Property("RoundsId") - .HasColumnType("integer") - .HasColumnName("rounds_id"); - - b.HasKey("PlayersId", "RoundsId") - .HasName("PK_player_round"); - - b.HasIndex("RoundsId") - .HasDatabaseName("IX_player_round_rounds_id"); - - b.ToTable("player_round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.HasOne("Content.Server.Database.AdminRank", "AdminRank") - .WithMany("Admins") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); - - b.Navigation("AdminRank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.HasOne("Content.Server.Database.Admin", "Admin") - .WithMany("Flags") - .HasForeignKey("AdminId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_flag_admin_admin_id"); - - b.Navigation("Admin"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany("AdminLogs") - .HasForeignKey("RoundId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_round_round_id"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminLogs") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_player_player_user_id"); - - b.HasOne("Content.Server.Database.AdminLog", "Log") - .WithMany("Players") - .HasForeignKey("RoundId", "LogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); - - b.Navigation("Log"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminMessagesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminMessagesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminMessagesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminMessagesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_messages_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_messages_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminNotesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminNotesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminNotesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminNotesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_notes_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_notes_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.HasOne("Content.Server.Database.AdminRank", "Rank") - .WithMany("Flags") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); - - b.Navigation("Rank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminWatchlistsCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminWatchlistsDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminWatchlistsLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminWatchlistsReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_watchlists_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_watchlists_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Antags") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_antag_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("ConnectionLogs") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired() - .HasConstraintName("FK_connection_log_server_server_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("integer") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Jobs") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_job_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("integer") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.HasOne("Content.Server.Database.Preference", "Preference") - .WithMany("Profiles") - .HasForeignKey("PreferenceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_preference_preference_id"); - - b.Navigation("Preference"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.HasOne("Content.Server.Database.ProfileLoadoutGroup", "ProfileLoadoutGroup") - .WithMany("Loadouts") - .HasForeignKey("ProfileLoadoutGroupId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_profile_loadout_group_profile_loadout_group~"); - - b.Navigation("ProfileLoadoutGroup"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.HasOne("Content.Server.Database.ProfileRoleLoadout", "ProfileRoleLoadout") - .WithMany("Groups") - .HasForeignKey("ProfileRoleLoadoutId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_group_profile_role_loadout_profile_role_loa~"); - - b.Navigation("ProfileRoleLoadout"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Loadouts") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_role_loadout_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("JobWhitelists") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_role_whitelists_player_player_user_id"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("Rounds") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_round_server_server_id"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("integer") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithMany("BanHits") - .HasForeignKey("BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); - - b.HasOne("Content.Server.Database.ConnectionLog", "Connection") - .WithMany("BanHits") - .HasForeignKey("ConnectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); - - b.Navigation("Ban"); - - b.Navigation("Connection"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerRoleBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerRoleBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_role_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("integer") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_unban_server_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Traits") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_trait_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.HasOne("Content.Server.Database.Player", null) - .WithMany() - .HasForeignKey("PlayersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_player_players_id"); - - b.HasOne("Content.Server.Database.Round", null) - .WithMany() - .HasForeignKey("RoundsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_round_rounds_id"); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Navigation("Players"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Navigation("Admins"); - - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Navigation("BanHits"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Navigation("AdminLogs"); - - b.Navigation("AdminMessagesCreated"); - - b.Navigation("AdminMessagesDeleted"); - - b.Navigation("AdminMessagesLastEdited"); - - b.Navigation("AdminMessagesReceived"); - - b.Navigation("AdminNotesCreated"); - - b.Navigation("AdminNotesDeleted"); - - b.Navigation("AdminNotesLastEdited"); - - b.Navigation("AdminNotesReceived"); - - b.Navigation("AdminServerBansCreated"); - - b.Navigation("AdminServerBansLastEdited"); - - b.Navigation("AdminServerRoleBansCreated"); - - b.Navigation("AdminServerRoleBansLastEdited"); - - b.Navigation("AdminWatchlistsCreated"); - - b.Navigation("AdminWatchlistsDeleted"); - - b.Navigation("AdminWatchlistsLastEdited"); - - b.Navigation("AdminWatchlistsReceived"); - - b.Navigation("JobWhitelists"); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Navigation("Profiles"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Navigation("Antags"); - - b.Navigation("Jobs"); - - b.Navigation("Loadouts"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Navigation("Loadouts"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Navigation("Groups"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Navigation("AdminLogs"); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Navigation("ConnectionLogs"); - - b.Navigation("Rounds"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Navigation("BanHits"); - - b.Navigation("Unban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Navigation("Unban"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.cs b/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.cs deleted file mode 100644 index debb36aacc..0000000000 --- a/Content.Server.Database/Migrations/Postgres/20241111193608_ConnectionTrust.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Content.Server.Database.Migrations.Postgres -{ - /// - public partial class ConnectionTrust : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "trust", - table: "connection_log", - type: "real", - nullable: false, - defaultValue: 0f); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "trust", - table: "connection_log"); - } - } -} diff --git a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs index c39fb6872b..c86d08b8dc 100644 --- a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs @@ -557,19 +557,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("ban_template", (string)null); }); - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("uuid") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => { b.Property("Id") @@ -588,6 +575,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("smallint") .HasColumnName("denied"); + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + b.Property("ServerId") .ValueGeneratedOnAdd() .HasColumnType("integer") @@ -598,10 +589,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("time"); - b.Property("Trust") - .HasColumnType("real") - .HasColumnName("trust"); - b.Property("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); @@ -760,6 +747,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("inet") .HasColumnName("last_seen_address"); + b.Property("LastSeenHWId") + .HasColumnType("bytea") + .HasColumnName("last_seen_hwid"); + b.Property("LastSeenTime") .HasColumnType("timestamp with time zone") .HasColumnName("last_seen_time"); @@ -1041,6 +1032,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("expiration_time"); + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + b.Property("Hidden") .HasColumnType("boolean") .HasColumnName("hidden"); @@ -1171,6 +1166,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("timestamp with time zone") .HasColumnName("expiration_time"); + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + b.Property("Hidden") .HasColumnType("boolean") .HasColumnName("hidden"); @@ -1612,34 +1611,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasConstraintName("FK_connection_log_server_server_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("integer") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - b.Navigation("Server"); }); @@ -1667,37 +1638,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Profile"); }); - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("integer") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - modelBuilder.Entity("Content.Server.Database.Profile", b => { b.HasOne("Content.Server.Database.Preference", "Preference") @@ -1756,36 +1696,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("RoundId") .HasConstraintName("FK_server_ban_round_round_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("integer") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - b.Navigation("CreatedBy"); - b.Navigation("HWId"); - b.Navigation("LastEditedBy"); b.Navigation("Round"); @@ -1833,36 +1745,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("RoundId") .HasConstraintName("FK_server_role_ban_round_round_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("integer") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("bytea") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("integer") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - b.Navigation("CreatedBy"); - b.Navigation("HWId"); - b.Navigation("LastEditedBy"); b.Navigation("Round"); diff --git a/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.Designer.cs deleted file mode 100644 index 56a9fe0a05..0000000000 --- a/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.Designer.cs +++ /dev/null @@ -1,1995 +0,0 @@ -// -using System; -using Content.Server.Database; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Content.Server.Database.Migrations.Sqlite -{ - [DbContext(typeof(SqliteServerDbContext))] - [Migration("20241111170107_ModernHwid")] - partial class ModernHwid - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("AdminRankId") - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Title") - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("UserId") - .HasName("PK_admin"); - - b.HasIndex("AdminRankId") - .HasDatabaseName("IX_admin_admin_rank_id"); - - b.ToTable("admin", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_flag_id"); - - b.Property("AdminId") - .HasColumnType("TEXT") - .HasColumnName("admin_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flag"); - - b.Property("Negative") - .HasColumnType("INTEGER") - .HasColumnName("negative"); - - b.HasKey("Id") - .HasName("PK_admin_flag"); - - b.HasIndex("AdminId") - .HasDatabaseName("IX_admin_flag_admin_id"); - - b.HasIndex("Flag", "AdminId") - .IsUnique(); - - b.ToTable("admin_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("admin_log_id"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("date"); - - b.Property("Impact") - .HasColumnType("INTEGER") - .HasColumnName("impact"); - - b.Property("Json") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("json"); - - b.Property("Message") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("Type") - .HasColumnType("INTEGER") - .HasColumnName("type"); - - b.HasKey("RoundId", "Id") - .HasName("PK_admin_log"); - - b.HasIndex("Date"); - - b.HasIndex("Type") - .HasDatabaseName("IX_admin_log_type"); - - b.ToTable("admin_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("LogId") - .HasColumnType("INTEGER") - .HasColumnName("log_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.HasKey("RoundId", "LogId", "PlayerUserId") - .HasName("PK_admin_log_player"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_log_player_player_user_id"); - - b.ToTable("admin_log_player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_messages_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("Dismissed") - .HasColumnType("INTEGER") - .HasColumnName("dismissed"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Seen") - .HasColumnType("INTEGER") - .HasColumnName("seen"); - - b.HasKey("Id") - .HasName("PK_admin_messages"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_messages_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_messages_round_id"); - - b.ToTable("admin_messages", null, t => - { - t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_notes_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Secret") - .HasColumnType("INTEGER") - .HasColumnName("secret"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_admin_notes"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_notes_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_notes_round_id"); - - b.ToTable("admin_notes", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_admin_rank"); - - b.ToTable("admin_rank", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_flag_id"); - - b.Property("AdminRankId") - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flag"); - - b.HasKey("Id") - .HasName("PK_admin_rank_flag"); - - b.HasIndex("AdminRankId"); - - b.HasIndex("Flag", "AdminRankId") - .IsUnique(); - - b.ToTable("admin_rank_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_watchlists_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.HasKey("Id") - .HasName("PK_admin_watchlists"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_watchlists_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_watchlists_round_id"); - - b.ToTable("admin_watchlists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("antag_id"); - - b.Property("AntagName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("antag_name"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_antag"); - - b.HasIndex("ProfileId", "AntagName") - .IsUnique(); - - b.ToTable("antag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("assigned_user_id_id"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_assigned_user_id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("assigned_user_id", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.BanTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("ban_template_id"); - - b.Property("AutoDelete") - .HasColumnType("INTEGER") - .HasColumnName("auto_delete"); - - b.Property("ExemptFlags") - .HasColumnType("INTEGER") - .HasColumnName("exempt_flags"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("Length") - .HasColumnType("TEXT") - .HasColumnName("length"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("PK_ban_template"); - - b.ToTable("ban_template", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("connection_log_id"); - - b.Property("Address") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("Denied") - .HasColumnType("INTEGER") - .HasColumnName("denied"); - - b.Property("ServerId") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("server_id"); - - b.Property("Time") - .HasColumnType("TEXT") - .HasColumnName("time"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_connection_log"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_connection_log_server_id"); - - b.HasIndex("Time"); - - b.HasIndex("UserId"); - - b.ToTable("connection_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("job_id"); - - b.Property("JobName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("job_name"); - - b.Property("Priority") - .HasColumnType("INTEGER") - .HasColumnName("priority"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_job"); - - b.HasIndex("ProfileId"); - - b.HasIndex("ProfileId", "JobName") - .IsUnique(); - - b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") - .IsUnique() - .HasFilter("priority = 3"); - - b.ToTable("job", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.PlayTime", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("play_time_id"); - - b.Property("PlayerId") - .HasColumnType("TEXT") - .HasColumnName("player_id"); - - b.Property("TimeSpent") - .HasColumnType("TEXT") - .HasColumnName("time_spent"); - - b.Property("Tracker") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("tracker"); - - b.HasKey("Id") - .HasName("PK_play_time"); - - b.HasIndex("PlayerId", "Tracker") - .IsUnique(); - - b.ToTable("play_time", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("player_id"); - - b.Property("FirstSeenTime") - .HasColumnType("TEXT") - .HasColumnName("first_seen_time"); - - b.Property("LastReadRules") - .HasColumnType("TEXT") - .HasColumnName("last_read_rules"); - - b.Property("LastSeenAddress") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_seen_address"); - - b.Property("LastSeenTime") - .HasColumnType("TEXT") - .HasColumnName("last_seen_time"); - - b.Property("LastSeenUserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_seen_user_name"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_player"); - - b.HasAlternateKey("UserId") - .HasName("ak_player_user_id"); - - b.HasIndex("LastSeenUserName"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("preference_id"); - - b.Property("AdminOOCColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("admin_ooc_color"); - - b.Property("SelectedCharacterSlot") - .HasColumnType("INTEGER") - .HasColumnName("selected_character_slot"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_preference"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("preference", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("Age") - .HasColumnType("INTEGER") - .HasColumnName("age"); - - b.Property("CharacterName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("char_name"); - - b.Property("EyeColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("eye_color"); - - b.Property("FacialHairColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("facial_hair_color"); - - b.Property("FacialHairName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("facial_hair_name"); - - b.Property("FlavorText") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flavor_text"); - - b.Property("Gender") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("gender"); - - b.Property("HairColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("hair_color"); - - b.Property("HairName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("hair_name"); - - b.Property("Markings") - .HasColumnType("jsonb") - .HasColumnName("markings"); - - b.Property("PreferenceId") - .HasColumnType("INTEGER") - .HasColumnName("preference_id"); - - b.Property("PreferenceUnavailable") - .HasColumnType("INTEGER") - .HasColumnName("pref_unavailable"); - - b.Property("Sex") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("sex"); - - b.Property("SkinColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("skin_color"); - - b.Property("Slot") - .HasColumnType("INTEGER") - .HasColumnName("slot"); - - b.Property("SpawnPriority") - .HasColumnType("INTEGER") - .HasColumnName("spawn_priority"); - - b.Property("Species") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("species"); - - b.HasKey("Id") - .HasName("PK_profile"); - - b.HasIndex("PreferenceId") - .HasDatabaseName("IX_profile_preference_id"); - - b.HasIndex("Slot", "PreferenceId") - .IsUnique(); - - b.ToTable("profile", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_id"); - - b.Property("LoadoutName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("loadout_name"); - - b.Property("ProfileLoadoutGroupId") - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_group_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout"); - - b.HasIndex("ProfileLoadoutGroupId"); - - b.ToTable("profile_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_group_id"); - - b.Property("GroupName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("group_name"); - - b.Property("ProfileRoleLoadoutId") - .HasColumnType("INTEGER") - .HasColumnName("profile_role_loadout_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout_group"); - - b.HasIndex("ProfileRoleLoadoutId"); - - b.ToTable("profile_loadout_group", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_role_loadout_id"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("RoleName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("role_name"); - - b.HasKey("Id") - .HasName("PK_profile_role_loadout"); - - b.HasIndex("ProfileId"); - - b.ToTable("profile_role_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("RoleId") - .HasColumnType("TEXT") - .HasColumnName("role_id"); - - b.HasKey("PlayerUserId", "RoleId") - .HasName("PK_role_whitelists"); - - b.ToTable("role_whitelists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("ServerId") - .HasColumnType("INTEGER") - .HasColumnName("server_id"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id") - .HasName("PK_round"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_round_server_id"); - - b.HasIndex("StartDate"); - - b.ToTable("round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_server"); - - b.ToTable("server", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_ban_id"); - - b.Property("Address") - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("AutoDelete") - .HasColumnType("INTEGER") - .HasColumnName("auto_delete"); - - b.Property("BanTime") - .HasColumnType("TEXT") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("banning_admin"); - - b.Property("ExemptFlags") - .HasColumnType("INTEGER") - .HasColumnName("exempt_flags"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_ban_round_id"); - - b.ToTable("server_ban", null, t => - { - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("Flags") - .HasColumnType("INTEGER") - .HasColumnName("flags"); - - b.HasKey("UserId") - .HasName("PK_server_ban_exemption"); - - b.ToTable("server_ban_exemption", null, t => - { - t.HasCheckConstraint("FlagsNotZero", "flags != 0"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_ban_hit_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("ConnectionId") - .HasColumnType("INTEGER") - .HasColumnName("connection_id"); - - b.HasKey("Id") - .HasName("PK_server_ban_hit"); - - b.HasIndex("BanId") - .HasDatabaseName("IX_server_ban_hit_ban_id"); - - b.HasIndex("ConnectionId") - .HasDatabaseName("IX_server_ban_hit_connection_id"); - - b.ToTable("server_ban_hit", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_role_ban_id"); - - b.Property("Address") - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("BanTime") - .HasColumnType("TEXT") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("banning_admin"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("role_id"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_role_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_role_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_role_ban_round_id"); - - b.ToTable("server_role_ban", null, t => - { - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("role_unban_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("TEXT") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_role_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_role_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("unban_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("TEXT") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("trait_id"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("TraitName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("trait_name"); - - b.HasKey("Id") - .HasName("PK_trait"); - - b.HasIndex("ProfileId", "TraitName") - .IsUnique(); - - b.ToTable("trait", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("uploaded_resource_log_id"); - - b.Property("Data") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("data"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("date"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_uploaded_resource_log"); - - b.ToTable("uploaded_resource_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Whitelist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_whitelist"); - - b.ToTable("whitelist", (string)null); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.Property("PlayersId") - .HasColumnType("INTEGER") - .HasColumnName("players_id"); - - b.Property("RoundsId") - .HasColumnType("INTEGER") - .HasColumnName("rounds_id"); - - b.HasKey("PlayersId", "RoundsId") - .HasName("PK_player_round"); - - b.HasIndex("RoundsId") - .HasDatabaseName("IX_player_round_rounds_id"); - - b.ToTable("player_round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.HasOne("Content.Server.Database.AdminRank", "AdminRank") - .WithMany("Admins") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); - - b.Navigation("AdminRank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.HasOne("Content.Server.Database.Admin", "Admin") - .WithMany("Flags") - .HasForeignKey("AdminId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_flag_admin_admin_id"); - - b.Navigation("Admin"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany("AdminLogs") - .HasForeignKey("RoundId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_round_round_id"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminLogs") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_player_player_user_id"); - - b.HasOne("Content.Server.Database.AdminLog", "Log") - .WithMany("Players") - .HasForeignKey("RoundId", "LogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); - - b.Navigation("Log"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminMessagesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminMessagesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminMessagesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminMessagesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_messages_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_messages_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminNotesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminNotesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminNotesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminNotesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_notes_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_notes_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.HasOne("Content.Server.Database.AdminRank", "Rank") - .WithMany("Flags") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); - - b.Navigation("Rank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminWatchlistsCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminWatchlistsDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminWatchlistsLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminWatchlistsReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_watchlists_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_watchlists_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Antags") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_antag_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("ConnectionLogs") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired() - .HasConstraintName("FK_connection_log_server_server_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("INTEGER") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Jobs") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_job_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("INTEGER") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.HasOne("Content.Server.Database.Preference", "Preference") - .WithMany("Profiles") - .HasForeignKey("PreferenceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_preference_preference_id"); - - b.Navigation("Preference"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.HasOne("Content.Server.Database.ProfileLoadoutGroup", "ProfileLoadoutGroup") - .WithMany("Loadouts") - .HasForeignKey("ProfileLoadoutGroupId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_profile_loadout_group_profile_loadout_group_id"); - - b.Navigation("ProfileLoadoutGroup"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.HasOne("Content.Server.Database.ProfileRoleLoadout", "ProfileRoleLoadout") - .WithMany("Groups") - .HasForeignKey("ProfileRoleLoadoutId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_group_profile_role_loadout_profile_role_loadout_id"); - - b.Navigation("ProfileRoleLoadout"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Loadouts") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_role_loadout_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("JobWhitelists") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_role_whitelists_player_player_user_id"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("Rounds") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_round_server_server_id"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithMany("BanHits") - .HasForeignKey("BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); - - b.HasOne("Content.Server.Database.ConnectionLog", "Connection") - .WithMany("BanHits") - .HasForeignKey("ConnectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); - - b.Navigation("Ban"); - - b.Navigation("Connection"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerRoleBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerRoleBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_role_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_unban_server_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Traits") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_trait_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.HasOne("Content.Server.Database.Player", null) - .WithMany() - .HasForeignKey("PlayersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_player_players_id"); - - b.HasOne("Content.Server.Database.Round", null) - .WithMany() - .HasForeignKey("RoundsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_round_rounds_id"); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Navigation("Players"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Navigation("Admins"); - - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Navigation("BanHits"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Navigation("AdminLogs"); - - b.Navigation("AdminMessagesCreated"); - - b.Navigation("AdminMessagesDeleted"); - - b.Navigation("AdminMessagesLastEdited"); - - b.Navigation("AdminMessagesReceived"); - - b.Navigation("AdminNotesCreated"); - - b.Navigation("AdminNotesDeleted"); - - b.Navigation("AdminNotesLastEdited"); - - b.Navigation("AdminNotesReceived"); - - b.Navigation("AdminServerBansCreated"); - - b.Navigation("AdminServerBansLastEdited"); - - b.Navigation("AdminServerRoleBansCreated"); - - b.Navigation("AdminServerRoleBansLastEdited"); - - b.Navigation("AdminWatchlistsCreated"); - - b.Navigation("AdminWatchlistsDeleted"); - - b.Navigation("AdminWatchlistsLastEdited"); - - b.Navigation("AdminWatchlistsReceived"); - - b.Navigation("JobWhitelists"); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Navigation("Profiles"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Navigation("Antags"); - - b.Navigation("Jobs"); - - b.Navigation("Loadouts"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Navigation("Loadouts"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Navigation("Groups"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Navigation("AdminLogs"); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Navigation("ConnectionLogs"); - - b.Navigation("Rounds"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Navigation("BanHits"); - - b.Navigation("Unban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Navigation("Unban"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.cs b/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.cs deleted file mode 100644 index 97b5dafd03..0000000000 --- a/Content.Server.Database/Migrations/Sqlite/20241111170107_ModernHwid.cs +++ /dev/null @@ -1,62 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Content.Server.Database.Migrations.Sqlite -{ - /// - public partial class ModernHwid : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "hwid_type", - table: "server_role_ban", - type: "INTEGER", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "hwid_type", - table: "server_ban", - type: "INTEGER", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "last_seen_hwid_type", - table: "player", - type: "INTEGER", - nullable: true, - defaultValue: 0); - - migrationBuilder.AddColumn( - name: "hwid_type", - table: "connection_log", - type: "INTEGER", - nullable: true, - defaultValue: 0); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "hwid_type", - table: "server_role_ban"); - - migrationBuilder.DropColumn( - name: "hwid_type", - table: "server_ban"); - - migrationBuilder.DropColumn( - name: "last_seen_hwid_type", - table: "player"); - - migrationBuilder.DropColumn( - name: "hwid_type", - table: "connection_log"); - } - } -} diff --git a/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.Designer.cs deleted file mode 100644 index bd4e20a464..0000000000 --- a/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.Designer.cs +++ /dev/null @@ -1,1999 +0,0 @@ -// -using System; -using Content.Server.Database; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace Content.Server.Database.Migrations.Sqlite -{ - [DbContext(typeof(SqliteServerDbContext))] - [Migration("20241111193602_ConnectionTrust")] - partial class ConnectionTrust - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("AdminRankId") - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Title") - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("UserId") - .HasName("PK_admin"); - - b.HasIndex("AdminRankId") - .HasDatabaseName("IX_admin_admin_rank_id"); - - b.ToTable("admin", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_flag_id"); - - b.Property("AdminId") - .HasColumnType("TEXT") - .HasColumnName("admin_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flag"); - - b.Property("Negative") - .HasColumnType("INTEGER") - .HasColumnName("negative"); - - b.HasKey("Id") - .HasName("PK_admin_flag"); - - b.HasIndex("AdminId") - .HasDatabaseName("IX_admin_flag_admin_id"); - - b.HasIndex("Flag", "AdminId") - .IsUnique(); - - b.ToTable("admin_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Id") - .HasColumnType("INTEGER") - .HasColumnName("admin_log_id"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("date"); - - b.Property("Impact") - .HasColumnType("INTEGER") - .HasColumnName("impact"); - - b.Property("Json") - .IsRequired() - .HasColumnType("jsonb") - .HasColumnName("json"); - - b.Property("Message") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("Type") - .HasColumnType("INTEGER") - .HasColumnName("type"); - - b.HasKey("RoundId", "Id") - .HasName("PK_admin_log"); - - b.HasIndex("Date"); - - b.HasIndex("Type") - .HasDatabaseName("IX_admin_log_type"); - - b.ToTable("admin_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("LogId") - .HasColumnType("INTEGER") - .HasColumnName("log_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.HasKey("RoundId", "LogId", "PlayerUserId") - .HasName("PK_admin_log_player"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_log_player_player_user_id"); - - b.ToTable("admin_log_player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_messages_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("Dismissed") - .HasColumnType("INTEGER") - .HasColumnName("dismissed"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Seen") - .HasColumnType("INTEGER") - .HasColumnName("seen"); - - b.HasKey("Id") - .HasName("PK_admin_messages"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_messages_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_messages_round_id"); - - b.ToTable("admin_messages", null, t => - { - t.HasCheckConstraint("NotDismissedAndSeen", "NOT dismissed OR seen"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_notes_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Secret") - .HasColumnType("INTEGER") - .HasColumnName("secret"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_admin_notes"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_notes_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_notes_round_id"); - - b.ToTable("admin_notes", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_admin_rank"); - - b.ToTable("admin_rank", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_flag_id"); - - b.Property("AdminRankId") - .HasColumnType("INTEGER") - .HasColumnName("admin_rank_id"); - - b.Property("Flag") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flag"); - - b.HasKey("Id") - .HasName("PK_admin_rank_flag"); - - b.HasIndex("AdminRankId"); - - b.HasIndex("Flag", "AdminRankId") - .IsUnique(); - - b.ToTable("admin_rank_flag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("admin_watchlists_id"); - - b.Property("CreatedAt") - .HasColumnType("TEXT") - .HasColumnName("created_at"); - - b.Property("CreatedById") - .HasColumnType("TEXT") - .HasColumnName("created_by_id"); - - b.Property("Deleted") - .HasColumnType("INTEGER") - .HasColumnName("deleted"); - - b.Property("DeletedAt") - .HasColumnType("TEXT") - .HasColumnName("deleted_at"); - - b.Property("DeletedById") - .HasColumnType("TEXT") - .HasColumnName("deleted_by_id"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("LastEditedAt") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("Message") - .IsRequired() - .HasMaxLength(4096) - .HasColumnType("TEXT") - .HasColumnName("message"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.HasKey("Id") - .HasName("PK_admin_watchlists"); - - b.HasIndex("CreatedById"); - - b.HasIndex("DeletedById"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_admin_watchlists_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_admin_watchlists_round_id"); - - b.ToTable("admin_watchlists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("antag_id"); - - b.Property("AntagName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("antag_name"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_antag"); - - b.HasIndex("ProfileId", "AntagName") - .IsUnique(); - - b.ToTable("antag", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("assigned_user_id_id"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_assigned_user_id"); - - b.HasIndex("UserId") - .IsUnique(); - - b.HasIndex("UserName") - .IsUnique(); - - b.ToTable("assigned_user_id", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.BanTemplate", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("ban_template_id"); - - b.Property("AutoDelete") - .HasColumnType("INTEGER") - .HasColumnName("auto_delete"); - - b.Property("ExemptFlags") - .HasColumnType("INTEGER") - .HasColumnName("exempt_flags"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("Length") - .HasColumnType("TEXT") - .HasColumnName("length"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.Property("Title") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("title"); - - b.HasKey("Id") - .HasName("PK_ban_template"); - - b.ToTable("ban_template", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("connection_log_id"); - - b.Property("Address") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("Denied") - .HasColumnType("INTEGER") - .HasColumnName("denied"); - - b.Property("ServerId") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("server_id"); - - b.Property("Time") - .HasColumnType("TEXT") - .HasColumnName("time"); - - b.Property("Trust") - .HasColumnType("REAL") - .HasColumnName("trust"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("UserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("user_name"); - - b.HasKey("Id") - .HasName("PK_connection_log"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_connection_log_server_id"); - - b.HasIndex("Time"); - - b.HasIndex("UserId"); - - b.ToTable("connection_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("job_id"); - - b.Property("JobName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("job_name"); - - b.Property("Priority") - .HasColumnType("INTEGER") - .HasColumnName("priority"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.HasKey("Id") - .HasName("PK_job"); - - b.HasIndex("ProfileId"); - - b.HasIndex("ProfileId", "JobName") - .IsUnique(); - - b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") - .IsUnique() - .HasFilter("priority = 3"); - - b.ToTable("job", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.PlayTime", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("play_time_id"); - - b.Property("PlayerId") - .HasColumnType("TEXT") - .HasColumnName("player_id"); - - b.Property("TimeSpent") - .HasColumnType("TEXT") - .HasColumnName("time_spent"); - - b.Property("Tracker") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("tracker"); - - b.HasKey("Id") - .HasName("PK_play_time"); - - b.HasIndex("PlayerId", "Tracker") - .IsUnique(); - - b.ToTable("play_time", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("player_id"); - - b.Property("FirstSeenTime") - .HasColumnType("TEXT") - .HasColumnName("first_seen_time"); - - b.Property("LastReadRules") - .HasColumnType("TEXT") - .HasColumnName("last_read_rules"); - - b.Property("LastSeenAddress") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_seen_address"); - - b.Property("LastSeenTime") - .HasColumnType("TEXT") - .HasColumnName("last_seen_time"); - - b.Property("LastSeenUserName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("last_seen_user_name"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_player"); - - b.HasAlternateKey("UserId") - .HasName("ak_player_user_id"); - - b.HasIndex("LastSeenUserName"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("player", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("preference_id"); - - b.Property("AdminOOCColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("admin_ooc_color"); - - b.Property("SelectedCharacterSlot") - .HasColumnType("INTEGER") - .HasColumnName("selected_character_slot"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_preference"); - - b.HasIndex("UserId") - .IsUnique(); - - b.ToTable("preference", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("Age") - .HasColumnType("INTEGER") - .HasColumnName("age"); - - b.Property("CharacterName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("char_name"); - - b.Property("EyeColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("eye_color"); - - b.Property("FacialHairColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("facial_hair_color"); - - b.Property("FacialHairName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("facial_hair_name"); - - b.Property("FlavorText") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("flavor_text"); - - b.Property("Gender") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("gender"); - - b.Property("HairColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("hair_color"); - - b.Property("HairName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("hair_name"); - - b.Property("Markings") - .HasColumnType("jsonb") - .HasColumnName("markings"); - - b.Property("PreferenceId") - .HasColumnType("INTEGER") - .HasColumnName("preference_id"); - - b.Property("PreferenceUnavailable") - .HasColumnType("INTEGER") - .HasColumnName("pref_unavailable"); - - b.Property("Sex") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("sex"); - - b.Property("SkinColor") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("skin_color"); - - b.Property("Slot") - .HasColumnType("INTEGER") - .HasColumnName("slot"); - - b.Property("SpawnPriority") - .HasColumnType("INTEGER") - .HasColumnName("spawn_priority"); - - b.Property("Species") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("species"); - - b.HasKey("Id") - .HasName("PK_profile"); - - b.HasIndex("PreferenceId") - .HasDatabaseName("IX_profile_preference_id"); - - b.HasIndex("Slot", "PreferenceId") - .IsUnique(); - - b.ToTable("profile", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_id"); - - b.Property("LoadoutName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("loadout_name"); - - b.Property("ProfileLoadoutGroupId") - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_group_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout"); - - b.HasIndex("ProfileLoadoutGroupId"); - - b.ToTable("profile_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_loadout_group_id"); - - b.Property("GroupName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("group_name"); - - b.Property("ProfileRoleLoadoutId") - .HasColumnType("INTEGER") - .HasColumnName("profile_role_loadout_id"); - - b.HasKey("Id") - .HasName("PK_profile_loadout_group"); - - b.HasIndex("ProfileRoleLoadoutId"); - - b.ToTable("profile_loadout_group", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("profile_role_loadout_id"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("RoleName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("role_name"); - - b.HasKey("Id") - .HasName("PK_profile_role_loadout"); - - b.HasIndex("ProfileId"); - - b.ToTable("profile_role_loadout", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("RoleId") - .HasColumnType("TEXT") - .HasColumnName("role_id"); - - b.HasKey("PlayerUserId", "RoleId") - .HasName("PK_role_whitelists"); - - b.ToTable("role_whitelists", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("ServerId") - .HasColumnType("INTEGER") - .HasColumnName("server_id"); - - b.Property("StartDate") - .HasColumnType("TEXT") - .HasColumnName("start_date"); - - b.HasKey("Id") - .HasName("PK_round"); - - b.HasIndex("ServerId") - .HasDatabaseName("IX_round_server_id"); - - b.HasIndex("StartDate"); - - b.ToTable("round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_id"); - - b.Property("Name") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("name"); - - b.HasKey("Id") - .HasName("PK_server"); - - b.ToTable("server", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_ban_id"); - - b.Property("Address") - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("AutoDelete") - .HasColumnType("INTEGER") - .HasColumnName("auto_delete"); - - b.Property("BanTime") - .HasColumnType("TEXT") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("banning_admin"); - - b.Property("ExemptFlags") - .HasColumnType("INTEGER") - .HasColumnName("exempt_flags"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_ban_round_id"); - - b.ToTable("server_ban", null, t => - { - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.Property("Flags") - .HasColumnType("INTEGER") - .HasColumnName("flags"); - - b.HasKey("UserId") - .HasName("PK_server_ban_exemption"); - - b.ToTable("server_ban_exemption", null, t => - { - t.HasCheckConstraint("FlagsNotZero", "flags != 0"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_ban_hit_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("ConnectionId") - .HasColumnType("INTEGER") - .HasColumnName("connection_id"); - - b.HasKey("Id") - .HasName("PK_server_ban_hit"); - - b.HasIndex("BanId") - .HasDatabaseName("IX_server_ban_hit_ban_id"); - - b.HasIndex("ConnectionId") - .HasDatabaseName("IX_server_ban_hit_connection_id"); - - b.ToTable("server_ban_hit", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("server_role_ban_id"); - - b.Property("Address") - .HasColumnType("TEXT") - .HasColumnName("address"); - - b.Property("BanTime") - .HasColumnType("TEXT") - .HasColumnName("ban_time"); - - b.Property("BanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("banning_admin"); - - b.Property("ExpirationTime") - .HasColumnType("TEXT") - .HasColumnName("expiration_time"); - - b.Property("Hidden") - .HasColumnType("INTEGER") - .HasColumnName("hidden"); - - b.Property("LastEditedAt") - .HasColumnType("TEXT") - .HasColumnName("last_edited_at"); - - b.Property("LastEditedById") - .HasColumnType("TEXT") - .HasColumnName("last_edited_by_id"); - - b.Property("PlayerUserId") - .HasColumnType("TEXT") - .HasColumnName("player_user_id"); - - b.Property("PlaytimeAtNote") - .HasColumnType("TEXT") - .HasColumnName("playtime_at_note"); - - b.Property("Reason") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("reason"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("role_id"); - - b.Property("RoundId") - .HasColumnType("INTEGER") - .HasColumnName("round_id"); - - b.Property("Severity") - .HasColumnType("INTEGER") - .HasColumnName("severity"); - - b.HasKey("Id") - .HasName("PK_server_role_ban"); - - b.HasIndex("Address"); - - b.HasIndex("BanningAdmin"); - - b.HasIndex("LastEditedById"); - - b.HasIndex("PlayerUserId") - .HasDatabaseName("IX_server_role_ban_player_user_id"); - - b.HasIndex("RoundId") - .HasDatabaseName("IX_server_role_ban_round_id"); - - b.ToTable("server_role_ban", null, t => - { - t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); - }); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("role_unban_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("TEXT") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_role_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_role_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("unban_id"); - - b.Property("BanId") - .HasColumnType("INTEGER") - .HasColumnName("ban_id"); - - b.Property("UnbanTime") - .HasColumnType("TEXT") - .HasColumnName("unban_time"); - - b.Property("UnbanningAdmin") - .HasColumnType("TEXT") - .HasColumnName("unbanning_admin"); - - b.HasKey("Id") - .HasName("PK_server_unban"); - - b.HasIndex("BanId") - .IsUnique(); - - b.ToTable("server_unban", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("trait_id"); - - b.Property("ProfileId") - .HasColumnType("INTEGER") - .HasColumnName("profile_id"); - - b.Property("TraitName") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("trait_name"); - - b.HasKey("Id") - .HasName("PK_trait"); - - b.HasIndex("ProfileId", "TraitName") - .IsUnique(); - - b.ToTable("trait", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasColumnName("uploaded_resource_log_id"); - - b.Property("Data") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("data"); - - b.Property("Date") - .HasColumnType("TEXT") - .HasColumnName("date"); - - b.Property("Path") - .IsRequired() - .HasColumnType("TEXT") - .HasColumnName("path"); - - b.Property("UserId") - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("Id") - .HasName("PK_uploaded_resource_log"); - - b.ToTable("uploaded_resource_log", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Whitelist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_whitelist"); - - b.ToTable("whitelist", (string)null); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.Property("PlayersId") - .HasColumnType("INTEGER") - .HasColumnName("players_id"); - - b.Property("RoundsId") - .HasColumnType("INTEGER") - .HasColumnName("rounds_id"); - - b.HasKey("PlayersId", "RoundsId") - .HasName("PK_player_round"); - - b.HasIndex("RoundsId") - .HasDatabaseName("IX_player_round_rounds_id"); - - b.ToTable("player_round", (string)null); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.HasOne("Content.Server.Database.AdminRank", "AdminRank") - .WithMany("Admins") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); - - b.Navigation("AdminRank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminFlag", b => - { - b.HasOne("Content.Server.Database.Admin", "Admin") - .WithMany("Flags") - .HasForeignKey("AdminId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_flag_admin_admin_id"); - - b.Navigation("Admin"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany("AdminLogs") - .HasForeignKey("RoundId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_round_round_id"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminLogs") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_player_player_user_id"); - - b.HasOne("Content.Server.Database.AdminLog", "Log") - .WithMany("Players") - .HasForeignKey("RoundId", "LogId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); - - b.Navigation("Log"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminMessage", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminMessagesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminMessagesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminMessagesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminMessagesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_messages_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_messages_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminNote", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminNotesCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminNotesDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminNotesLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminNotesReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_notes_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_notes_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => - { - b.HasOne("Content.Server.Database.AdminRank", "Rank") - .WithMany("Flags") - .HasForeignKey("AdminRankId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); - - b.Navigation("Rank"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminWatchlistsCreated") - .HasForeignKey("CreatedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_created_by_id"); - - b.HasOne("Content.Server.Database.Player", "DeletedBy") - .WithMany("AdminWatchlistsDeleted") - .HasForeignKey("DeletedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminWatchlistsLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("AdminWatchlistsReceived") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .HasConstraintName("FK_admin_watchlists_player_player_user_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_admin_watchlists_round_round_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Player"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.Antag", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Antags") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_antag_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("ConnectionLogs") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.SetNull) - .IsRequired() - .HasConstraintName("FK_connection_log_server_server_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("INTEGER") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.Job", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Jobs") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_job_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("INTEGER") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.HasOne("Content.Server.Database.Preference", "Preference") - .WithMany("Profiles") - .HasForeignKey("PreferenceId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_preference_preference_id"); - - b.Navigation("Preference"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadout", b => - { - b.HasOne("Content.Server.Database.ProfileLoadoutGroup", "ProfileLoadoutGroup") - .WithMany("Loadouts") - .HasForeignKey("ProfileLoadoutGroupId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_profile_loadout_group_profile_loadout_group_id"); - - b.Navigation("ProfileLoadoutGroup"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.HasOne("Content.Server.Database.ProfileRoleLoadout", "ProfileRoleLoadout") - .WithMany("Groups") - .HasForeignKey("ProfileRoleLoadoutId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_loadout_group_profile_role_loadout_profile_role_loadout_id"); - - b.Navigation("ProfileRoleLoadout"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Loadouts") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_profile_role_loadout_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("Content.Server.Database.RoleWhitelist", b => - { - b.HasOne("Content.Server.Database.Player", "Player") - .WithMany("JobWhitelists") - .HasForeignKey("PlayerUserId") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_role_whitelists_player_player_user_id"); - - b.Navigation("Player"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.HasOne("Content.Server.Database.Server", "Server") - .WithMany("Rounds") - .HasForeignKey("ServerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_round_server_server_id"); - - b.Navigation("Server"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithMany("BanHits") - .HasForeignKey("BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); - - b.HasOne("Content.Server.Database.ConnectionLog", "Connection") - .WithMany("BanHits") - .HasForeignKey("ConnectionId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); - - b.Navigation("Ban"); - - b.Navigation("Connection"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.HasOne("Content.Server.Database.Player", "CreatedBy") - .WithMany("AdminServerRoleBansCreated") - .HasForeignKey("BanningAdmin") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_banning_admin"); - - b.HasOne("Content.Server.Database.Player", "LastEditedBy") - .WithMany("AdminServerRoleBansLastEdited") - .HasForeignKey("LastEditedById") - .HasPrincipalKey("UserId") - .OnDelete(DeleteBehavior.SetNull) - .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); - - b.HasOne("Content.Server.Database.Round", "Round") - .WithMany() - .HasForeignKey("RoundId") - .HasConstraintName("FK_server_role_ban_round_round_id"); - - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - - b.Navigation("CreatedBy"); - - b.Navigation("HWId"); - - b.Navigation("LastEditedBy"); - - b.Navigation("Round"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => - { - b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerUnban", b => - { - b.HasOne("Content.Server.Database.ServerBan", "Ban") - .WithOne("Unban") - .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_server_unban_server_ban_ban_id"); - - b.Navigation("Ban"); - }); - - modelBuilder.Entity("Content.Server.Database.Trait", b => - { - b.HasOne("Content.Server.Database.Profile", "Profile") - .WithMany("Traits") - .HasForeignKey("ProfileId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_trait_profile_profile_id"); - - b.Navigation("Profile"); - }); - - modelBuilder.Entity("PlayerRound", b => - { - b.HasOne("Content.Server.Database.Player", null) - .WithMany() - .HasForeignKey("PlayersId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_player_players_id"); - - b.HasOne("Content.Server.Database.Round", null) - .WithMany() - .HasForeignKey("RoundsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("FK_player_round_round_rounds_id"); - }); - - modelBuilder.Entity("Content.Server.Database.Admin", b => - { - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminLog", b => - { - b.Navigation("Players"); - }); - - modelBuilder.Entity("Content.Server.Database.AdminRank", b => - { - b.Navigation("Admins"); - - b.Navigation("Flags"); - }); - - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => - { - b.Navigation("BanHits"); - }); - - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.Navigation("AdminLogs"); - - b.Navigation("AdminMessagesCreated"); - - b.Navigation("AdminMessagesDeleted"); - - b.Navigation("AdminMessagesLastEdited"); - - b.Navigation("AdminMessagesReceived"); - - b.Navigation("AdminNotesCreated"); - - b.Navigation("AdminNotesDeleted"); - - b.Navigation("AdminNotesLastEdited"); - - b.Navigation("AdminNotesReceived"); - - b.Navigation("AdminServerBansCreated"); - - b.Navigation("AdminServerBansLastEdited"); - - b.Navigation("AdminServerRoleBansCreated"); - - b.Navigation("AdminServerRoleBansLastEdited"); - - b.Navigation("AdminWatchlistsCreated"); - - b.Navigation("AdminWatchlistsDeleted"); - - b.Navigation("AdminWatchlistsLastEdited"); - - b.Navigation("AdminWatchlistsReceived"); - - b.Navigation("JobWhitelists"); - }); - - modelBuilder.Entity("Content.Server.Database.Preference", b => - { - b.Navigation("Profiles"); - }); - - modelBuilder.Entity("Content.Server.Database.Profile", b => - { - b.Navigation("Antags"); - - b.Navigation("Jobs"); - - b.Navigation("Loadouts"); - - b.Navigation("Traits"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileLoadoutGroup", b => - { - b.Navigation("Loadouts"); - }); - - modelBuilder.Entity("Content.Server.Database.ProfileRoleLoadout", b => - { - b.Navigation("Groups"); - }); - - modelBuilder.Entity("Content.Server.Database.Round", b => - { - b.Navigation("AdminLogs"); - }); - - modelBuilder.Entity("Content.Server.Database.Server", b => - { - b.Navigation("ConnectionLogs"); - - b.Navigation("Rounds"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerBan", b => - { - b.Navigation("BanHits"); - - b.Navigation("Unban"); - }); - - modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => - { - b.Navigation("Unban"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.cs b/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.cs deleted file mode 100644 index 3a7fd784e1..0000000000 --- a/Content.Server.Database/Migrations/Sqlite/20241111193602_ConnectionTrust.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace Content.Server.Database.Migrations.Sqlite -{ - /// - public partial class ConnectionTrust : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.AddColumn( - name: "trust", - table: "connection_log", - type: "REAL", - nullable: false, - defaultValue: 0f); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropColumn( - name: "trust", - table: "connection_log"); - } - } -} diff --git a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs index 3b2b680ddf..a5baf9d04b 100644 --- a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs @@ -526,19 +526,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("ban_template", (string)null); }); - modelBuilder.Entity("Content.Server.Database.Blacklist", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT") - .HasColumnName("user_id"); - - b.HasKey("UserId") - .HasName("PK_blacklist"); - - b.ToTable("blacklist", (string)null); - }); - modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => { b.Property("Id") @@ -555,6 +542,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("INTEGER") .HasColumnName("denied"); + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + b.Property("ServerId") .ValueGeneratedOnAdd() .HasColumnType("INTEGER") @@ -565,10 +556,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT") .HasColumnName("time"); - b.Property("Trust") - .HasColumnType("REAL") - .HasColumnName("trust"); - b.Property("UserId") .HasColumnType("TEXT") .HasColumnName("user_id"); @@ -716,6 +703,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT") .HasColumnName("last_seen_address"); + b.Property("LastSeenHWId") + .HasColumnType("BLOB") + .HasColumnName("last_seen_hwid"); + b.Property("LastSeenTime") .HasColumnType("TEXT") .HasColumnName("last_seen_time"); @@ -984,6 +975,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT") .HasColumnName("expiration_time"); + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + b.Property("Hidden") .HasColumnType("INTEGER") .HasColumnName("hidden"); @@ -1108,6 +1103,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("TEXT") .HasColumnName("expiration_time"); + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + b.Property("Hidden") .HasColumnType("INTEGER") .HasColumnName("hidden"); @@ -1539,34 +1538,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .IsRequired() .HasConstraintName("FK_connection_log_server_server_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ConnectionLogId") - .HasColumnType("INTEGER") - .HasColumnName("connection_log_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ConnectionLogId"); - - b1.ToTable("connection_log"); - - b1.WithOwner() - .HasForeignKey("ConnectionLogId") - .HasConstraintName("FK_connection_log_connection_log_connection_log_id"); - }); - - b.Navigation("HWId"); - b.Navigation("Server"); }); @@ -1594,37 +1565,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Profile"); }); - modelBuilder.Entity("Content.Server.Database.Player", b => - { - b.OwnsOne("Content.Server.Database.TypedHwid", "LastSeenHWId", b1 => - { - b1.Property("PlayerId") - .HasColumnType("INTEGER") - .HasColumnName("player_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("last_seen_hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("last_seen_hwid_type"); - - b1.HasKey("PlayerId"); - - b1.ToTable("player"); - - b1.WithOwner() - .HasForeignKey("PlayerId") - .HasConstraintName("FK_player_player_player_id"); - }); - - b.Navigation("LastSeenHWId"); - }); - modelBuilder.Entity("Content.Server.Database.Profile", b => { b.HasOne("Content.Server.Database.Preference", "Preference") @@ -1683,36 +1623,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("RoundId") .HasConstraintName("FK_server_ban_round_round_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerBanId"); - - b1.ToTable("server_ban"); - - b1.WithOwner() - .HasForeignKey("ServerBanId") - .HasConstraintName("FK_server_ban_server_ban_server_ban_id"); - }); - b.Navigation("CreatedBy"); - b.Navigation("HWId"); - b.Navigation("LastEditedBy"); b.Navigation("Round"); @@ -1760,36 +1672,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("RoundId") .HasConstraintName("FK_server_role_ban_round_round_id"); - b.OwnsOne("Content.Server.Database.TypedHwid", "HWId", b1 => - { - b1.Property("ServerRoleBanId") - .HasColumnType("INTEGER") - .HasColumnName("server_role_ban_id"); - - b1.Property("Hwid") - .IsRequired() - .HasColumnType("BLOB") - .HasColumnName("hwid"); - - b1.Property("Type") - .ValueGeneratedOnAdd() - .HasColumnType("INTEGER") - .HasDefaultValue(0) - .HasColumnName("hwid_type"); - - b1.HasKey("ServerRoleBanId"); - - b1.ToTable("server_role_ban"); - - b1.WithOwner() - .HasForeignKey("ServerRoleBanId") - .HasConstraintName("FK_server_role_ban_server_role_ban_server_role_ban_id"); - }); - b.Navigation("CreatedBy"); - b.Navigation("HWId"); - b.Navigation("LastEditedBy"); b.Navigation("Round"); diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index 377718bcba..96f2aad380 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; -using System.Collections.Immutable; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Net; using System.Text.Json; @@ -317,47 +315,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) .HasForeignKey(w => w.PlayerUserId) .HasPrincipalKey(p => p.UserId) .OnDelete(DeleteBehavior.Cascade); - - // Changes for modern HWID integration - modelBuilder.Entity() - .OwnsOne(p => p.LastSeenHWId) - .Property(p => p.Hwid) - .HasColumnName("last_seen_hwid"); - - modelBuilder.Entity() - .OwnsOne(p => p.LastSeenHWId) - .Property(p => p.Type) - .HasDefaultValue(HwidType.Legacy); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Hwid) - .HasColumnName("hwid"); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Type) - .HasDefaultValue(HwidType.Legacy); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Hwid) - .HasColumnName("hwid"); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Type) - .HasDefaultValue(HwidType.Legacy); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Hwid) - .HasColumnName("hwid"); - - modelBuilder.Entity() - .OwnsOne(p => p.HWId) - .Property(p => p.Type) - .HasDefaultValue(HwidType.Legacy); } public virtual IQueryable SearchLogs(IQueryable query, string searchText) @@ -497,7 +454,7 @@ public class Player public string LastSeenUserName { get; set; } = null!; public DateTime LastSeenTime { get; set; } public IPAddress LastSeenAddress { get; set; } = null!; - public TypedHwid? LastSeenHWId { get; set; } + public byte[]? LastSeenHWId { get; set; } // Data that changes with each round public List Rounds { get; set; } = null!; @@ -646,7 +603,7 @@ public interface IBanCommon where TUnban : IUnbanCommon int Id { get; set; } Guid? PlayerUserId { get; set; } NpgsqlInet? Address { get; set; } - TypedHwid? HWId { get; set; } + byte[]? HWId { get; set; } DateTime BanTime { get; set; } DateTime? ExpirationTime { get; set; } string Reason { get; set; } @@ -731,7 +688,7 @@ public class ServerBan : IBanCommon /// /// Hardware ID of the banned player. /// - public TypedHwid? HWId { get; set; } + public byte[]? HWId { get; set; } /// /// The time when the ban was applied by an administrator. @@ -869,7 +826,7 @@ public class ConnectionLog public DateTime Time { get; set; } public IPAddress Address { get; set; } = null!; - public TypedHwid? HWId { get; set; } + public byte[]? HWId { get; set; } public ConnectionDenyReason? Denied { get; set; } @@ -886,8 +843,6 @@ public class ConnectionLog public List BanHits { get; set; } = null!; public Server Server { get; set; } = null!; - - public float Trust { get; set; } } public enum ConnectionDenyReason : byte @@ -925,7 +880,7 @@ public sealed class ServerRoleBan : IBanCommon public Guid? PlayerUserId { get; set; } [Required] public TimeSpan PlaytimeAtNote { get; set; } public NpgsqlInet? Address { get; set; } - public TypedHwid? HWId { get; set; } + public byte[]? HWId { get; set; } public DateTime BanTime { get; set; } @@ -1186,37 +1141,4 @@ public sealed class BanTemplate /// public bool Hidden { get; set; } } - - /// - /// A hardware ID value together with its . - /// - /// - [Owned] - public sealed class TypedHwid - { - public byte[] Hwid { get; set; } = default!; - public HwidType Type { get; set; } - - [return: NotNullIfNotNull(nameof(immutable))] - public static implicit operator TypedHwid?(ImmutableTypedHwid? immutable) - { - if (immutable == null) - return null; - - return new TypedHwid - { - Hwid = immutable.Hwid.ToArray(), - Type = immutable.Type, - }; - } - - [return: NotNullIfNotNull(nameof(hwid))] - public static implicit operator ImmutableTypedHwid?(TypedHwid? hwid) - { - if (hwid == null) - return null; - - return new ImmutableTypedHwid(hwid.Hwid.ToImmutableArray(), hwid.Type); - } - } } diff --git a/Content.Server/Administration/BanList/BanListEui.cs b/Content.Server/Administration/BanList/BanListEui.cs index 2ca126bf16..8ddc7459d7 100644 --- a/Content.Server/Administration/BanList/BanListEui.cs +++ b/Content.Server/Administration/BanList/BanListEui.cs @@ -54,7 +54,7 @@ private void OnPermsChanged(AdminPermsChangedEventArgs args) private async Task LoadBans(NetUserId userId) { - foreach (var ban in await _db.GetServerBansAsync(null, userId, null, null)) + foreach (var ban in await _db.GetServerBansAsync(null, userId, null)) { SharedServerUnban? unban = null; if (ban.Unban is { } unbanDef) @@ -74,7 +74,7 @@ private async Task LoadBans(NetUserId userId) ? (address.address.ToString(), address.cidrMask) : null; - hwid = ban.HWId?.ToString(); + hwid = ban.HWId == null ? null : Convert.ToBase64String(ban.HWId.Value.AsSpan()); } Bans.Add(new SharedServerBan( @@ -95,7 +95,7 @@ private async Task LoadBans(NetUserId userId) private async Task LoadRoleBans(NetUserId userId) { - foreach (var ban in await _db.GetServerRoleBansAsync(null, userId, null, null)) + foreach (var ban in await _db.GetServerRoleBansAsync(null, userId, null)) { SharedServerUnban? unban = null; if (ban.Unban is { } unbanDef) @@ -115,7 +115,7 @@ private async Task LoadRoleBans(NetUserId userId) ? (address.address.ToString(), address.cidrMask) : null; - hwid = ban.HWId?.ToString(); + hwid = ban.HWId == null ? null : Convert.ToBase64String(ban.HWId.Value.AsSpan()); } RoleBans.Add(new SharedServerRoleBan( ban.Id, diff --git a/Content.Server/Administration/BanPanelEui.cs b/Content.Server/Administration/BanPanelEui.cs index 3e33693208..aa6bd8d4bf 100644 --- a/Content.Server/Administration/BanPanelEui.cs +++ b/Content.Server/Administration/BanPanelEui.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Net; using System.Net.Sockets; using Content.Server.Administration.Managers; @@ -27,7 +28,7 @@ public sealed class BanPanelEui : BaseEui private NetUserId? PlayerId { get; set; } private string PlayerName { get; set; } = string.Empty; private IPAddress? LastAddress { get; set; } - private ImmutableTypedHwid? LastHwid { get; set; } + private ImmutableArray? LastHwid { get; set; } private const int Ipv4_CIDR = 32; private const int Ipv6_CIDR = 64; @@ -51,7 +52,7 @@ public override void HandleMessage(EuiMessageBase msg) switch (msg) { case BanPanelEuiStateMsg.CreateBanRequest r: - BanPlayer(r.Player, r.IpAddress, r.UseLastIp, r.Hwid, r.UseLastHwid, r.Minutes, r.Severity, r.Reason, r.Roles, r.Erase); + BanPlayer(r.Player, r.IpAddress, r.UseLastIp, r.Hwid?.ToImmutableArray(), r.UseLastHwid, r.Minutes, r.Severity, r.Reason, r.Roles, r.Erase); break; case BanPanelEuiStateMsg.GetPlayerInfoRequest r: ChangePlayer(r.PlayerUsername); @@ -59,7 +60,7 @@ public override void HandleMessage(EuiMessageBase msg) } } - private async void BanPlayer(string? target, string? ipAddressString, bool useLastIp, ImmutableTypedHwid? hwid, bool useLastHwid, uint minutes, NoteSeverity severity, string reason, IReadOnlyCollection? roles, bool erase) + private async void BanPlayer(string? target, string? ipAddressString, bool useLastIp, ImmutableArray? hwid, bool useLastHwid, uint minutes, NoteSeverity severity, string reason, IReadOnlyCollection? roles, bool erase) { if (!_admins.HasAdminFlag(Player, AdminFlags.Ban)) { @@ -156,7 +157,7 @@ public async void ChangePlayer(string playerNameOrId) ChangePlayer(located?.UserId, located?.Username ?? string.Empty, located?.LastAddress, located?.LastHWId); } - public void ChangePlayer(NetUserId? playerId, string playerName, IPAddress? lastAddress, ImmutableTypedHwid? lastHwid) + public void ChangePlayer(NetUserId? playerId, string playerName, IPAddress? lastAddress, ImmutableArray? lastHwid) { PlayerId = playerId; PlayerName = playerName; diff --git a/Content.Server/Administration/Commands/BanListCommand.cs b/Content.Server/Administration/Commands/BanListCommand.cs index 2f7093ae1d..a5bc97dce3 100644 --- a/Content.Server/Administration/Commands/BanListCommand.cs +++ b/Content.Server/Administration/Commands/BanListCommand.cs @@ -38,7 +38,7 @@ public override async void Execute(IConsoleShell shell, string argStr, string[] if (shell.Player is not { } player) { - var bans = await _dbManager.GetServerBansAsync(data.LastAddress, data.UserId, data.LastLegacyHWId, data.LastModernHWIds, false); + var bans = await _dbManager.GetServerBansAsync(data.LastAddress, data.UserId, data.LastHWId, false); if (bans.Count == 0) { diff --git a/Content.Server/Administration/Commands/RoleBanListCommand.cs b/Content.Server/Administration/Commands/RoleBanListCommand.cs index c87a0b3b54..aa416bc33f 100644 --- a/Content.Server/Administration/Commands/RoleBanListCommand.cs +++ b/Content.Server/Administration/Commands/RoleBanListCommand.cs @@ -44,7 +44,7 @@ public async void Execute(IConsoleShell shell, string argStr, string[] args) var targetUid = located.UserId; var targetAddress = located.LastAddress; - var bans = await dbMan.GetServerRoleBansAsync(targetAddress, targetUid, located.LastLegacyHWId, located.LastModernHWIds, includeUnbanned); + var bans = await dbMan.GetServerRoleBansAsync(targetAddress, targetUid, targetHWid, includeUnbanned); if (bans.Count == 0) { diff --git a/Content.Server/Administration/Managers/BanManager.cs b/Content.Server/Administration/Managers/BanManager.cs index d36bcd29d0..e04a6e3d35 100644 --- a/Content.Server/Administration/Managers/BanManager.cs +++ b/Content.Server/Administration/Managers/BanManager.cs @@ -62,15 +62,6 @@ public void Initialize() private async Task CachePlayerData(ICommonSession player, CancellationToken cancel) { var flags = await _db.GetBanExemption(player.UserId, cancel); - - var netChannel = player.Channel; - ImmutableArray? hwId = netChannel.UserData.HWId.Length == 0 ? null : netChannel.UserData.HWId; - var modernHwids = netChannel.UserData.ModernHWIds; - var roleBans = await _db.GetServerRoleBansAsync(netChannel.RemoteEndPoint.Address, player.UserId, hwId, modernHwids, false); - - var userRoleBans = new List(); - foreach (var ban in roleBans) - userRoleBans.Add(ban); cancel.ThrowIfCancellationRequested(); _cachedBanExemptions[player] = flags; _cachedRoleBans[player] = userRoleBans; @@ -130,7 +121,7 @@ public void Restart() } #region Server Bans - public async void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableTypedHwid? hwid, uint? minutes, NoteSeverity severity, string reason) + public async void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray? hwid, uint? minutes, NoteSeverity severity, string reason) { DateTimeOffset? expires = null; if (minutes > 0) @@ -164,7 +155,9 @@ public async void CreateServerBan(NetUserId? target, string? targetUsername, Net var addressRangeString = addressRange != null ? $"{addressRange.Value.Item1}/{addressRange.Value.Item2}" : "null"; - var hwidString = hwid?.ToString() ?? "null"; + var hwidString = hwid != null + ? string.Concat(hwid.Value.Select(x => x.ToString("x2"))) + : "null"; var expiresString = expires == null ? Loc.GetString("server-ban-string-never") : $"{expires}"; var key = _cfg.GetCVar(CCVars.AdminShowPIIOnBan) ? "server-ban-string" : "server-ban-string-no-pii"; @@ -204,7 +197,6 @@ private bool BanMatchesPlayer(ICommonSession player, ServerBanDef ban) UserId = player.UserId, Address = player.Channel.RemoteEndPoint.Address, HWId = player.Channel.UserData.HWId, - ModernHWIds = player.Channel.UserData.ModernHWIds, // It's possible for the player to not have cached data loading yet due to coincidental timing. // If this is the case, we assume they have all flags to avoid false-positives. ExemptFlags = _cachedBanExemptions.GetValueOrDefault(player, ServerBanExemptFlags.All), @@ -225,7 +217,7 @@ private void KickForBanDef(ICommonSession player, ServerBanDef def) #region Job Bans // If you are trying to remove timeOfBan, please don't. It's there because the note system groups role bans by time, reason and banning admin. // Removing it will clutter the note list. Please also make sure that department bans are applied to roles with the same DateTimeOffset. - public async void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableTypedHwid? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan) + public async void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan) { if (!_prototypeManager.TryIndex(role, out JobPrototype? _)) { diff --git a/Content.Server/Administration/Managers/IBanManager.cs b/Content.Server/Administration/Managers/IBanManager.cs index fc192cc306..c11e310a82 100644 --- a/Content.Server/Administration/Managers/IBanManager.cs +++ b/Content.Server/Administration/Managers/IBanManager.cs @@ -24,7 +24,7 @@ public interface IBanManager /// Number of minutes to ban for. 0 and null mean permanent /// Severity of the resulting ban note /// Reason for the ban - public void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableTypedHwid? hwid, uint? minutes, NoteSeverity severity, string reason); + public void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray? hwid, uint? minutes, NoteSeverity severity, string reason); public HashSet? GetRoleBans(NetUserId playerUserId); public HashSet>? GetJobBans(NetUserId playerUserId); @@ -37,7 +37,7 @@ public interface IBanManager /// Reason for the ban /// Number of minutes to ban for. 0 and null mean permanent /// Time when the ban was applied, used for grouping role bans - public void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableTypedHwid? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan); + public void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan); /// /// Pardons a role ban for the specified target, username or GUID diff --git a/Content.Server/Administration/PlayerLocator.cs b/Content.Server/Administration/PlayerLocator.cs index 25cc771468..64a85f19ad 100644 --- a/Content.Server/Administration/PlayerLocator.cs +++ b/Content.Server/Administration/PlayerLocator.cs @@ -5,42 +5,16 @@ using System.Net.Http.Json; using System.Threading; using System.Threading.Tasks; -using Content.Server.Connection; using Content.Server.Database; -using Content.Shared.Database; using JetBrains.Annotations; using Robust.Server.Player; using Robust.Shared; using Robust.Shared.Configuration; using Robust.Shared.Network; -using Robust.Shared.Player; namespace Content.Server.Administration { - /// - /// Contains data resolved via . - /// - /// The ID of the located user. - /// The last known IP address that the user connected with. - /// - /// The last known HWID that the user connected with. - /// This should be used for placing new records involving HWIDs, such as bans. - /// For looking up data based on HWID, use combined and . - /// - /// The last known username for the user connected with. - /// - /// The last known legacy HWID value this user connected with. Only use for old lookups! - /// - /// - /// The set of last known modern HWIDs the user connected with. - /// - public sealed record LocatedPlayerData( - NetUserId UserId, - IPAddress? LastAddress, - ImmutableTypedHwid? LastHWId, - string Username, - ImmutableArray? LastLegacyHWId, - ImmutableArray> LastModernHWIds); + public sealed record LocatedPlayerData(NetUserId UserId, IPAddress? LastAddress, ImmutableArray? LastHWId, string Username); /// /// Utilities for finding user IDs that extend to more than the server database. @@ -93,42 +67,63 @@ public PlayerLocator() { // Check people currently on the server, the easiest case. if (_playerManager.TryGetSessionByUsername(playerName, out var session)) - return ReturnForSession(session); + { + var userId = session.UserId; + var address = session.Channel.RemoteEndPoint.Address; + var hwId = session.Channel.UserData.HWId; + return new LocatedPlayerData(userId, address, hwId, session.Name); + } // Check database for past players. var record = await _db.GetPlayerRecordByUserName(playerName, cancel); if (record != null) - return ReturnForPlayerRecord(record); + return new LocatedPlayerData(record.UserId, record.LastSeenAddress, record.HWId, record.LastSeenUserName); // If all else fails, ask the auth server. var authServer = _configurationManager.GetCVar(CVars.AuthServer); var requestUri = $"{authServer}api/query/name?name={WebUtility.UrlEncode(playerName)}"; using var resp = await _httpClient.GetAsync(requestUri, cancel); - return await HandleAuthServerResponse(resp, cancel); + if (resp.StatusCode == HttpStatusCode.NotFound) + return null; + + if (!resp.IsSuccessStatusCode) + { + _sawmill.Error("Auth server returned bad response {StatusCode}!", resp.StatusCode); + return null; + } + + var responseData = await resp.Content.ReadFromJsonAsync(cancellationToken: cancel); + + if (responseData == null) + { + _sawmill.Error("Auth server returned null response!"); + return null; + } + + return new LocatedPlayerData(new NetUserId(responseData.UserId), null, null, responseData.UserName); } public async Task LookupIdAsync(NetUserId userId, CancellationToken cancel = default) { // Check people currently on the server, the easiest case. if (_playerManager.TryGetSessionById(userId, out var session)) - return ReturnForSession(session); + { + var address = session.Channel.RemoteEndPoint.Address; + var hwId = session.Channel.UserData.HWId; + return new LocatedPlayerData(userId, address, hwId, session.Name); + } // Check database for past players. var record = await _db.GetPlayerRecordByUserId(userId, cancel); if (record != null) - return ReturnForPlayerRecord(record); + return new LocatedPlayerData(record.UserId, record.LastSeenAddress, record.HWId, record.LastSeenUserName); // If all else fails, ask the auth server. var authServer = _configurationManager.GetCVar(CVars.AuthServer); var requestUri = $"{authServer}api/query/userid?userid={WebUtility.UrlEncode(userId.UserId.ToString())}"; using var resp = await _httpClient.GetAsync(requestUri, cancel); - return await HandleAuthServerResponse(resp, cancel); - } - - private async Task HandleAuthServerResponse(HttpResponseMessage resp, CancellationToken cancel) - { if (resp.StatusCode == HttpStatusCode.NotFound) return null; @@ -139,40 +134,14 @@ public PlayerLocator() } var responseData = await resp.Content.ReadFromJsonAsync(cancellationToken: cancel); + if (responseData == null) { _sawmill.Error("Auth server returned null response!"); return null; } - return new LocatedPlayerData(new NetUserId(responseData.UserId), null, null, responseData.UserName, null, []); - } - - private static LocatedPlayerData ReturnForSession(ICommonSession session) - { - var userId = session.UserId; - var address = session.Channel.RemoteEndPoint.Address; - var hwId = session.Channel.UserData.GetModernHwid(); - return new LocatedPlayerData( - userId, - address, - hwId, - session.Name, - session.Channel.UserData.HWId, - session.Channel.UserData.ModernHWIds); - } - - private static LocatedPlayerData ReturnForPlayerRecord(PlayerRecord record) - { - var hwid = record.HWId; - - return new LocatedPlayerData( - record.UserId, - record.LastSeenAddress, - hwid, - record.LastSeenUserName, - hwid is { Type: HwidType.Legacy } ? hwid.Hwid : null, - hwid is { Type: HwidType.Modern } ? [hwid.Hwid] : []); + return new LocatedPlayerData(new NetUserId(responseData.UserId), null, null, responseData.UserName); } public async Task LookupIdByNameOrIdAsync(string playerName, CancellationToken cancel = default) diff --git a/Content.Server/Administration/PlayerPanelEui.cs b/Content.Server/Administration/PlayerPanelEui.cs index 6c30488886..4c0df80601 100644 --- a/Content.Server/Administration/PlayerPanelEui.cs +++ b/Content.Server/Administration/PlayerPanelEui.cs @@ -173,11 +173,11 @@ public async void SetPlayerState() { _whitelisted = await _db.GetWhitelistStatusAsync(_targetPlayer.UserId); // This won't get associated ip or hwid bans but they were not placed on this account anyways - _bans = (await _db.GetServerBansAsync(null, _targetPlayer.UserId, null, null)).Count; + _bans = (await _db.GetServerBansAsync(null, _targetPlayer.UserId, null)).Count; // Unfortunately role bans for departments and stuff are issued individually. This means that a single role ban can have many individual role bans internally // The only way to distinguish whether a role ban is the same is to compare the ban time. // This is horrible and I would love to just erase the database and start from scratch instead but that's what I can do for now. - _roleBans = (await _db.GetServerRoleBansAsync(null, _targetPlayer.UserId, null, null)).DistinctBy(rb => rb.BanTime).Count(); + _roleBans = (await _db.GetServerRoleBansAsync(null, _targetPlayer.UserId, null)).DistinctBy(rb => rb.BanTime).Count(); } else { diff --git a/Content.Server/Administration/Systems/BwoinkSystem.cs b/Content.Server/Administration/Systems/BwoinkSystem.cs index 220e79f3f3..21b5f6d301 100644 --- a/Content.Server/Administration/Systems/BwoinkSystem.cs +++ b/Content.Server/Administration/Systems/BwoinkSystem.cs @@ -173,7 +173,7 @@ private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs } // Check if the user has been banned - var ban = await _dbManager.GetServerBanAsync(null, e.Session.UserId, null, null); + var ban = await _dbManager.GetServerBanAsync(null, e.Session.UserId, null); if (ban != null) { var banMessage = Loc.GetString("bwoink-system-player-banned", ("banReason", ban.Reason)); diff --git a/Content.Server/Connection/ConnectionManager.cs b/Content.Server/Connection/ConnectionManager.cs index 1f36ba63dd..5209605d6d 100644 --- a/Content.Server/Connection/ConnectionManager.cs +++ b/Content.Server/Connection/ConnectionManager.cs @@ -118,14 +118,11 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) var serverId = (await _serverDbEntry.ServerEntity).Id; - var hwid = e.UserData.GetModernHwid(); - var trust = e.UserData.Trust; - if (deny != null) { var (reason, msg, banHits) = deny.Value; - var id = await _db.AddConnectionLogAsync(userId, e.UserName, addr, hwid, trust, reason, serverId); + var id = await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId, reason, serverId); if (banHits is { Count: > 0 }) await _db.AddServerBanHitsAsync(id, banHits); @@ -137,12 +134,12 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) } else { - await _db.AddConnectionLogAsync(userId, e.UserName, addr, hwid, trust, null, serverId); + await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId, null, serverId); if (!ServerPreferencesManager.ShouldStorePrefs(e.AuthType)) return; - await _db.UpdatePlayerRecordAsync(userId, e.UserName, addr, hwid); + await _db.UpdatePlayerRecordAsync(userId, e.UserName, addr, e.UserData.HWId); } } @@ -200,9 +197,7 @@ session.Status is SessionStatus.Connected or SessionStatus.InGame hwId = null; } - var modernHwid = e.UserData.ModernHWIds; - - var bans = await _db.GetServerBansAsync(addr, userId, hwId, modernHwid, includeUnbanned: false); + var bans = await _db.GetServerBansAsync(addr, userId, hwId, includeUnbanned: false); if (bans.Count > 0) { var firstBan = bans[0]; diff --git a/Content.Server/Connection/UserDataExt.cs b/Content.Server/Connection/UserDataExt.cs deleted file mode 100644 index a409f79a75..0000000000 --- a/Content.Server/Connection/UserDataExt.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Shared.Database; -using Robust.Shared.Network; - -namespace Content.Server.Connection; - -/// -/// Helper functions for working with . -/// -public static class UserDataExt -{ - /// - /// Get the preferred HWID that should be used for new records related to a player. - /// - /// - /// Players can have zero or more HWIDs, but for logging things like connection logs we generally - /// only want a single one. This method returns a nullable method. - /// - public static ImmutableTypedHwid? GetModernHwid(this NetUserData userData) - { - return userData.ModernHWIds.Length == 0 - ? null - : new ImmutableTypedHwid(userData.ModernHWIds[0], HwidType.Modern); - } -} diff --git a/Content.Server/Database/BanMatcher.cs b/Content.Server/Database/BanMatcher.cs index f477ccd822..e58e5b0b5f 100644 --- a/Content.Server/Database/BanMatcher.cs +++ b/Content.Server/Database/BanMatcher.cs @@ -1,7 +1,6 @@ using System.Collections.Immutable; using System.Net; using Content.Server.IP; -using Content.Shared.Database; using Robust.Shared.Network; namespace Content.Server.Database; @@ -53,28 +52,9 @@ public static bool BanMatches(ServerBanDef ban, in PlayerInfo player) return true; } - switch (ban.HWId?.Type) - { - case HwidType.Legacy: - if (player.HWId is { Length: > 0 } hwIdVar - && hwIdVar.AsSpan().SequenceEqual(ban.HWId.Hwid.AsSpan())) - { - return true; - } - break; - case HwidType.Modern: - if (player.ModernHWIds is { Length: > 0 } modernHwIdVar) - { - foreach (var hwid in modernHwIdVar) - { - if (hwid.AsSpan().SequenceEqual(ban.HWId.Hwid.AsSpan())) - return true; - } - } - break; - } - - return false; + return player.HWId is { Length: > 0 } hwIdVar + && ban.HWId != null + && hwIdVar.AsSpan().SequenceEqual(ban.HWId.Value.AsSpan()); } /// @@ -93,15 +73,10 @@ public struct PlayerInfo public IPAddress? Address; /// - /// The LEGACY hardware ID of the player. Corresponds with . + /// The hardware ID of the player. /// public ImmutableArray? HWId; - /// - /// The modern hardware IDs of the player. Corresponds with . - /// - public ImmutableArray>? ModernHWIds; - /// /// Exemption flags the player has been granted. /// diff --git a/Content.Server/Database/DatabaseRecords.cs b/Content.Server/Database/DatabaseRecords.cs index 30fba3434b..c0d81147bb 100644 --- a/Content.Server/Database/DatabaseRecords.cs +++ b/Content.Server/Database/DatabaseRecords.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Net; using Content.Shared.Database; using Robust.Shared.Network; @@ -120,7 +121,7 @@ public sealed record PlayerRecord( string LastSeenUserName, DateTimeOffset LastSeenTime, IPAddress LastSeenAddress, - ImmutableTypedHwid? HWId); + ImmutableArray? HWId); public sealed record RoundRecord(int Id, DateTimeOffset? StartDate, ServerRecord Server); diff --git a/Content.Server/Database/ServerBanDef.cs b/Content.Server/Database/ServerBanDef.cs index a09f9e959c..09a960e9a6 100644 --- a/Content.Server/Database/ServerBanDef.cs +++ b/Content.Server/Database/ServerBanDef.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Net; using Content.Shared.CCVar; using Content.Shared.Database; @@ -12,7 +13,7 @@ public sealed class ServerBanDef public int? Id { get; } public NetUserId? UserId { get; } public (IPAddress address, int cidrMask)? Address { get; } - public ImmutableTypedHwid? HWId { get; } + public ImmutableArray? HWId { get; } public DateTimeOffset BanTime { get; } public DateTimeOffset? ExpirationTime { get; } @@ -27,7 +28,7 @@ public sealed class ServerBanDef public ServerBanDef(int? id, NetUserId? userId, (IPAddress, int)? address, - TypedHwid? hwId, + ImmutableArray? hwId, DateTimeOffset banTime, DateTimeOffset? expirationTime, int? roundId, diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index 5f9ef727d6..876a20ff79 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -355,14 +355,12 @@ public async Task AssignUserIdAsync(string name, NetUserId netUserId) /// /// The ip address of the user. /// The id of the user. - /// The legacy HWId of the user. - /// The modern HWIDs of the user. + /// The HWId of the user. /// The user's latest received un-pardoned ban, or null if none exist. public abstract Task GetServerBanAsync( IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds); + ImmutableArray? hwId); /// /// Looks up an user's ban history. @@ -371,15 +369,13 @@ public async Task AssignUserIdAsync(string name, NetUserId netUserId) /// /// The ip address of the user. /// The id of the user. - /// The legacy HWId of the user. - /// The modern HWIDs of the user. + /// The HWId of the user. /// Include pardoned and expired bans. /// The user's ban history. public abstract Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned); public abstract Task AddServerBanAsync(ServerBanDef serverBan); @@ -470,13 +466,11 @@ public async Task GetBanExemption(NetUserId userId, Cancel /// The IP address of the user. /// The NetUserId of the user. /// The Hardware Id of the user. - /// The modern HWIDs of the user. /// Whether expired and pardoned bans are included. /// The user's role ban history. public abstract Task> GetServerRoleBansAsync(IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned); public abstract Task AddServerRoleBanAsync(ServerRoleBanDef serverRoleBan); @@ -559,7 +553,7 @@ public async Task UpdatePlayerRecord( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId) + ImmutableArray hwId) { await using var db = await GetDb(); @@ -576,7 +570,7 @@ public async Task UpdatePlayerRecord( record.LastSeenTime = DateTime.UtcNow; record.LastSeenAddress = address; record.LastSeenUserName = userName; - record.LastSeenHWId = hwId; + record.LastSeenHWId = hwId.ToArray(); await db.DbContext.SaveChangesAsync(); } @@ -622,7 +616,7 @@ protected async Task PlayerRecordExists(DbGuard db, NetUserId userId) player.LastSeenUserName, new DateTimeOffset(NormalizeDatabaseTime(player.LastSeenTime)), player.LastSeenAddress, - player.LastSeenHWId); + player.LastSeenHWId?.ToImmutableArray()); } #endregion @@ -631,11 +625,11 @@ protected async Task PlayerRecordExists(DbGuard db, NetUserId userId) /* * CONNECTION LOG */ - public abstract Task AddConnectionLogAsync(NetUserId userId, + public abstract Task AddConnectionLogAsync( + NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId, - float trust, + ImmutableArray hwId, ConnectionDenyReason? denied, int serverId); diff --git a/Content.Server/Database/ServerDbManager.cs b/Content.Server/Database/ServerDbManager.cs index c614e231cc..c74b1e632c 100644 --- a/Content.Server/Database/ServerDbManager.cs +++ b/Content.Server/Database/ServerDbManager.cs @@ -69,14 +69,12 @@ Task InitPrefsAsync( /// /// The ip address of the user. /// The id of the user. - /// The legacy HWID of the user. - /// The modern HWIDs of the user. + /// The hardware ID of the user. /// The user's latest received un-pardoned ban, or null if none exist. Task GetServerBanAsync( IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds); + ImmutableArray? hwId); /// /// Looks up an user's ban history. @@ -84,16 +82,14 @@ Task InitPrefsAsync( /// /// The ip address of the user. /// The id of the user. - /// The legacy HWId of the user. - /// The modern HWIDs of the user. + /// The HWId of the user. /// If true, bans that have been expired or pardoned are also included. /// The user's ban history. Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, - bool includeUnbanned=true); + bool includeUnbanned = true); Task AddServerBanAsync(ServerBanDef serverBan); Task AddServerUnbanAsync(ServerUnbanDef serverBan); @@ -141,14 +137,12 @@ public Task EditServerBan( /// The IP address of the user. /// The NetUserId of the user. /// The Hardware Id of the user. - /// The modern HWIDs of the user. /// Whether expired and pardoned bans are included. /// The user's role ban history. Task> GetServerRoleBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned = true); Task AddServerRoleBanAsync(ServerRoleBanDef serverBan); @@ -186,7 +180,7 @@ Task UpdatePlayerRecordAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId); + ImmutableArray hwId); Task GetPlayerRecordByUserName(string userName, CancellationToken cancel = default); Task GetPlayerRecordByUserId(NetUserId userId, CancellationToken cancel = default); #endregion @@ -197,8 +191,7 @@ Task AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId, - float trust, + ImmutableArray hwId, ConnectionDenyReason? denied, int serverId); @@ -487,22 +480,20 @@ public Task AssignUserIdAsync(string name, NetUserId userId) public Task GetServerBanAsync( IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds) + ImmutableArray? hwId) { DbReadOpsMetric.Inc(); - return RunDbCommand(() => _db.GetServerBanAsync(address, userId, hwId, modernHWIds)); + return RunDbCommand(() => _db.GetServerBanAsync(address, userId, hwId)); } public Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, - bool includeUnbanned=true) + bool includeUnbanned = true) { DbReadOpsMetric.Inc(); - return RunDbCommand(() => _db.GetServerBansAsync(address, userId, hwId, modernHWIds, includeUnbanned)); + return RunDbCommand(() => _db.GetServerBansAsync(address, userId, hwId, includeUnbanned)); } public Task AddServerBanAsync(ServerBanDef serverBan) @@ -546,11 +537,10 @@ public Task> GetServerRoleBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned = true) { DbReadOpsMetric.Inc(); - return RunDbCommand(() => _db.GetServerRoleBansAsync(address, userId, hwId, modernHWIds, includeUnbanned)); + return RunDbCommand(() => _db.GetServerRoleBansAsync(address, userId, hwId, includeUnbanned)); } public Task AddServerRoleBanAsync(ServerRoleBanDef serverRoleBan) @@ -592,7 +582,7 @@ public Task UpdatePlayerRecordAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId) + ImmutableArray hwId) { DbWriteOpsMetric.Inc(); return RunDbCommand(() => _db.UpdatePlayerRecord(userId, userName, address, hwId)); @@ -614,13 +604,12 @@ public Task AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId, - float trust, + ImmutableArray hwId, ConnectionDenyReason? denied, int serverId) { DbWriteOpsMetric.Inc(); - return RunDbCommand(() => _db.AddConnectionLogAsync(userId, userName, address, hwId, trust, denied, serverId)); + return RunDbCommand(() => _db.AddConnectionLogAsync(userId, userName, address, hwId, denied, serverId)); } public Task AddServerBanHitsAsync(int connection, IEnumerable bans) diff --git a/Content.Server/Database/ServerDbPostgres.cs b/Content.Server/Database/ServerDbPostgres.cs index c034670837..7d131f70dc 100644 --- a/Content.Server/Database/ServerDbPostgres.cs +++ b/Content.Server/Database/ServerDbPostgres.cs @@ -9,7 +9,6 @@ using Content.Server.Administration.Logs; using Content.Server.IP; using Content.Shared.CCVar; -using Content.Shared.Database; using Microsoft.EntityFrameworkCore; using Robust.Shared.Configuration; using Robust.Shared.Network; @@ -74,8 +73,7 @@ public ServerDbPostgres(DbContextOptions options, public override async Task GetServerBanAsync( IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds) + ImmutableArray? hwId) { if (address == null && userId == null && hwId == null) { @@ -86,7 +84,7 @@ public ServerDbPostgres(DbContextOptions options, var exempt = await GetBanExemptionCore(db, userId); var newPlayer = userId == null || !await PlayerRecordExists(db, userId.Value); - var query = MakeBanLookupQuery(address, userId, hwId, modernHWIds, db, includeUnbanned: false, exempt, newPlayer) + var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned: false, exempt, newPlayer) .OrderByDescending(b => b.BanTime); var ban = await query.FirstOrDefaultAsync(); @@ -96,9 +94,7 @@ public ServerDbPostgres(DbContextOptions options, public override async Task> GetServerBansAsync(IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds, - bool includeUnbanned) + ImmutableArray? hwId, bool includeUnbanned) { if (address == null && userId == null && hwId == null) { @@ -109,7 +105,7 @@ public override async Task> GetServerBansAsync(IPAddress? add var exempt = await GetBanExemptionCore(db, userId); var newPlayer = !await db.PgDbContext.Player.AnyAsync(p => p.UserId == userId); - var query = MakeBanLookupQuery(address, userId, hwId, modernHWIds, db, includeUnbanned, exempt, newPlayer); + var query = MakeBanLookupQuery(address, userId, hwId, db, includeUnbanned, exempt, newPlayer); var queryBans = await query.ToArrayAsync(); var bans = new List(queryBans.Length); @@ -131,7 +127,6 @@ private static IQueryable MakeBanLookupQuery( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, DbGuardImpl db, bool includeUnbanned, ServerBanExemptFlags? exemptFlags, @@ -139,11 +134,16 @@ private static IQueryable MakeBanLookupQuery( { DebugTools.Assert(!(address == null && userId == null && hwId == null)); - var query = MakeBanLookupQualityShared( - userId, - hwId, - modernHWIds, - db.PgDbContext.Ban); + IQueryable? query = null; + + if (userId is { } uid) + { + var newQ = db.PgDbContext.Ban + .Include(p => p.Unban) + .Where(b => b.PlayerUserId == uid.UserId); + + query = query == null ? newQ : query.Union(newQ); + } if (address != null && !exemptFlags.GetValueOrDefault(ServerBanExemptFlags.None).HasFlag(ServerBanExemptFlags.IP)) { @@ -156,6 +156,15 @@ private static IQueryable MakeBanLookupQuery( query = query == null ? newQ : query.Union(newQ); } + if (hwId != null && hwId.Value.Length > 0) + { + var newQ = db.PgDbContext.Ban + .Include(p => p.Unban) + .Where(b => b.HWId!.SequenceEqual(hwId.Value.ToArray())); + + query = query == null ? newQ : query.Union(newQ); + } + DebugTools.Assert( query != null, "At least one filter item (IP/UserID/HWID) must have been given to make query not null."); @@ -177,49 +186,6 @@ private static IQueryable MakeBanLookupQuery( return query.Distinct(); } - private static IQueryable? MakeBanLookupQualityShared( - NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds, - DbSet set) - where TBan : class, IBanCommon - where TUnban : class, IUnbanCommon - { - IQueryable? query = null; - - if (userId is { } uid) - { - var newQ = set - .Include(p => p.Unban) - .Where(b => b.PlayerUserId == uid.UserId); - - query = query == null ? newQ : query.Union(newQ); - } - - if (hwId != null && hwId.Value.Length > 0) - { - var newQ = set - .Include(p => p.Unban) - .Where(b => b.HWId!.Type == HwidType.Legacy && b.HWId!.Hwid.SequenceEqual(hwId.Value.ToArray())); - - query = query == null ? newQ : query.Union(newQ); - } - - if (modernHWIds != null) - { - foreach (var modernHwid in modernHWIds) - { - var newQ = set - .Include(p => p.Unban) - .Where(b => b.HWId!.Type == HwidType.Modern && b.HWId!.Hwid.SequenceEqual(modernHwid.ToArray())); - - query = query == null ? newQ : query.Union(newQ); - } - } - - return query; - } - private static ServerBanDef? ConvertBan(ServerBan? ban) { if (ban == null) @@ -245,7 +211,7 @@ private static IQueryable MakeBanLookupQuery( ban.Id, uid, ban.Address.ToTuple(), - ban.HWId, + ban.HWId == null ? null : ImmutableArray.Create(ban.HWId), ban.BanTime, ban.ExpirationTime, ban.RoundId, @@ -283,7 +249,7 @@ public override async Task AddServerBanAsync(ServerBanDef serverBan) db.PgDbContext.Ban.Add(new ServerBan { Address = serverBan.Address.ToNpgsqlInet(), - HWId = serverBan.HWId, + HWId = serverBan.HWId?.ToArray(), Reason = serverBan.Reason, Severity = serverBan.Severity, BanningAdmin = serverBan.BanningAdmin?.UserId, @@ -331,7 +297,6 @@ public override async Task AddServerUnbanAsync(ServerUnbanDef serverUnban) public override async Task> GetServerRoleBansAsync(IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned) { if (address == null && userId == null && hwId == null) @@ -341,7 +306,7 @@ public override async Task> GetServerRoleBansAsync(IPAddr await using var db = await GetDbImpl(); - var query = MakeRoleBanLookupQuery(address, userId, hwId, modernHWIds, db, includeUnbanned) + var query = MakeRoleBanLookupQuery(address, userId, hwId, db, includeUnbanned) .OrderByDescending(b => b.BanTime); return await QueryRoleBans(query); @@ -369,15 +334,19 @@ private static IQueryable MakeRoleBanLookupQuery( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, DbGuardImpl db, bool includeUnbanned) { - var query = MakeBanLookupQualityShared( - userId, - hwId, - modernHWIds, - db.PgDbContext.RoleBan); + IQueryable? query = null; + + if (userId is { } uid) + { + var newQ = db.PgDbContext.RoleBan + .Include(p => p.Unban) + .Where(b => b.PlayerUserId == uid.UserId); + + query = query == null ? newQ : query.Union(newQ); + } if (address != null) { @@ -388,6 +357,15 @@ private static IQueryable MakeRoleBanLookupQuery( query = query == null ? newQ : query.Union(newQ); } + if (hwId != null && hwId.Value.Length > 0) + { + var newQ = db.PgDbContext.RoleBan + .Include(p => p.Unban) + .Where(b => b.HWId!.SequenceEqual(hwId.Value.ToArray())); + + query = query == null ? newQ : query.Union(newQ); + } + if (!includeUnbanned) { query = query?.Where(p => @@ -424,7 +402,7 @@ private static IQueryable MakeRoleBanLookupQuery( ban.Id, uid, ban.Address.ToTuple(), - ban.HWId, + ban.HWId == null ? null : ImmutableArray.Create(ban.HWId), ban.BanTime, ban.ExpirationTime, ban.RoundId, @@ -462,7 +440,7 @@ public override async Task AddServerRoleBanAsync(ServerRoleBan var ban = new ServerRoleBan { Address = serverRoleBan.Address.ToNpgsqlInet(), - HWId = serverRoleBan.HWId, + HWId = serverRoleBan.HWId?.ToArray(), Reason = serverRoleBan.Reason, Severity = serverRoleBan.Severity, BanningAdmin = serverRoleBan.BanningAdmin?.UserId, @@ -498,8 +476,7 @@ public override async Task AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId, - float trust, + ImmutableArray hwId, ConnectionDenyReason? denied, int serverId) { @@ -511,10 +488,9 @@ public override async Task AddConnectionLogAsync( Time = DateTime.UtcNow, UserId = userId.UserId, UserName = userName, - HWId = hwId, + HWId = hwId.ToArray(), Denied = denied, - ServerId = serverId, - Trust = trust, + ServerId = serverId }; db.PgDbContext.ConnectionLog.Add(connectionLog); diff --git a/Content.Server/Database/ServerDbSqlite.cs b/Content.Server/Database/ServerDbSqlite.cs index 623b979f4b..58d21acb63 100644 --- a/Content.Server/Database/ServerDbSqlite.cs +++ b/Content.Server/Database/ServerDbSqlite.cs @@ -9,7 +9,6 @@ using Content.Server.IP; using Content.Server.Preferences.Managers; using Content.Shared.CCVar; -using Content.Shared.Database; using Microsoft.EntityFrameworkCore; using Robust.Shared.Configuration; using Robust.Shared.Network; @@ -81,24 +80,22 @@ public ServerDbSqlite( public override async Task GetServerBanAsync( IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds) + ImmutableArray? hwId) { await using var db = await GetDbImpl(); - return (await GetServerBanQueryAsync(db, address, userId, hwId, modernHWIds, includeUnbanned: false)).FirstOrDefault(); + return (await GetServerBanQueryAsync(db, address, userId, hwId, includeUnbanned: false)).FirstOrDefault(); } public override async Task> GetServerBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned) { await using var db = await GetDbImpl(); - return (await GetServerBanQueryAsync(db, address, userId, hwId, modernHWIds, includeUnbanned)).ToList(); + return (await GetServerBanQueryAsync(db, address, userId, hwId, includeUnbanned)).ToList(); } private async Task> GetServerBanQueryAsync( @@ -106,7 +103,6 @@ private async Task> GetServerBanQueryAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned) { var exempt = await GetBanExemptionCore(db, userId); @@ -123,7 +119,6 @@ private async Task> GetServerBanQueryAsync( UserId = userId, ExemptFlags = exempt ?? default, HWId = hwId, - ModernHWIds = modernHWIds, IsNewPlayer = newPlayer, }; @@ -162,7 +157,7 @@ public override async Task AddServerBanAsync(ServerBanDef serverBan) Reason = serverBan.Reason, Severity = serverBan.Severity, BanningAdmin = serverBan.BanningAdmin?.UserId, - HWId = serverBan.HWId, + HWId = serverBan.HWId?.ToArray(), BanTime = serverBan.BanTime.UtcDateTime, ExpirationTime = serverBan.ExpirationTime?.UtcDateTime, RoundId = serverBan.RoundId, @@ -206,7 +201,6 @@ public override async Task> GetServerRoleBansAsync( IPAddress? address, NetUserId? userId, ImmutableArray? hwId, - ImmutableArray>? modernHWIds, bool includeUnbanned) { await using var db = await GetDbImpl(); @@ -216,7 +210,7 @@ public override async Task> GetServerRoleBansAsync( var queryBans = await GetAllRoleBans(db.SqliteDbContext, includeUnbanned); return queryBans - .Where(b => RoleBanMatches(b, address, userId, hwId, modernHWIds)) + .Where(b => RoleBanMatches(b, address, userId, hwId)) .Select(ConvertRoleBan) .ToList()!; } @@ -239,8 +233,7 @@ private static bool RoleBanMatches( ServerRoleBan ban, IPAddress? address, NetUserId? userId, - ImmutableArray? hwId, - ImmutableArray>? modernHWIds) + ImmutableArray? hwId) { if (address != null && ban.Address is not null && address.IsInSubnet(ban.Address.ToTuple().Value)) { @@ -252,27 +245,7 @@ private static bool RoleBanMatches( return true; } - switch (ban.HWId?.Type) - { - case HwidType.Legacy: - if (hwId is { Length: > 0 } hwIdVar && hwIdVar.AsSpan().SequenceEqual(ban.HWId.Hwid)) - return true; - break; - - case HwidType.Modern: - if (modernHWIds != null) - { - foreach (var modernHWId in modernHWIds) - { - if (modernHWId.AsSpan().SequenceEqual(ban.HWId.Hwid)) - return true; - } - } - - break; - } - - return false; + return hwId is { Length: > 0 } hwIdVar && hwIdVar.AsSpan().SequenceEqual(ban.HWId); } public override async Task AddServerRoleBanAsync(ServerRoleBanDef serverBan) @@ -285,7 +258,7 @@ public override async Task AddServerRoleBanAsync(ServerRoleBan Reason = serverBan.Reason, Severity = serverBan.Severity, BanningAdmin = serverBan.BanningAdmin?.UserId, - HWId = serverBan.HWId, + HWId = serverBan.HWId?.ToArray(), BanTime = serverBan.BanTime.UtcDateTime, ExpirationTime = serverBan.ExpirationTime?.UtcDateTime, RoundId = serverBan.RoundId, @@ -339,7 +312,7 @@ public override async Task AddServerRoleUnbanAsync(ServerRoleUnbanDef serverUnba ban.Id, uid, ban.Address.ToTuple(), - ban.HWId, + ban.HWId == null ? null : ImmutableArray.Create(ban.HWId), // SQLite apparently always reads DateTime as unspecified, but we always write as UTC. DateTime.SpecifyKind(ban.BanTime, DateTimeKind.Utc), ban.ExpirationTime == null ? null : DateTime.SpecifyKind(ban.ExpirationTime.Value, DateTimeKind.Utc), @@ -399,7 +372,7 @@ public override async Task AddServerRoleUnbanAsync(ServerRoleUnbanDef serverUnba ban.Id, uid, ban.Address.ToTuple(), - ban.HWId, + ban.HWId == null ? null : ImmutableArray.Create(ban.HWId), // SQLite apparently always reads DateTime as unspecified, but we always write as UTC. DateTime.SpecifyKind(ban.BanTime, DateTimeKind.Utc), ban.ExpirationTime == null ? null : DateTime.SpecifyKind(ban.ExpirationTime.Value, DateTimeKind.Utc), @@ -435,8 +408,7 @@ public override async Task AddConnectionLogAsync( NetUserId userId, string userName, IPAddress address, - ImmutableTypedHwid? hwId, - float trust, + ImmutableArray hwId, ConnectionDenyReason? denied, int serverId) { @@ -448,10 +420,9 @@ public override async Task AddConnectionLogAsync( Time = DateTime.UtcNow, UserId = userId.UserId, UserName = userName, - HWId = hwId, + HWId = hwId.ToArray(), Denied = denied, - ServerId = serverId, - Trust = trust, + ServerId = serverId }; db.SqliteDbContext.ConnectionLog.Add(connectionLog); diff --git a/Content.Server/Database/ServerRoleBanDef.cs b/Content.Server/Database/ServerRoleBanDef.cs index dda3a82237..f615d5da4d 100644 --- a/Content.Server/Database/ServerRoleBanDef.cs +++ b/Content.Server/Database/ServerRoleBanDef.cs @@ -1,3 +1,4 @@ +using System.Collections.Immutable; using System.Net; using Content.Shared.Database; using Robust.Shared.Network; @@ -9,7 +10,7 @@ public sealed class ServerRoleBanDef public int? Id { get; } public NetUserId? UserId { get; } public (IPAddress address, int cidrMask)? Address { get; } - public ImmutableTypedHwid? HWId { get; } + public ImmutableArray? HWId { get; } public DateTimeOffset BanTime { get; } public DateTimeOffset? ExpirationTime { get; } @@ -25,7 +26,7 @@ public ServerRoleBanDef( int? id, NetUserId? userId, (IPAddress, int)? address, - ImmutableTypedHwid? hwId, + ImmutableArray? hwId, DateTimeOffset banTime, DateTimeOffset? expirationTime, int? roundId, diff --git a/Content.Shared.Database/TypedHwid.cs b/Content.Shared.Database/TypedHwid.cs deleted file mode 100644 index 253375e9db..0000000000 --- a/Content.Shared.Database/TypedHwid.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections.Immutable; -using System.Diagnostics.CodeAnalysis; - -namespace Content.Shared.Database; - -/// -/// Represents a raw HWID value together with its type. -/// -[Serializable] -public sealed class ImmutableTypedHwid(ImmutableArray hwid, HwidType type) -{ - public readonly ImmutableArray Hwid = hwid; - public readonly HwidType Type = type; - - public override string ToString() - { - var b64 = Convert.ToBase64String(Hwid.AsSpan()); - return Type == HwidType.Modern ? $"V2-{b64}" : b64; - } - - public static bool TryParse(string value, [NotNullWhen(true)] out ImmutableTypedHwid? hwid) - { - var type = HwidType.Legacy; - if (value.StartsWith("V2-", StringComparison.Ordinal)) - { - value = value["V2-".Length..]; - type = HwidType.Modern; - } - - var array = new byte[GetBase64ByteLength(value)]; - if (!Convert.TryFromBase64String(value, array, out _)) - { - hwid = null; - return false; - } - - // ReSharper disable once UseCollectionExpression - // Do not use collection expression, C# compiler is weird and it fails sandbox. - hwid = new ImmutableTypedHwid(ImmutableArray.Create(array), type); - return true; - } - - private static int GetBase64ByteLength(string value) - { - // Why is .NET like this man wtf. - return 3 * (value.Length / 4) - value.TakeLast(2).Count(c => c == '='); - } -} - -/// -/// Represents different types of HWIDs as exposed by the engine. -/// -public enum HwidType -{ - /// - /// The legacy HWID system. Should only be used for checking old existing database bans. - /// - Legacy = 0, - - /// - /// The modern HWID system. - /// - Modern = 1, -} diff --git a/Content.Shared/Administration/BanPanelEuiState.cs b/Content.Shared/Administration/BanPanelEuiState.cs index 74c340566b..dd10068e5d 100644 --- a/Content.Shared/Administration/BanPanelEuiState.cs +++ b/Content.Shared/Administration/BanPanelEuiState.cs @@ -25,7 +25,7 @@ public sealed class CreateBanRequest : EuiMessageBase { public string? Player { get; set; } public string? IpAddress { get; set; } - public ImmutableTypedHwid? Hwid { get; set; } + public byte[]? Hwid { get; set; } public uint Minutes { get; set; } public string Reason { get; set; } public NoteSeverity Severity { get; set; } @@ -34,7 +34,7 @@ public sealed class CreateBanRequest : EuiMessageBase public bool UseLastHwid { get; set; } public bool Erase { get; set; } - public CreateBanRequest(string? player, (IPAddress, int)? ipAddress, bool useLastIp, ImmutableTypedHwid? hwid, bool useLastHwid, uint minutes, string reason, NoteSeverity severity, string[]? roles, bool erase) + public CreateBanRequest(string? player, (IPAddress, int)? ipAddress, bool useLastIp, byte[]? hwid, bool useLastHwid, uint minutes, string reason, NoteSeverity severity, string[]? roles, bool erase) { Player = player; IpAddress = ipAddress == null ? null : $"{ipAddress.Value.Item1}/{ipAddress.Value.Item2}";