Skip to content

Releases: erri120/GameFinder

Release 4.2.0

28 Jan 11:12
6d0f0a7
Compare
Choose a tag to compare
  • Added support for OSX version of Steam (#122)

Release 4.1.0

08 Jan 13:16
b651100
Compare
Choose a tag to compare
  • Upgraded to .NET 8.
  • Upgraded all dependencies.
  • Replaced Vogen with TransparentValueObjects.
  • Steam: fixed AppManifestParser breaking when encountering an absolute path instead of a relative path in the installdir field (#118).
  • Bottles: fixed a DirectoryNotFoundException when trying to enumerate a directory that doesn't exist (#119).

Release 4.0.0

03 Sep 10:40
30eb0cc
Compare
Choose a tag to compare

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

11 Aug 10:15
e359c85
Compare
Choose a tag to compare
  • Steam: fixed StateFlag parser throwing an exception (#93).
  • Updated dependencies.
  • Replaced Moq with NSubstitute (#92).

Release 3.2.1

25 Jul 12:55
a719a9d
Compare
Choose a tag to compare
  • Xbox: parsed relative path is now sanitized

Release 3.2.0

25 Jul 10:13
c888749
Compare
Choose a tag to compare

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: for appmanifest_*.acf files.
  • LibraryFoldersManifest: for the single libraryfolders.vdf file inside the Steam/config folder.
  • WorkshopManifest: for appworkshop_*.acf files.
  • LocalUserConfig for the single localconfig.vdf file inside the userdata/{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 to 0.1.1

Release 3.1.0

23 May 13:59
884b29b
Compare
Choose a tag to compare

Changes:

  • Steam: added CloudSavesDirectory to SteamGame.
  • 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

10 May 10:27
c7c20b7
Compare
Choose a tag to compare

Changes:

  • Converted AWinePrefix and all inheritors into record types.
  • Added DebuggerDisplay to ErrorMessage.

Release 3.0.1

10 May 08:44
e60b07a
Compare
Choose a tag to compare

First small release after the major 3.0.0 release.

Changes:

  • Added AHandler. This is a non-generic abstract base class, inherited by AHandler<TGame, TId> and should alleviate some of the issues with generics hell. This class only has one method IEnumerable<OneOf<IGame, ErrorMessage>> FindAllInterfaceGames() which makes use of the new IGame interface added in 3.0.0.

Release 3.0.0

09 May 09:35
7c2e64a
Compare
Choose a tag to compare

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 return OneOf<TGame, ErrorMessage> instead of Result<TGame> (using the OneOf library).
  • Replaced System.IO.Abstraction with NexusMods.Path.IFileSystem.
    • Paths are now of type AbsolutePath instead of string.
  • Changed AHandler<TGame, TId> to require TId : notnull.
  • Added IGame interface and changed AHandler<TGame, TId> to require TGame : IGame.
  • Removed the extension functions OnlyGame and OnlyError.
  • Changed all game Ids to be value objects using Vogen.
  • Changed FindAllGamesById to return IReadOnlyDictionary<TGame, TId> instead of IDictionary<TGame, TId>.

(Hopefully) non-breaking changes:

  • Re-added Xbox Game Pass.
  • Added Func<TGame, TId> IdSelector and IEqualityComparer<TId>? IdEqualityComparer to AHandler<TGame, TId>. These can be used to construct key-value types like a dictionary.
  • Added WindowsRegistry.Shared for a shared instance of IRegistry.
  • Wine: added GetUserName, ProtonWinePrefix will now use steamuser.
  • 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.