diff --git a/ReplayBrowser/Data/Migrations/ReplayDbContextModelSnapshot.cs b/ReplayBrowser/Data/Migrations/ReplayDbContextModelSnapshot.cs index 5a06c9a..595ab7a 100644 --- a/ReplayBrowser/Data/Migrations/ReplayDbContextModelSnapshot.cs +++ b/ReplayBrowser/Data/Migrations/ReplayDbContextModelSnapshot.cs @@ -559,39 +559,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("ReplayParticipants"); }); - modelBuilder.Entity("ReplayBrowser.Models.Ingested.ReplayEvents.ReplayEventPlayer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AntagPrototypes") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("JobPrototypes") - .IsRequired() - .HasColumnType("text[]"); - - b.Property("PlayerGuid") - .IsRequired() - .HasColumnType("uuid"); - - b.Property("PlayerIcName") - .IsRequired() - .HasColumnType("text"); - - b.Property("PlayerOocName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("ReplayEventPlayer"); - }); - modelBuilder.Entity("ReplayBrowser.Models.Ingested.ReplayEvents.EventTypes.AlertLevelChangedReplayEvent", b => { b.HasBaseType("ReplayBrowser.Data.Models.ReplayDbEvent"); diff --git a/ReplayBrowser/Models/Ingested/ReplayEvents/EventTypes/CargoProductsOrderedReplayEvent.cs b/ReplayBrowser/Models/Ingested/ReplayEvents/EventTypes/CargoProductsOrderedReplayEvent.cs index c06a471..f5da18c 100644 --- a/ReplayBrowser/Models/Ingested/ReplayEvents/EventTypes/CargoProductsOrderedReplayEvent.cs +++ b/ReplayBrowser/Models/Ingested/ReplayEvents/EventTypes/CargoProductsOrderedReplayEvent.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Newtonsoft.Json; using ReplayBrowser.Data.Models; @@ -24,7 +25,11 @@ public void Configure(EntityTypeBuilder builder builder.Property(e => e.Products) .HasConversion( v => JsonConvert.SerializeObject(v), - v => JsonConvert.DeserializeObject(v)); + v => JsonConvert.DeserializeObject(v)) + .Metadata.SetValueComparer(new ValueComparer( + (c1, c2) => c1.SequenceEqual(c2), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => (CargoReplayProduct[])c.Clone())); } } diff --git a/ReplayBrowser/Models/Ingested/ReplayEvents/ReplayEventPlayer.cs b/ReplayBrowser/Models/Ingested/ReplayEvents/ReplayEventPlayer.cs index 7259502..db14618 100644 --- a/ReplayBrowser/Models/Ingested/ReplayEvents/ReplayEventPlayer.cs +++ b/ReplayBrowser/Models/Ingested/ReplayEvents/ReplayEventPlayer.cs @@ -8,20 +8,8 @@ namespace ReplayBrowser.Models.Ingested.ReplayEvents; /// /// Represents a player in a replay event. /// -public class ReplayEventPlayer : IEntityTypeConfiguration +public class ReplayEventPlayer { - public int Id { get; set; } - - public void Configure(EntityTypeBuilder builder) - { - builder.HasKey(e => e.Id); - builder.Property(e => e.PlayerOocName).IsRequired(); - builder.Property(e => e.PlayerIcName).IsRequired(); - builder.Property(e => e.PlayerGuid).IsRequired(); - builder.Property(e => e.JobPrototypes).IsRequired(); - builder.Property(e => e.AntagPrototypes).IsRequired(); - } - /// /// The username of the player. /// diff --git a/ReplayBrowser/Services/WebhookService.cs b/ReplayBrowser/Services/WebhookService.cs index dbb1dab..b126359 100644 --- a/ReplayBrowser/Services/WebhookService.cs +++ b/ReplayBrowser/Services/WebhookService.cs @@ -34,6 +34,12 @@ public async Task SendReplayToWebhooks(Replay parsedReplay) { foreach (var webhook in account.Webhooks) { + // URL check, don't send if empty, doesn't parse as URL or points to localhost + if (string.IsNullOrWhiteSpace(webhook.Url) || !Uri.TryCreate(webhook.Url, UriKind.Absolute, out var url) || url.Host == "localhost") + { + continue; + } + var servers = webhook.Servers.Split(','); if (!servers.Contains(parsedReplay.ServerName) && !string.IsNullOrWhiteSpace(webhook.Servers)) {