chore: alpha 4 release#229
Conversation
…trols - Added `NullableDecimalToIntConverter` to handle data conversion between View and ViewModel. - Defined a new "phantom" style for `NumericUpDown` to match the existing minimalist UI. - Replaced `TextBlock` value displays with `NumericUpDown` controls for Gamma, Audio volumes, Font sizes, and Camera settings. - Adjusted Grid column widths to accommodate interactive input fields.
Added manual folder picker for Retail GameInstallations without registry
…227) Fixed GameSettings not persisting whenever the profile was saved.
… resolution (#225) * fix(deps): ensure disabled game installation is auto-resolved when required by client * feat(local): add GameType selection and validation for local content * feat(game-profiles): hide GameInstallation from UI
…ate detection (#228) Upon launching a GameProfile that has a GeneralsOnline GameClient, a check for an update will be made. When an update is available it will download the new release, remove the old GameClient and MapPack, reconcile the profiles with the new release, then continue with launching the game.
Users can now subscribe to development branches to receive notifications for every new push or update
…xternal JSON (#205) This commit lays the foundation for the Provider Defition framework whereby publishers can become ContentProviders in GenHub.
… data` button under Danger Zone (#230)
… management (#235) - Added a GameType filter for Generals and Zero Hour. - Updated the selected ContentType button to highlight when active. - Centered all ContentItems. - Organized ContentItems into a brick-style layout. - Replaced the add/remove buttons with a click action on the ContentItem itself. - Set the "Delete" button to be visible only on hover.
Added a section under settings for the following data directories; workspace, profiles, manifests and CAS-pool,
…234) Removed old local content dialog properties and methods from GameProfileSettingsViewModel. Enhanced UI with drag-and-drop support for file and folder imports.
39d9455 to
b9f8255
Compare
…age and multi-instance debugging support (#239) * Added persistent storage for manual game installations and multi-instance debugging support. * Improved update reliability with HTTP retries, GitHub API caching, and enhanced error handling. * Refactored constants and implemented automated cleanup for orphaned workspace directories.
b9f8255 to
615dc70
Compare
|
@greptile |
| { | ||
| try | ||
| { | ||
| manualInstallationStorage.ClearAllAsync(default).GetAwaiter().GetResult(); |
There was a problem hiding this comment.
logic: Using GetAwaiter().GetResult() inside a lock can cause deadlocks. The _cacheLock is held synchronously while waiting for an async operation to complete.
| manualInstallationStorage.ClearAllAsync(default).GetAwaiter().GetResult(); | |
| await manualInstallationStorage.ClearAllAsync(cancellationToken).ConfigureAwait(false); |
Prompt To Fix With AI
This is a comment left during a code review.
Path: GenHub/GenHub/Features/GameInstallations/GameInstallationService.cs
Line: 227:227
Comment:
**logic:** Using `GetAwaiter().GetResult()` inside a lock can cause deadlocks. The `_cacheLock` is held synchronously while waiting for an async operation to complete.
```suggestion
await manualInstallationStorage.ClearAllAsync(cancellationToken).ConfigureAwait(false);
```
How can I resolve this? If you propose a fix, please make it concise.…port and GitHub rate limit tracking (#237) This update introduces a persistent notification feed with history tracking and a redesigned bell UI featuring dynamic unread badges. It adds support for multi-action notifications with styled buttons and integrates a GitHub rate limit tracker to provide real-time API usage warnings. The core notification architecture has been refactored into record types for better immutability, alongside service enhancements for managing read states and history. Additionally, the UI features a new custom title bar and redesigned toasts, backed by comprehensive unit tests to ensure thread safety and reliability.
…y launching (#241) * feat: Implement SteamLauncher for game directory preparation and proxy launching - Added SteamLauncher service to manage game directory preparation for Steam-tracked profiles. - Introduced ProxyConfig for configuring the proxy launcher with target executable and working directory. - Implemented methods for deploying the proxy launcher and creating necessary configuration files. - Enhanced manifest generation to support backup executable handling from the Steam Proxy Launcher. - Updated SteamManifestPatcher to improve executable validation logic. - Refactored HardLinkStrategy to prioritize file deduplication based on content type. - Improved error handling and logging throughout the game installation and manifest processes. - Updated documentation to reflect changes in detection and manifest creation workflows. * fix: resolve proxy launcher not replacing generals.exe * chore: resolve greptile comments * fix: resolve GameProfileSettingsWindow drag to resize from fullscreen
) * feat: add GitHub Pages deployment workflow and landing page assets * feat: Add Replay Manager tool with drag-and-drop functionality and file management - Implemented ReplayManagerView for managing replay files. - Added drag-and-drop support for importing replay files (.rep, .zip). - Enhanced ToolsViewModel to include Replay Manager services. - Updated UI styles for better visual consistency. - Introduced EnumToBoolConverter and EqualsToConverter for improved data binding. - Added documentation for Replay Manager features and usage. - Registered Replay Manager services in the dependency injection module. * feat(tools): enhance map/replay managers and refine tools sidebar ui * feat(tools): enhance map/replay managers and refine tools sidebar ui * feat(tools): enhance map/replay managers and refine tools sidebar ui * fix: resolve build version mismatch and the add local content DragDrop not working admin
|
Too many files changed for review. ( |
…for creating profiles (#253)
… process monitoring
7a7e39e to
72b0589
Compare
…to High (0) in Options.ini (#256)
Added a new info tab with 3 sections: - GenHub Guide - GeneralsOnline - Zerohour FAQ Moreover the sidebar got redesigned to be reusable .
| jobs: | ||
| deploy: | ||
| runs-on: ubuntu-latest | ||
| if: ${{ github.event.workflow_run.conclusion == 'success' }} |
There was a problem hiding this comment.
WARNING: Manual workflow dispatch will never run
For workflow_dispatch events, github.event.workflow_run is undefined, so this if condition evaluates to false and skips the job entirely. If you intend manual runs to work, the condition should allow workflow_dispatch (e.g., check github.event_name).
|
|
||
| - name: Build Projects | ||
| run: | | ||
| BUILD_PROPS="-p:Version=${{ steps.buildinfo.outputs.VERSION }} -p:GitShortHash=${{ steps.buildinfo.outputs.SHORT_HASH }} -p:PullRequestNumber=${{ steps.buildinfo.outputs.PR_NUMBER }} -p:BuildChannel=${{ steps.buildinfo.outputs.CHANNEL }}" |
There was a problem hiding this comment.
WARNING: BuildChannel output is never set in this job
steps.buildinfo.outputs.CHANNEL is referenced here, but the build-info step only echoes SHORT_HASH, PR_NUMBER, and VERSION. This leaves BuildChannel empty in CI builds, which can cause incorrect channel tagging or defaults. Consider exporting CHANNEL in the build-info step.
This comment was marked as resolved.
This comment was marked as resolved.
…layout (#259) - Updated the website layour
| # 2. Linux NuPkgs and Json | ||
| find artifacts/linux-release -type f \( -name "*.nupkg" -o -name "*.json" \) -exec cp {} final-assets/ \; | ||
| # 3. Windows Portable (Specific match) | ||
| cp artifacts/windows-portable/*.zip final-assets/ |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
…dy existing genhub workspaces adjacent to the current game installation (#262)
This comment was marked as resolved.
This comment was marked as resolved.
| /// <summary> | ||
| /// Gets the default UploadThing token injected at build time (Obfuscated). | ||
| /// </summary> | ||
| public static string BuildTimeUploadThingToken |
There was a problem hiding this comment.
WARNING: Build-time UploadThing token embedded in the client
Injecting the UploadThing token into a shipped binary means the secret is recoverable from artifacts and end-user installs, which allows unauthorized uploads or abuse. Consider moving uploads behind a server-side broker or issuing short-lived, scoped tokens instead of embedding a long-lived secret in the client.
… for the website (#270)
…x state persistence and race conditions Implemented mute/unmute support in the notifications feed with proper UI indicators and command bindings. Converted mute operations to async with reliable persistence via UserSettingsService and added CancellationToken support. Fixed race conditions affecting mute state and ensured state updates only occur after successful persistence. Improved notification badge sizing, positioning, and count handling. Refactored bindings to rely on ViewModel state, removed dead code, and resolved StyleCop issues. Includes UI fixes, cleanup, and reliability improvements.
…th genpatcher registry. (#273) This PR fixes the Controlbar and Hotkeys not being converted and packed correctly into `.big` files.
…gement (#261) * GeneralsOnline, CommunityOutpost and TheSuperhackers will auto-update and reconcile GameProfiles that have outdated content replacing them with the updated content.
This PR creates the alpha 4 release merge commit
Greptile Summary
This PR merges multiple feature branches for the alpha 4 release, consolidating 19 commits with significant enhancements across game installation management, content provider infrastructure, UI improvements, and update mechanisms.
Key Changes
ManualInstallationStorageservice and comprehensive diagnostic logging throughoutGameInstallationServiceProviderDefinitionLoader,ContentPipelineFactory) enabling dynamic content source configurationGeneralsOnlineProfileReconcilerservice for syncing profile metadata and automatic update detectionSetupWizardServiceand supporting UIVelopackUpdateManagerwith artifact builds support, PR/branch subscriptions, and development channel updatesAddLocalContentViewModelwith file tree browsing for importing local mods/mapsGameSettingsMapperwith improved persistence handlingVersionComparerhelper for semantic versioning across different format conventionsTesting & Documentation
build-release.ps1scriptConfidence Score: 4/5
GameInstallationService.InvalidateCache()whereGetAwaiter().GetResult()is called while holding a synchronous lock. Otherwise, the changes demonstrate solid engineering practices with proper async/await patterns, resource disposal, caching strategies, and diagnostic logging throughout.GameInstallationService.cs:227where the synchronous lock with async call could cause threading issuesImportant Files Changed
Sequence Diagram
sequenceDiagram participant User participant UI as UI/ViewModel participant InstallService as GameInstallationService participant ManualStorage as ManualInstallationStorage participant Detector as InstallationDetector participant ContentFactory as ContentPipelineFactory participant ProviderLoader as ProviderDefinitionLoader participant UpdateManager as VelopackUpdateManager Note over User,UpdateManager: Manual Installation Flow (New Feature) User->>UI: Select installation folder UI->>InstallService: RegisterManualInstallationAsync() InstallService->>ManualStorage: SaveManualInstallationAsync() ManualStorage-->>InstallService: Success InstallService->>Detector: DetectGameClients() Detector-->>InstallService: GameClients InstallService-->>UI: Installation registered Note over User,UpdateManager: Provider Configuration Loading (New Architecture) UI->>ProviderLoader: LoadProvidersAsync() ProviderLoader->>ProviderLoader: Load bundled JSON providers ProviderLoader->>ProviderLoader: Load user JSON providers (override) ProviderLoader-->>UI: Provider definitions UI->>ContentFactory: CreatePipeline(providerDef) ContentFactory->>ContentFactory: Instantiate discoverer/resolver/deliverer ContentFactory-->>UI: Content pipeline ready Note over User,UpdateManager: App Update with Artifact Support (Enhanced) User->>UI: Check for updates UI->>UpdateManager: CheckForUpdatesAsync() UpdateManager->>UpdateManager: Check GitHub releases (cached) UpdateManager-->>UI: Update available User->>UI: Check development builds UI->>UpdateManager: CheckForArtifactUpdatesAsync() UpdateManager->>UpdateManager: Query GitHub Actions artifacts UpdateManager-->>UI: Artifact available User->>UI: Install artifact UI->>UpdateManager: InstallArtifactAsync() UpdateManager->>UpdateManager: Download artifact, extract nupkg UpdateManager->>UpdateManager: Start local HTTP server UpdateManager->>UpdateManager: Apply update via Velopack UpdateManager-->>UI: Restart application