Files
Pf2eDataScrapper/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/AonprdDataBuilder.cs
T

94 lines
2.7 KiB
C#

using Konsole;
using Pf2eDataScrapper.Importers.Implementations.Aonprd.Compendium;
using Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors;
using static Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.AbstractProcessor;
namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder;
internal class AonprdDataBuilder(AonprdLoader loader)
{
public Pf2eDatabase Database = Pf2eDatabase.Instance;
/// <summary>
/// Загрузчик данных.
/// </summary>
public readonly AonprdLoader Loader = loader;
/// <summary>
/// Коллекция папок компендиума.
/// </summary>
public AonprdCompendium Compendium => Loader.Compendium;
public AonprdProcessorCollection Processors = new();
public void TruncateTables()
{
Console.WriteLine("Truncating all old data...");
Database.ExecuteCommand("SELECT f_truncate_tables();");
Console.WriteLine("Truncation completed!");
}
public void Build()
{
Console.WriteLine("Building data...");
ConcurrentWriter window = new Window(
0,
0,
Console.WindowWidth,
Console.WindowHeight
).Concurrent();
IConsole bars = window.OpenBox(
"Progress",
Console.WindowWidth,
4,
new BoxStyle { Body = Colors.WhiteOnBlack }
);
Window output = new(0, 4, Console.WindowWidth, Console.WindowHeight - 4, window);
ProgressBar bar1 = new(bars, Processors.Items.Count, 15);
ProgressBar bar2 = new(bars, 1, 15);
int i = 0;
foreach (AonprdProcessorCollection.ProcessorItem item in Processors.Iterate())
{
bar1.Refresh(i++, $"{item.Attribute.Name}");
bar2.Max = Compendium.Count([item.Attribute.Type]);
int j = 0;
foreach (AonprdLoader.LoaderEntry entry in Loader.Entries(item.Attribute.Type))
{
bar2.Refresh(j++, $"{entry.Id}");
AonprdProcessorInput input = new(entry.Json);
AbstractProcessor processor = (AbstractProcessor)item.Constructor.Invoke([input]);
try
{
processor.Process();
processor.Save();
}
catch (LegacyItemException ex)
{
output.WriteLine(ex.Message);
}
catch (SkipItemException ex)
{
output.WriteLine(ex.Message);
}
}
bar2.Refresh(j, "Processor completed");
}
bar1.Refresh(i, "Done!");
window.Clear();
}
}