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]