From 5600ba178389333118cf56740482c7dd8847d8dd Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 13 Aug 2023 17:26:49 +0100 Subject: [PATCH] dumps after certain date for containers --- Config/config.json | 3 ++ Model/Config/Config.cs | 4 +++ Model/Config/DumpProcessorConfig.cs | 14 ++++++++ Model/Processing/PreProcessedLooseLoot.cs | 7 ++-- .../MultithreadSteppedDumpProcessor.cs | 19 +++++++---- .../Json/Converters/NetDateTimeConverter.cs | 22 +++++++++++++ .../Json/Converters/NetJsonKeyConverter.cs | 3 +- .../Converters/NewtonsoftDateTimeConverter.cs | 28 ++++++++++++++++ .../Converters/NewtonsoftJsonKeyConverter.cs | 5 +-- Serializers/Json/NetJsonSerializer.cs | 6 ++-- Serializers/Json/NewtonsoftJsonSerializer.cs | 5 +-- Utils/FileDateParser.cs | 32 +++++++++++++++++++ 12 files changed, 132 insertions(+), 16 deletions(-) create mode 100644 Model/Config/DumpProcessorConfig.cs create mode 100644 Serializers/Json/Converters/NetDateTimeConverter.cs create mode 100644 Serializers/Json/Converters/NewtonsoftDateTimeConverter.cs create mode 100644 Utils/FileDateParser.cs diff --git a/Config/config.json b/Config/config.json index 4850723..ec09830 100644 --- a/Config/config.json +++ b/Config/config.json @@ -4,6 +4,9 @@ "threadPoolingTimeoutMs": 1000, "jsonSerializer": "DotNet", "manualGarbageCollectionCalls": false, + "dumpProcessorConfig": { + "spawnContainerChanceIncludeAfterDate": "2023-08-01 00:00:00" + }, "dataStorageConfig": { "dataStorageType": "Memory", "fileDataStorageTempLocation": "D:\\Spt Stuff\\Lootgenerator\\Dumps\\cache" diff --git a/Model/Config/Config.cs b/Model/Config/Config.cs index e888406..6249a27 100644 --- a/Model/Config/Config.cs +++ b/Model/Config/Config.cs @@ -41,6 +41,10 @@ public class Config [JsonProperty("processorConfig")] [JsonPropertyName("processorConfig")] public ProcessorConfig ProcessorConfig { get; set; } + + [JsonProperty("dumpProcessorConfig")] + [JsonPropertyName("dumpProcessorConfig")] + public DumpProcessorConfig DumpProcessorConfig { get; set; } [JsonProperty("writerConfig")] [JsonPropertyName("writerConfig")] diff --git a/Model/Config/DumpProcessorConfig.cs b/Model/Config/DumpProcessorConfig.cs new file mode 100644 index 0000000..b7f7630 --- /dev/null +++ b/Model/Config/DumpProcessorConfig.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization; +using LootDumpProcessor.Serializers.Json.Converters; +using Newtonsoft.Json; + +namespace LootDumpProcessor.Model.Config; + +public class DumpProcessorConfig +{ + [JsonProperty("spawnContainerChanceIncludeAfterDate")] + [JsonPropertyName("spawnContainerChanceIncludeAfterDate")] + [Newtonsoft.Json.JsonConverter(typeof(NewtonsoftDateTimeConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(NetDateTimeConverter))] + public DateTime SpawnContainerChanceIncludeAfterDate { get; set; } +} \ No newline at end of file diff --git a/Model/Processing/PreProcessedLooseLoot.cs b/Model/Processing/PreProcessedLooseLoot.cs index ecf6f33..73ccc9a 100644 --- a/Model/Processing/PreProcessedLooseLoot.cs +++ b/Model/Processing/PreProcessedLooseLoot.cs @@ -1,5 +1,5 @@ -using LootDumpProcessor.Storage; -using Newtonsoft.Json; +using LootDumpProcessor.Serializers.Json.Converters; +using LootDumpProcessor.Storage; namespace LootDumpProcessor.Model.Processing; @@ -7,7 +7,8 @@ public class PreProcessedLooseLoot : IKeyable { public Dictionary Counts { get; set; } - [JsonConverter(typeof(NewtonsoftJsonKeyConverter))] + [Newtonsoft.Json.JsonConverter(typeof(NewtonsoftJsonKeyConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(NetJsonKeyConverter))] public IKey ItemProperties { get; set; } public int MapSpawnpointCount { get; set; } diff --git a/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs b/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs index b4b191c..11e7a50 100644 --- a/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs +++ b/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs @@ -78,14 +78,21 @@ public class MultithreadSteppedDumpProcessor : IDumpProcessor } } - foreach (var dynamicStaticContainer in StaticLootProcessor.CreateDynamicStaticContainers(data)) + // Only process the dump file if the date is higher (after) the configuration date + if (FileDateParser.TryParseFileDate(dumped.BasicInfo.FileName, out var fileDate) && + fileDate.HasValue && + fileDate.Value > LootDumpProcessorContext.GetConfig().DumpProcessorConfig + .SpawnContainerChanceIncludeAfterDate) { - lock (mapStaticContainersAggregatedLock) + foreach (var dynamicStaticContainer in StaticLootProcessor.CreateDynamicStaticContainers(data)) { - if (mapAggregatedData.ContainsKey(dynamicStaticContainer)) - mapAggregatedData[dynamicStaticContainer] += 1; - else - mapAggregatedData.Add(dynamicStaticContainer, 1); + lock (mapStaticContainersAggregatedLock) + { + if (mapAggregatedData.ContainsKey(dynamicStaticContainer)) + mapAggregatedData[dynamicStaticContainer] += 1; + else + mapAggregatedData.Add(dynamicStaticContainer, 1); + } } } diff --git a/Serializers/Json/Converters/NetDateTimeConverter.cs b/Serializers/Json/Converters/NetDateTimeConverter.cs new file mode 100644 index 0000000..a2f6574 --- /dev/null +++ b/Serializers/Json/Converters/NetDateTimeConverter.cs @@ -0,0 +1,22 @@ +using System.Globalization; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace LootDumpProcessor.Serializers.Json.Converters; + +public class NetDateTimeConverter : JsonConverter +{ + private static string _dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + var stringDate = reader.GetString() ?? ""; + if (!DateTime.TryParseExact(stringDate, _dateTimeFormat, null, DateTimeStyles.None, out var parsedDate)) + throw new Exception($"Invalid value for DateTime format: {_dateTimeFormat}"); + return parsedDate; + } + + public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options) + { + writer.WriteStringValue(value.ToString(_dateTimeFormat)); + } +} \ No newline at end of file diff --git a/Serializers/Json/Converters/NetJsonKeyConverter.cs b/Serializers/Json/Converters/NetJsonKeyConverter.cs index 1453a20..04c3cf3 100644 --- a/Serializers/Json/Converters/NetJsonKeyConverter.cs +++ b/Serializers/Json/Converters/NetJsonKeyConverter.cs @@ -1,7 +1,8 @@ using System.Text.Json; using System.Text.Json.Serialization; +using LootDumpProcessor.Storage; -namespace LootDumpProcessor.Storage; +namespace LootDumpProcessor.Serializers.Json.Converters; public class NetJsonKeyConverter : JsonConverter { diff --git a/Serializers/Json/Converters/NewtonsoftDateTimeConverter.cs b/Serializers/Json/Converters/NewtonsoftDateTimeConverter.cs new file mode 100644 index 0000000..9947d17 --- /dev/null +++ b/Serializers/Json/Converters/NewtonsoftDateTimeConverter.cs @@ -0,0 +1,28 @@ +using System.Globalization; +using Newtonsoft.Json; + +namespace LootDumpProcessor.Serializers.Json.Converters; + +public class NewtonsoftDateTimeConverter : JsonConverter +{ + private static string _dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + + public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer) + { + writer.WriteValue(value.ToString(_dateTimeFormat)); + } + + public override DateTime ReadJson( + JsonReader reader, + Type objectType, + DateTime existingValue, + bool hasExistingValue, + JsonSerializer serializer + ) + { + var stringDate = reader.Value?.ToString() ?? ""; + if (!DateTime.TryParseExact(stringDate, _dateTimeFormat, null, DateTimeStyles.None, out var parsedDate)) + throw new Exception($"Invalid value for DateTime format: {_dateTimeFormat}"); + return parsedDate; + } +} \ No newline at end of file diff --git a/Serializers/Json/Converters/NewtonsoftJsonKeyConverter.cs b/Serializers/Json/Converters/NewtonsoftJsonKeyConverter.cs index 5907488..ff9acb0 100644 --- a/Serializers/Json/Converters/NewtonsoftJsonKeyConverter.cs +++ b/Serializers/Json/Converters/NewtonsoftJsonKeyConverter.cs @@ -1,6 +1,7 @@ -using Newtonsoft.Json; +using LootDumpProcessor.Storage; +using Newtonsoft.Json; -namespace LootDumpProcessor.Storage; +namespace LootDumpProcessor.Serializers.Json.Converters; public class NewtonsoftJsonKeyConverter : JsonConverter { diff --git a/Serializers/Json/NetJsonSerializer.cs b/Serializers/Json/NetJsonSerializer.cs index 0d2fa35..bde563d 100644 --- a/Serializers/Json/NetJsonSerializer.cs +++ b/Serializers/Json/NetJsonSerializer.cs @@ -1,6 +1,6 @@ using System.Text.Json; using System.Text.Json.Serialization; -using LootDumpProcessor.Storage; +using LootDumpProcessor.Serializers.Json.Converters; namespace LootDumpProcessor.Serializers.Json; @@ -12,9 +12,11 @@ public class NetJsonSerializer : IJsonSerializer Converters = { new NetJsonKeyConverter(), - new JsonStringEnumConverter() + new JsonStringEnumConverter(), + new NetDateTimeConverter() } }; + public string Serialize(T obj) { return JsonSerializer.Serialize(obj, _serializeOptions); diff --git a/Serializers/Json/NewtonsoftJsonSerializer.cs b/Serializers/Json/NewtonsoftJsonSerializer.cs index f9690f5..6d0c4c0 100644 --- a/Serializers/Json/NewtonsoftJsonSerializer.cs +++ b/Serializers/Json/NewtonsoftJsonSerializer.cs @@ -1,4 +1,4 @@ -using LootDumpProcessor.Storage; +using LootDumpProcessor.Serializers.Json.Converters; using Newtonsoft.Json; using Newtonsoft.Json.Converters; @@ -11,7 +11,8 @@ public class NewtonsoftJsonSerializer : IJsonSerializer Converters = { new NewtonsoftJsonKeyConverter(), - new StringEnumConverter() + new StringEnumConverter(), + new NewtonsoftDateTimeConverter() } }; diff --git a/Utils/FileDateParser.cs b/Utils/FileDateParser.cs new file mode 100644 index 0000000..47743ac --- /dev/null +++ b/Utils/FileDateParser.cs @@ -0,0 +1,32 @@ +using System.Text.RegularExpressions; + +namespace LootDumpProcessor.Process.Processor; + +public static class FileDateParser +{ + private static readonly Regex _fileDateRegex = + new(".*([0-9]{4})[-]([0-9]{2})[-]([0-9]{2})[_]([0-9]{2})[-]([0-9]{2})[-]([0-9]{2}).*"); + + public static bool TryParseFileDate(string fileName, out DateTime? date) + { + date = null; + if (!_fileDateRegex.IsMatch(fileName)) + return false; + var match = _fileDateRegex.Match(fileName); + var year = match.Groups[1].Value; + var month = match.Groups[2].Value; + var day = match.Groups[3].Value; + var hour = match.Groups[4].Value; + var mins = match.Groups[5].Value; + var secs = match.Groups[6].Value; + date = new DateTime( + int.Parse(year), + int.Parse(month), + int.Parse(day), + int.Parse(hour), + int.Parse(mins), + int.Parse(secs) + ); + return true; + } +} \ No newline at end of file