- Upgraded to .NET 8
- Minor refactoring & optimizations
This commit is contained in:
pointfeev 2024-01-12 22:50:28 -05:00
parent b0279461db
commit 992b7a9374
15 changed files with 99 additions and 108 deletions

View file

@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>WinExe</OutputType> <OutputType>WinExe</OutputType>
<TargetFramework>net7.0-windows10.0.22621.0</TargetFramework> <TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
<UseWindowsForms>True</UseWindowsForms> <UseWindowsForms>True</UseWindowsForms>
<ApplicationIcon>Resources\program.ico</ApplicationIcon> <ApplicationIcon>Resources\program.ico</ApplicationIcon>
<Version>4.10.0</Version> <Version>4.10.1</Version>
<Copyright>2021, pointfeev (https://github.com/pointfeev)</Copyright> <Copyright>2021, pointfeev (https://github.com/pointfeev)</Copyright>
<Company>CreamInstaller</Company> <Company>CreamInstaller</Company>
<Product>Automatic DLC Unlocker Installer &amp; Configuration Generator</Product> <Product>Automatic DLC Unlocker Installer &amp; Configuration Generator</Product>

View file

@ -16,14 +16,14 @@ internal sealed partial class DialogForm : CustomForm
{ {
descriptionIcon ??= Icon; descriptionIcon ??= Icon;
icon.Image = descriptionIcon?.ToBitmap(); icon.Image = descriptionIcon?.ToBitmap();
List<LinkLabel.Link> links = new(); List<LinkLabel.Link> links = [];
for (int i = 0; i < descriptionText.Length; i++) for (int i = 0; i < descriptionText.Length; i++)
if (descriptionText[i] == '[') if (descriptionText[i] == '[')
{ {
int textLeft = descriptionText.IndexOf("[", i, StringComparison.Ordinal); int textLeft = descriptionText.IndexOf('[', i);
int textRight = descriptionText.IndexOf("]", textLeft == -1 ? i : textLeft, StringComparison.Ordinal); int textRight = descriptionText.IndexOf(']', textLeft == -1 ? i : textLeft);
int linkLeft = descriptionText.IndexOf("(", textRight == -1 ? i : textRight, StringComparison.Ordinal); int linkLeft = descriptionText.IndexOf('(', textRight == -1 ? i : textRight);
int linkRight = descriptionText.IndexOf(")", linkLeft == -1 ? i : linkLeft, StringComparison.Ordinal); int linkRight = descriptionText.IndexOf(')', linkLeft == -1 ? i : linkLeft);
if (textLeft == -1 || textRight != linkLeft - 1 || linkRight == -1) if (textLeft == -1 || textRight != linkLeft - 1 || linkRight == -1)
continue; continue;
string text = descriptionText[(textLeft + 1)..textRight]; string text = descriptionText[(textLeft + 1)..textRight];

View file

@ -138,7 +138,7 @@ internal sealed partial class UpdateForm : CustomForm
cancellation = new(); cancellation = new();
bool success = true; bool success = true;
PackagePath.DeleteFile(true); PackagePath.DeleteFile(true);
await using Stream update = PackagePath.CreateFile(true); await using FileStream update = PackagePath.CreateFile(true);
bool retry = true; bool retry = true;
try try
{ {

View file

@ -16,7 +16,7 @@ internal static class EpicStore
internal static async Task<List<(string id, string name, string product, string icon, string developer)>> QueryCatalog(string categoryNamespace) internal static async Task<List<(string id, string name, string product, string icon, string developer)>> QueryCatalog(string categoryNamespace)
{ {
List<(string id, string name, string product, string icon, string developer)> dlcIds = new(); List<(string id, string name, string product, string icon, string developer)> dlcIds = [];
string cacheFile = ProgramData.AppInfoPath + @$"\{categoryNamespace}.json"; string cacheFile = ProgramData.AppInfoPath + @$"\{categoryNamespace}.json";
bool cachedExists = cacheFile.FileExists(); bool cachedExists = cacheFile.FileExists();
Response response = null; Response response = null;
@ -43,7 +43,7 @@ internal static class EpicStore
} }
if (response is null) if (response is null)
return dlcIds; return dlcIds;
List<Element> searchStore = new(response.Data.Catalog.SearchStore.Elements); List<Element> searchStore = [..response.Data.Catalog.SearchStore.Elements];
foreach (Element element in searchStore) foreach (Element element in searchStore)
{ {
string title = element.Title; string title = element.Title;
@ -60,7 +60,7 @@ internal static class EpicStore
foreach (Item item in element.Items) foreach (Item item in element.Items)
dlcIds.Populate(item.Id, title, product, icon, null, element.Items.Length == 1); dlcIds.Populate(item.Id, title, product, icon, null, element.Items.Length == 1);
} }
List<Element> catalogOffers = new(response.Data.Catalog.CatalogOffers.Elements); List<Element> catalogOffers = [..response.Data.Catalog.CatalogOffers.Elements];
foreach (Element element in catalogOffers) foreach (Element element in catalogOffers)
{ {
string title = element.Title; string title = element.Title;

View file

@ -13,9 +13,10 @@ internal sealed class Request
[JsonProperty(PropertyName = "query")] [JsonProperty(PropertyName = "query")]
private string Query private string Query
=> @"query searchOffers($namespace: String!) { => """
query searchOffers($namespace: String!) {
Catalog { Catalog {
searchStore(category: ""*"", namespace: $namespace){ searchStore(category: "*", namespace: $namespace){
elements { elements {
id id
title title
@ -24,7 +25,7 @@ internal sealed class Request
id id
} }
catalogNs { catalogNs {
mappings(pageType: ""productHome"") { mappings(pageType: "productHome") {
pageSlug pageSlug
} }
} }
@ -49,14 +50,15 @@ internal sealed class Request
developer developer
} }
catalogNs { catalogNs {
mappings(pageType: ""productHome"") { mappings(pageType: "productHome") {
pageSlug pageSlug
} }
} }
} }
} }
} }
}"; }
""";
[JsonProperty(PropertyName = "variables")] [JsonProperty(PropertyName = "variables")]
private Variables Vars { get; set; } private Variables Vars { get; set; }

View file

@ -1,6 +1,4 @@
#pragma warning disable CA1819 // Properties should not return arrays using System;
using System;
using Newtonsoft.Json; using Newtonsoft.Json;
namespace CreamInstaller.Platforms.Epic.GraphQL; namespace CreamInstaller.Platforms.Epic.GraphQL;

View file

@ -205,8 +205,8 @@ internal static class SteamCMD
if (output is null) if (output is null)
{ {
output = await Run(appId) ?? ""; output = await Run(appId) ?? "";
int openBracket = output.IndexOf("{", StringComparison.Ordinal); int openBracket = output.IndexOf('{');
int closeBracket = output.LastIndexOf("}", StringComparison.Ordinal); int closeBracket = output.LastIndexOf('}');
if (openBracket != -1 && closeBracket != -1 && closeBracket > openBracket) if (openBracket != -1 && closeBracket != -1 && closeBracket > openBracket)
{ {
output = $"\"{appId}\"\n" + output[openBracket..(1 + closeBracket)]; output = $"\"{appId}\"\n" + output[openBracket..(1 + closeBracket)];
@ -255,7 +255,7 @@ internal static class SteamCMD
internal static async Task<HashSet<string>> ParseDlcAppIds(VProperty appInfo) internal static async Task<HashSet<string>> ParseDlcAppIds(VProperty appInfo)
=> await Task.Run(() => => await Task.Run(() =>
{ {
HashSet<string> dlcIds = new(); HashSet<string> dlcIds = [];
if (Program.Canceled || appInfo is null) if (Program.Canceled || appInfo is null)
return dlcIds; return dlcIds;
VToken extended = appInfo.Value.GetChild("extended"); VToken extended = appInfo.Value.GetChild("extended");

View file

@ -13,7 +13,7 @@ internal static class Program
{ {
internal static readonly string Name = Application.CompanyName; internal static readonly string Name = Application.CompanyName;
private static readonly string Description = Application.ProductName; private static readonly string Description = Application.ProductName;
internal static readonly string Version = Application.ProductVersion; internal static readonly string Version = Application.ProductVersion[..(Application.ProductVersion.IndexOf('+') is var index && index != -1 ? index : Application.ProductVersion.Length)];
internal const string RepositoryOwner = "pointfeev"; internal const string RepositoryOwner = "pointfeev";
internal static readonly string RepositoryName = Name; internal static readonly string RepositoryName = Name;
@ -32,9 +32,9 @@ internal static class Program
internal static readonly int CurrentProcessId = CurrentProcess.Id; internal static readonly int CurrentProcessId = CurrentProcess.Id;
internal static bool BlockProtectedGames = true; internal static bool BlockProtectedGames = true;
internal static readonly string[] ProtectedGames = { "PAYDAY 2" }; internal static readonly string[] ProtectedGames = ["PAYDAY 2"];
internal static readonly string[] ProtectedGameDirectories = { @"\EasyAntiCheat", @"\BattlEye" }; internal static readonly string[] ProtectedGameDirectories = [@"\EasyAntiCheat", @"\BattlEye"];
internal static readonly string[] ProtectedGameDirectoryExceptions = Array.Empty<string>(); internal static readonly string[] ProtectedGameDirectoryExceptions = [];
internal static bool IsGameBlocked(string name, string directory = null) internal static bool IsGameBlocked(string name, string directory = null)
=> BlockProtectedGames && (ProtectedGames.Contains(name) || directory is not null && !ProtectedGameDirectoryExceptions.Contains(name) => BlockProtectedGames && (ProtectedGames.Contains(name) || directory is not null && !ProtectedGameDirectoryExceptions.Contains(name)

View file

@ -13,14 +13,14 @@ namespace CreamInstaller.Resources;
internal static class Koaloader internal static class Koaloader
{ {
internal static readonly List<(string unlocker, string dll)> AutoLoadDLLs = new() internal static readonly List<(string unlocker, string dll)> AutoLoadDLLs =
{ [
("Koaloader", "Unlocker.dll"), ("Koaloader", "Unlocker32.dll"), ("Koaloader", "Unlocker64.dll"), ("Lyptus", "Lyptus.dll"), ("Koaloader", "Unlocker.dll"), ("Koaloader", "Unlocker32.dll"), ("Koaloader", "Unlocker64.dll"), ("Lyptus", "Lyptus.dll"),
("Lyptus", "Lyptus32.dll"), ("Lyptus", "Lyptus64.dll"), ("SmokeAPI", "SmokeAPI.dll"), ("SmokeAPI", "SmokeAPI32.dll"), ("Lyptus", "Lyptus32.dll"), ("Lyptus", "Lyptus64.dll"), ("SmokeAPI", "SmokeAPI.dll"), ("SmokeAPI", "SmokeAPI32.dll"),
("SmokeAPI", "SmokeAPI64.dll"), ("ScreamAPI", "ScreamAPI.dll"), ("ScreamAPI", "ScreamAPI32.dll"), ("ScreamAPI", "ScreamAPI64.dll"), ("SmokeAPI", "SmokeAPI64.dll"), ("ScreamAPI", "ScreamAPI.dll"), ("ScreamAPI", "ScreamAPI32.dll"), ("ScreamAPI", "ScreamAPI64.dll"),
("Uplay R1 Unlocker", "UplayR1Unlocker.dll"), ("Uplay R1 Unlocker", "UplayR1Unlocker32.dll"), ("Uplay R1 Unlocker", "UplayR1Unlocker64.dll"), ("Uplay R1 Unlocker", "UplayR1Unlocker.dll"), ("Uplay R1 Unlocker", "UplayR1Unlocker32.dll"), ("Uplay R1 Unlocker", "UplayR1Unlocker64.dll"),
("Uplay R2 Unlocker", "UplayR2Unlocker.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker32.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker64.dll") ("Uplay R2 Unlocker", "UplayR2Unlocker.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker32.dll"), ("Uplay R2 Unlocker", "UplayR2Unlocker64.dll")
}; ];
internal static IEnumerable<string> GetKoaloaderProxies(this string directory) internal static IEnumerable<string> GetKoaloaderProxies(this string directory)
=> from resource in EmbeddedResources => from resource in EmbeddedResources
@ -92,7 +92,7 @@ internal static class Koaloader
} }
} }
private static void WriteConfig(TextWriter writer, SortedList<string, string> targets, SortedList<string, string> modules, InstallForm installForm = null) private static void WriteConfig(StreamWriter writer, SortedList<string, string> targets, SortedList<string, string> modules, InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");
writer.WriteLine(" \"logging\": false,"); writer.WriteLine(" \"logging\": false,");

View file

@ -17,8 +17,7 @@ internal static class Resources
private static readonly Dictionary<ResourceIdentifier, HashSet<string>> ResourceMD5s = new() private static readonly Dictionary<ResourceIdentifier, HashSet<string>> ResourceMD5s = new()
{ {
{ {
ResourceIdentifier.Koaloader, new() ResourceIdentifier.Koaloader, [
{
"8A0958687B5ED7C34DAD037856DD1530", // Koaloader v2.0.0 "8A0958687B5ED7C34DAD037856DD1530", // Koaloader v2.0.0
"8FECDEB40980F4E687C10E056232D96B", // Koaloader v2.0.0 "8FECDEB40980F4E687C10E056232D96B", // Koaloader v2.0.0
"92AD5E145A7CF9BA6F841BEB714B919B", // Koaloader v2.0.0 "92AD5E145A7CF9BA6F841BEB714B919B", // Koaloader v2.0.0
@ -351,27 +350,24 @@ internal static class Resources
"4207947D0452C1E33428ED098DC23D26", // Koaloader v3.0.2 "4207947D0452C1E33428ED098DC23D26", // Koaloader v3.0.2
"BDD0DCAE7A5FBBBA0D8B857AC34BD43C", // Koaloader v3.0.2 "BDD0DCAE7A5FBBBA0D8B857AC34BD43C", // Koaloader v3.0.2
"A0933D21552CC5C835416DFD7604548D" // Koaloader v3.0.2 "A0933D21552CC5C835416DFD7604548D" // Koaloader v3.0.2
} ]
}, },
{ {
ResourceIdentifier.EpicOnlineServices32, new() ResourceIdentifier.EpicOnlineServices32, [
{
"069A57B1834A960193D2AD6B96926D70", // ScreamAPI v3.0.0 "069A57B1834A960193D2AD6B96926D70", // ScreamAPI v3.0.0
"E2FB3A4A9583FDC215832E5F935E4440", // ScreamAPI v3.0.1 "E2FB3A4A9583FDC215832E5F935E4440", // ScreamAPI v3.0.1
"8B4B30AFAE8D7B06413EE2F2266B20DB" // ScreamAPI v4.0.0-rc01 "8B4B30AFAE8D7B06413EE2F2266B20DB" // ScreamAPI v4.0.0-rc01
} ]
}, },
{ {
ResourceIdentifier.EpicOnlineServices64, new() ResourceIdentifier.EpicOnlineServices64, [
{
"0D62E57139F1A64F807A9934946A9474", // ScreamAPI v3.0.0 "0D62E57139F1A64F807A9934946A9474", // ScreamAPI v3.0.0
"3875C7B735EE80C23239CC4749FDCBE6", // ScreamAPI v3.0.1 "3875C7B735EE80C23239CC4749FDCBE6", // ScreamAPI v3.0.1
"CBC89E2221713B0D4482F91282030A88" // ScreamAPI v4.0.0-rc01 "CBC89E2221713B0D4482F91282030A88" // ScreamAPI v4.0.0-rc01
} ]
}, },
{ {
ResourceIdentifier.Steamworks32, new() ResourceIdentifier.Steamworks32, [
{
"02594110FE56B2945955D46670B9A094", // CreamAPI v4.5.0.0 Hotfix "02594110FE56B2945955D46670B9A094", // CreamAPI v4.5.0.0 Hotfix
"B2434578957CBE38BDCE0A671C1262FC", // SmokeAPI v1.0.0 "B2434578957CBE38BDCE0A671C1262FC", // SmokeAPI v1.0.0
"973AB1632B747D4BF3B2666F32E34327", // SmokeAPI v1.0.1 "973AB1632B747D4BF3B2666F32E34327", // SmokeAPI v1.0.1
@ -385,11 +381,10 @@ internal static class Resources
"8B075C6B272A172A014D5C9E60F13DF2", // SmokeAPI v2.0.3 "8B075C6B272A172A014D5C9E60F13DF2", // SmokeAPI v2.0.3
"A3873569DECAD08962C46E88352E6DB1", // SmokeAPI v2.0.4 "A3873569DECAD08962C46E88352E6DB1", // SmokeAPI v2.0.4
"4A1A823E5CF4FB861DD6BA94539D29C4" // SmokeAPI v2.0.5 "4A1A823E5CF4FB861DD6BA94539D29C4" // SmokeAPI v2.0.5
} ]
}, },
{ {
ResourceIdentifier.Steamworks64, new() ResourceIdentifier.Steamworks64, [
{
"30091B91923D9583A54A93ED1145554B", // CreamAPI v4.5.0.0 Hotfix "30091B91923D9583A54A93ED1145554B", // CreamAPI v4.5.0.0 Hotfix
"08713035CAD6F52548FF324D0487B88D", // SmokeAPI v1.0.0 "08713035CAD6F52548FF324D0487B88D", // SmokeAPI v1.0.0
"D077737B9979D32458AC938A2978FA3C", // SmokeAPI v1.0.1 "D077737B9979D32458AC938A2978FA3C", // SmokeAPI v1.0.1
@ -403,33 +398,29 @@ internal static class Resources
"E4DC2AF2B8B77A0C9BF9BFBBAEA11CF7", // SmokeAPI v2.0.3 "E4DC2AF2B8B77A0C9BF9BFBBAEA11CF7", // SmokeAPI v2.0.3
"C0DDB49C9BFD3E05CBC1C61D117E93F9", // SmokeAPI v2.0.4 "C0DDB49C9BFD3E05CBC1C61D117E93F9", // SmokeAPI v2.0.4
"F7C3064D5E3C892B168F504C21AC4923" // SmokeAPI v2.0.5 "F7C3064D5E3C892B168F504C21AC4923" // SmokeAPI v2.0.5
} ]
}, },
{ {
ResourceIdentifier.Uplay32, new() ResourceIdentifier.Uplay32, [
{
"1977967B2549A38EC2DB39D4C8ED499B" // Uplay R1 Unlocker v2.0.0 "1977967B2549A38EC2DB39D4C8ED499B" // Uplay R1 Unlocker v2.0.0
} ]
}, },
{ {
ResourceIdentifier.Uplay64, new() ResourceIdentifier.Uplay64, [
{
"333FEDD9DC2B299419B37ED1624FF8DB" // Uplay R1 Unlocker v2.0.0 "333FEDD9DC2B299419B37ED1624FF8DB" // Uplay R1 Unlocker v2.0.0
} ]
}, },
{ {
ResourceIdentifier.Upc32, new() ResourceIdentifier.Upc32, [
{
"C14368BC4EE19FDE8DBAC07E31C67AE4", // Uplay R2 Unlocker v3.0.0 "C14368BC4EE19FDE8DBAC07E31C67AE4", // Uplay R2 Unlocker v3.0.0
"DED3A3EA1876E3110D7D87B9A22946B0" // Uplay R2 Unlocker v3.0.1 "DED3A3EA1876E3110D7D87B9A22946B0" // Uplay R2 Unlocker v3.0.1
} ]
}, },
{ {
ResourceIdentifier.Upc64, new() ResourceIdentifier.Upc64, [
{
"7D9A4C12972BAABCB6C181920CC0F19B", // Uplay R2 Unlocker v3.0.0 "7D9A4C12972BAABCB6C181920CC0F19B", // Uplay R2 Unlocker v3.0.0
"D7FDBFE0FC8D7600FEB8EC0A97713184" // Uplay R2 Unlocker v3.0.1 "D7FDBFE0FC8D7600FEB8EC0A97713184" // Uplay R2 Unlocker v3.0.1
} ]
} }
}; };
@ -440,7 +431,7 @@ internal static class Resources
if (embeddedResources is not null) if (embeddedResources is not null)
return embeddedResources; return embeddedResources;
string[] names = Assembly.GetExecutingAssembly().GetManifestResourceNames(); string[] names = Assembly.GetExecutingAssembly().GetManifestResourceNames();
embeddedResources = new(); embeddedResources = [];
foreach (string resourceName in names.Where(n => n.StartsWith("CreamInstaller.Resources.", StringComparison.Ordinal))) foreach (string resourceName in names.Where(n => n.StartsWith("CreamInstaller.Resources.", StringComparison.Ordinal)))
_ = embeddedResources.Add(resourceName[25..]); _ = embeddedResources.Add(resourceName[25..]);
return embeddedResources; return embeddedResources;
@ -491,13 +482,13 @@ internal static class Resources
{ {
e.path = Path.GetDirectoryName(e.path); e.path = Path.GetDirectoryName(e.path);
return e; return e;
}).DistinctBy(e => e.path).ToList() ?? new()); }).DistinctBy(e => e.path).ToList() ?? []);
internal static async Task<List<(string path, BinaryType binaryType)>> GetExecutables(this string rootDirectory, bool filterCommon = false, internal static async Task<List<(string path, BinaryType binaryType)>> GetExecutables(this string rootDirectory, bool filterCommon = false,
Func<string, bool> validFunc = null) Func<string, bool> validFunc = null)
=> await Task.Run(() => => await Task.Run(() =>
{ {
List<(string path, BinaryType binaryType)> executables = new(); List<(string path, BinaryType binaryType)> executables = [];
if (Program.Canceled || !rootDirectory.DirectoryExists()) if (Program.Canceled || !rootDirectory.DirectoryExists())
return null; return null;
foreach (string path in rootDirectory.EnumerateDirectory("*.exe", true)) foreach (string path in rootDirectory.EnumerateDirectory("*.exe", true))
@ -531,7 +522,7 @@ internal static class Resources
internal static async Task<HashSet<string>> GetDllDirectoriesFromGameDirectory(this string gameDirectory, Platform platform) internal static async Task<HashSet<string>> GetDllDirectoriesFromGameDirectory(this string gameDirectory, Platform platform)
=> await Task.Run(() => => await Task.Run(() =>
{ {
HashSet<string> dllDirectories = new(); HashSet<string> dllDirectories = [];
if (Program.Canceled || !gameDirectory.DirectoryExists()) if (Program.Canceled || !gameDirectory.DirectoryExists())
return null; return null;
foreach (string directory in gameDirectory.EnumerateSubdirectories("*", true).Append(gameDirectory)) foreach (string directory in gameDirectory.EnumerateSubdirectories("*", true).Append(gameDirectory))

View file

@ -27,7 +27,7 @@ internal static class ScreamAPI
directory.GetScreamApiComponents(out _, out _, out _, out _, out string config, out _); directory.GetScreamApiComponents(out _, out _, out _, out _, out string config, out _);
HashSet<SelectionDLC> overrideCatalogItems = selection.DLC.Where(dlc => dlc.Type is DLCType.Epic && !dlc.Enabled).ToHashSet(); HashSet<SelectionDLC> overrideCatalogItems = selection.DLC.Where(dlc => dlc.Type is DLCType.Epic && !dlc.Enabled).ToHashSet();
int entitlementCount = 0; int entitlementCount = 0;
HashSet<SelectionDLC> injectedEntitlements = new(); HashSet<SelectionDLC> injectedEntitlements = [];
foreach (SelectionDLC dlc in selection.DLC.Where(dlc => dlc.Type is DLCType.EpicEntitlement)) foreach (SelectionDLC dlc in selection.DLC.Where(dlc => dlc.Type is DLCType.EpicEntitlement))
{ {
if (dlc.Enabled) if (dlc.Enabled)
@ -65,7 +65,7 @@ internal static class ScreamAPI
} }
} }
private static void WriteConfig(TextWriter writer, SortedList<string, SelectionDLC> overrideCatalogItems, private static void WriteConfig(StreamWriter writer, SortedList<string, SelectionDLC> overrideCatalogItems,
SortedList<string, SelectionDLC> injectedEntitlements, InstallForm installForm = null) SortedList<string, SelectionDLC> injectedEntitlements, InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");

View file

@ -31,11 +31,11 @@ internal static class SmokeAPI
HashSet<SelectionDLC> overrideDlc = selection.DLC.Where(dlc => !dlc.Enabled).ToHashSet(); HashSet<SelectionDLC> overrideDlc = selection.DLC.Where(dlc => !dlc.Enabled).ToHashSet();
foreach (SelectionDLC extraDlc in selection.ExtraSelections.SelectMany(extraSelection => extraSelection.DLC.Where(dlc => !dlc.Enabled))) foreach (SelectionDLC extraDlc in selection.ExtraSelections.SelectMany(extraSelection => extraSelection.DLC.Where(dlc => !dlc.Enabled)))
_ = overrideDlc.Add(extraDlc); _ = overrideDlc.Add(extraDlc);
HashSet<SelectionDLC> injectDlc = new(); HashSet<SelectionDLC> injectDlc = [];
if (selection.DLC.Count() > 64) if (selection.DLC.Count() > 64)
foreach (SelectionDLC hiddenDlc in selection.DLC.Where(dlc => dlc.Enabled && dlc.Type is DLCType.SteamHidden)) foreach (SelectionDLC hiddenDlc in selection.DLC.Where(dlc => dlc.Enabled && dlc.Type is DLCType.SteamHidden))
_ = injectDlc.Add(hiddenDlc); _ = injectDlc.Add(hiddenDlc);
List<KeyValuePair<string, (string name, SortedList<string, SelectionDLC> injectDlc)>> extraApps = new(); List<KeyValuePair<string, (string name, SortedList<string, SelectionDLC> injectDlc)>> extraApps = [];
foreach (Selection extraSelection in selection.ExtraSelections.Where(extraSelection => extraSelection.DLC.Count() > 64)) foreach (Selection extraSelection in selection.ExtraSelections.Where(extraSelection => extraSelection.DLC.Count() > 64))
{ {
SortedList<string, SelectionDLC> extraInjectDlc = new(PlatformIdComparer.String); SortedList<string, SelectionDLC> extraInjectDlc = new(PlatformIdComparer.String);
@ -68,7 +68,7 @@ internal static class SmokeAPI
} }
} }
private static void WriteConfig(TextWriter writer, string appId, SortedList<string, (string name, SortedList<string, SelectionDLC> injectDlc)> extraApps, private static void WriteConfig(StreamWriter writer, string appId, SortedList<string, (string name, SortedList<string, SelectionDLC> injectDlc)> extraApps,
SortedList<string, SelectionDLC> overrideDlc, SortedList<string, SelectionDLC> injectDlc, InstallForm installForm = null) SortedList<string, SelectionDLC> overrideDlc, SortedList<string, SelectionDLC> injectDlc, InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");

View file

@ -45,7 +45,7 @@ internal static class UplayR1
} }
} }
private static void WriteConfig(TextWriter writer, SortedList<string, SelectionDLC> blacklistDlc, InstallForm installForm = null) private static void WriteConfig(StreamWriter writer, SortedList<string, SelectionDLC> blacklistDlc, InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");
writer.WriteLine(" \"logging\": false,"); writer.WriteLine(" \"logging\": false,");

View file

@ -47,7 +47,7 @@ internal static class UplayR2
} }
} }
private static void WriteConfig(TextWriter writer, SortedList<string, SelectionDLC> blacklistDlc, InstallForm installForm = null) private static void WriteConfig(StreamWriter writer, SortedList<string, SelectionDLC> blacklistDlc, InstallForm installForm = null)
{ {
writer.WriteLine("{"); writer.WriteLine("{");
writer.WriteLine(" \"logging\": false,"); writer.WriteLine(" \"logging\": false,");

View file

@ -139,7 +139,7 @@ internal static class ProgramData
{ {
try try
{ {
if (choices is null || !choices.Any()) if (choices is null || choices.Count == 0)
DlcChoicesPath.DeleteFile(); DlcChoicesPath.DeleteFile();
else else
DlcChoicesPath.WriteFile(JsonConvert.SerializeObject(choices)); DlcChoicesPath.WriteFile(JsonConvert.SerializeObject(choices));