diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml
index 9898233..defefb8 100644
--- a/.github/workflows/dotnet.yml
+++ b/.github/workflows/dotnet.yml
@@ -12,17 +12,17 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v5
- name: Setup .NET
- uses: actions/setup-dotnet@v3
+ uses: actions/setup-dotnet@v5
with:
- dotnet-version: 7.0.x
+ dotnet-version: '10.0.x'
- name: Check Tag
id: check-tag
run: |
if [[ v${{ github.event.ref }} =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- echo ::set-output name=match::true
+ echo "match=true" >> $GITHUB_OUTPUT
fi
- name: Run Unit Tests
@@ -39,24 +39,13 @@ jobs:
dotnet build -c Release
dotnet pack -c Release -o /tmp/nupkgs -v m -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg
dotnet nuget push /tmp/nupkgs/NosCore.ParserInputGenerator.${{github.event.ref}}.nupkg -s https://api.nuget.org/v3/index.json -k ${{secrets.NUGET_API_KEY}}
- echo ::set-output name=ARTIFACT_PATH::/tmp/nupkgs/NosCore.ParserInputGenerator.${{github.event.ref}}.snupkg
- echo ::set-output name=ARTIFACT_NAME::NosCore.ParserInputGenerator.${{github.event.ref}}.snupkg
-
- - name: Gets Latest Release
- if: steps.check-tag.outputs.match == 'true'
- id: latest_release_info
- uses: jossef/action-latest-release-info@v1.1.0
- env:
- GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }}
+ echo "ARTIFACT_PATH=/tmp/nupkgs/NosCore.ParserInputGenerator.${{github.event.ref}}.snupkg" >> $GITHUB_OUTPUT
+ echo "ARTIFACT_NAME=NosCore.ParserInputGenerator.${{github.event.ref}}.snupkg" >> $GITHUB_OUTPUT
- name: Upload Release Asset
if: steps.check-tag.outputs.match == 'true'
- uses: actions/upload-release-asset@v1
- env:
- GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }}
+ uses: softprops/action-gh-release@v2
with:
- upload_url: ${{ steps.latest_release_info.outputs.upload_url }}
- asset_path: ${{ steps.build_artifact.outputs.ARTIFACT_PATH }}
- asset_name: ${{ steps.build_artifact.outputs.ARTIFACT_NAME }}
- asset_content_type: application/zip
+ files: ${{ steps.build_artifact.outputs.ARTIFACT_PATH }}
+ token: ${{ secrets.REPO_TOKEN }}
diff --git a/src/NosCore.ParserInputGenerator.Launcher/Configuration/ParserInputGeneratorConfiguration.cs b/src/NosCore.ParserInputGenerator.Launcher/Configuration/ParserInputGeneratorConfiguration.cs
index 876bc06..d64b632 100644
--- a/src/NosCore.ParserInputGenerator.Launcher/Configuration/ParserInputGeneratorConfiguration.cs
+++ b/src/NosCore.ParserInputGenerator.Launcher/Configuration/ParserInputGeneratorConfiguration.cs
@@ -2,6 +2,9 @@
namespace NosCore.ParserInputGenerator.Launcher.Configuration
{
+ ///
+ /// Configuration for the Parser Input Generator.
+ ///
public class ParserInputGeneratorConfiguration : LanguageConfiguration
{
}
diff --git a/src/NosCore.ParserInputGenerator.Launcher/NosCore.ParserInputGenerator.Launcher.csproj b/src/NosCore.ParserInputGenerator.Launcher/NosCore.ParserInputGenerator.Launcher.csproj
index 5b959e4..0e63687 100644
--- a/src/NosCore.ParserInputGenerator.Launcher/NosCore.ParserInputGenerator.Launcher.csproj
+++ b/src/NosCore.ParserInputGenerator.Launcher/NosCore.ParserInputGenerator.Launcher.csproj
@@ -2,7 +2,7 @@
Exe
- net8.0
+ net10.0
true
@@ -10,6 +10,11 @@
..\..\build\
+
+
+
+
+
diff --git a/src/NosCore.ParserInputGenerator.Launcher/Program.cs b/src/NosCore.ParserInputGenerator.Launcher/Program.cs
index c334005..de00603 100644
--- a/src/NosCore.ParserInputGenerator.Launcher/Program.cs
+++ b/src/NosCore.ParserInputGenerator.Launcher/Program.cs
@@ -10,13 +10,25 @@
namespace NosCore.ParserInputGenerator.Launcher
{
- class Program
+ ///
+ /// Main program entry point for the Parser Input Generator launcher.
+ ///
+ public class Program
{
+ ///
+ /// Application entry point.
+ ///
+ /// Command line arguments.
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
+ ///
+ /// Creates and configures the host builder.
+ ///
+ /// Command line arguments.
+ /// The configured host builder.
public static IHostBuilder CreateHostBuilder(string[] args)
{
var configuration = new ParserInputGeneratorConfiguration();
diff --git a/src/NosCore.ParserInputGenerator.Launcher/Worker.cs b/src/NosCore.ParserInputGenerator.Launcher/Worker.cs
index f6bb815..b673a30 100644
--- a/src/NosCore.ParserInputGenerator.Launcher/Worker.cs
+++ b/src/NosCore.ParserInputGenerator.Launcher/Worker.cs
@@ -14,6 +14,9 @@
namespace NosCore.ParserInputGenerator.Launcher
{
+ ///
+ /// Background service worker that downloads and processes parser input files.
+ ///
public class Worker : BackgroundService
{
private const string ConsoleText = "PARSER INPUT GENERATOR - NosCoreIO";
@@ -45,6 +48,12 @@ public class Worker : BackgroundService
"NSgtdData.NOS"
};
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The logger instance.
+ /// The client downloader.
+ /// The file extractor.
public Worker(ILogger logger, IClientDownloader client, IExtractor extractor)
{
_logger = logger;
@@ -52,6 +61,11 @@ public Worker(ILogger logger, IClientDownloader client, IExtractor extra
_extractor = extractor;
}
+ ///
+ /// Executes the worker task to download, extract, and package parser input files.
+ ///
+ /// Cancellation token to stop the service.
+ /// A task representing the asynchronous operation.
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
diff --git a/src/NosCore.ParserInputGenerator/Downloader/ClientDownloader.cs b/src/NosCore.ParserInputGenerator/Downloader/ClientDownloader.cs
index 6c0c075..9537707 100644
--- a/src/NosCore.ParserInputGenerator/Downloader/ClientDownloader.cs
+++ b/src/NosCore.ParserInputGenerator/Downloader/ClientDownloader.cs
@@ -17,19 +17,29 @@
namespace NosCore.ParserInputGenerator.Downloader
{
+ ///
+ /// Implements client file downloading functionality.
+ ///
public class ClientDownloader : IClientDownloader
{
private readonly IHttpClientFactory _clientFactory;
private readonly ILogger _logger;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The HTTP client factory.
+ /// The logger instance.
public ClientDownloader(IHttpClientFactory clientFactory, ILogger logger)
{
_clientFactory = clientFactory;
_logger = logger;
}
+ ///
public Task DownloadManifest() => DownloadManifestAsync(RegionType.EN);
+ ///
public async Task DownloadManifestAsync(RegionType region)
{
var client = _clientFactory.CreateClient();
@@ -42,8 +52,10 @@ public async Task DownloadManifestAsync(RegionType region)
}) ?? throw new InvalidOperationException();
}
+ ///
public async Task DownloadClientAsync() => await DownloadClientAsync(await DownloadManifest());
+ ///
public async Task DownloadClientAsync(ClientManifest manifest)
{
async Task Download(Entry entry)
diff --git a/src/NosCore.ParserInputGenerator/Downloader/ClientManifest.cs b/src/NosCore.ParserInputGenerator/Downloader/ClientManifest.cs
index 1f97498..dfbc3e1 100644
--- a/src/NosCore.ParserInputGenerator/Downloader/ClientManifest.cs
+++ b/src/NosCore.ParserInputGenerator/Downloader/ClientManifest.cs
@@ -3,35 +3,68 @@
namespace NosCore.ParserInputGenerator.Downloader
{
+ ///
+ /// Represents a client manifest containing file entries and metadata.
+ ///
public class ClientManifest
{
+ ///
+ /// Gets or sets the array of file entries in the manifest.
+ ///
[JsonPropertyName("entries")]
public Entry[] Entries { get; set; } = null!;
+ ///
+ /// Gets or sets the total size of all files in bytes.
+ ///
[JsonPropertyName("totalSize")]
public long TotalSize { get; set; }
+ ///
+ /// Gets or sets the build number of the client.
+ ///
[JsonPropertyName("build")]
public long Build { get; set; }
}
+ ///
+ /// Represents an individual file entry in the client manifest.
+ ///
public class Entry
{
+ ///
+ /// Gets or sets the file path.
+ ///
[JsonPropertyName("path")]
public string? Path { get; set; }
+ ///
+ /// Gets or sets the SHA1 hash of the file.
+ ///
[JsonPropertyName("sha1")]
public string? Sha1 { get; set; }
+ ///
+ /// Gets or sets the file name.
+ ///
[JsonPropertyName("file")]
public string File { get; set; } = null!;
+ ///
+ /// Gets or sets file flags.
+ ///
[JsonPropertyName("flags")]
public long Flags { get; set; }
+ ///
+ /// Gets or sets the file size in bytes.
+ ///
[JsonPropertyName("size")]
public long Size { get; set; }
+ ///
+ /// Gets or sets a value indicating whether this entry is a folder.
+ ///
[JsonPropertyName("folder")]
public bool Folder { get; set; }
}
diff --git a/src/NosCore.ParserInputGenerator/Downloader/IClientDownloader.cs b/src/NosCore.ParserInputGenerator/Downloader/IClientDownloader.cs
index bed2d74..43ea1e5 100644
--- a/src/NosCore.ParserInputGenerator/Downloader/IClientDownloader.cs
+++ b/src/NosCore.ParserInputGenerator/Downloader/IClientDownloader.cs
@@ -6,12 +6,35 @@
namespace NosCore.ParserInputGenerator.Downloader
{
+ ///
+ /// Interface for downloading client files and manifests.
+ ///
public interface IClientDownloader
{
+ ///
+ /// Downloads the client manifest using the default region.
+ ///
+ /// The downloaded client manifest.
Task DownloadManifest();
+
+ ///
+ /// Downloads the client manifest for a specific region.
+ ///
+ /// The region to download from.
+ /// The downloaded client manifest.
Task DownloadManifestAsync(RegionType region);
+ ///
+ /// Downloads the client files using the default manifest.
+ ///
+ /// A task representing the asynchronous operation.
Task DownloadClientAsync();
+
+ ///
+ /// Downloads the client files specified in the manifest.
+ ///
+ /// The manifest containing file information.
+ /// A task representing the asynchronous operation.
Task DownloadClientAsync(ClientManifest manifest);
}
}
diff --git a/src/NosCore.ParserInputGenerator/Extractor/Extractor.cs b/src/NosCore.ParserInputGenerator/Extractor/Extractor.cs
index bf157ec..e6d77d1 100644
--- a/src/NosCore.ParserInputGenerator/Extractor/Extractor.cs
+++ b/src/NosCore.ParserInputGenerator/Extractor/Extractor.cs
@@ -10,19 +10,29 @@
namespace NosCore.ParserInputGenerator.Extractor
{
+ ///
+ /// Implements file extraction functionality for NostaleData archives.
+ ///
public class Extractor : IExtractor
{
private readonly ILogger _logger;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The logger instance.
public Extractor(ILogger logger)
{
_logger = logger;
}
+ ///
public Task ExtractAsync(FileInfo file, string dest) => ExtractAsync(file, dest, false);
+ ///
public Task ExtractAsync(FileInfo file) => ExtractAsync(file, $".{Path.DirectorySeparatorChar}output{Path.DirectorySeparatorChar}");
+ ///
public async Task ExtractAsync(FileInfo nosFile, string directory, bool rename)
{
async Task WriteFile(string fileName, MemoryStream decryptedContent)
diff --git a/src/NosCore.ParserInputGenerator/Extractor/IExtractor.cs b/src/NosCore.ParserInputGenerator/Extractor/IExtractor.cs
index 6b9f3cf..cd5fce6 100644
--- a/src/NosCore.ParserInputGenerator/Extractor/IExtractor.cs
+++ b/src/NosCore.ParserInputGenerator/Extractor/IExtractor.cs
@@ -9,10 +9,33 @@
namespace NosCore.ParserInputGenerator.Extractor
{
+ ///
+ /// Interface for extracting archived files.
+ ///
public interface IExtractor
{
+ ///
+ /// Extracts a file to the default directory.
+ ///
+ /// The file to extract.
+ /// A task representing the asynchronous operation.
Task ExtractAsync(FileInfo file);
+
+ ///
+ /// Extracts a file to a specified directory.
+ ///
+ /// The file to extract.
+ /// The target directory.
+ /// A task representing the asynchronous operation.
Task ExtractAsync(FileInfo file, string directory);
+
+ ///
+ /// Extracts a file to a specified directory with optional renaming.
+ ///
+ /// The file to extract.
+ /// The target directory.
+ /// Whether to rename extracted files.
+ /// A task representing the asynchronous operation.
Task ExtractAsync(FileInfo file, string directory, bool rename);
}
}
\ No newline at end of file
diff --git a/src/NosCore.ParserInputGenerator/I18N/LogLanguage.cs b/src/NosCore.ParserInputGenerator/I18N/LogLanguage.cs
index 55f5a7d..06ac74d 100644
--- a/src/NosCore.ParserInputGenerator/I18N/LogLanguage.cs
+++ b/src/NosCore.ParserInputGenerator/I18N/LogLanguage.cs
@@ -10,6 +10,9 @@
namespace NosCore.ParserInputGenerator.I18N
{
+ ///
+ /// Provides localized log messages based on language keys.
+ ///
public sealed class LogLanguage
{
private static LogLanguage? _instance;
@@ -26,15 +29,32 @@ private LogLanguage()
assem);
}
+ ///
+ /// Gets or sets the language/region type for localization.
+ ///
public static RegionType Language { get; set; }
+ ///
+ /// Gets the singleton instance of LogLanguage.
+ ///
public static LogLanguage Instance => _instance ??= new LogLanguage();
+ ///
+ /// Gets a localized message from the specified key using the default culture.
+ ///
+ /// The message key to retrieve.
+ /// The localized message string.
public string GetMessageFromKey(LogLanguageKey messageKey)
{
return GetMessageFromKey(messageKey, null);
}
+ ///
+ /// Gets a localized message from the specified key using a specific culture.
+ ///
+ /// The message key to retrieve.
+ /// The culture name to use, or null for default.
+ /// The localized message string.
public string GetMessageFromKey(LogLanguageKey messageKey, string? culture)
{
var cult = culture != null ? new CultureInfo(culture) : ResourceCulture;
diff --git a/src/NosCore.ParserInputGenerator/I18N/LogLanguageKey.cs b/src/NosCore.ParserInputGenerator/I18N/LogLanguageKey.cs
index b582dad..2afb32b 100644
--- a/src/NosCore.ParserInputGenerator/I18N/LogLanguageKey.cs
+++ b/src/NosCore.ParserInputGenerator/I18N/LogLanguageKey.cs
@@ -8,12 +8,30 @@
namespace NosCore.ParserInputGenerator.I18N
{
+ ///
+ /// Enumeration of log message keys for localization.
+ ///
[SuppressMessage("ReSharper", "InconsistentNaming")]
public enum LogLanguageKey
{
+ ///
+ /// Download successful message key.
+ ///
DOWNLOAD_SUCCESSFULL,
+
+ ///
+ /// Parser input generated message key.
+ ///
PARSER_INPUT_GENERATED,
+
+ ///
+ /// Error message key.
+ ///
ERROR,
+
+ ///
+ /// Downloading message key.
+ ///
DOWNLOADING
}
}
\ No newline at end of file
diff --git a/src/NosCore.ParserInputGenerator/NosCore.ParserInputGenerator.csproj b/src/NosCore.ParserInputGenerator/NosCore.ParserInputGenerator.csproj
index fc59b78..4014aa3 100644
--- a/src/NosCore.ParserInputGenerator/NosCore.ParserInputGenerator.csproj
+++ b/src/NosCore.ParserInputGenerator/NosCore.ParserInputGenerator.csproj
@@ -1,7 +1,7 @@
- net8.0
+ net10.0
latest
favicon.ico
true
@@ -21,7 +21,6 @@
icon.png
true
true
- CS1591
@@ -40,12 +39,14 @@
-
-
+
+
+
-
-
+
+
+
diff --git a/test/NosCore.ParserInputGenerator.Tests/NosCore.ParserInputGenerator.Tests.csproj b/test/NosCore.ParserInputGenerator.Tests/NosCore.ParserInputGenerator.Tests.csproj
index b6a127d..71ade03 100644
--- a/test/NosCore.ParserInputGenerator.Tests/NosCore.ParserInputGenerator.Tests.csproj
+++ b/test/NosCore.ParserInputGenerator.Tests/NosCore.ParserInputGenerator.Tests.csproj
@@ -1,16 +1,18 @@
- net8.0
+ net10.0
true
false
-
-
-
-
+
+
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/test/NosCore.ParserInputGenerator.Tests/UnitTest1.cs b/test/NosCore.ParserInputGenerator.Tests/UnitTest1.cs
index 2db5a97..da8d5f6 100644
--- a/test/NosCore.ParserInputGenerator.Tests/UnitTest1.cs
+++ b/test/NosCore.ParserInputGenerator.Tests/UnitTest1.cs
@@ -1,5 +1,7 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
+[assembly: Parallelize(Workers = 0, Scope = ExecutionScope.MethodLevel)]
+
namespace NosCore.ParserInputGenerator.Tests
{
[TestClass]