Code Monkey home page Code Monkey logo

nexusmods.app's Introduction

The Nexus Mods App



Mod With Confidence
The future of modding with Nexus Mods.

CI Tests Discord

Nexus Mods App is a mod installer, creator and manager for all your popular games.

Easy to use, runs on your standard Windows PC and Linux alike. Don't waste time troubleshooting, play your games, fill those knees with arrows and most importantly, Have Fun!

Learn more about the App on the Wiki

nexusmods.app's People

Contributors

al12rs avatar aragas avatar bellcubedev avatar bhargavshirin avatar cuzkey avatar dependabot[bot] avatar erri120 avatar greg-nexus avatar halgari avatar januarysnow avatar jonathanfeenstra avatar patriot99 avatar pickysaurus avatar sewer56 avatar tanninone avatar udaykharatmol avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nexusmods.app's Issues

Game Support - Fallout New Vegas

Outline

The desired outcome of this issue is that Fallout New Vegas:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Windows Game Store

Research the datastore backend (again)

So far the app has had 2-3 separate data storage backends, RocksDB, LMDB being the two that lasted the longest, but FASTER was also tested at one point.

Recently I've encountered yet another "gotcha" in LMDB means we have to pre-determine the size of the data store and then close/reopen it whenever it reaches a certain size. It defaults to 10MB so that users hit the limits fairly quickly, but it also pre-allocates the size of the DB and requires that the file be mmapped completely into memory. This may become an issue long term if we ever have a large datastore in the range of 4GB. Will users be unhappy seeing 4GB of VRAM used by the app? How do we lock down the database so that we can resize it mid-usage?

We should make a feature matrix of all the main storage options to figure out what's best to use long term. Thankfully, due to all the iterations this code has been through the interface is very storage agnostic so swapping out the backend should only take a day once we decide what to do.

Requirements:

  • Storing data by keys, to store/retrieve bytes
  • Keys should be arbitrarily sized
  • Prefix searching, some keys are multi part and we want to find all values where the key is 0x44343*
  • Writes are rare, reads are common
  • Larger than memory storage solutions, we don't want the entire DB loaded in memory all the time
  • Concurrent read and co-ordinated writes by multiple processes. We want people to be able to run the CLI while the main app is running

Few known issues with other databases:

  • SQLite - very slow, structured, not really a K/V store
  • FASTER - very write focused, slow O(n) prefix searching, strange model for read caching that could mean loading data from disk on every read
  • RocksDB - single process usage of the data store
  • LMDB - fixed database size

What we need is essentially covered by a durable B*-tree, and we need very few updates, so perhaps something that models Datomic would work here? An immutable btree + a log and a offline compaction phase? We're going to need an history cleaner at some point anyways, so that could possibly be rolled into a btree store. All that to say, I've tossed around the idea of writing our own, maybe I'll look at it as a side project at some point.

Game Support - Mass Effect Legendary Edition

Outline

The desired outcome of this issue is that Mass Effect Legendary Edition:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • EA App
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • EA App
  • Game Managed
    • Steam
    • Epic Games Launcher
    • EA App

Game Support - Grand Theft Auto 5

Outline

The desired outcome of this issue is that Grand Theft Auto 5:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher
  • Game Managed
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher

Game Support - Oblivion

Outline

The desired outcome of this issue is that Oblivion:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Windows Game Store

As a user, I want to update a mod

User Story

As a user, I want to update a mod

Requirements

We need to decide how/when we poll to check NXM for mod updates.

If mod updates are available, users need to be able to easily update (potentially from Mods or Loadouts).

Designs

DODs

Scenario 1

Given
When
Then

Game Support - Sifu

Outline

The desired outcome of this issue is that Sifu:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Epic Games Launcher
  • Game Version Detection
    • Epic Games Launcher
  • Game Managed
    • Epic Games Launcher

Consider using nested `Directory.Build.props` and `Directory.Build.targets` files

Overview

MSBuild docs: Customize your build

The Directory.Build.props and Directory.Build.targets file are great for consolidating common properties, when separating projects into different folders (example: src and test).

Example

Using GameFinder as an example:

/
├─ Directory.Build.props
├─ Directory.Build.targets
├─ src/
│  ├─ Directory.Build.props
│  ├─ GameFinder.StoreHandlers.Steam/
│  │  ├─ GameFinder.StoreHandlers.Steam.csproj
├─ tests/
│  ├─ Directory.Build.props
│  ├─ Directory.Build.targets
│  ├─ GameFinder.StoreHandlers.Steam.Tests/
│  │  ├─ GameFinder.StoreHandlers.Steam.Tests.csproj

Top-Level

The top-level files can be used to configure properties that apply for every project:

Directory.Build.props:

<Project>
    <PropertyGroup>
        <TargetFrameworks>net6.0;net7.0</TargetFrameworks>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Meziantou.Analyzer" Version="2.0.13">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
    </ItemGroup>

    <PropertyGroup>
        <!-- https://github.com/meziantou/Meziantou.Analyzer/tree/main/docs/Rules -->
        <!-- MA0048: File name must match type name -->
        <NoWarn>MA0048</NoWarn>
    </PropertyGroup>
</Project>

Directory.Build.targets:

<Project>
    <PropertyGroup>
        <Nullable>enable</Nullable>
        <LangVersion>11</LangVersion>
        <ImplicitUsings>false</ImplicitUsings>
    </PropertyGroup>
</Project>

Every project will target both net6.0 and net7.0 have other properties already set for them. Every project also automatically references Meziantou.Analyzer and the dependency can me managed from a single file, making updating much easier.

src folder

src/Directory.Build.props:

<Project>
    <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

    <PropertyGroup>
        <Authors>erri120</Authors>

        <PackageReadmeFile>docs\README.md</PackageReadmeFile>
        <PackageLicenseExpression>MIT</PackageLicenseExpression>

        <PackageProjectUrl>https://github.com/erri120/GameFinder</PackageProjectUrl>
        <RepositoryUrl>https://github.com/erri120/GameFinder.git</RepositoryUrl>
        <RepositoryType>git</RepositoryType>

        <IncludeSymbols>true</IncludeSymbols>
        <SymbolPackageFormat>snupkg</SymbolPackageFormat>
    </PropertyGroup>

    <ItemGroup>
        <None Include="../../README.md" Pack="true" PackagePath="docs"/>
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="JetBrains.Annotations" Version="2022.3.1" PrivateAssets="all" />
    </ItemGroup>
</Project>

Since GameFinder is a library, all projects inside the src folder are going to be published and require package properties. These can be put into one Directory.Build.props file. Important is <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" /> which references the Directory.Build.props file from the root directory (see docs).

tests folder

tests/Directory.Build.props:

<Project>
    <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

    <PropertyGroup>
        <IsPackable>false</IsPackable>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="AutoFixture" Version="4.17.0" />
        <PackageReference Include="AutoFixture.AutoMoq" Version="4.17.0" />
        <PackageReference Include="AutoFixture.Xunit2" Version="4.17.0" />
        <PackageReference Include="FluentAssertions" Version="6.9.0" />
        <PackageReference Include="FluentAssertions.Analyzers" Version="0.17.2">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
        <PackageReference Include="System.IO.Abstractions.TestingHelpers" Version="19.1.5" />
        <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
        <PackageReference Include="Moq" Version="4.18.4" />
        <PackageReference Include="xunit" Version="2.4.2" />
        <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
        <PackageReference Include="coverlet.collector" Version="3.2.0">
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
            <PrivateAssets>all</PrivateAssets>
        </PackageReference>
    </ItemGroup>
</Project>

Every test project has to reference common testing packages like xUnit.net, AutoFixture and FluentAssertions. Having all of those dependencies in the same file makes it very easy to upgrade.

Individual projects

Arriving at the individual .csproj files, these will contain unique properties for their project:

src/GameFinder.StoreHandlers.Steam/GameFinder.StoreHandlers.Steam.csproj:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <Description>Library for finding games installed with Steam.</Description>
        <PackageTags>valve steam games</PackageTags>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
        <DocumentationFile>bin\Debug\GameFinder.StoreHandlers.Steam.xml</DocumentationFile>
    </PropertyGroup>

    <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
        <DocumentationFile>bin\Release\GameFinder.StoreHandlers.Steam.xml</DocumentationFile>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="ValveKeyValue" Version="0.8.2.162" />
        <PackageReference Include="System.IO.Abstractions" Version="19.1.5" />
    </ItemGroup>

    <ItemGroup>
        <PackageReference Include="Roslyn.System.IO.Abstractions.Analyzers" Version="12.2.19">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
        </PackageReference>
    </ItemGroup>

    <ItemGroup>
        <ProjectReference Include="..\GameFinder.Common\GameFinder.Common.csproj" />
        <ProjectReference Include="..\GameFinder.RegistryUtils\GameFinder.RegistryUtils.csproj" />
    </ItemGroup>

    <ItemGroup>
        <InternalsVisibleTo Include="GameFinder.StoreHandlers.Steam.Tests" />
    </ItemGroup>
</Project>

tests/GameFinder.StoreHandlers.Steam.Tests/GameFinder.StoreHandlers.Steam.Tests.csproj:

<Project Sdk="Microsoft.NET.Sdk">
    <ItemGroup>
        <ProjectReference Include="..\..\src\GameFinder.StoreHandlers.Steam\GameFinder.StoreHandlers.Steam.csproj" />
        <ProjectReference Include="..\TestUtils\TestUtils.csproj" />
    </ItemGroup>

    <ItemGroup>
        <Compile Include="..\Usings.cs">
            <Link>Usings.cs</Link>
        </Compile>
    </ItemGroup>
</Project>

(Having a common Usings.cs for tests is also possible with this approach.)

Conclusion

Putting common project properties and dependencies into Directory.Build.props and Directory.Build.targets files can drastically remove clutter from project files and make it easier to manage dependencies. The individual project files will then only contain the unique properties, required for the project, and nothing else.

Auto-invalidate archive content caches when new analyzers are added/updated

Currently when analyzing an archive we assume that the archive contents never change and hence the results of the analyzers need never be updated. However during development (and in future versions of the application) we may need to re-analyze archives to get improved analysis data. So we need some sort of versioning system for analysis data.

  • IFileAnalyzer should include some sort of version or hash for determining when the analyzer changes
  • All analyzers that match a given file type should be calculated and stored with the analyzed archive in the datastore
    • Consider using a value hash, or some sort of content hash to condense all the analyzers and versions into a single small value (like a long) instead of a list of strings that must be included on every file analyzed
  • When the cached data is loaded the analyzer fingerprint should be compared against the current fingerprint and if they differ, the cached copy should be discarded.

Implement a flexible HTTP downloader

Several parts of the application need a reliable HTTP downloader. In some cases users want to restrict the bandwidth of their downloads both at a per-connection and per-bytes-per-second level. So this should be backed by a IResource<>

Currently we have SimpleHttpDownloader that implements the IHttpDownloader interface. We also have a test framework that can serve up arbitrary data via HttpListener. We can add another endpoint to that listener that randomly kills the connection or only sends partial data.

Requirements:

  • Should support one or more HTTP urls, extra URLs are assumed to be mirrors
  • Should try mirrors on 404s, and 500s
  • Should retry the same mirror at least once, so we don't switch datacenters due to a single hiccup.
  • Can download directly to disk, no need restrict yourself to a Stream interface
  • IHttpDownloader includes a size parameter that can be used to verify download sizes for use in retries
  • Should support resume, even after a complete app crash
    • Perhaps with two-phase write, write data, write a log of what was downloaded in a separate file? On restart, we can pick up at the location of the last log point.
  • Should respect the IResource<> interface, and report all data usage and connections
  • Should a given connection fail, try one of the mirrors. Restarting where the previous connection died.
  • Should be backed by a DI HttpClient. .NET recommends a single HttpClient instance for the entire app.
  • Implement tests
    • Using HTTPListener simulate retry, resume, etc.
    • We can pass parameters to the HttpListener endpoint to define how many bytes to go before causing a disconnect.
    • We can drive those parameters with FsCheck (https://fscheck.github.io/FsCheck//QuickStart.html) for a truely robust solution

Game Support - Stardew Valley

Outline

The desired outcome of this issue is that Stardew Valley:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Stores
  • Automatic Game Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Windows Game Store

Game Support - Red Dead Redemption 2

Outline

The desired outcome of this issue is that Red Dead Redemption 2:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher
  • Game Managed
    • Steam
    • Epic Games Launcher
    • Rockstar Games Launcher

As a user, I want to manage a game

User Story

As a user, I want to manage a game using the Nexus Mods App

Requirements

Must haves:

  • Automatic game detection
  • Manual game selection (from folder)
  • Manage a game
  • Manage multiple games at once
  • Un-manage a game

Won't haves:

  • Sorting
  • Filtering
  • Searching

Designs

Figma designs

Figma - Page anatomy

Figma prototype - Add found games from home screen

Figma prototype - Add found games from “My Games” screen

Figma prototype - Add games manually from “Browse Games” screen

Design system components

Game widget

Page messages - NMA - Rich content - Info

DODs

Scenario 1

Given
I open NMA

When
NMA first loads

Then
I am shown the Home section on the Newsfeed page

Scenario 2

Given
I have game/s installed on my system

When
I open NMA and am shown the "Home - Newsfeed" page

Then
The Newsfeed displays a dismissible "page message" component using the "rich content - info" variant displaying any detected games.

Scenario 3

Given
I dismiss the games found page message in the newsfeed.

When
I next open NMA

Then
The games found page message will not show again unless new games have been installed and detected since. Only the newly detected games will be shown in the page message.

Scenario 4

Given
I have installed games that NMA has detected

When
I click "add game" on the Game tile

Then
The game is added to the Spine menu and to the "Ready to mod" card in "Home - My Games"

Then
I am taken to that newly added games page.

Scenario 5

Given
I have installed games that NMA has detected

When
I navigate to "Home - My games"

Then
The installed games are displayed in the "Detected games" card

As a user, I want to uninstall a mod

User Story

As a user, I want to uninstall a mod as I no longer want to use it and/or want to free disk space.

Requirements

Must haves:
Ability to uninstall a mod.
Remove the uninstalled mod from the mod list.

Won't haves:
Any handling for keeping archives. Designed on the assumption that uninstalling the mod will also delete the archive.

Designs

Figma designs

Prototype

Image

DODs

Scenario 1

Given
I have mods in my mod list
When
I select a mod/s
Then
The option to uninstall a mod is enabled.

Scenario 2

Given
I have selected a mod/s
When
I click the uninstall button
Then
The mods are uninstalled
And
Removed from the mod list.

Add EA Desktop & Epic support

We currently only support GoG and Steam, for our upcoming game support work we should also support EA and Epic games. The GameFinder library supports these sources already so this is mostly just wiring things up

Game Support - My Summer Car

Outline

The desired outcome of this issue is that My Summer Car:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

As a user, I want to undo/redo changes to loadout

User Story

As a user, I want to undo/redo changes to my loadout

Requirements

Fairly straightforward, we need UI elements on the loadout screen to undo/redo any changes made.

Designs

DODs

Scenario 1

Given
When
Then

Game Support - Skyrim Special Edition

Outline

The desired outcome of this issue is that Skyrim Special Edition:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store

Game Support - Blade & Sorcery

Outline

The desired outcome of this issue is that Blade & Sorcery:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

As a user, I want to install a mod

User Story

As a user, I want to install a mod so I can use the mod in my game and manage it within NMA

Requirements

Must haves:
Manually install a mod that has already been downloaded by the user
Loading/installing state communicated
Error/failed state communicated

Won't haves:
Downloading mods
Communicating detailed error messages if installation fails

Designs

Figma designs

Prototype

image

DODs

Scenario 1

Given
I have a mod on my system and I want to install it
When
I click add game from the toolbar
Then
I can browse to find the mod I want to install

Scenario 2

Given
I have installed a mod
When
I view the mod list
Then
I can see the newly installed mod

Scenario 3

Given
I am installing a mod
When
The mod fails to install
Then
I receive a message to inform me the install failed.

As a user, I want to view a list of mods

User Story

As a user, I want to

Requirements

Must haves:

View a list of all added mods

Won't haves:

  • Sort
  • Filters
  • Actions

Notes:

"Toggle" component is in the process of being redesigned for NMA, if there is an out of the box toggle available in Avalonia please go ahead and use that rather then creating our current, soon to be outdated, toggles from scratch.

We will not implement the 'Used by' column as part of this issue.

Designs

Figma

image

DODs

Scenario 1

Given
I open NMA and select a game

When
I select "Mods" from the left menu

Then
I am shown a list of added mods

Game Support - Skyrim

Outline

The desired outcome of this issue is that Skyrim:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

  • TBD

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

Note: the original Skyrim may be available on other platforms, it doesn't return in searches though.

As a user with a premium Nexus Mods membership, I want to search for mods from Nexus Mods

User Story

As a premium user, I want to search for mods on Nexus Mods without visiting www.nexusmods.com

Requirements

Add a new search feature for mods on Nexus Mods.

If a free/supporter user attempts to use the feature, display a premium advert/prompt and explain that it's only available to premium members.

Mod details to return and display:

  • Thumbnail image
  • Title
  • Category
  • Uploaded Timestamp
  • Last Update Timestamp
  • Author
  • Description
  • File Size
  • Endorsements
  • Unique Downloads

We'll need to consider:

  • Sorting
  • Filtering
  • No Results

Designs

DODs

Scenario 1

Given
When
Then

Game Support - Elden Ring

Outline

The desired outcome of this issue is that Elden Ring:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

Game Support - Fallout 4

Outline

The desired outcome of this issue is that Fallout 4:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Windows Game Store
  • Game Version Detection
    • Steam
    • Windows Game Store
  • Game Managed
    • Steam
    • Windows Game Store

As a user with premium Nexus Mods membership, I want to view a mod from Nexus Mods

User Story

As a premium user, I want to view a mod from Nexus Mods without visiting www.nexusmods.com

Requirements

This is dependent on #67

After running a search for mods, users should be able to view the mod.

This needs to be limited in scope, for now we can focus on:

  • Mod details (title, desc, tile/cover image, description, etc.)
  • Media Gallery
  • Download
  • Files

Later, in further issues, we can worry about:

  • Comments
  • Bugs
  • Logs
  • Stats
  • etc.

Designs

DODs

Scenario 1

Given
When
Then

Game Support - Ready or Not

Outline

The desired outcome of this issue is that Ready or Not:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

Game Support - Morrowind

Outline

The desired outcome of this issue is that Morrowind:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Windows Game Store

Game Support - The Witcher 3

Outline

The desired outcome of this issue is that The Witcher 3:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Epic Games Launcher
  • Game Version Detection
    • Steam
    • GOG
    • Epic Games Launcher
  • Game Managed
    • Steam
    • GOG
    • Epic Games Launcher

Integrate with Slack

Look into some integration with Slack to send notifications for:

  • New Issues
  • PRs that need review
  • Comments on issues/PRs

Game Support - Valheim

Outline

The desired outcome of this issue is that Valheim:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Windows Game Store
  • Game Version Detection
    • Steam
    • Windows Game Store
  • Game Managed
    • Steam
    • Windows Game Store

Game Support - Final Fantasy VII Remake

Outline

The desired outcome of this issue is that Final Fantasy VII Remake:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
  • Game Version Detection
    • Steam
    • Epic Games Launcher
  • Game Managed
    • Steam
    • Epic Games Launcher

Add support for Skyrim Plugins

We need to rough out the concept of plugins, plugin sorting and generated files. Let's start by adding support for sorting on files in mods. Next we'll need to add support for files generated at deploy time, and test this in Skyrim by generating a plugin.txt file.

Requirements:

  • Can add First, Before, After on esp/esm/esl files
  • Deploying in Skyrim emits a plugin.txt file to the correct folder
  • Set hash values on the deployed file in such a way that future deployments do not re-generate the file

OAuth2 login for Nexus Mods

Implement OAuth2 login/logout for Nexus Mods. Don't think we can test this in an automated way, but we should be able to call nexus-login and nexus-logout from the command line to invoke the routines.

We can store the tokens in the data store (via IDataStore). Implement a new instance of NexusWebApi.IHttpMessageFactory to and use that to inject authorized messages into NexusWebApi.Client. This way we can continue to us API keys in the testing environment, and OAuth in the app proper.

If we make a single Show Browser function we can add overrides for each OS. For this ticket only Windows support is expected. Later on we'll add a ticket to add implementations for this Show Browser function for OSX/Linux.

Requirements:

  • Login via the CLI
  • Logout via the CLI
    • Should clear out the login data in the datastore
  • CLI command to verify the login via hitting /verify on the Nexus API and returning the result via the commandline

Refactor loadout->mod->file relationships

Currently mods and files are stored as hashsets in their parents. This means we have to do O(n) scans of the loadout to replace or update them. We should switch these to a dictionary and provide marker interfaces for modifying files and mods. Essentially we need a set of methods for manipulating these entities.

For mod files and mods, we need routines that can quickly modify, delete, or transform each of these entities. Preferably as a batch operation that emits a single Alter transform.

Game Support - Star Wars: Battlefront 2 (2017)

Outline

The desired outcome of this issue is that Star Wars Battlefront 2 (2017):

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • EA App
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • EA App
  • Game Managed
    • Steam
    • Epic Games Launcher
    • EA App

Game Support - Monster Hunter Rise

Outline

The desired outcome of this issue is that Monster Hunter Rise:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Windows Game Store
  • Game Version Detection
    • Steam
    • Windows Game Store
  • Game Managed
    • Steam
    • Windows Game Store

Game Support - Blade & Sorcery: Nomad

Outline

The desired outcome of this issue is that Blade & Sorcery Nomad:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • VR
  • Game Version Detection
    • VR
  • Game Managed
    • VR

Game Support - Cyberpunk 2077

Outline

The desired outcome of this issue is that Cyberpunk 2077:

  • is automatically detected;
  • game version is detected;
  • can be managed by Nexus Mods App;

...for all applicable game stores.

We also need to ensure that for Cyberpunk 2077, Nexus Mods App can:

  • install mods;
    • manually,
    • from Nexus Mods,
    • from other third-party sources,
  • uninstall mods;
  • update mods;
  • endorse/un-endorse mods;
  • list mods;
  • undo/redo changes to a list of mods.

The following work also needs to be done in order to support Cyberpunk 2077:

  • TBD

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • Windows Game Store
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • Windows Game Store
  • Game Managed
    • Steam
    • Epic Games Launcher
    • Windows Game Store

Game Support - Mount & Blade 2: Bannerlord

Outline

The desired outcome of this issue is that Mount & Blade 2 Bannerlord:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store

Game Support - Anno 1800

Outline

The desired outcome of this issue is that Anno 1800:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
    • Ubisoft Connect
  • Game Version Detection
    • Steam
    • Epic Games Launcher
    • Ubisoft Connect
  • Game Managed
    • Steam
    • Epic Games Launcher
    • Ubisoft Connect

Game Support - Monster Hunter: World

Outline

The desired outcome of this issue is that Monster Hunter World:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
  • Game Version Detection
    • Steam
  • Game Managed
    • Steam

Add sorting support for mods

Currently mods are sorted by hash value, which is completely useless. We need to implement a way of sorting mods. Since our current storage of mods in a loadout is simply a hashset of mods, it seems like a simple way would to implement this would be via set of rules. Rules that we would certainly need

  • Load First (use by the game files)
  • Loads After
  • Loads Before

Starting with these we should be able to implement some fairly complex loadouts. In order to have mods refer to eachother in a generic way, we'll need to create a ModId for each mod and then implement a polymorphic set of loading rules for each mod.

The data structure could probably be:

- Loadout
  Mods:
    - Name: GameFiles
      Id: 44242
      SortRules:
        - Load First
    - Name: MyMod
      Id: 44243
      SortRules:
        - Load After: 44242 
    - Name: MyMod2
      Id: 44244
      SortRules:
        - Load Before: 44244

After this is implemented, we'll need a simple DAG sorter, and then we can hook that into the flatten routine in the LoadOrder.

Game Support - Marvel's Spider-Man Remastered

Outline

The desired outcome of this issue is that Marvel's Spider-Man Remastered:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • Epic Games Launcher
  • Game Version Detection
    • Steam
    • Epic Games Launcher
  • Game Managed
    • Steam
    • Epic Games Launcher

Game Support - Fallout 3

Outline

The desired outcome of this issue is that Fallout 3:

  • is automatically detected; AND
  • game version is detected; AND
  • can be managed by Nexus Mods App; AND
  • the most common mods can be installed; AND
  • the game starts with mods installed (and the mods work).

...for all applicable game stores (see below).

Supporting Information

  • Automatic Game Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Version Detection
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store
  • Game Managed
    • Steam
    • GOG
    • Epic Games Launcher
    • Windows Game Store

Consider using Vogen for Nominal Typing

Vogen is a .NET source generator and code analyzer that generates Value Objects for Nominal Typing/to prevent primitive obsession:

[ValueObject<int>]
public partial struct MyId { }

[ValueObject<int>]
public readonly partial struct MyReadonlyId { }

[ValueObject<string>(conversions: Conversions.SystemTextJson)]
public partial class MyFilePath
{
    private static Validation Validate(string value)
    {
        return value.Contains('.', StringComparison.OrdinalIgnoreCase)
            ? Validation.Ok
            : Validation.Invalid("File path must have an extension!");
    }
}
var id = MyId.From(1);
var path = MyFilePath.From("log.log");
var invalidPath = MyFilePath.From("no-extension");

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.