Releases: erri120/GameFinder
Release 4.0.0
This is a major release because I've had to change the license from MIT to GPLv3. See 53130f2 for details.
Additionally, all builds will now be packaged in release mode and dependencies have been upgraded.
Release 3.2.2
Release 3.2.1
- Xbox: parsed relative path is now sanitized
Release 3.2.0
This is the first in a series of major updates that rework one of the store handlers. In this update, I focused on Steam and completely reworked the handler and data models. The SteamGame
record now contains a reference to the parsed AppManifest
, which itself is now fully fleshed out and has everything you need. Furthermore, you can now also parse the workshop manifest file, if it exists, to get a list of all installed Steam workshop items:
AppManifest
: forappmanifest_*.acf
files.LibraryFoldersManifest
: for the singlelibraryfolders.vdf
file inside theSteam/config
folder.WorkshopManifest
: forappworkshop_*.acf
files.LocalUserConfig
for the singlelocalconfig.vdf
file inside theuserdata/{steamId}/config
folder.
Finally, I've been thinking a lot about result types. Over the years, I've updated GameFinder to use various different approaches for dealing with errors. This update is the beginning of me phasing out my hacky OneOf<TResult, ErrorMessage>
solution, and replacing it with FluentResults.
Changes:
- Steam: complete rework
- Updated
NexusMods.Paths
to0.1.1
Release 3.1.0
Changes:
- Steam: added
CloudSavesDirectory
toSteamGame
. - Fixed
AWinePrefix.CreateRegistry
throwing an exception when the file doesn't exist. It will now do a check and early exist with an empty registry, if the registry file doesn't exist. - Fixed
WMIHelper
throwing an exception when WMI returns more than one element. - Marked
GameFinder.StoreHandlers.EADesktop
as non-trimmable. It uses the WMI, which itself requires COM, which is disabled when trimming is enabled.
Release 3.0.2
Changes:
- Converted
AWinePrefix
and all inheritors into record types. - Added
DebuggerDisplay
toErrorMessage
.
Release 3.0.1
First small release after the major 3.0.0 release.
Changes:
- Added
AHandler
. This is a non-generic abstract base class, inherited byAHandler<TGame, TId>
and should alleviate some of the issues with generics hell. This class only has one methodIEnumerable<OneOf<IGame, ErrorMessage>> FindAllInterfaceGames()
which makes use of the newIGame
interface added in 3.0.0.
Release 3.0.0
This is a major release with big changes featuring Wine, Bottles and Proton support for GOG, EGS and Origin. This release also replaces System.IO.Abstraction
with NexusMods.Paths
from the new Nexus Mods App, changes how results are handled and re-adds Xbox Game Pass support.
Breaking Changes:
- Reworked the constructors of all handlers and removed most overloads. All handlers now have a single constructor with no default values.
- Updated
FindAllGames
to returnOneOf<TGame, ErrorMessage>
instead ofResult<TGame>
(using the OneOf library). - Replaced
System.IO.Abstraction
withNexusMods.Path.IFileSystem
.- Paths are now of type
AbsolutePath
instead ofstring
.
- Paths are now of type
- Changed
AHandler<TGame, TId>
to requireTId : notnull
. - Added
IGame
interface and changedAHandler<TGame, TId>
to requireTGame : IGame
. - Removed the extension functions
OnlyGame
andOnlyError
. - Changed all game Ids to be value objects using Vogen.
- Changed
FindAllGamesById
to returnIReadOnlyDictionary<TGame, TId>
instead ofIDictionary<TGame, TId>
.
(Hopefully) non-breaking changes:
- Re-added Xbox Game Pass.
- Added
Func<TGame, TId> IdSelector
andIEqualityComparer<TId>? IdEqualityComparer
toAHandler<TGame, TId>
. These can be used to construct key-value types like a dictionary. - Added
WindowsRegistry.Shared
for a shared instance ofIRegistry
. - Wine: added
GetUserName
,ProtonWinePrefix
will now usesteamuser
. - Enabled Trimming.
How to upgrade:
The transition from Result<TGame>
to OneOf<TGame, ErrorMessage>
should be straight forward. You can use the provided helper methods for matching like result.Match(game => { }, error => { })
or result.Switch(game => { }, error => { })
depending on your needs. I've also added some extension methods to make the transition easier:
bool IsGame()
bool IsError()
TGame AsGame()
ErrorMessage AsError
bool TryGetGame(out TGame)
bool TryGetError(out ErrorMessage)
Store handlers, like GOGHandler
, now require an implementation of NexusMods.Paths.IFileSystem
, instead of System.IO.Abstraction.IFileSystem
. You can use the shared instance at NexusMods.Path.FileSystem.Shared
, if you want to use the real file system.
For testing, you can either mock NexusMods.Paths.IFileSystem
, or use NexusMods.Paths.InMemoryFileSystem
. If you need to do more in-depth testing, you can also use the NexusMods.Paths.TestingHelpers
package.
Since AHandler<TGame, TId>
has changed, you might need to update the constraints for TId
, if you use generics. Simply add where TId : notnull
to the constraints. All Ids have been replaced to using value objects. For example: instead of having long id
for GOGGame
, it's now GOGGameId id
. You can still get the value using id.Value
, which is still a long
.
How to use with Wine on Linux:
See the updated README.
Release 2.6.0
- removed support for
net6.0
- add support for finding Wine prefixes (check the README)
- Steam: added new default installation directories:
~/.steam/debian-installation
(apparently used on Debian/Ubuntu systems)~/.var/app/com.valvesoftware.Steam/data/Steam
(used by the flatpak installation)~/.steam/steam
(legacy installation, links to another installation)
Release 2.5.0
Added support for EA Desktop. Read the wiki entry before using.