From 372e41e51a11aec75c7b00f0fd64201e30fa3dec Mon Sep 17 00:00:00 2001 From: kozhilya Date: Fri, 18 Apr 2025 12:48:24 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D1=91=D1=80=D0=B0=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Aonprd/DataBuilder/AonprdDataBuilder.cs | 4 +- .../Aonprd/DataBuilder/AonprdEnumResolver.cs | 4 +- .../DataBuilder/AonprdProcessorInput.cs | 18 +++++++ .../DataBuilder/AbstractProcessor.cs | 50 ++++--------------- .../DataBuilder/PF2eFoundryDataBuilder.cs | 4 +- .../DataBuilder/Processors/ActionProcessor.cs | 4 +- .../Processors/ConditionProcessor.cs | 12 ++--- .../Aonprd/DataBuilder => }/ProcessorInput.cs | 30 +++++++---- 8 files changed, 62 insertions(+), 64 deletions(-) create mode 100644 Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdProcessorInput.cs rename Pf2eDataScrapper/Importers/{Implementations/Aonprd/DataBuilder => }/ProcessorInput.cs (70%) diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdDataBuilder.cs b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdDataBuilder.cs index 9a4cd75..f6e1a14 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdDataBuilder.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdDataBuilder.cs @@ -37,7 +37,7 @@ internal class AonprdDataBuilder(AonprdLoader loader) IConsole bars = window.OpenBox("Progress", Console.WindowWidth, 4, new BoxStyle { Body = Colors.WhiteOnBlack }); - Window output = new Window(0, 4, Console.WindowWidth, Console.WindowHeight - 4, window); + Window output = new(0, 4, Console.WindowWidth, Console.WindowHeight - 4, window); ProgressBar bar1 = new(bars, Loader.ItemCount, 15); ProgressBar bar2 = new(bars, 1, 15); @@ -54,7 +54,7 @@ internal class AonprdDataBuilder(AonprdLoader loader) { bar2.Refresh(i++, $"{entry.Id}"); - ProcessorInput input = new ProcessorInput(entry.Json); + AonprdProcessorInput input = new(entry.Json); AbstractProcessor processor = (AbstractProcessor) item.Constructor.Invoke([input]); try diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdEnumResolver.cs b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdEnumResolver.cs index bb9bedf..05eeca3 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdEnumResolver.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdEnumResolver.cs @@ -35,7 +35,7 @@ public static class AonprdEnumResolver }), ]; - public static T ResolveEventArgs(string value) where T : struct, Enum + public static T Resolve(string value) where T : Enum { Type type = typeof(T); @@ -56,7 +56,7 @@ public static class AonprdEnumResolver public abstract Type Type { get; } } - private class Solver(Dictionary data) : Solver where T : struct, Enum + private class Solver(Dictionary data) : Solver where T : Enum { public override Type Type { get; } = typeof(T); public Dictionary Data { get; } = data; diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdProcessorInput.cs b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdProcessorInput.cs new file mode 100644 index 0000000..3bf56c4 --- /dev/null +++ b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdProcessorInput.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json.Linq; + +namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder; + +internal class AonprdProcessorInput(JObject input) : ProcessorInput(input) +{ + public override T Enum(string value) + { + try + { + return AonprdEnumResolver.Resolve(value); + } + catch + { + return base.Enum(value); + } + } +} diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/AbstractProcessor.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/AbstractProcessor.cs index fc5b23f..816b1d8 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/AbstractProcessor.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/AbstractProcessor.cs @@ -1,5 +1,4 @@ using Newtonsoft.Json.Linq; -using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder; using Pf2eModel.Model; using Pf2eModel.Model.Base; using Pf2eModel.Model.Base.Source; @@ -11,13 +10,13 @@ using System.Text; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.DataBuilder; -internal abstract class AbstractProcessor(JObject input) +internal abstract class AbstractProcessor(ProcessorInput input) { protected DatabaseHelper Helper = DatabaseHelper.Instance; public readonly Pf2eDbContext Context = DatabaseHelper.DbContext; - public readonly JObject Input = input; + public readonly ProcessorInput Input = input; public Entity Entity { get; set; } = new(); @@ -30,15 +29,15 @@ internal abstract class AbstractProcessor(JObject input) Entity.Id = Helper.NextEntityId; Entity.Type = Type; - Entity.Name = GetRequired("name"); - Entity.Img = GetRequired("img"); - Entity.Description = GetRequired("system.description.value"); + Entity.Name = Input.GetRequired("name"); + Entity.Img = Input.GetRequired("img"); + Entity.Description = Input.GetRequired("system.description.value"); Entity.IsTranslated = false; Entity.IsChecked = false; Entity.Slug = Helper.GenerateSlug(Entity.Name); - Entity.Rarity = EnumOptional("system.traits.rarity", EntityRarity.Common); + Entity.Rarity = Input.EnumOptional("system.traits.rarity", EntityRarity.Common); Object.Id = Entity.Id; @@ -59,10 +58,10 @@ internal abstract class AbstractProcessor(JObject input) { Entity = Entity, - Source = GetSource(GetRequired("system.publication.title")), + Source = GetSource(Input.GetRequired("system.publication.title")), Suffix = "", - IsRemaster = GetRequired("system.publication.remaster") + IsRemaster = Input.GetRequired("system.publication.remaster") }; Context.EntitySources.Add(source); @@ -71,13 +70,13 @@ internal abstract class AbstractProcessor(JObject input) { Entity = Entity, Target = GetTarget(), - Suffix = GetRequired("_id"), - Md5 = Md5(Input.ToString()) + Suffix = Input.GetRequired("_id"), + Md5 = Md5(Input.Input.ToString()) }; Context.EntityExternals.Add(external); // Traits - JToken? traitsJson = Input.SelectToken("system.traits.value"); + JToken? traitsJson = Input.Input.SelectToken("system.traits.value"); if (traitsJson?.Type != JTokenType.Array) { @@ -95,33 +94,6 @@ internal abstract class AbstractProcessor(JObject input) Context.SaveChanges(); } - public T GetRequired(string path) - { - JToken token = Input.SelectToken(path) ?? throw new NullReferenceException($"'{path}' is null"); - - return token.ToObject() ?? throw new NullReferenceException($"'{path}' is null"); - } - - public T? GetOptional(string path) - { - JToken? token = Input.SelectToken(path) ?? null; - - return (token is null || token.Type == JTokenType.Null) ? default! : token.ToObject() ?? default; - } - - public T EnumRequired(string path) where T : Enum - { - string value = GetOptional(path) ?? throw new NullReferenceException($"Value in path {path} null or not exists"); - - return ProcessorInput.Enum(value); - } - - public T EnumOptional(string path, T defaultValue) where T : Enum - { - string? value = GetOptional(path); - - return value is null ? defaultValue : ProcessorInput.Enum(value); - } protected Source GetSource(string name) { diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/PF2eFoundryDataBuilder.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/PF2eFoundryDataBuilder.cs index 9ad4f57..756cd9e 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/PF2eFoundryDataBuilder.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/PF2eFoundryDataBuilder.cs @@ -36,13 +36,13 @@ internal class PF2eFoundryDataBuilder continue; } Pf2eTypeProcessor? attribute = type.GetCustomAttribute(); - Processors.Add(attribute!.Type, type.GetConstructor([typeof(JObject)])!); + Processors.Add(attribute!.Type, type.GetConstructor([typeof(ProcessorInput)])!); } } public AbstractProcessor? GetProcessor(string type, JObject input) { - return Processors.TryGetValue(type, out ConstructorInfo? constructor) ? (AbstractProcessor) constructor.Invoke([input]) : null; + return Processors.TryGetValue(type, out ConstructorInfo? constructor) ? (AbstractProcessor) constructor.Invoke([new ProcessorInput(input)]) : null; } public void TruncateTables() diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ActionProcessor.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ActionProcessor.cs index 3b42d95..d406427 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ActionProcessor.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ActionProcessor.cs @@ -4,7 +4,7 @@ using Pf2eModel.Model.Enum; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.DataBuilder.Processors; [Pf2eTypeProcessor("Item.action")] -internal class ActionProcessor(JObject input) : AbstractProcessor(input) +internal class ActionProcessor(ProcessorInput input) : AbstractProcessor(input) { public override EntityType Type => EntityType.Action; @@ -21,7 +21,7 @@ internal class ActionProcessor(JObject input) : AbstractProcessor(input) */ JObject extra = new() { - { "selfEffect", Input.SelectToken("system.selfEffect") } + { "selfEffect", Input.Input.SelectToken("system.selfEffect") } }; Object.Extra = extra.ToString(Newtonsoft.Json.Formatting.None); diff --git a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ConditionProcessor.cs b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ConditionProcessor.cs index 33e7434..fba77e1 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ConditionProcessor.cs +++ b/Pf2eDataScrapper/Importers/Implementations/Pf2eFoundry/DataBuilder/Processors/ConditionProcessor.cs @@ -5,7 +5,7 @@ using Pf2eModel.Model.Structure; namespace Pf2eDataScrapper.Importers.Implementations.Pf2eFoundry.DataBuilder.Processors; [Pf2eTypeProcessor("Item.condition")] -internal class ConditionProcessor(JObject input) : AbstractProcessor(input) +internal class ConditionProcessor(ProcessorInput input) : AbstractProcessor(input) { public override EntityType Type => EntityType.Condition; @@ -17,14 +17,14 @@ internal class ConditionProcessor(JObject input) : AbstractProcessor(input) JObject extra = new() { - { "duration", Input.SelectToken("system.duration") }, - { "overrides", Input.SelectToken("system.overrides") }, - { "references", Input.SelectToken("system.references") }, - { "value", Input.SelectToken("system.value") } + { "duration", Input.Input.SelectToken("system.duration") }, + { "overrides", Input.Input.SelectToken("system.overrides") }, + { "references", Input.Input.SelectToken("system.references") }, + { "value", Input.Input.SelectToken("system.value") } }; Object.Extra = extra.ToString(Newtonsoft.Json.Formatting.None); - Object.Group = EnumOptional("system.group", ConditionGroup.Unknown); + Object.Group = Input.EnumOptional("system.group", ConditionGroup.Unknown); Context.Conditions.Add(Object); } diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/ProcessorInput.cs b/Pf2eDataScrapper/Importers/ProcessorInput.cs similarity index 70% rename from Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/ProcessorInput.cs rename to Pf2eDataScrapper/Importers/ProcessorInput.cs index a9f8f73..5e8c9a3 100644 --- a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/ProcessorInput.cs +++ b/Pf2eDataScrapper/Importers/ProcessorInput.cs @@ -1,41 +1,53 @@ using Newtonsoft.Json.Linq; using NpgsqlTypes; -namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder; +namespace Pf2eDataScrapper.Importers; internal class ProcessorInput(JObject input) { public readonly JObject Input = input; - public T GetRequired(string path) + public virtual T GetRequired(string path) { JToken token = Input.SelectToken(path) ?? throw new NullReferenceException($"'{path}' is null"); return token.ToObject() ?? throw new NullReferenceException($"'{path}' is null"); } - public T? GetOptional(string path) + public virtual T? GetOptional(string path) { JToken? token = Input.SelectToken(path) ?? null; return (token is null || token.Type == JTokenType.Null) ? default! : token.ToObject() ?? default; } - public T EnumRequired(string path) where T : Enum + public virtual T EnumRequired(string path) where T : Enum { string value = GetOptional(path) ?? throw new NullReferenceException($"Value in path {path} null or not exists"); return Enum(value); } - public T EnumOptional(string path, T defaultValue) where T : Enum + public virtual T EnumOptional(string path, T defaultValue) where T : Enum { string? value = GetOptional(path); - return value is null ? defaultValue : Enum(value); + if (value is null) + { + return defaultValue; + } + + try + { + return Enum(value); + } + catch (InvalidEnumStringException) + { + return defaultValue; + } } - public static T Enum(string value) where T : Enum + public virtual T Enum(string value) where T : Enum { foreach (System.Reflection.FieldInfo field in typeof(T).GetFields()) { @@ -45,10 +57,6 @@ internal class ProcessorInput(JObject input) { variants.Add(pgAttribute.PgName); } - if (Attribute.GetCustomAttribute(field, typeof(AonprdEnumAttribute)) is AonprdEnumAttribute aonprdAttribute) - { - variants.AddRange(aonprdAttribute.Values); - } if (variants.Contains(value)) {