Skip to content

feat: resolve 9 bugs, integrate 6 PRs, add 5 features + debug logging (v2.0.0.0)#260

Closed
diaverso wants to merge 16 commits into
Foxlider:masterfrom
diaverso:master
Closed

feat: resolve 9 bugs, integrate 6 PRs, add 5 features + debug logging (v2.0.0.0)#260
diaverso wants to merge 16 commits into
Foxlider:masterfrom
diaverso:master

Conversation

@diaverso
Copy link
Copy Markdown

@diaverso diaverso commented May 5, 2026

Summary

This PR resolves all open GitHub issues, integrates all open pull requests, and adds several requested features. Version bumped to 2.0.0.0.


Bug Fixes

Issue Description File(s)
#255 forcedDifficulty was not quoted in server.cfg output ServerCfg.cs
#184 / #221 RaisePropertyChanged called with literal strings instead of nameof() across ServerCfg, BasicCfg and related models ServerCfg.cs, BasicCfg.cs
#251 / #115 Cloning a profile reset MaxMsgSend to 256 — PerfPreset getter always returns "Custom" so JSON deserialization triggered the setter; fixed with [JsonIgnore] BasicCfg.cs
#254 LinkMod / DeleteLink called Directory.Delete(path, true) on symlinks, destroying the source folder instead of just the link DeploymentViewModel.cs
#131 DeployAll did not check whether the install path exists before trying to create symlinks DeploymentViewModel.cs
#242 mod.Status was incorrectly reset to NotComplete in the cancellation path before any download started SteamUpdaterViewModel.cs
#259 Task.Factory.StartNew(async () => ...) returned Task<Task>; missing .Unwrap() caused ContinueWith to fire immediately, not after async work completed SteamUpdaterViewModel.cs
#238 NullReferenceException when SteamClient was set to null before the error message string was evaluated SteamUpdaterViewModel.cs
#167 After 3 failed retries in UpdateInfos(), no user-visible error was shown; added one-time warning for bad Steam API Key ArmaMod.cs, SteamWebApi.cs

Pull Requests Integrated

PR Description File(s)
#246 Output class AdvancedOptions { } block in server.cfg ServerCfg.cs
#230 Configurable language setting in BasicCfg with dropdown in Profile UI BasicCfg.cs, ProfileViewModel.cs, Profile.xaml
#231 New command-line parameters: HugePages, BePath, ExThreads, LoadMissionToMemory, LimitFPS, EnableSteamLogs ServerProfile.cs, ProfileViewModel.cs, Profile.xaml
#198 Purge and Reinstall: delete mod folder and mark for re-download (single, selected, all) ModsViewModel.cs, Mods.xaml
#258 CheckForUpdates made async with 300ms delay between mods to avoid rate limiting ModsViewModel.cs, Mods.xaml
#239 GitHub Actions workflows missing DOTNET_VERSION env var .github/workflows/

New Features

Issue Description File(s)
#217 AntiFlood settings block in server.cfg (enabled, cycle time, cycle limit, hard limit, kick) ServerCfg.cs, Profile.xaml
#229 missionHTTPDownloadBaseURL setting in server.cfg ServerCfg.cs, Profile.xaml
#241 -keysFolder command-line parameter with folder browser button ServerProfile.cs, ProfileViewModel.cs, Profile.xaml
#216 Profile reordering via ▲/▼ buttons in the side panel MainWindow.xaml.cs, ServerProfile.cs
#209 Purge Unused Mods: cross-references all profiles and deletes mods not used by any profile ModsViewModel.cs, Mods.xaml

Additional Improvements

  • Purge and Reinstall All: reworked to delete all folders inside the Mod Staging Directory and immediately launch Update All
  • Debug Logging: new toggle in Settings that writes timestamped entries to %AppData%\FASTER\faster.log; includes an "Open Log File" button; covers CheckForUpdates, PurgeAndReinstall, DeployAll, and LinkMod
  • GitHub Actions: added standalone build.yml workflow; fixed release.yml trigger and permissions; replaced unmaintained andelf/nightly-release with softprops/action-gh-release@v2
  • Version: bumped to 2.0.0.0

diaverso and others added 16 commits May 4, 2026 21:51
Bugs fixed:
- Foxlider#255 forcedDifficulty missing quotes in server.cfg
- Foxlider#254 Deploy All destroys symlink targets (ReparsePoint check)
- Foxlider#251/Foxlider#115 Performance tab not cloned (JsonIgnore on PerfPreset)
- Foxlider#242 Mod status stuck as NotComplete after cancel
- Foxlider#184/Foxlider#221 logObjectNotFound field naming + nameof refactor (81 calls)
- Foxlider#167 Bad Steam API Key silently fails (user-visible error)
- Foxlider#259 Async deadlock in RunModsUpdater (.Wait -> await + Unwrap)
- Foxlider#238 NullRef in SteamLogin after nulling SteamClient
- Foxlider#131 Deploy mods: pre-flight check + UnauthorizedAccessException msg

PRs integrated:
- Foxlider#239 Pipelines: add missing DOTNET_VERSION env var
- Foxlider#252 MaxMsgSend clone fix (covered by Foxlider#251 fix)
- Foxlider#258 Steam API throttling 300ms + async Task (fixes SonarQube C grade)
- Foxlider#230 Configurable server language (11 options)
- Foxlider#231 New launch args: hugePages, bePath, exThreads, loadMissionToMemory, limitFPS, enableSteamLogs
- Foxlider#246 class AdvancedOptions {} block in server.cfg output
- Foxlider#198 Purge & Reinstall All / per-mod buttons

Features added:
- Foxlider#241 -keysFolder launch parameter
- Foxlider#217 AntiFlood class configurable in server.cfg
- Foxlider#229 missionHTTPDownloadBaseURL in server.cfg
- Foxlider#209 Purge Unused Mods button
- Foxlider#216 Profile reordering with Up/Down buttons in sidebar

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds a simple build.yml workflow that runs on every push to master
and pull requests. Does not depend on CodeQL environment or other
workflow configurations, making it reliable on forks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
RaisePropertyChanged had a lowercase 'i' (DrawinginMap) introduced
during the nameof() refactor. Corrected to match the actual property name.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add `permissions: contents: write` to the release job so GITHUB_TOKEN
  can create releases and upload assets
- Truncate changelog to 20k chars to stay under the 32766-char env var limit
  that caused `INPUT_BODY` to overflow in andelf/nightly-release

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The andelf/nightly-release action is unmaintained and incompatible with
current GitHub Actions token permissions. Replaced with the widely-used
softprops/action-gh-release@v2 which respects contents:write permission.
Added a pre-step to delete the existing nightly tag before recreating it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Change workflow_run trigger from [Code Analysis] to [Build] so the
  nightly release fires after the new build.yml succeeds (CodeQL was
  unreliable in the fork due to missing 'Dev' environment)
- Add github.event_name == 'workflow_dispatch' to the build job condition
  so manual triggers actually execute the job instead of being silently skipped

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
softprops/action-gh-release fails with 'already_exists' when a nightly
release already exists. Added a step that uses gh CLI to delete both the
GitHub release object AND the git tag before creating a fresh nightly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Also update FASTER_Version.xml URLs to point to the diaverso fork.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New Logger.cs static class: writes timestamped entries to
  %AppData%\FASTER\faster.log when enabled
- Added enableDebugLog boolean setting (default: false)
- Settings UI: new 'Enable Debug Logging' checkbox + 'Open Log File' button
- Log calls added to: CheckForUpdates, PurgeAndReinstallMod,
  PurgeAndReinstallAll, DeployAll, LinkMod

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Covers SteamLogin steps, RunModsUpdater flow, DownloadForMultiple
internals (SetupAsync/VerifyAsync/DownloadAsync), per-file events
(FileVerified, FileDownloaded, VerificationCompleted, DownloadComplete),
and full stack traces on any exception.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@sonarqubecloud
Copy link
Copy Markdown

sonarqubecloud Bot commented May 6, 2026

Quality Gate Failed Quality Gate failed

Failed conditions
C Reliability Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@godgutten
Copy link
Copy Markdown

Any idea when this will be merged to the master code?

@diaverso
Copy link
Copy Markdown
Author

Any idea when this will be merged to the master code?

Well, I have no idea—it looks like it's been inactive for several months. You can download the .exe file from my fork, which includes these things.

@jupster jupster requested review from Foxlider and jupster May 11, 2026 06:42
@jupster
Copy link
Copy Markdown
Collaborator

jupster commented May 11, 2026

Will try and look over it on the weekend. I get pretty smashed during the week with work

@Foxlider
Copy link
Copy Markdown
Owner

This PR is way too big to be easily reviewed.
https://github.com/Foxlider/FASTER/blob/master/CONTRIBUTING.md#pull-requests

There are many undocumented changes and testing will require time to ensure the functionalities are still OK and the fixes working as expected

@jupster
Copy link
Copy Markdown
Collaborator

jupster commented May 11, 2026

This PR is way too big to be easily reviewed. https://github.com/Foxlider/FASTER/blob/master/CONTRIBUTING.md#pull-requests

There are many undocumented changes and testing will require time to ensure the functionalities are still OK and the fixes working as expected

@diaverso this might need to go into a nightly build or update build as Keelah said this is a huge PR

@jupster
Copy link
Copy Markdown
Collaborator

jupster commented May 11, 2026

I'd suggest take this and PR like this

PR 1 — Critical Bug Fixes
async unwrap
symlink deletion
nullrefs
deploy path checks
serialization fix

PR 2 — Community PR integrations

Just merge the existing community PRs separately.

PR 3 — Features
AntiFlood
missionHTTPDownloadBaseURL
keysFolder
profile reorder
purge unused mods

PR 4 — Logging system

Needs isolated testing.

PR 5 — CI/CD and release workflows

Completely separate concern.

As a maintainer I would NOT approve this as-is.

Not because it’s bad.

Because:

it’s too large
too hard to validate

@diaverso diaverso closed this May 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants