SaveDataFilter

This commit is contained in:
2025-04-10 15:42:39 +05:00
parent 95c0403362
commit d5b6061cc7
8 changed files with 101 additions and 28 deletions
@@ -2,15 +2,16 @@
using System.Linq;
using System.Text.Encodings.Web;
using System.Text.Json.Serialization;
using ParadoxSaveParser.WebAPI.SaveDataFilters;
namespace ParadoxSaveParser.WebAPI.BackgroundTasks;
public class SaveParsingOperation
{
public readonly long OperationId;
public readonly SaveFileMetadata Meta;
public readonly ISearchExpression SearchQuery;
private readonly SaveFileMetadata _meta;
private readonly ISaveDataFilter _filter;
private readonly ContextLogger _logger;
private readonly CancellationToken _cancelToken;
@@ -22,12 +23,12 @@ public class SaveParsingOperation
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull,
};
public SaveParsingOperation(long operationId, SaveFileMetadata meta, ISearchExpression searchQuery,
public SaveParsingOperation(long operationId, SaveFileMetadata meta, ISaveDataFilter filter,
ContextLogger logger, CancellationToken cancelToken)
{
OperationId = operationId;
Meta = meta;
SearchQuery = searchQuery;
_meta = meta;
_filter = filter;
_logger = logger;
_cancelToken = cancelToken;
}
@@ -36,22 +37,22 @@ public class SaveParsingOperation
{
try
{
_logger.LogInfo($"Starting background parsing operation of {Meta.game} save {Meta.id}");
switch (Meta.game)
_logger.LogInfo($"Starting background parsing operation of {_meta.game} save {_meta.id}");
switch (_meta.game)
{
case Game.EU4:
await ParseSaveEU4();
break;
default:
throw new ArgumentOutOfRangeException(Meta.game.ToString());
throw new ArgumentOutOfRangeException(_meta.game.ToString());
}
_logger.LogInfo($"Finished parsing operation of {Meta.game} save {Meta.id}");
_logger.LogInfo($"Finished parsing operation of {_meta.game} save {_meta.id}");
}
catch (Exception ex)
{
string errorMesage = ex.ToStringDemystified();
_logger.LogError(errorMesage);
Meta.errorMessage = errorMesage;
_meta.errorMessage = errorMesage;
}
finally
{
@@ -63,8 +64,8 @@ public class SaveParsingOperation
{
// wait for save file closing
await Task.Delay(200, _cancelToken);
string extractedGamestatePath = PathHelper.GetSaveFilePath(Meta.id) + ".gamestate";
using (var zipArchive = ZipFile.Open(PathHelper.GetSaveFilePath(Meta.id).Str, ZipArchiveMode.Read))
string extractedGamestatePath = PathHelper.GetSaveFilePath(_meta.id) + ".gamestate";
using (var zipArchive = ZipFile.Open(PathHelper.GetSaveFilePath(_meta.id).Str, ZipArchiveMode.Read))
{
var zipEntry = zipArchive.Entries.FirstOrDefault(e => e.Name == "gamestate");
if (zipEntry is null)
@@ -75,16 +76,17 @@ public class SaveParsingOperation
var gamestateStream = File.OpenRead(extractedGamestatePath);
Meta.status = SaveFileProcessingStatus.Parsing;
var parser = new SaveParserEU4(gamestateStream, SearchQuery);
_meta.status = SaveFileProcessingStatus.Parsing;
var parser = new SaveParserEU4(gamestateStream, _filter.SearchExpression);
var result = parser.Parse();
_filter.Apply(result);
Meta.status = SaveFileProcessingStatus.SavingResults;
var resultFilePath = PathHelper.GetParsedSaveFilePath(Meta.id);
_meta.status = SaveFileProcessingStatus.SavingResults;
var resultFilePath = PathHelper.GetParsedSaveFilePath(_meta.id);
await using var resultFile = File.OpenWrite(resultFilePath);
await JsonSerializer.SerializeAsync(resultFile, result,
_saveSerializerOptions, _cancelToken);
Meta.status = SaveFileProcessingStatus.Done;
Meta.SaveToFile();
_meta.status = SaveFileProcessingStatus.Done;
_meta.SaveToFile();
}
}