LANCommander 2.0.0 Release Notes
LANCommander 2.0.0 is up there as one of the largest updates in the project's history. This release represents over ten months of development, with more individual contributors than previous versions. The jump from 1.x to 2.x reflects substantial architectural changes, new features, and significant improvements in the server, launcher, and SDK.
Additionally, documentation has now been moved to Docusaurus and is being hosted on GitHub Pages. Documentation can now live in the same repository as the rest of the application, ensuring that documentation is versioned and up to date.
Breaking Changes
Settings
Settings have previously been implemented with custom code parsing the Settings.yml file. They are now implemented using standard .NET configuration practices.
A migration has been put in place to adapt to the new format, but as with any migration some settings may not carry over from previous installs.
Import/Export
Importing and exporting has been rebuilt from the ground up. An effort to allow the import of legacy LCX files has been made, but this may vary based on the age of the export file.
User Data Paths
In previous versions of LANCommander, user data files/directories such as the database, settings, media, and uploads were thrown into the same directory as the main executable (for both server and launcher). In 2.0.0 a new directory called "Data" will be created and used for all user data. This change should make it easier to create backups and map Docker volumes.
A migration has been written to assist with this change, but as always make sure you backup your data before upgrading. For Docker users: Before updating to 2.0.0, make sure you map /app/Data with your volumes from previous versions. The migration will do its best attempt at discovering if this directory is mapped before moving any data.
Logging
Previous versions have relied on Serilog to provide logging for both the server and launcher. An effort is being made to update this to more modern practices by integrating OpenTelemetry. As of right now, logging support for Seq and ElasticSearch is non-functional.
SDK Changes
The SDK has been refactored to utilize dependency injection instead of relying on a monolithic singleton client. I'm not aware of any other projects using the SDK, but it's worth noting at this time.
Major Changes / features
Import/Export
As mentioned, importing and exporting has been rebuilt from the ground up, and as such the manifest format for LCX files has gone through some significant changes. Ultimately, this change reflects a closer parity between export files and the database schema, which should allow for extensibility in the future.
The core concept that drove this rewrite is selective importing/exporting. Now when you go to export or import a game, server, or redistributable you may choose which data you want to import or export. This includes metadata, archives, media, and user data such as save games or play sessions. This should make it easier to share only the data you want or to selectively migrate from one system to another.
Launcher Authentication/Stability
A large effort was put into 2.0.0 to make the launcher more stable. A core issue has always been the authentication flow. While this still can be improved upon, the core changes put in should reduce the amount of soft-locking that could previously happen within the launcher.
Chat
A bare-bones chat system has been added to the platform. As of right now this probably isn't entirely useful, but there's a good base for improvements in future versions.
Packaging Scripts
Games and redistributables now support a new script type called Package. These scripts are designed to run on the server to package up a game/redistributable automatically. Package scripts are run on a recurring schedule, so they can be used to keep things up to date. Refer to the scripting documentation for more details.
SteamCMD
The server now supports a basic integration with SteamCMD. Currently, you can authenticate to multiple Steam profiles. This pairs great with packaging scripts to keep your games up to date!
Docker
The Docker image has been updated to support the new user data pathing. In addition, scripts have been added to allow the installation of both SteamCMD and WINE. These may be useful for writing packaging scripts or hosting dedicated servers in Docker-hosted environments.
For Docker Compose users, refer to the sample docker-compose.yml file in the repository.
Metadata Retrieval
In previous versions, metadata retrieval was only possible through IGDB and you had to accept whatever it gave you. This has been retooled and you now have the option of importing metadata from either IGDB or PCGamingWiki. Once you select the correct game, you are also able to select which data you would like to pull. This is built on the back of the new import functionality, so it should be more stable as well! The framework has also been laid out where it should be easier to integrate other metadata sources in the future.
Bug Fixes / Misc Improvements
As if there weren't already enough changes in this release, here's a list of notable bug fixes that have been made in 2.0.0:
- Game process tracking is now more reliable and less prone to memory leaks
- Downloads now buffer correctly and file writes should happen asynchronously. This should increase download speeds while preventing long load times in the web UI.
- Metadata and libraries are now caching more effectively, resulting in faster response times
- API requests are now being prioritized over downloads. Users should see an increase in responsiveness while other users are downloading from the server.
- Game saves should now be more reliable on both upload and download
- Launcher authentication state should now be more reliable
- An unresponsive server should no longer cause fatal errors when trying to launch games
- The discovery beacon has been rebuilt from the ground up and should no longer cause hard crashes
- Thumbnail sizes can now be customized in settings
- IGDB metadata importing should now be more consistent
- Taxonomy metadata such as genre or tags is no longer being lost when updating other game information
Contributors
As mentioned previously, this update had the most outside contributions over any other version. A big thanks to the following contributors and their pull requests:
- #390 Skipping nightly CI if it's not the lancommander main repo
- #387 Launcher import fixes
- #386 Evolving Migrations
- #385 Download endpoints get correct paths
- #384 Ensuring media path is correct
- #383 Adding SQLite database migration step
- #382 tags input fixes
- #337 Corrected Auto-updater
- #336 Added redistributables to Games API and Games manifest
- #335 Fixing scripts not saved anymore in Launcher
- #334 Save Games no longer shared between user
- #327 Corrected routes for Play Sessions tracking
- #322 Re-implement registry save paths game save creation in Launcher
- #321 Fix game end lag caused by generating game save
- #319 Fix editing collection and other metadata pages
- #318 Fix generating of thumbnails on importing games
- #316 Error messaging for login/register via Launcher
- #308 Bypass password policy on first-time-setup for administrator creation
- #307 Launcher: Fix connecting to hostname:port Uri
- #306 Launcher: Rework on offline mode and connection timeout
- #305 Launcher: Configure logger with log level from debug settings
- #303 Fix context menu items not triggering on click
- #291 Library changes to addon installation
- #290 Update archive's file sizes for a specific archive/game
- #289 Depot game changes to update view
- #287 Remove games via dialog for dependent games
- #286 Fix crash of base game removal of user Library
- #283 Fix Avatar uploading
- #282 Fix packaging and uploading save games by Launcher
- #281 Fix storing several entities (such as Gamesaves) properly
- #277 Fix importing tags on Lookup from IGDB
- #272 Standalone mods/expansions as Base Game
- #271 Fix changing base game of a game
- #269 Option to delete selected Media entries
- #268 Expiring Archives cache after recalculating/updating archives
- #260 Utilizing MadMilkman.INI for ini parsing
- #257 Fix "Name Change Script" from context menu nulling username in game files
More contributions are always welcome! If you would like to know how to help and have any of these skills, please reach out via Discord!
- Documentation maintenance
- ASP.NET Blazor development
- Discord moderation
- Docker image maintenance (we need more game servers!)
- Localization translation
- Avalonia development
And as always with a shameless plug, donations are welcome. Currently the best way to support the project is to sign up over at Patreon. There's currently no special tiers for higher members other than getting a special "Bawler" role in the Discord and any locked posts are still accessible via the free tier.