From 84f4710c88a3f47cb289df096f80c3b02f09162c Mon Sep 17 00:00:00 2001 From: "liam.cannon" Date: Wed, 25 Sep 2024 09:27:31 -0400 Subject: [PATCH 01/27] various LINQ optimizations to prefer find or firstordefault, Exists over any where applicatble, changed Datetime(1970, 1, 1) to Datetime.UnixEpoch --- FASTER Maintenance/Program.cs | 2 +- FASTER/Models/ArmaMod.cs | 2 +- FASTER/Models/ServerCfg.cs | 8 ++++---- FASTER/Models/ServerProfile.cs | 2 +- FASTER/ViewModel/ModsViewModel.cs | 4 ++-- FASTER/ViewModel/ProfileViewModel.cs | 10 +++++----- FASTER/ViewModel/SteamUpdaterViewModel.cs | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/FASTER Maintenance/Program.cs b/FASTER Maintenance/Program.cs index 1c4eb94f..386cc368 100644 --- a/FASTER Maintenance/Program.cs +++ b/FASTER Maintenance/Program.cs @@ -176,7 +176,7 @@ private static void MigrateTo17() } Console.WriteLine($"\tRead config from '{selected}\\user.config'"); - var servers = conf16.UserSettings.Settings.Setting.FirstOrDefault(s => s.Name == "Servers"); + var servers = conf16.UserSettings.Settings.Setting.Find(s => s.Name == "Servers"); conf16.UserSettings.Settings.Setting.Remove(servers); conf17.UserSettings = new Models._17Models.UserSettings { Settings = new Models._17Models.Settings { Setting = conf16.UserSettings.Settings.Setting } }; Console.WriteLine("\tConverted standard values to 1.7"); diff --git a/FASTER/Models/ArmaMod.cs b/FASTER/Models/ArmaMod.cs index f458a904..d24a20f0 100644 --- a/FASTER/Models/ArmaMod.cs +++ b/FASTER/Models/ArmaMod.cs @@ -275,7 +275,7 @@ internal async Task UpdateModAsync() break; case UpdateState.Success: Status = ArmaModStatus.UpToDate; - var nx = new DateTime(1970, 1, 1); + var nx = DateTime.UnixEpoch; var ts = DateTime.UtcNow - nx; LocalLastUpdated = (ulong) ts.TotalSeconds; diff --git a/FASTER/Models/ServerCfg.cs b/FASTER/Models/ServerCfg.cs index d96b2df4..d5f14f39 100644 --- a/FASTER/Models/ServerCfg.cs +++ b/FASTER/Models/ServerCfg.cs @@ -207,7 +207,7 @@ public bool HeadlessClientEnabled { headlessClientEnabled = value; RaisePropertyChanged("HeadlessClientEnabled"); - if (value && !headlessClients.Any(e => e.Length > 0)) + if (value && !headlessClients.Exists(e => e.Length > 0)) { HeadlessClients = "127.0.0.1"; } } } @@ -733,7 +733,7 @@ public List Missions bool isEqual = _missions.Count == value.Count && !( from mission in value - let local = _missions.FirstOrDefault(m => m.Path == mission.Path) + let local = _missions.Find(m => m.Path == mission.Path) where local == null || local.MissionChecked != mission.MissionChecked select mission ).Any(); @@ -932,8 +932,8 @@ public string ProcessFile() + "\r\n" + "\r\n" + "// HEADLESS CLIENT\r\n" - + $"{(headlessClientEnabled && !headlessClients.Any(string.IsNullOrWhiteSpace) ? $"headlessClients[] = { "{\n\t\"" + string.Join("\",\n\t \"", headlessClients) + "\"\n}" };\r\n" : "")}" - + $"{(headlessClientEnabled && !localClient.Any(string.IsNullOrWhiteSpace)? $"localClient[] = { "{\n\t\"" + string.Join("\",\n\t \"", localClient) + "\"\n}" };" : "")}"; + + $"{(headlessClientEnabled && !headlessClients.Exists(string.IsNullOrWhiteSpace) ? $"headlessClients[] = { "{\n\t\"" + string.Join("\",\n\t \"", headlessClients) + "\"\n}" };\r\n" : "")}" + + $"{(headlessClientEnabled && !localClient.Exists(string.IsNullOrWhiteSpace)? $"localClient[] = { "{\n\t\"" + string.Join("\",\n\t \"", localClient) + "\"\n}" };" : "")}"; return output; } diff --git a/FASTER/Models/ServerProfile.cs b/FASTER/Models/ServerProfile.cs index b74a42c5..9500c2b2 100644 --- a/FASTER/Models/ServerProfile.cs +++ b/FASTER/Models/ServerProfile.cs @@ -447,7 +447,7 @@ public ServerProfile Clone() { p.GenerateNewId(); - if (p.Name.EndsWith(")") && p.Name.Contains('(') && int.TryParse(p.Name.Substring(p.Name.Length - 2, 1), out _)) + if (p.Name.EndsWith(')') && p.Name.Contains('(') && int.TryParse(p.Name.Substring(p.Name.Length - 2, 1), out _)) { var i = p.Name.IndexOf('('); var j = p.Name.Length; diff --git a/FASTER/ViewModel/ModsViewModel.cs b/FASTER/ViewModel/ModsViewModel.cs index 9e4aaf15..4070d038 100644 --- a/FASTER/ViewModel/ModsViewModel.cs +++ b/FASTER/ViewModel/ModsViewModel.cs @@ -80,9 +80,9 @@ public async Task AddLocalModAsync() return; var oldPaths = new List(); - if (!Path.GetFileName(localPath).StartsWith("@") && Directory.GetDirectories(localPath).Where((file) => Path.GetFileName(file).StartsWith("@")).ToList().Count > 0) + if (!Path.GetFileName(localPath).StartsWith('@') && Directory.GetDirectories(localPath).Where((file) => Path.GetFileName(file).StartsWith('@')).ToList().Count > 0) { - oldPaths = Directory.GetDirectories(localPath).Where((file) => Path.GetFileName(file).StartsWith("@")).ToList(); + oldPaths = Directory.GetDirectories(localPath).Where((file) => Path.GetFileName(file).StartsWith('@')).ToList(); } else { diff --git a/FASTER/ViewModel/ProfileViewModel.cs b/FASTER/ViewModel/ProfileViewModel.cs index 192e2779..bfafd88a 100644 --- a/FASTER/ViewModel/ProfileViewModel.cs +++ b/FASTER/ViewModel/ProfileViewModel.cs @@ -199,7 +199,7 @@ internal void DeleteProfile() { Directory.Delete(Path.Combine(Profile.ArmaPath, "Servers", Profile.Id), true); } Properties.Settings.Default.Profiles.Remove(Profile); Properties.Settings.Default.Save(); - MainWindow.Instance.ContentProfileViews.Remove(MainWindow.Instance.ContentProfileViews.FirstOrDefault(p => p.Profile.Id == Profile.Id)); + MainWindow.Instance.ContentProfileViews.Remove(MainWindow.Instance.ContentProfileViews.Find(p => p.Profile.Id == Profile.Id)); var menuItem = MainWindow.Instance.IServerProfilesMenu.Items.Cast().FirstOrDefault(p => p.Name == Profile.Id); if(menuItem != null) MainWindow.Instance.IServerProfilesMenu.Items.Remove(menuItem); @@ -302,7 +302,7 @@ internal void LoadModsFromFile() List notFound = new(); foreach (var extractedMod in extractedModList) { - var mod = Profile.ProfileMods.FirstOrDefault(m => m.Id == extractedMod.Id || ModUtilities.GetCompareString(extractedMod.Name) == ModUtilities.GetCompareString(m.Name)); + var mod = Profile.ProfileMods.Find(m => m.Id == extractedMod.Id || ModUtilities.GetCompareString(extractedMod.Name) == ModUtilities.GetCompareString(m.Name)); if (mod != null) { mod.ClientSideChecked = true; @@ -396,7 +396,7 @@ internal async Task ClearModKeys() { foreach (var keyFile in Directory.GetFiles(Path.Combine(Profile.ArmaPath, "keys"))) { - if (ignoredKeys.Any(keyFile.Contains)) + if (Array.Exists(ignoredKeys, x => keyFile.Contains(x))) continue; try { @@ -423,7 +423,7 @@ public void LoadData() var modlist = new List(); foreach(var mod in Properties.Settings.Default.armaMods.ArmaMods) { - ProfileMod existingMod = Profile.ProfileMods.FirstOrDefault(m => m.Id == mod.WorkshopId); + ProfileMod existingMod = Profile.ProfileMods.Find(m => m.Id == mod.WorkshopId); if (existingMod == null) { var newProfile = new ProfileMod { Name = mod.Name, Id = mod.WorkshopId, IsLocal = mod.IsLocal}; @@ -465,7 +465,7 @@ internal void LoadMissions() foreach (var mission in newMissions) { - ProfileMission existingMission = Profile.ServerCfg.Missions.FirstOrDefault(m => m.Path == mission); + ProfileMission existingMission = Profile.ServerCfg.Missions.Find(m => m.Path == mission); if (existingMission == null) { var newMission = new ProfileMission { Name = mission.Replace(".pbo", ""), Path = mission }; diff --git a/FASTER/ViewModel/SteamUpdaterViewModel.cs b/FASTER/ViewModel/SteamUpdaterViewModel.cs index 298a9c78..d6a231bb 100644 --- a/FASTER/ViewModel/SteamUpdaterViewModel.cs +++ b/FASTER/ViewModel/SteamUpdaterViewModel.cs @@ -481,7 +481,7 @@ public async Task RunModsUpdater(ObservableCollection mods) sw.Stop(); mod.Status = ArmaModStatus.UpToDate; - var nx = new DateTime(1970, 1, 1); + var nx = DateTime.UnixEpoch; var ts = DateTime.UtcNow - nx; mod.LocalLastUpdated = (ulong) ts.TotalSeconds; From aa7f5f272ad5012f44a0966ded1ee4cb08b20dd8 Mon Sep 17 00:00:00 2001 From: Jupster <78136088+jupster@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:25:11 +1000 Subject: [PATCH 02/27] Update FASTER.csproj --- FASTER/FASTER.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 8e9ee5cf..c9fa17ab 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -9,7 +9,7 @@ true false true - 1.9.5.2 + 1.9.5.3 Keelah Fox FoxliCorp. Fox's Arma Server Tool Extended Rewrite From 8daef5e7eb1c4abf3cd003223d6c655e03e62e2c Mon Sep 17 00:00:00 2001 From: Jupster <78136088+jupster@users.noreply.github.com> Date: Mon, 30 Sep 2024 12:25:46 +1000 Subject: [PATCH 03/27] Update FASTER_Version.xml --- FASTER_Version.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FASTER_Version.xml b/FASTER_Version.xml index 3569db0f..032bbed7 100644 --- a/FASTER_Version.xml +++ b/FASTER_Version.xml @@ -1,6 +1,6 @@  - 1.9.5.2 + 1.9.5.3 https://github.com/Foxlider/FASTER/releases/latest/download/Release_x64.zip https://github.com/Foxlider/FASTER/releases true From 0715ec5e0b586095757a95e5b35e934315ce493d Mon Sep 17 00:00:00 2001 From: Keelah Atom Date: Sat, 5 Oct 2024 13:00:56 +0200 Subject: [PATCH 04/27] New Pipelines and release --- .github/release.yml | 11 ++++ .github/workflows/codeql-analysis.yml | 59 ++++++++++------- .github/workflows/publish.yml | 3 +- .github/workflows/release.yml | 93 +++++++++++++++++++++++++++ CONTRIBUTING.md | 4 +- 5 files changed, 145 insertions(+), 25 deletions(-) create mode 100644 .github/release.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 00000000..7aa8ef72 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,11 @@ +changelog: + categories: + - title: 🏕 Features + labels: + - '*' + exclude: + labels: + - dependencies + - title: 👒 Dependencies + labels: + - dependencies diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index d747a535..9299682a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,30 +1,24 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" +name: "Code Analysis" on: - push: + push: # The master branch must be analyzed on a new commit branches: [ master ] pull_request: - # The branches below must be a subset of the branches above + # Any PR on master must be analyzed branches: [ master ] - schedule: - - cron: '39 18 * * 0' - workflow_dispatch: + workflow_dispatch: # CodeQL can be triggered manually jobs: - analyze: - name: Analyze - runs-on: [self-hosted, windows-latest] + analyzeQL: + name: Analyze with CodeQL + runs-on: [ubuntu-latest] + + permissions: + # required for all workflows + security-events: write + + # required to fetch internal or private CodeQL packs + packages: read strategy: fail-fast: false @@ -33,20 +27,41 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4.1.2 + uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} + - name: Setup .NET Core SDK uses: actions/setup-dotnet@v4.0.0 with: - dotnet-version: 7.x + dotnet-version: ${{vars.DOTNET_VERSION}} - run: dotnet restore - run: dotnet build ./FASTER.sln --configuration Debug - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 + + AnalysisSonar: + name: Analyze with SonarCloud + runs-on: ubuntu-latest + permissions: + pull-requests: write # allows SonarCloud to decorate PRs with analysis results + + steps: + - name: Analyze with SonarCloud + + # You can pin the exact commit or the version. + uses: SonarSource/sonarcloud-github-action@v3 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + with: + # Additional arguments for the SonarScanner CLI + args: + -Dsonar.projectKey=Foxlider_FASTER + -Dsonar.organization=foxlicorp + projectBaseDir: . \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index de9ddbad..3f8f92d5 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -16,4 +16,5 @@ jobs: identifier: Foxlider.FASTER installers-regex: 'Release_x64.zip' max-versions-to-keep: 5 - token: ${{ secrets.WINGET_TOKEN }} # Classic Personal Access Token with [public_repo, workflow] scopes \ No newline at end of file + # Classic Personal Access Token with [public_repo, workflow] scopes + token: ${{ secrets.WINGET_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..a2a015fd --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,93 @@ +name: "Release Generator" + +# after successful analysis on the main branch, a new pre-release is generated +on: + workflow_run: + workflows: [Code Analysis] + types: [completed] + branches: [master] + +jobs: + + # BUILD APP + build: + + strategy: + matrix: + runtime: [x64, x86] + + runs-on: windows-latest # For a list of available runner types, refer to + # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on + + env: + Configuration: Release + Solution_Name: FASTER # Replace with your solution name, i.e. MyWpfApp.sln. + Test_Project_Path: FASTERTests\FASTERTests.csproj # Replace with the path to your test project, i.e. MyWpfApp.Tests\MyWpfApp.Tests.csproj. + Wap_Project_Directory: FASTER # Replace with the Wap project directory relative to the solution, i.e. MyWpfApp.Package. + Wap_Project_Path: FASTER.App.Package\FASTER.Package.wapproj # Replace with the path to your Wap project, i.e. MyWpf.App.Package\MyWpfApp.Package.wapproj. + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Install the .NET Core workload + - name: Install .NET Core + uses: actions/setup-dotnet@v4 + with: + dotnet-version: ${{vars.DOTNET_VERSION}} + + # Execute all unit tests in the solution + - name: Execute unit tests + run: dotnet test + + # Restore the application to populate the obj folder with RuntimeIdentifiers + - name: Restore the application + run: dotnet restore + + # Build + - name: Build the application + run: dotnet build --configuration $env:Configuration -a $env:Runtime ./FASTER/FASTER.csproj + env: + Runtime: ${{ matrix.runtime }} + + # Pub + - name: Publish the application $env:Runtime + run: dotnet publish --configuration $env:Configuration -a $env:Runtime --self-contained true /p:useapphost=true --output .\Release_Nightly_$env:Runtime ./FASTER/FASTER.csproj + env: + Runtime: ${{ matrix.runtime }} + + + # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact + # - name: Upload build artifacts + # uses: actions/upload-artifact@v4 + # with: + # name: Release_Nightly_${{ env.Runtime }} + # path: .\FASTER_Nightly_${{ env.Runtime }} + # env: + # Runtime: ${{ matrix.runtime }} + + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.ref }} + release_name: Release ${{ github.ref }} + draft: false + prerelease: true + #Upload Artifacts + - name: Upload Release Asset + id: upload-release-asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + Runtime: ${{ matrix.runtime }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps + asset_path: .\FASTER_Nightly_${{ env.Runtime }}.zip + asset_name: Release_Nightly_${{ env.Runtime }}.zip + asset_content_type: application/zip + \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e5902522..c19913e2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -43,9 +43,9 @@ For changes that address core functionality or would require breaking changes (e In general, we follow the ["fork-and-pull" Git workflow](https://github.com/susam/gitpr) While a bit different, it is generally the same idea. -1. Fork the repository to your own Github account +1. Fork the repository to your own GitHub account 2. Clone the project to your machine -3. Create a branch locally with a succinct but descriptive name. It is preferred to branch from the current update branch that should be named feature/Update-X.Y +3. Create a branch locally with a succinct but descriptive name. It is preferred to branch from the current update branch that should be named `feature/shortName` 4. Commit changes to the branch 5. Following any formatting and testing guidelines specific to this repo 6. Push changes to your fork From da8e285f2b10fdcd700d1ff8c9bc3b21dc8f1316 Mon Sep 17 00:00:00 2001 From: Keelah Atom Date: Sat, 5 Oct 2024 14:05:00 +0200 Subject: [PATCH 05/27] Changed CodeQL runner type to windows --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9299682a..0b539f33 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -11,7 +11,7 @@ on: jobs: analyzeQL: name: Analyze with CodeQL - runs-on: [ubuntu-latest] + runs-on: [windows-latest] permissions: # required for all workflows From 9998a250259445c72dbc66feaff0b4d00bc6ba80 Mon Sep 17 00:00:00 2001 From: Keelah Atom Date: Sat, 5 Oct 2024 14:10:03 +0200 Subject: [PATCH 06/27] OOM Error on windows-latest >< --- .github/workflows/codeql-analysis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 0b539f33..28fe31a4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -11,7 +11,8 @@ on: jobs: analyzeQL: name: Analyze with CodeQL - runs-on: [windows-latest] + # runs-on: [windows-latest] # may cause Out of Memory errors + runs-on: [self-hosted] permissions: # required for all workflows From df4b3d2a4938d3bde6297b7a872c90db29fc1e91 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 5 Oct 2024 18:12:41 +0200 Subject: [PATCH 07/27] Fixed Release Generator --- .github/workflows/release.yml | 38 ++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a2a015fd..df4366cc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,10 +2,23 @@ name: "Release Generator" # after successful analysis on the main branch, a new pre-release is generated on: + #Makes a Nighly release on a new commit. workflow_run: workflows: [Code Analysis] types: [completed] branches: [master] + + #Makes a Release on tag + push: + # Sequence of patterns matched against refs/tags + tags: + - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10 + workflow_dispatch: # ReleaseGen can be triggered manually + +env: + IS_TAG: ${{ github.ref_type == 'tag' }} + ZIP_NAME: ${{ github.ref_type == 'tag' && 'Release_' || 'Release_Nightly_' }} + ZIP_PATH: ${{ github.ref_type == 'tag' && 'FASTER_' || 'FASTER_Nightly_' }} jobs: @@ -53,8 +66,8 @@ jobs: Runtime: ${{ matrix.runtime }} # Pub - - name: Publish the application $env:Runtime - run: dotnet publish --configuration $env:Configuration -a $env:Runtime --self-contained true /p:useapphost=true --output .\Release_Nightly_$env:Runtime ./FASTER/FASTER.csproj + - name: Publish the application ${{ matrix.runtime }} + run: dotnet publish --configuration $env:Configuration -a $env:Runtime --self-contained true /p:useapphost=true --output .\$env:ZIP_NAME$env:Runtime ./FASTER/FASTER.csproj env: Runtime: ${{ matrix.runtime }} @@ -68,16 +81,27 @@ jobs: # env: # Runtime: ${{ matrix.runtime }} + - name: get-net-sdk-project-versions-action + uses: kzrnm/get-net-sdk-project-versions-action@v2.0.0 + id: get-version + with: + proj-path: ./FASTER/FASTER.csproj + + - name: Set Version + id: set_version + run: echo "VERSION=$([[ ${{ env.IS_TAG }} == 'true' ]] && echo '${{ github.ref }}' || echo '${{ steps.get-version.outputs.version }}')" >> $GITHUB_ENV + - name: Create Release id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} + tag_name: ${{ env.VERSION }} + release_name: ${{ env.IS_TAG == 'true' && 'Release' || 'PreRelease' }} ${{ env.VERSION }} draft: false - prerelease: true + prerelease: ${{ env.IS_TAG == 'false' }} + #Upload Artifacts - name: Upload Release Asset id: upload-release-asset @@ -87,7 +111,7 @@ jobs: Runtime: ${{ matrix.runtime }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: .\FASTER_Nightly_${{ env.Runtime }}.zip - asset_name: Release_Nightly_${{ env.Runtime }}.zip + asset_path: .\${{ env.ZIP_PATH}}${{ env.Runtime }}.zip + asset_name: ${{ env.ZIP_NAME}}${{ env.Runtime }}.zip asset_content_type: application/zip \ No newline at end of file From 664151263eeaa73d8f7f467beda6c3f53f973678 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 5 Oct 2024 18:26:20 +0200 Subject: [PATCH 08/27] Right... x86 is incompatible for now... --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index df4366cc..1bb0e50f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,7 +27,8 @@ jobs: strategy: matrix: - runtime: [x64, x86] + # runtime: [x64, x86] + runtime: [x64] runs-on: windows-latest # For a list of available runner types, refer to # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on From 390458ef8982c8b7d50e56ef12425b050bbd46b0 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 5 Oct 2024 18:55:19 +0200 Subject: [PATCH 09/27] Removed SonarLint hardcoded path --- FASTER Maintenance/FASTER Maintenance.csproj | 11 ----------- FASTER/FASTER - Backup.csproj | 1 - FASTER/FASTER.csproj | 4 ---- 3 files changed, 16 deletions(-) diff --git a/FASTER Maintenance/FASTER Maintenance.csproj b/FASTER Maintenance/FASTER Maintenance.csproj index 5bd11581..bf535bb0 100644 --- a/FASTER Maintenance/FASTER Maintenance.csproj +++ b/FASTER Maintenance/FASTER Maintenance.csproj @@ -12,7 +12,6 @@ 512 true false - ..\.sonarlint\foxlider_fastercsharp.ruleset AnyCPU @@ -24,7 +23,6 @@ prompt 4 8 - ..\.sonarlint\foxlider_fastercsharp.ruleset AnyCPU @@ -35,7 +33,6 @@ prompt 4 8 - ..\.sonarlint\foxlider_fastercsharp.ruleset Properties\app.manifest @@ -65,16 +62,8 @@ - - foxlider_fastercsharp.ruleset - - - - SonarLint.xml - - \ No newline at end of file diff --git a/FASTER/FASTER - Backup.csproj b/FASTER/FASTER - Backup.csproj index ce7aa469..6dd452ef 100644 --- a/FASTER/FASTER - Backup.csproj +++ b/FASTER/FASTER - Backup.csproj @@ -21,7 +21,6 @@ true FASTERKey.snk false - ..\.sonarlint\foxlider_fastercsharp.ruleset false diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index c9fa17ab..67565679 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -23,7 +23,6 @@ true FASTERKey.snk false - ..\.sonarlint\foxlider_fastercsharp.ruleset false @@ -49,9 +48,6 @@ - - - From 6fed5124b22156d77617141b452f3e312ea6e32c Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 5 Oct 2024 18:55:53 +0200 Subject: [PATCH 10/27] Using `pwsh` for scripting Prevents issues between Win and Linux --- .github/workflows/release.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1bb0e50f..00d00be6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,13 @@ jobs: - name: Set Version id: set_version - run: echo "VERSION=$([[ ${{ env.IS_TAG }} == 'true' ]] && echo '${{ github.ref }}' || echo '${{ steps.get-version.outputs.version }}')" >> $GITHUB_ENV + run: | + if ($env:IS_TAG -eq "true") { + echo "VERSION=$env:GITHUB_REF" >> $env:GITHUB_ENV + } else { + echo "VERSION=${{ steps.get-version.outputs.version }}" >> $env:GITHUB_ENV + } + shell: pwsh - name: Create Release id: create_release From 4ecc372d24ed7b3852edaeb3f49d9522a33e225a Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 5 Oct 2024 19:28:28 +0200 Subject: [PATCH 11/27] Fixed Release zip file --- .github/workflows/release.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 00d00be6..dcab3145 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -71,7 +71,13 @@ jobs: run: dotnet publish --configuration $env:Configuration -a $env:Runtime --self-contained true /p:useapphost=true --output .\$env:ZIP_NAME$env:Runtime ./FASTER/FASTER.csproj env: Runtime: ${{ matrix.runtime }} - + + # Zip the folder + - name: Zip the application folder + run: Compress-Archive -Path .\$env:ZIP_NAME$env:Runtime\* -DestinationPath .\$env:ZIP_NAME$env:Runtime.zip + shell: pwsh + env: + Runtime: ${{ matrix.runtime }} # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact # - name: Upload build artifacts @@ -104,7 +110,7 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: ${{ env.VERSION }} + tag_name: v${{ env.VERSION }} release_name: ${{ env.IS_TAG == 'true' && 'Release' || 'PreRelease' }} ${{ env.VERSION }} draft: false prerelease: ${{ env.IS_TAG == 'false' }} @@ -118,7 +124,7 @@ jobs: Runtime: ${{ matrix.runtime }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} # This pulls from the CREATE RELEASE step above, referencing it's ID to get its outputs object, which include a `upload_url`. See this blog post for more info: https://jasonet.co/posts/new-features-of-github-actions/#passing-data-to-future-steps - asset_path: .\${{ env.ZIP_PATH}}${{ env.Runtime }}.zip + asset_path: .\${{ env.ZIP_NAME}}${{ env.Runtime }}.zip asset_name: ${{ env.ZIP_NAME}}${{ env.Runtime }}.zip asset_content_type: application/zip \ No newline at end of file From 020708178b7eda5bf85bc32013f5bfede43a108f Mon Sep 17 00:00:00 2001 From: Keelah Date: Fri, 11 Oct 2024 16:56:07 +0200 Subject: [PATCH 12/27] Updated Code to .NET 8.0 --- FASTER/FASTER.csproj | 123 +++++++++---------- FASTERTests/FASTERTests.csproj | 10 +- FASTERTests/Models/Arma3ProfileTests.cs | 54 ++++---- FASTERTests/Models/ArmaModCollectionTests.cs | 22 ++-- FASTERTests/Models/BasicCfgTests.cs | 28 ++--- FASTERTests/Models/ConverterTests.cs | 24 ++-- FASTERTests/Models/EncryptionTests.cs | 4 +- FASTERTests/SteamModTests.cs | 38 +++--- FASTERTests/SteamWebApiTests.cs | 10 +- 9 files changed, 151 insertions(+), 162 deletions(-) diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 67565679..5c04803a 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -1,49 +1,60 @@ - - WinExe - net7.0-windows - true - true - win-x64 - true - true - false - true - 1.9.5.3 - Keelah Fox - FoxliCorp. - Fox's Arma Server Tool Extended Rewrite - Copyright © 2019 - https://forums.bohemia.net/forums/topic/224359-foxs-arma-server-tool-extended-rewrite-faster/ - https://github.com/Foxlider/FASTER - Resources\FASTER.ico - FASTER.App - Properties\FASTER.manifest - 9.0 - true - FASTERKey.snk - false - false - - - 1701;1702;NU1701;CS8002 - x64 - none - false - True - - - 1701;1702;NU1701;CS8002 - x64 - - - 1701;1702;NU1701;CS8002 - x86 - - - 1701;1702;NU1701;CS8002 - False - + + WinExe + net8.0-windows + enable + enable + true + Resources\FASTER.ico + Properties\FASTER.manifest + True + FASTERKey.snk + Keelah Fox, Jupster, Canno.n + 1.9.5.3 + FoxliCorp. + Fox's Arma Server Tool Extended Rewrite + Copyright © 2019 + https://github.com/Foxlider/FASTER + README.md + https://github.com/Foxlider/FASTER + LICENSE + + true + true + true + false + + + + + portable + + + + none + + + + + PreserveNewest + + + + + + + + True + True + Settings.settings + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + @@ -59,28 +70,6 @@ - - - - PreserveNewest - - - - - - - - True - True - Settings.settings - - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - diff --git a/FASTERTests/FASTERTests.csproj b/FASTERTests/FASTERTests.csproj index 77d28e29..e56945dc 100644 --- a/FASTERTests/FASTERTests.csproj +++ b/FASTERTests/FASTERTests.csproj @@ -1,6 +1,6 @@  - net7.0-windows + net8.0-windows false @@ -19,13 +19,13 @@ x64 - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + all diff --git a/FASTERTests/Models/Arma3ProfileTests.cs b/FASTERTests/Models/Arma3ProfileTests.cs index d922e1ad..6e43a9cd 100644 --- a/FASTERTests/Models/Arma3ProfileTests.cs +++ b/FASTERTests/Models/Arma3ProfileTests.cs @@ -14,33 +14,33 @@ public void Arma3ProfileSetUp() [Test()] public void Arma3ProfileCorrectData() { - Assert.IsTrue(ProfileCfgArrays.AiPresetStrings.Contains(_p.AiLevelPreset)); - Assert.IsTrue(ProfileCfgArrays.ThirdPersonStrings.Contains(_p.ThirdPersonView)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.ReducedDamage)); - Assert.IsTrue(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.GroupIndicators)); - Assert.IsTrue(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.FriendlyTags)); - Assert.IsTrue(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.EnemyTags)); - Assert.IsTrue(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.DetectedMines)); - Assert.IsTrue(ProfileCfgArrays.FadeOutStrings.Contains(_p.Commands)); - Assert.IsTrue(ProfileCfgArrays.FadeOutStrings.Contains(_p.Waypoints)); - Assert.IsTrue(ProfileCfgArrays.FadeOutStrings.Contains(_p.WeaponInfo)); - Assert.IsTrue(ProfileCfgArrays.FadeOutStrings.Contains(_p.StanceIndicator)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.StaminaBar)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.WeaponCrosshair)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.VisionAid)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.CameraShake)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.ScoreTable)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.DeathMessages)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.VonID)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentEnemy)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentFriendly)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentMines)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.AutoReport)); - Assert.IsTrue(ProfileCfgArrays.EnabledStrings.Contains(_p.MultipleSaves)); - Assert.IsTrue(ProfileCfgArrays.TacticalPingStrings.Contains(_p.TacticalPing)); - Assert.IsFalse(string.IsNullOrWhiteSpace(_p.ArmaProfileContent)); - Assert.IsNotNull(_p.PrecisionAi); - Assert.IsNotNull(_p.SkillAi); + Assert.That(ProfileCfgArrays.AiPresetStrings.Contains(_p.AiLevelPreset)); + Assert.That(ProfileCfgArrays.ThirdPersonStrings.Contains(_p.ThirdPersonView)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.ReducedDamage)); + Assert.That(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.GroupIndicators)); + Assert.That(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.FriendlyTags)); + Assert.That(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.EnemyTags)); + Assert.That(ProfileCfgArrays.LimitedDistanceStrings.Contains(_p.DetectedMines)); + Assert.That(ProfileCfgArrays.FadeOutStrings.Contains(_p.Commands)); + Assert.That(ProfileCfgArrays.FadeOutStrings.Contains(_p.Waypoints)); + Assert.That(ProfileCfgArrays.FadeOutStrings.Contains(_p.WeaponInfo)); + Assert.That(ProfileCfgArrays.FadeOutStrings.Contains(_p.StanceIndicator)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.StaminaBar)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.WeaponCrosshair)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.VisionAid)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.CameraShake)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.ScoreTable)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.DeathMessages)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.VonID)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentEnemy)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentFriendly)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.MapContentMines)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.AutoReport)); + Assert.That(ProfileCfgArrays.EnabledStrings.Contains(_p.MultipleSaves)); + Assert.That(ProfileCfgArrays.TacticalPingStrings.Contains(_p.TacticalPing)); + Assert.That(!string.IsNullOrWhiteSpace(_p.ArmaProfileContent)); + Assert.That(_p.PrecisionAi, Is.Not.Null); + Assert.That(_p.SkillAi, Is.Not.Null); } [Test()] diff --git a/FASTERTests/Models/ArmaModCollectionTests.cs b/FASTERTests/Models/ArmaModCollectionTests.cs index c10b345a..b29121e7 100644 --- a/FASTERTests/Models/ArmaModCollectionTests.cs +++ b/FASTERTests/Models/ArmaModCollectionTests.cs @@ -36,17 +36,17 @@ public void AddSteamModTest() [Test] public void TestSteamModGet() { - Assert.IsFalse(string.IsNullOrEmpty(_mod.Author)); - Assert.IsFalse(string.IsNullOrEmpty(_mod.Name)); - Assert.IsFalse(string.IsNullOrEmpty(_mod.Path)); - Assert.IsFalse(string.IsNullOrEmpty(_mod.Status)); - Assert.IsNotNull(_mod.Size); - Assert.IsNotNull(_mod.LocalLastUpdated); - Assert.IsNotNull(_mod.WorkshopId); - Assert.IsNotNull(_mod.SteamLastUpdated); - Assert.IsNotNull(_mod.PrivateMod); - Assert.IsNotNull(_mod.IsLocal); - Assert.IsNotNull(_mod.IsLoading); + Assert.That(!string.IsNullOrEmpty(_mod.Author)); + Assert.That(!string.IsNullOrEmpty(_mod.Name)); + Assert.That(!string.IsNullOrEmpty(_mod.Path)); + Assert.That(!string.IsNullOrEmpty(_mod.Status)); + Assert.That(_mod.Size, Is.Not.Null); + Assert.That(_mod.LocalLastUpdated, Is.Not.Null); + Assert.That(_mod.WorkshopId, Is.Not.Null); + Assert.That(_mod.SteamLastUpdated, Is.Not.Null); + Assert.That(_mod.PrivateMod, Is.Not.Null); + Assert.That(_mod.IsLocal, Is.Not.Null); + Assert.That(_mod.IsLoading, Is.Not.Null); } [Test] diff --git a/FASTERTests/Models/BasicCfgTests.cs b/FASTERTests/Models/BasicCfgTests.cs index 784f89a3..f11b3643 100644 --- a/FASTERTests/Models/BasicCfgTests.cs +++ b/FASTERTests/Models/BasicCfgTests.cs @@ -16,20 +16,20 @@ public void BasicCfgSetUp() [Test()] public void BasicCfgGetTest() { - Assert.IsNotNull(_cfg.BasicContent); - Assert.IsNotNull(_cfg.MaxBandwidth); - Assert.IsNotNull(_cfg.MaxCustomFileSize); - Assert.IsNotNull(_cfg.MaxMsgSend); - Assert.IsNotNull(_cfg.MaxPacketSize); - Assert.IsNotNull(_cfg.MaxSizeGuaranteed); - Assert.IsNotNull(_cfg.MaxSizeNonGuaranteed); - Assert.IsNotNull(_cfg.MinBandwidth); - Assert.IsNotNull(_cfg.MinErrorToSend); - Assert.IsNotNull(_cfg.MinErrorToSend); - Assert.IsNotNull(_cfg.MinErrorToSendNear); - Assert.AreEqual("Custom", _cfg.PerfPreset); - Assert.IsNotNull(_cfg.TerrainGrid); - Assert.IsNotNull(_cfg.ViewDistance); + Assert.That(_cfg.BasicContent, Is.Not.Null); + Assert.That(_cfg.MaxBandwidth, Is.Not.Null); + Assert.That(_cfg.MaxCustomFileSize, Is.Not.Null); + Assert.That(_cfg.MaxMsgSend, Is.Not.Null); + Assert.That(_cfg.MaxPacketSize, Is.Not.Null); + Assert.That(_cfg.MaxSizeGuaranteed, Is.Not.Null); + Assert.That(_cfg.MaxSizeNonGuaranteed, Is.Not.Null); + Assert.That(_cfg.MinBandwidth, Is.Not.Null); + Assert.That(_cfg.MinErrorToSend, Is.Not.Null); + Assert.That(_cfg.MinErrorToSend, Is.Not.Null); + Assert.That(_cfg.MinErrorToSendNear, Is.Not.Null); + Assert.That(_cfg.PerfPreset, Is.EqualTo("Custom")); + Assert.That(_cfg.TerrainGrid, Is.Not.Null); + Assert.That(_cfg.ViewDistance, Is.Not.Null); } [Test()] diff --git a/FASTERTests/Models/ConverterTests.cs b/FASTERTests/Models/ConverterTests.cs index c867f8a6..1a2ce1b9 100644 --- a/FASTERTests/Models/ConverterTests.cs +++ b/FASTERTests/Models/ConverterTests.cs @@ -13,8 +13,8 @@ public class ProfileModsFilterIsInvalidTextConverterTests [Test()] public void ConvertTest() { - Assert.AreEqual(" ", _converter.Convert(false, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.AreEqual("Invalid regular expression...", _converter.Convert(true, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture)); + Assert.That(_converter.Convert(false, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(" ")); + Assert.That(_converter.Convert(true, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo("Invalid regular expression...")); } [Test()] @@ -35,8 +35,8 @@ public void ConvertTest() SolidColorBrush c1 = _converter.Convert(true, typeof(SolidColorBrush), null, System.Globalization.CultureInfo.InvariantCulture) as SolidColorBrush; SolidColorBrush c2 = _converter.Convert(false, typeof(SolidColorBrush), null, System.Globalization.CultureInfo.InvariantCulture) as SolidColorBrush; - Assert.AreEqual(new SolidColorBrush(Color.FromRgb(90, 29, 29)).Color, c1.Color); - Assert.AreEqual(new SolidColorBrush().Color, c2.Color); + Assert.That(c1.Color, Is.EqualTo(new SolidColorBrush(Color.FromRgb(90, 29, 29)).Color)); + Assert.That(c2.Color, Is.EqualTo(new SolidColorBrush().Color)); } [Test()] @@ -56,8 +56,8 @@ public void ConvertTest() SolidColorBrush c1 = _converter.Convert(true, typeof(SolidColorBrush), null, System.Globalization.CultureInfo.InvariantCulture) as SolidColorBrush; SolidColorBrush c2 = _converter.Convert(false, typeof(SolidColorBrush), null, System.Globalization.CultureInfo.InvariantCulture) as SolidColorBrush; - Assert.AreEqual(new SolidColorBrush(Color.FromRgb(190, 17, 0)).Color, c1.Color); - Assert.AreEqual(new SolidColorBrush().Color, c2.Color); + Assert.That(c1.Color, Is.EqualTo(new SolidColorBrush(Color.FromRgb(190, 17, 0)).Color)); + Assert.That(c2.Color, Is.EqualTo(new SolidColorBrush().Color)); } [Test()] @@ -74,8 +74,8 @@ public class NotBooleanToVisibilityConverterTests [Test()] public void ConvertTest() { - Assert.AreEqual(System.Windows.Visibility.Visible, _converter.Convert(false, typeof(System.Windows.Visibility), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.AreEqual(System.Windows.Visibility.Collapsed, _converter.Convert(true, typeof(System.Windows.Visibility), null, System.Globalization.CultureInfo.InvariantCulture)); + Assert.That(_converter.Convert(false, typeof(System.Windows.Visibility), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(System.Windows.Visibility.Visible)); + Assert.That(_converter.Convert(true, typeof(System.Windows.Visibility), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo(System.Windows.Visibility.Collapsed)); } [Test()] @@ -93,15 +93,15 @@ public class FolderSizeConverterTests public void ConvertTest() { var separator = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator; - Assert.AreEqual($" 1{separator}00 B", _converter.Convert((long)1, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.AreEqual($" 1{separator}00 KB", _converter.Convert((long)1024, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture)); - Assert.AreEqual("0 B", _converter.Convert("FAIL", typeof(string), null, System.Globalization.CultureInfo.InvariantCulture)); + Assert.That(_converter.Convert((long)1, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo($" 1{separator}00 B")); + Assert.That(_converter.Convert((long)1024, typeof(string), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo($" 1{separator}00 KB")); + Assert.That(_converter.Convert("FAIL", typeof(string), null, System.Globalization.CultureInfo.InvariantCulture), Is.EqualTo("0 B")); } [Test()] public void ConvertBackTest() { - Assert.IsNull(_converter.ConvertBack(1, typeof(string), null, null)); + Assert.That(_converter.ConvertBack(1, typeof(string), null, null), Is.Null); } } } \ No newline at end of file diff --git a/FASTERTests/Models/EncryptionTests.cs b/FASTERTests/Models/EncryptionTests.cs index 625b4601..49923fa2 100644 --- a/FASTERTests/Models/EncryptionTests.cs +++ b/FASTERTests/Models/EncryptionTests.cs @@ -9,14 +9,14 @@ public class EncryptionTests public void EncryptDataTest() { Assert.DoesNotThrow(() => Encryption.Instance.EncryptData("SomeText")); - Assert.AreNotEqual("SomeText", Encryption.Instance.EncryptData("SomeText")); + Assert.That(Encryption.Instance.EncryptData("SomeText"), Is.EqualTo("SomeText")); } [Test()] public void DecryptDataTest() { var encrypted = Encryption.Instance.EncryptData("SomeText"); - Assert.AreEqual("SomeText", Encryption.Instance.DecryptData(encrypted)); + Assert.That(Encryption.Instance.DecryptData(encrypted), Is.EqualTo("SomeText")); } } } \ No newline at end of file diff --git a/FASTERTests/SteamModTests.cs b/FASTERTests/SteamModTests.cs index 878d700b..39771a75 100644 --- a/FASTERTests/SteamModTests.cs +++ b/FASTERTests/SteamModTests.cs @@ -12,11 +12,11 @@ public class SteamModTests [Test()] public void SteamIdFromUrlTest() { - Assert.AreEqual(463939057, SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?id=463939057")); - Assert.AreEqual(463939057, SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?id=463939057&l=french")); - Assert.AreEqual(463939057, SteamMod.SteamIdFromUrl("https://steamcommunity.com/sharedfiles/filedetails/?l=german&id=463939057")); - Assert.AreEqual(463939057, SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?l=french&id=463939057")); - Assert.AreEqual(463939057, SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?l=english&id=463939057&l=french")); + Assert.That(SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?id=463939057"), Is.EqualTo(463939057)); + Assert.That(SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?id=463939057&l=french"), Is.EqualTo(463939057)); + Assert.That(SteamMod.SteamIdFromUrl("https://steamcommunity.com/sharedfiles/filedetails/?l=german&id=463939057"), Is.EqualTo(463939057)); + Assert.That(SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?l=french&id=463939057"), Is.EqualTo(463939057)); + Assert.That(SteamMod.SteamIdFromUrl("https://steamcommunity.com/workshop/filedetails/?l=english&id=463939057&l=french"), Is.EqualTo(463939057)); } @@ -26,9 +26,9 @@ public void GetModInfoTest() Tuple expected = new Tuple("ace", "acemod", 1577907553); Tuple res = null; Assert.DoesNotThrow(() => { res = SteamMod.GetModInfo(463939057); }); - Assert.AreEqual(expected.Item1, res.Item1, "The expected mod name was wrong"); - Assert.AreEqual(expected.Item2, res.Item2, "The expected creator name was wrong"); - Assert.GreaterOrEqual(res.Item3, expected.Item3, "The expected update time was wrong"); + Assert.That(res.Item1, Is.EqualTo(expected.Item1), "The expected mod name was wrong"); + Assert.That(res.Item2, Is.EqualTo(expected.Item2), "The expected creator name was wrong"); + Assert.That(res.Item3, Is.GreaterThanOrEqualTo(expected.Item3), "The expected update time was wrong"); } } @@ -48,10 +48,10 @@ public void ParseArmaProfileFile() File.WriteAllText(fullPath, _armaProfileContent); var modList = ModUtilities.ParseModsFromArmaProfileFile(fullPath); - Assert.IsNotNull(modList); - Assert.AreEqual(1, modList.Count); - Assert.AreEqual("CBA_A3", modList[0].Name); - Assert.AreEqual(ModUtilities.GetCompareString("@CBA_A3"), ModUtilities.GetCompareString(modList[0].Name)); + Assert.That(modList, Is.Not.Null); + Assert.That(modList.Count, Is.EqualTo(1)); + Assert.That(modList[0].Name, Is.EqualTo("CBA_A3")); + Assert.That(ModUtilities.GetCompareString(modList[0].Name), Is.EqualTo(ModUtilities.GetCompareString("@CBA_A3"))); if (File.Exists(fullPath)) File.Delete(fullPath); @@ -65,15 +65,15 @@ public void ParseBuggedArmaProfileFile() File.WriteAllText(fullPath, _armaBugProfileContent); var modList = ModUtilities.ParseModsFromArmaProfileFile(fullPath); - Assert.IsNotNull(modList); - Assert.AreEqual(68, modList.Count); - Assert.AreEqual(65, modList.FindAll(mod => !mod.IsLocal).Count); - Assert.AreEqual(3, modList.FindAll(mod => mod.IsLocal).Count); + Assert.That(modList, Is.Not.Null); + Assert.That(modList.Count, Is.EqualTo(68)); + Assert.That(modList.FindAll(mod => !mod.IsLocal).Count, Is.EqualTo(65)); + Assert.That(modList.FindAll(mod => mod.IsLocal).Count, Is.EqualTo(3)); var mod = modList.Find(m => m.Name == "A3 Thermal Improvement"); - Assert.IsNotNull(mod); - Assert.IsTrue(mod.IsLocal); - Assert.AreEqual(ModUtilities.GetCompareString("@A3_Thermal_Improvement"), ModUtilities.GetCompareString(mod.Name)); + Assert.That(mod, Is.Not.Null); + Assert.That(mod.IsLocal); + Assert.That(ModUtilities.GetCompareString(mod.Name), Is.EqualTo(ModUtilities.GetCompareString("@A3_Thermal_Improvement"))); if (File.Exists(fullPath)) File.Delete(fullPath); diff --git a/FASTERTests/SteamWebApiTests.cs b/FASTERTests/SteamWebApiTests.cs index e51b29fe..1b5ba161 100644 --- a/FASTERTests/SteamWebApiTests.cs +++ b/FASTERTests/SteamWebApiTests.cs @@ -11,11 +11,11 @@ public class SteamWebApiTests public void GetSingleFileDetailsTest() { var res = SteamWebApi.GetSingleFileDetails(463939057); - Assert.IsNotNull(res); - Assert.AreEqual("463939057", res["publishedfileid"].ToString()); - Assert.AreEqual("76561198194647182", res["creator"].ToString()); - Assert.AreEqual("ace", res["title"].ToString()); - Assert.AreEqual("107410", res["creator_appid"].ToString()); + Assert.That(res, Is.Not.Null); + Assert.That(res["publishedfileid"].ToString(), Is.EqualTo("463939057")); + Assert.That(res["creator"].ToString(), Is.EqualTo("76561198194647182")); + Assert.That(res["title"].ToString(), Is.EqualTo("ace")); + Assert.That(res["creator_appid"].ToString(), Is.EqualTo("107410")); } } } \ No newline at end of file From 8eac7c1a5f7100aaaf804fc072c2ebd49b02212c Mon Sep 17 00:00:00 2001 From: Keelah Date: Fri, 11 Oct 2024 16:56:22 +0200 Subject: [PATCH 13/27] Package Bump --- FASTER.sln | 2 ++ FASTER/FASTER.csproj | 13 +++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/FASTER.sln b/FASTER.sln index f208b064..3b729fd9 100644 --- a/FASTER.sln +++ b/FASTER.sln @@ -13,7 +13,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml FASTER_Version.xml = FASTER_Version.xml NuGet.Config = NuGet.Config + .github\workflows\publish.yml = .github\workflows\publish.yml README.md = README.md + .github\workflows\release.yml = .github\workflows\release.yml EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FASTERTests", "FASTERTests\FASTERTests.csproj", "{65FDF864-BF9B-414A-A6E6-3473BCFB62BE}" diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 5c04803a..3799b691 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -60,16 +60,17 @@ - + - - - + + + - - + + + From b4429f6c1a0edf5919373c421be2e7e964996e9d Mon Sep 17 00:00:00 2001 From: Keelah Date: Fri, 11 Oct 2024 18:01:16 +0200 Subject: [PATCH 14/27] Sonar Scanner fixes --- .github/workflows/codeql-analysis.yml | 67 ++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 28fe31a4..38a03257 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -49,20 +49,65 @@ jobs: AnalysisSonar: name: Analyze with SonarCloud - runs-on: ubuntu-latest + runs-on: windows-latest permissions: pull-requests: write # allows SonarCloud to decorate PRs with analysis results - steps: - - name: Analyze with SonarCloud + # steps: # DOES NOT SCAN FOR SOME REASON ? + # - name: Analyze with SonarCloud + + # # You can pin the exact commit or the version. + # uses: SonarSource/sonarcloud-github-action@v3 + # env: + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + # with: + # # Additional arguments for the SonarScanner CLI + # args: + # -Dsonar.projectKey=Foxlider_FASTER + # -Dsonar.organization=foxlicorp + # projectBaseDir: . + - # You can pin the exact commit or the version. - uses: SonarSource/sonarcloud-github-action@v3 + steps: + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'zulu' # Alternative distribution options are available. + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + + - name: Cache SonarCloud packages + uses: actions/cache@v4 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache SonarCloud scanner + id: cache-sonar-scanner + uses: actions/cache@v4 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + + - name: Install SonarCloud scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: pwsh + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + + - name: Build and analyze env: + GITHUB_TOKEN: ${{ secrets.PR_DECORATION }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - with: - # Additional arguments for the SonarScanner CLI - args: - -Dsonar.projectKey=Foxlider_FASTER - -Dsonar.organization=foxlicorp - projectBaseDir: . \ No newline at end of file + shell: pwsh + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"Foxlider_FASTER" /o:"foxlicorp" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" + dotnet build + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" + \ No newline at end of file From 1205130643200fb42de376029e0f94c6b418766e Mon Sep 17 00:00:00 2001 From: Keelah Date: Fri, 11 Oct 2024 18:15:01 +0200 Subject: [PATCH 15/27] Actually this might just work --- .github/workflows/codeql-analysis.yml | 69 ++++++--------------------- 1 file changed, 14 insertions(+), 55 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 38a03257..9177e82a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -49,65 +49,24 @@ jobs: AnalysisSonar: name: Analyze with SonarCloud - runs-on: windows-latest + runs-on: ubuntu-latest permissions: pull-requests: write # allows SonarCloud to decorate PRs with analysis results - # steps: # DOES NOT SCAN FOR SOME REASON ? - # - name: Analyze with SonarCloud - - # # You can pin the exact commit or the version. - # uses: SonarSource/sonarcloud-github-action@v3 - # env: - # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - # with: - # # Additional arguments for the SonarScanner CLI - # args: - # -Dsonar.projectKey=Foxlider_FASTER - # -Dsonar.organization=foxlicorp - # projectBaseDir: . - - - steps: - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: 17 - distribution: 'zulu' # Alternative distribution options are available. - + steps: # DOES NOT SCAN FOR SOME REASON ? - uses: actions/checkout@v4 with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - - name: Cache SonarCloud packages - uses: actions/cache@v4 - with: - path: ~\sonar\cache - key: ${{ runner.os }}-sonar - restore-keys: ${{ runner.os }}-sonar - - - name: Cache SonarCloud scanner - id: cache-sonar-scanner - uses: actions/cache@v4 - with: - path: .\.sonar\scanner - key: ${{ runner.os }}-sonar-scanner - restore-keys: ${{ runner.os }}-sonar-scanner - - - name: Install SonarCloud scanner - if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' - shell: pwsh - run: | - New-Item -Path .\.sonar\scanner -ItemType Directory - dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner - - - name: Build and analyze + # Disabling shallow clone is recommended for improving relevancy of reporting + fetch-depth: 0 + - name: Analyze with SonarCloud + + # You can pin the exact commit or the version. + uses: SonarSource/sonarcloud-github-action@v3 env: - GITHUB_TOKEN: ${{ secrets.PR_DECORATION }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - shell: pwsh - run: | - .\.sonar\scanner\dotnet-sonarscanner begin /k:"Foxlider_FASTER" /o:"foxlicorp" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" - dotnet build - .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" - \ No newline at end of file + with: + # Additional arguments for the SonarScanner CLI + args: + -Dsonar.projectKey=Foxlider_FASTER + -Dsonar.organization=foxlicorp + projectBaseDir: . From 0e4c97aeb830caeb0e99b47bb1c4c7e17a759edb Mon Sep 17 00:00:00 2001 From: Keelah Date: Fri, 11 Oct 2024 18:21:57 +0200 Subject: [PATCH 16/27] Nope... *sigh* --- .github/workflows/codeql-analysis.yml | 69 +++++++++++++++++++++------ 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9177e82a..38a03257 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -49,24 +49,65 @@ jobs: AnalysisSonar: name: Analyze with SonarCloud - runs-on: ubuntu-latest + runs-on: windows-latest permissions: pull-requests: write # allows SonarCloud to decorate PRs with analysis results - steps: # DOES NOT SCAN FOR SOME REASON ? + # steps: # DOES NOT SCAN FOR SOME REASON ? + # - name: Analyze with SonarCloud + + # # You can pin the exact commit or the version. + # uses: SonarSource/sonarcloud-github-action@v3 + # env: + # SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + # with: + # # Additional arguments for the SonarScanner CLI + # args: + # -Dsonar.projectKey=Foxlider_FASTER + # -Dsonar.organization=foxlicorp + # projectBaseDir: . + + + steps: + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: 'zulu' # Alternative distribution options are available. + - uses: actions/checkout@v4 with: - # Disabling shallow clone is recommended for improving relevancy of reporting - fetch-depth: 0 - - name: Analyze with SonarCloud - - # You can pin the exact commit or the version. - uses: SonarSource/sonarcloud-github-action@v3 + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + + - name: Cache SonarCloud packages + uses: actions/cache@v4 + with: + path: ~\sonar\cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + + - name: Cache SonarCloud scanner + id: cache-sonar-scanner + uses: actions/cache@v4 + with: + path: .\.sonar\scanner + key: ${{ runner.os }}-sonar-scanner + restore-keys: ${{ runner.os }}-sonar-scanner + + - name: Install SonarCloud scanner + if: steps.cache-sonar-scanner.outputs.cache-hit != 'true' + shell: pwsh + run: | + New-Item -Path .\.sonar\scanner -ItemType Directory + dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner + + - name: Build and analyze env: + GITHUB_TOKEN: ${{ secrets.PR_DECORATION }} # Needed to get PR information, if any SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - with: - # Additional arguments for the SonarScanner CLI - args: - -Dsonar.projectKey=Foxlider_FASTER - -Dsonar.organization=foxlicorp - projectBaseDir: . + shell: pwsh + run: | + .\.sonar\scanner\dotnet-sonarscanner begin /k:"Foxlider_FASTER" /o:"foxlicorp" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" + dotnet build + .\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}" + \ No newline at end of file From fd5eff719e64f9e549aedd380526ba68b5a8702b Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 12 Oct 2024 17:53:27 +0200 Subject: [PATCH 17/27] Edit pipeline for Nightly Releases (#208) * Edit pipeline for Nightly Releases * Create changelog * Fuck it, we script it * I swear if that's the reason why it fails... * I want to cry * Hope is slipping away * I am loosing my mind * I GOT IT ! * Quick polishing --- .github/workflows/release.yml | 102 ++++++++++++++++++++++++++++------ 1 file changed, 85 insertions(+), 17 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dcab3145..7c4ccbe0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ on: workflow_dispatch: # ReleaseGen can be triggered manually env: - IS_TAG: ${{ github.ref_type == 'tag' }} + IS_RELEASE: ${{ github.ref_type == 'tag' }} ZIP_NAME: ${{ github.ref_type == 'tag' && 'Release_' || 'Release_Nightly_' }} ZIP_PATH: ${{ github.ref_type == 'tag' && 'FASTER_' || 'FASTER_Nightly_' }} @@ -72,51 +72,103 @@ jobs: env: Runtime: ${{ matrix.runtime }} - # Zip the folder + # Zip the folder - name: Zip the application folder run: Compress-Archive -Path .\$env:ZIP_NAME$env:Runtime\* -DestinationPath .\$env:ZIP_NAME$env:Runtime.zip shell: pwsh env: Runtime: ${{ matrix.runtime }} - # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact - # - name: Upload build artifacts - # uses: actions/upload-artifact@v4 - # with: - # name: Release_Nightly_${{ env.Runtime }} - # path: .\FASTER_Nightly_${{ env.Runtime }} - # env: - # Runtime: ${{ matrix.runtime }} - + # Get version number - name: get-net-sdk-project-versions-action uses: kzrnm/get-net-sdk-project-versions-action@v2.0.0 id: get-version with: proj-path: ./FASTER/FASTER.csproj + # Get Changes between Tags + - name: Generate Changelog + id: get-changes + run: | + Write-Output "::group::Collecting Changes between Tags..." + + # Set options from inputs + $tagPattern = "^v?\d\.\d+([a-zA-Z]|\.\d+([a-zA-Z])?)?" + $linePrefix = "- " + + # Fetch all tags from origin + git fetch origin --tags --force + + # Get tags that match the pattern and sort them using version sorting in reverse + $tags = git tag --sort=committerdate -l | Select-String -Pattern $tagPattern | Sort-Object -Descending || "" + + # Count the found tags + $countTags = ($tags -split "`n").Count + + # Exit with error if no tags are found + if ($tags -eq "" -or $countTags -le 0) { + Write-Output "::error title=no tags found::changes-between-tags action could not find any tags to work with" + exit 1 + } + + # Take the first tag as latestTag + $latestTag = ($tags -split "`n")[0] + + $range = "$latestTag" + "..@" + + # Get changes for range + $changes = git log --pretty=reference --no-decorate $range + + + # If set, add a prefix to every commit message + if ($linePrefix) { + $changes = $changes -replace "^(.*)$", "$linePrefix`$1" + } + + # Set outputs + $EOF = (New-Guid).Guid + "changes<<$EOF" >> $env:GITHUB_OUTPUT + $changes >> $env:GITHUB_OUTPUT + "$EOF" >> $env:GITHUB_OUTPUT + "tag=$latestTag" >> $env:GITHUB_OUTPUT + + # Log the results + Write-Output "tag: $latestTag" + Write-Output "changes:" + Write-Output $changes + + # End log grouping + Write-Output "::endgroup::" + shell: pwsh + + # Set Version Number to environment - name: Set Version id: set_version run: | - if ($env:IS_TAG -eq "true") { + if ($env:IS_RELEASE -eq "true") { echo "VERSION=$env:GITHUB_REF" >> $env:GITHUB_ENV } else { echo "VERSION=${{ steps.get-version.outputs.version }}" >> $env:GITHUB_ENV } shell: pwsh + #Create Release - name: Create Release + if: env.IS_RELEASE == 'true' id: create_release uses: actions/create-release@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: v${{ env.VERSION }} - release_name: ${{ env.IS_TAG == 'true' && 'Release' || 'PreRelease' }} ${{ env.VERSION }} + tag_name: 'v${{ env.VERSION }}' + release_name: 'Release v${{ env.VERSION }}' + body: ${{ steps.get-changes.outputs.changes }} draft: false - prerelease: ${{ env.IS_TAG == 'false' }} + prerelease: ${{ env.IS_RELEASE == 'false' }} - #Upload Artifacts + # Upload Artifacts - name: Upload Release Asset + if: env.IS_RELEASE == 'true' id: upload-release-asset uses: actions/upload-release-asset@v1 env: @@ -127,4 +179,20 @@ jobs: asset_path: .\${{ env.ZIP_NAME}}${{ env.Runtime }}.zip asset_name: ${{ env.ZIP_NAME}}${{ env.Runtime }}.zip asset_content_type: application/zip - \ No newline at end of file + + # Create Nightly Release + - name: Create Nightly Release + uses: andelf/nightly-release@main + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + Runtime: ${{ matrix.runtime }} + with: + tag_name: nightly + name: 'Nightly Release v${{ env.VERSION }}' + body: | + Changelog since release ${{ steps.get-changes.outputs.tag }} : + --- + ${{ steps.get-changes.outputs.changes }} + --- + prerelease: true + files: .\${{ env.ZIP_NAME}}${{ env.Runtime }}.zip \ No newline at end of file From cf1c35369251c217eeb4679b67e4f925f026ba29 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sat, 12 Oct 2024 19:20:28 +0200 Subject: [PATCH 18/27] Added Cancellation to "Login Loop" (#207) * Added Cancellation to "Login Loop" * Sonar angry --- FASTER/ViewModel/SteamUpdaterViewModel.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/FASTER/ViewModel/SteamUpdaterViewModel.cs b/FASTER/ViewModel/SteamUpdaterViewModel.cs index d6a231bb..6bd7532f 100644 --- a/FASTER/ViewModel/SteamUpdaterViewModel.cs +++ b/FASTER/ViewModel/SteamUpdaterViewModel.cs @@ -26,7 +26,7 @@ namespace FASTER.ViewModel { - public sealed class SteamUpdaterViewModel : INotifyPropertyChanged + public sealed class SteamUpdaterViewModel : INotifyPropertyChanged, IDisposable { public SteamUpdaterViewModel() { @@ -510,6 +510,8 @@ public async Task RunModsUpdater(ObservableCollection mods) internal async Task SteamLogin() { + if (tokenSource.IsCancellationRequested) + tokenSource = new CancellationTokenSource(); IsLoggingIn = true; var path = Path.Combine(Path.GetDirectoryName(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath) ?? string.Empty, "sentries"); @@ -530,7 +532,7 @@ internal async Task SteamLogin() Parameters.Output += $"\nConnecting to Steam as {(_steamCredentials.IsAnonymous ? "anonymous" : _steamCredentials.Username)}"; SteamClient.MaximumLogonAttempts = 5; try - { await SteamClient.ConnectAsync(); } + { await SteamClient.ConnectAsync(tokenSource.Token); } catch (SteamClientAlreadyRunningException) { Parameters.Output += $"\nClient already logged in."; @@ -746,6 +748,11 @@ private void RaisePropertyChanged(string property) if (PropertyChanged == null) return; PropertyChanged(this, new PropertyChangedEventArgs(property)); } + + public void Dispose() + { + tokenSource.Dispose(); + } } public static class UpdateState From cb4f1ce22d45bfd3e481ce15614fc7e1708f493c Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 00:16:59 +0200 Subject: [PATCH 19/27] Added BytexDigital.Steam as submodule --- .gitmodules | 3 +++ BytexDigital.Steam | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 BytexDigital.Steam diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..4cf677ad --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "BytexDigital.Steam"] + path = BytexDigital.Steam + url = https://github.com/BytexDigital/BytexDigital.Steam diff --git a/BytexDigital.Steam b/BytexDigital.Steam new file mode 160000 index 00000000..aa44bded --- /dev/null +++ b/BytexDigital.Steam @@ -0,0 +1 @@ +Subproject commit aa44bdedc3d146ba42c584c9963e775458696776 From 9d2dc6587953bb93ef79c6bc9e9efc11ac1a0c63 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 00:42:04 +0200 Subject: [PATCH 20/27] FIXED LOGIN ISSUES FINALLY --- FASTER.sln | 6 ++++++ FASTER/FASTER.csproj | 4 +++- FASTER/ViewModel/SteamUpdaterViewModel.cs | 22 +++++++++++++--------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/FASTER.sln b/FASTER.sln index 3b729fd9..2ca216bd 100644 --- a/FASTER.sln +++ b/FASTER.sln @@ -22,6 +22,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FASTERTests", "FASTERTests\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FASTER Maintenance", "FASTER Maintenance\FASTER Maintenance.csproj", "{465FB100-A08C-4E4F-A321-EC85C5C177B3}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BytexDigital.Steam", "BytexDigital.Steam\BytexDigital.Steam\BytexDigital.Steam.csproj", "{6E75A863-F718-4374-94B7-97B480F9E274}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -38,6 +40,10 @@ Global {65FDF864-BF9B-414A-A6E6-3473BCFB62BE}.Release|Any CPU.Build.0 = Release|Any CPU {465FB100-A08C-4E4F-A321-EC85C5C177B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {465FB100-A08C-4E4F-A321-EC85C5C177B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E75A863-F718-4374-94B7-97B480F9E274}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E75A863-F718-4374-94B7-97B480F9E274}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E75A863-F718-4374-94B7-97B480F9E274}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E75A863-F718-4374-94B7-97B480F9E274}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 3799b691..46994848 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -61,7 +61,6 @@ - @@ -73,4 +72,7 @@ + + + diff --git a/FASTER/ViewModel/SteamUpdaterViewModel.cs b/FASTER/ViewModel/SteamUpdaterViewModel.cs index 6bd7532f..0e18c940 100644 --- a/FASTER/ViewModel/SteamUpdaterViewModel.cs +++ b/FASTER/ViewModel/SteamUpdaterViewModel.cs @@ -12,16 +12,11 @@ using Microsoft.AppCenter.Analytics; -using System; -using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Configuration; using System.Diagnostics; using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; using System.Windows.Threading; namespace FASTER.ViewModel @@ -446,7 +441,7 @@ public async Task RunModsUpdater(ObservableCollection mods) { ManifestId manifestId = default; - if(mod.LocalLastUpdated > mod.SteamLastUpdated) + if(mod.LocalLastUpdated > mod.SteamLastUpdated && mod.Size > 0) { mod.Status = ArmaModStatus.UpToDate; Parameters.Output += $"\n Mod{mod.WorkshopId} already up to date. Ignoring..."; @@ -611,8 +606,12 @@ private async Task Download(IDownloadHandler downloadHandler, string targetDir) if (tokenSource.IsCancellationRequested) tokenSource = new CancellationTokenSource(); - Task downloadTask = downloadHandler.DownloadToFolderAsync(targetDir, tokenSource.Token); - + Task downloadTask = Task.Run(async () => + { + await downloadHandler.SetupAsync(targetDir, file => true, tokenSource.Token); + await downloadHandler.VerifyAsync(tokenSource.Token); + await downloadHandler.DownloadAsync(tokenSource.Token); + }); Parameters.Output += "\nOK."; @@ -694,7 +693,12 @@ private async Task DownloadForMultiple(IDownloadHandler downloadHandler, string }; downloadHandler.DownloadComplete += (_, _) => Parameters.Output += "\n Download completed"; - Task downloadTask = downloadHandler.DownloadToFolderAsync(targetDir, tokenSource.Token); + Task downloadTask = Task.Run(async () => + { + await downloadHandler.SetupAsync(targetDir, file => true, tokenSource.Token); + await downloadHandler.VerifyAsync(tokenSource.Token); + await downloadHandler.DownloadAsync(tokenSource.Token); + }); Parameters.Output += "\n OK."; From ead88114077ac0a170493595f078d891acd72c3e Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 00:59:14 +0200 Subject: [PATCH 21/27] Fixed a few warnings, hid others. Will fix later Fixes #205 --- FASTER/FASTER.csproj | 2 ++ FASTER/Models/ServerProfile.cs | 2 +- FASTERTests/Models/EncryptionTests.cs | 6 +++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 46994848..ea69b196 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -28,10 +28,12 @@ portable + 1701;1702;NU1701;CS8002;CS8618;CS8622 none + 1701;1702;NU1701;CS8002;CS8618;CS8622 diff --git a/FASTER/Models/ServerProfile.cs b/FASTER/Models/ServerProfile.cs index 9500c2b2..cb61afae 100644 --- a/FASTER/Models/ServerProfile.cs +++ b/FASTER/Models/ServerProfile.cs @@ -112,7 +112,7 @@ public string Executable } } - public string ArmaPath => Path.GetDirectoryName(_executable); + public string ArmaPath => Path.GetDirectoryName(_executable) ?? string.Empty; public int Port { diff --git a/FASTERTests/Models/EncryptionTests.cs b/FASTERTests/Models/EncryptionTests.cs index 49923fa2..13e1bc79 100644 --- a/FASTERTests/Models/EncryptionTests.cs +++ b/FASTERTests/Models/EncryptionTests.cs @@ -1,17 +1,21 @@ using NUnit.Framework; +using System.Runtime.Versioning; + namespace FASTER.Models.Tests { [TestFixture()] public class EncryptionTests { + [SupportedOSPlatform("windows7.0")] [Test()] public void EncryptDataTest() { Assert.DoesNotThrow(() => Encryption.Instance.EncryptData("SomeText")); - Assert.That(Encryption.Instance.EncryptData("SomeText"), Is.EqualTo("SomeText")); + Assert.That(Encryption.Instance.EncryptData("SomeText"), Is.Not.EqualTo("SomeText")); } + [SupportedOSPlatform("windows7.0")] [Test()] public void DecryptDataTest() { From daf8abc5698e7e7de0d5c0194d397cd078f8e1c0 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 01:21:12 +0200 Subject: [PATCH 22/27] Added tests to CodeQL --- .github/workflows/codeql-analysis.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 38a03257..6982ab8c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -40,9 +40,14 @@ jobs: uses: actions/setup-dotnet@v4.0.0 with: dotnet-version: ${{vars.DOTNET_VERSION}} - + - run: dotnet restore - - run: dotnet build ./FASTER.sln --configuration Debug + + - name: Build Solution + run: dotnet build ./FASTER.sln --configuration Debug + + - name: Execute unit tests + run: dotnet test - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 From 1a1f889e0fc93d41bb9f63729341476ce7b664e6 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 01:32:18 +0200 Subject: [PATCH 23/27] Un submoduled BytexDigital.Steam --- .gitmodules | 3 --- BytexDigital.Steam | 1 - FASTER.sln | 6 ------ FASTER/FASTER.csproj | 4 +--- FASTER/ViewModel/SteamUpdaterViewModel.cs | 11 +++++------ 5 files changed, 6 insertions(+), 19 deletions(-) delete mode 100644 .gitmodules delete mode 160000 BytexDigital.Steam diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4cf677ad..00000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "BytexDigital.Steam"] - path = BytexDigital.Steam - url = https://github.com/BytexDigital/BytexDigital.Steam diff --git a/BytexDigital.Steam b/BytexDigital.Steam deleted file mode 160000 index aa44bded..00000000 --- a/BytexDigital.Steam +++ /dev/null @@ -1 +0,0 @@ -Subproject commit aa44bdedc3d146ba42c584c9963e775458696776 diff --git a/FASTER.sln b/FASTER.sln index 2ca216bd..3b729fd9 100644 --- a/FASTER.sln +++ b/FASTER.sln @@ -22,8 +22,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FASTERTests", "FASTERTests\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FASTER Maintenance", "FASTER Maintenance\FASTER Maintenance.csproj", "{465FB100-A08C-4E4F-A321-EC85C5C177B3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BytexDigital.Steam", "BytexDigital.Steam\BytexDigital.Steam\BytexDigital.Steam.csproj", "{6E75A863-F718-4374-94B7-97B480F9E274}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,10 +38,6 @@ Global {65FDF864-BF9B-414A-A6E6-3473BCFB62BE}.Release|Any CPU.Build.0 = Release|Any CPU {465FB100-A08C-4E4F-A321-EC85C5C177B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {465FB100-A08C-4E4F-A321-EC85C5C177B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E75A863-F718-4374-94B7-97B480F9E274}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E75A863-F718-4374-94B7-97B480F9E274}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E75A863-F718-4374-94B7-97B480F9E274}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E75A863-F718-4374-94B7-97B480F9E274}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index ea69b196..02ca6a50 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -63,6 +63,7 @@ + @@ -74,7 +75,4 @@ - - - diff --git a/FASTER/ViewModel/SteamUpdaterViewModel.cs b/FASTER/ViewModel/SteamUpdaterViewModel.cs index 0e18c940..1200fdab 100644 --- a/FASTER/ViewModel/SteamUpdaterViewModel.cs +++ b/FASTER/ViewModel/SteamUpdaterViewModel.cs @@ -461,6 +461,11 @@ public async Task RunModsUpdater(ObservableCollection mods) var downloadHandler = SteamContentClient.GetPublishedFileDataAsync(mod.WorkshopId, manifestId, tokenSource.Token); DownloadForMultiple(downloadHandler.Result, mod.Path).Wait(); + + mod.Status = ArmaModStatus.UpToDate; + var nx = DateTime.UnixEpoch; + var ts = DateTime.UtcNow - nx; + mod.LocalLastUpdated = (ulong)ts.TotalSeconds; } catch (TaskCanceledException) { @@ -473,18 +478,12 @@ public async Task RunModsUpdater(ObservableCollection mods) mod.Status = ArmaModStatus.NotComplete; Parameters.Output += $"\nError: {ex.Message}{(ex.InnerException != null ? $" Inner Exception: {ex.InnerException.Message}" : "")}"; } - sw.Stop(); - mod.Status = ArmaModStatus.UpToDate; - var nx = DateTime.UnixEpoch; - var ts = DateTime.UtcNow - nx; - mod.LocalLastUpdated = (ulong) ts.TotalSeconds; mod.CheckModSize(); Parameters.Output += $"\n Download {mod.WorkshopId} completed, it took {sw.Elapsed.Minutes + sw.Elapsed.Hours*60}m {sw.Elapsed.Seconds}s {sw.Elapsed.Milliseconds}ms"; - }, TaskCreationOptions.LongRunning).ContinueWith((_) => { finished += 1; From 41f5c072a20a5b4b1bdccbd72943dc8dd4dc4623 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 01:43:42 +0200 Subject: [PATCH 24/27] Version Bump --- FASTER/FASTER.csproj | 2 +- FASTER_Version.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index 02ca6a50..a1995f48 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -10,7 +10,7 @@ True FASTERKey.snk Keelah Fox, Jupster, Canno.n - 1.9.5.3 + 1.9.6.0 FoxliCorp. Fox's Arma Server Tool Extended Rewrite Copyright © 2019 diff --git a/FASTER_Version.xml b/FASTER_Version.xml index 032bbed7..b84a37be 100644 --- a/FASTER_Version.xml +++ b/FASTER_Version.xml @@ -1,6 +1,6 @@  - 1.9.5.3 + 1.9.6.0 https://github.com/Foxlider/FASTER/releases/latest/download/Release_x64.zip https://github.com/Foxlider/FASTER/releases true From 265047c78e2f9a58a1e0d7b33064bd627f052ef6 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 01:57:18 +0200 Subject: [PATCH 25/27] Hotfix Release pipeline --- .github/workflows/release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7c4ccbe0..52768cbc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -160,8 +160,8 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token with: - tag_name: 'v${{ env.VERSION }}' - release_name: 'Release v${{ env.VERSION }}' + tag_name: '${{ env.VERSION }}' + release_name: 'Release ${{ env.VERSION }}' body: ${{ steps.get-changes.outputs.changes }} draft: false prerelease: ${{ env.IS_RELEASE == 'false' }} From 2f80485fd9e4bc49ef33ea847eabae99ebb78f7e Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 02:03:40 +0200 Subject: [PATCH 26/27] Hotfix Release pipeline --- .github/release.yml | 11 ----------- .github/workflows/release.yml | 7 ++++++- 2 files changed, 6 insertions(+), 12 deletions(-) delete mode 100644 .github/release.yml diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index 7aa8ef72..00000000 --- a/.github/release.yml +++ /dev/null @@ -1,11 +0,0 @@ -changelog: - categories: - - title: 🏕 Features - labels: - - '*' - exclude: - labels: - - dependencies - - title: 👒 Dependencies - labels: - - dependencies diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 52768cbc..7c835e37 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -162,7 +162,11 @@ jobs: with: tag_name: '${{ env.VERSION }}' release_name: 'Release ${{ env.VERSION }}' - body: ${{ steps.get-changes.outputs.changes }} + body: | + Changelog since release ${{ steps.get-changes.outputs.tag }} : + --- + ${{ steps.get-changes.outputs.changes }} + --- draft: false prerelease: ${{ env.IS_RELEASE == 'false' }} @@ -182,6 +186,7 @@ jobs: # Create Nightly Release - name: Create Nightly Release + if: env.IS_RELEASE == 'false' uses: andelf/nightly-release@main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 4017482895a0a51f54a15a59cbe5b56e9e9a8d32 Mon Sep 17 00:00:00 2001 From: Keelah Date: Sun, 13 Oct 2024 02:22:26 +0200 Subject: [PATCH 27/27] hotfix pipeline and About page Fixes #212 --- .github/workflows/release.yml | 13 +++++++++++-- FASTER/FASTER.csproj | 2 +- FASTER/Views/About.xaml | 2 +- FASTER_Version.xml | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7c835e37..56808bec 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -114,9 +114,18 @@ jobs: # Take the first tag as latestTag $latestTag = ($tags -split "`n")[0] - $range = "$latestTag" + "..@" - # Get changes for range + # Check if the latest tag is on the last commit + $latestCommit = git rev-parse HEAD + $latestTagCommit = git rev-list -n 1 $latestTag + + if ($latestCommit -eq $latestTagCommit -and $countTags -gt 1) { + # Use the previous tag if the latest tag is on the last commit + $latestTag = ($tags -split "`n")[1] + + } + + $range = "$latestTag" + "..@" $changes = git log --pretty=reference --no-decorate $range diff --git a/FASTER/FASTER.csproj b/FASTER/FASTER.csproj index a1995f48..70a663f5 100644 --- a/FASTER/FASTER.csproj +++ b/FASTER/FASTER.csproj @@ -10,7 +10,7 @@ True FASTERKey.snk Keelah Fox, Jupster, Canno.n - 1.9.6.0 + 1.9.6.1 FoxliCorp. Fox's Arma Server Tool Extended Rewrite Copyright © 2019 diff --git a/FASTER/Views/About.xaml b/FASTER/Views/About.xaml index 382fee08..9c0d662f 100644 --- a/FASTER/Views/About.xaml +++ b/FASTER/Views/About.xaml @@ -79,7 +79,7 @@ diff --git a/FASTER_Version.xml b/FASTER_Version.xml index b84a37be..b1f15c50 100644 --- a/FASTER_Version.xml +++ b/FASTER_Version.xml @@ -1,6 +1,6 @@  - 1.9.6.0 + 1.9.6.1 https://github.com/Foxlider/FASTER/releases/latest/download/Release_x64.zip https://github.com/Foxlider/FASTER/releases true