mirror of
https://github.com/bloxstraplabs/bloxstrap.git
synced 2025-04-21 18:11:27 -07:00
Refactor settings management
This commit is contained in:
parent
deee40fb5c
commit
93b082263b
@ -37,8 +37,7 @@ namespace Bloxstrap
|
||||
|
||||
public static string Version = Assembly.GetExecutingAssembly().GetName().Version!.ToString()[..^2];
|
||||
|
||||
public static SettingsManager SettingsManager = new();
|
||||
public static SettingsFormat Settings = SettingsManager.Settings;
|
||||
public static readonly JsonManager<Settings> Settings = new();
|
||||
public static readonly HttpClient HttpClient = new(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All });
|
||||
|
||||
// shorthand
|
||||
@ -52,7 +51,7 @@ namespace Bloxstrap
|
||||
|
||||
public static void Terminate(int code = Bootstrapper.ERROR_SUCCESS)
|
||||
{
|
||||
SettingsManager.Save();
|
||||
Settings.Save();
|
||||
Environment.Exit(code);
|
||||
}
|
||||
|
||||
@ -90,7 +89,6 @@ namespace Bloxstrap
|
||||
if (registryKey is null)
|
||||
{
|
||||
IsFirstRun = true;
|
||||
Settings = SettingsManager.Settings;
|
||||
BaseDirectory = Path.Combine(Directories.LocalAppData, ProjectName);
|
||||
|
||||
if (!IsQuiet)
|
||||
@ -111,14 +109,14 @@ namespace Bloxstrap
|
||||
|
||||
Directories.Initialize(BaseDirectory);
|
||||
|
||||
SettingsManager.SaveLocation = Path.Combine(Directories.Base, "Settings.json");
|
||||
//Settings.FileLocation = Path.Combine(Directories.Base, "Settings.json");
|
||||
|
||||
// we shouldn't save settings on the first run until the first installation is finished,
|
||||
// just in case the user decides to cancel the install
|
||||
if (!IsFirstRun)
|
||||
{
|
||||
Settings = SettingsManager.Settings;
|
||||
SettingsManager.ShouldSave = true;
|
||||
Settings.Load();
|
||||
Settings.ShouldSave = true;
|
||||
}
|
||||
|
||||
#if !DEBUG
|
||||
@ -163,8 +161,8 @@ namespace Bloxstrap
|
||||
|
||||
if (!String.IsNullOrEmpty(commandLine))
|
||||
{
|
||||
DeployManager.Channel = Settings.Channel;
|
||||
Settings.BootstrapperStyle.Show(new Bootstrapper(commandLine));
|
||||
DeployManager.Channel = Settings.Prop.Channel;
|
||||
Settings.Prop.BootstrapperStyle.Show(new Bootstrapper(commandLine));
|
||||
}
|
||||
|
||||
Terminate();
|
||||
|
@ -86,7 +86,7 @@ namespace Bloxstrap
|
||||
public Bootstrapper(string? launchCommandLine = null)
|
||||
{
|
||||
LaunchCommandLine = launchCommandLine;
|
||||
FreshInstall = String.IsNullOrEmpty(App.Settings.VersionGuid);
|
||||
FreshInstall = String.IsNullOrEmpty(App.Settings.Prop.VersionGuid);
|
||||
}
|
||||
|
||||
// this is called from BootstrapperStyleForm.SetupDialog()
|
||||
@ -99,7 +99,7 @@ namespace Bloxstrap
|
||||
}
|
||||
|
||||
#if !DEBUG
|
||||
if (!App.IsFirstRun && App.Settings.CheckForUpdates)
|
||||
if (!App.IsFirstRun && App.Settings.Prop.CheckForUpdates)
|
||||
await CheckForUpdates();
|
||||
#endif
|
||||
|
||||
@ -107,13 +107,13 @@ namespace Bloxstrap
|
||||
|
||||
// if bloxstrap is installing for the first time but is running, prompt to close roblox
|
||||
// if roblox needs updating but is running, ignore update for now
|
||||
if (!Directory.Exists(VersionFolder) && CheckIfRunning(true) || App.Settings.VersionGuid != VersionGuid && !CheckIfRunning(false))
|
||||
if (!Directory.Exists(VersionFolder) && CheckIfRunning(true) || App.Settings.Prop.VersionGuid != VersionGuid && !CheckIfRunning(false))
|
||||
await InstallLatestVersion();
|
||||
|
||||
await ApplyModifications();
|
||||
|
||||
if (App.IsFirstRun)
|
||||
App.SettingsManager.ShouldSave = true;
|
||||
App.Settings.ShouldSave = true;
|
||||
|
||||
await ApplyModifications();
|
||||
|
||||
if (App.IsFirstRun || FreshInstall)
|
||||
Register();
|
||||
@ -122,7 +122,7 @@ namespace Bloxstrap
|
||||
|
||||
await RbxFpsUnlocker.CheckInstall();
|
||||
|
||||
App.SettingsManager.Save();
|
||||
App.Settings.Save();
|
||||
|
||||
if (App.IsFirstRun && App.IsNoLaunch)
|
||||
Dialog.ShowSuccess($"{App.ProjectName} has successfully installed");
|
||||
@ -167,7 +167,7 @@ namespace Bloxstrap
|
||||
foreach (string arg in App.LaunchArgs)
|
||||
startInfo.ArgumentList.Add(arg);
|
||||
|
||||
App.SettingsManager.Save();
|
||||
App.Settings.Save();
|
||||
|
||||
Process.Start(startInfo);
|
||||
|
||||
@ -178,7 +178,7 @@ namespace Bloxstrap
|
||||
{
|
||||
Dialog.Message = "Connecting to Roblox...";
|
||||
|
||||
ClientVersion clientVersion = await DeployManager.GetLastDeploy(App.Settings.Channel);
|
||||
ClientVersion clientVersion = await DeployManager.GetLastDeploy(App.Settings.Prop.Channel);
|
||||
VersionGuid = clientVersion.VersionGuid;
|
||||
VersionFolder = Path.Combine(Directories.Versions, VersionGuid);
|
||||
VersionPackageManifest = await PackageManifest.Get(VersionGuid);
|
||||
@ -217,7 +217,7 @@ namespace Bloxstrap
|
||||
|
||||
Dialog.Message = "Starting Roblox...";
|
||||
|
||||
if (LaunchCommandLine == "--app" && App.Settings.UseDisableAppPatch)
|
||||
if (LaunchCommandLine == "--app" && App.Settings.Prop.UseDisableAppPatch)
|
||||
{
|
||||
Utilities.OpenWebsite("https://www.roblox.com/games");
|
||||
return;
|
||||
@ -226,8 +226,8 @@ namespace Bloxstrap
|
||||
// launch time isn't really required for all launches, but it's usually just safest to do this
|
||||
LaunchCommandLine += " --launchtime=" + DateTimeOffset.Now.ToUnixTimeMilliseconds();
|
||||
|
||||
if (App.Settings.Channel.ToLower() != DeployManager.DefaultChannel.ToLower())
|
||||
LaunchCommandLine += " -channel " + App.Settings.Channel.ToLower();
|
||||
if (App.Settings.Prop.Channel.ToLower() != DeployManager.DefaultChannel.ToLower())
|
||||
LaunchCommandLine += " -channel " + App.Settings.Prop.Channel.ToLower();
|
||||
|
||||
LaunchCommandLine += " -startEvent " + startEventName;
|
||||
|
||||
@ -247,7 +247,7 @@ namespace Bloxstrap
|
||||
return;
|
||||
}
|
||||
|
||||
if (App.Settings.RFUEnabled && Process.GetProcessesByName("rbxfpsunlocker").Length == 0)
|
||||
if (App.Settings.Prop.RFUEnabled && Process.GetProcessesByName("rbxfpsunlocker").Length == 0)
|
||||
{
|
||||
ProcessStartInfo startInfo = new()
|
||||
{
|
||||
@ -257,11 +257,11 @@ namespace Bloxstrap
|
||||
|
||||
rbxFpsUnlocker = Process.Start(startInfo);
|
||||
|
||||
if (App.Settings.RFUAutoclose)
|
||||
if (App.Settings.Prop.RFUAutoclose)
|
||||
shouldWait = true;
|
||||
}
|
||||
|
||||
if (App.Settings.MultiInstanceLaunching)
|
||||
if (App.Settings.Prop.MultiInstanceLaunching)
|
||||
{
|
||||
// this might be a bit problematic since this mutex will be released when the first launched instance is closed...
|
||||
singletonMutex = new Mutex(true, "ROBLOX_singletonMutex");
|
||||
@ -271,7 +271,7 @@ namespace Bloxstrap
|
||||
// event fired, wait for 3 seconds then close
|
||||
await Task.Delay(3000);
|
||||
|
||||
if (App.Settings.UseDiscordRichPresence)
|
||||
if (App.Settings.Prop.UseDiscordRichPresence)
|
||||
{
|
||||
richPresence = new DiscordRichPresence();
|
||||
richPresence.MonitorGameActivity();
|
||||
@ -287,7 +287,7 @@ namespace Bloxstrap
|
||||
|
||||
richPresence?.Dispose();
|
||||
|
||||
if (App.Settings.RFUAutoclose && rbxFpsUnlocker is not null)
|
||||
if (App.Settings.Prop.RFUAutoclose && rbxFpsUnlocker is not null)
|
||||
rbxFpsUnlocker.Kill();
|
||||
}
|
||||
|
||||
@ -400,7 +400,7 @@ namespace Bloxstrap
|
||||
.WriteToFile(newMenuShortcut);
|
||||
}
|
||||
|
||||
if (App.Settings.CreateDesktopIcon && !File.Exists(Path.Combine(Directories.Desktop, "Play Roblox.lnk")))
|
||||
if (App.Settings.Prop.CreateDesktopIcon && !File.Exists(Path.Combine(Directories.Desktop, "Play Roblox.lnk")))
|
||||
{
|
||||
ShellLink.Shortcut.CreateShortcut(Directories.Application, "", Directories.Application, 0)
|
||||
.WriteToFile(Path.Combine(Directories.Desktop, "Play Roblox.lnk"));
|
||||
@ -413,7 +413,7 @@ namespace Bloxstrap
|
||||
|
||||
Dialog.Message = $"Uninstalling {App.ProjectName}...";
|
||||
|
||||
App.SettingsManager.ShouldSave = false;
|
||||
App.Settings.ShouldSave = false;
|
||||
|
||||
// check if stock bootstrapper is still installed
|
||||
RegistryKey? bootstrapperKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\CurrentVersion\Uninstall\roblox-player");
|
||||
@ -540,9 +540,9 @@ namespace Bloxstrap
|
||||
File.Delete(filename);
|
||||
}
|
||||
|
||||
string oldVersionFolder = Path.Combine(Directories.Versions, App.Settings.VersionGuid);
|
||||
string oldVersionFolder = Path.Combine(Directories.Versions, App.Settings.Prop.VersionGuid);
|
||||
|
||||
if (VersionGuid != App.Settings.VersionGuid && Directory.Exists(oldVersionFolder))
|
||||
if (VersionGuid != App.Settings.Prop.VersionGuid && Directory.Exists(oldVersionFolder))
|
||||
{
|
||||
// and also to delete our old version folder
|
||||
Directory.Delete(oldVersionFolder, true);
|
||||
@ -551,7 +551,7 @@ namespace Bloxstrap
|
||||
|
||||
Dialog.CancelEnabled = false;
|
||||
|
||||
App.Settings.VersionGuid = VersionGuid;
|
||||
App.Settings.Prop.VersionGuid = VersionGuid;
|
||||
}
|
||||
|
||||
private async Task ApplyModifications()
|
||||
@ -567,10 +567,10 @@ namespace Bloxstrap
|
||||
if (!Directory.Exists(modFolder))
|
||||
Directory.CreateDirectory(modFolder);
|
||||
|
||||
await CheckModPreset(App.Settings.UseOldDeathSound, @"content\sounds\ouch.ogg", "OldDeath.ogg");
|
||||
await CheckModPreset(App.Settings.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowCursor.png", "OldCursor.png");
|
||||
await CheckModPreset(App.Settings.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowFarCursor.png", "OldFarCursor.png");
|
||||
await CheckModPreset(App.Settings.UseDisableAppPatch, @"ExtraContent\places\Mobile.rbxl", "");
|
||||
await CheckModPreset(App.Settings.Prop.UseOldDeathSound, @"content\sounds\ouch.ogg", "OldDeath.ogg");
|
||||
await CheckModPreset(App.Settings.Prop.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowCursor.png", "OldCursor.png");
|
||||
await CheckModPreset(App.Settings.Prop.UseOldMouseCursor, @"content\textures\Cursors\KeyboardMouse\ArrowFarCursor.png", "OldFarCursor.png");
|
||||
await CheckModPreset(App.Settings.Prop.UseDisableAppPatch, @"ExtraContent\places\Mobile.rbxl", "");
|
||||
|
||||
await ReShade.CheckModifications();
|
||||
|
||||
|
@ -82,7 +82,7 @@ namespace Bloxstrap.Dialogs
|
||||
public void SetupDialog()
|
||||
{
|
||||
this.Text = App.ProjectName;
|
||||
this.Icon = App.Settings.BootstrapperIcon.GetIcon();
|
||||
this.Icon = App.Settings.Prop.BootstrapperIcon.GetIcon();
|
||||
|
||||
if (Bootstrapper is null)
|
||||
{
|
||||
|
@ -40,7 +40,7 @@ namespace Bloxstrap.Dialogs
|
||||
Bootstrapper = bootstrapper;
|
||||
|
||||
// have to convert icon -> bitmap since winforms scaling is poop
|
||||
this.IconBox.BackgroundImage = App.Settings.BootstrapperIcon.GetIcon().ToBitmap();
|
||||
this.IconBox.BackgroundImage = App.Settings.Prop.BootstrapperIcon.GetIcon().ToBitmap();
|
||||
|
||||
ScaleWindow();
|
||||
SetupDialog();
|
||||
|
@ -38,7 +38,7 @@ namespace Bloxstrap.Dialogs
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
if (App.Settings.Theme.GetFinal() == Theme.Dark)
|
||||
if (App.Settings.Prop.Theme.GetFinal() == Theme.Dark)
|
||||
{
|
||||
this.labelMessage.ForeColor = SystemColors.Window;
|
||||
this.buttonCancel.Image = Properties.Resources.DarkCancelButton;
|
||||
@ -48,14 +48,14 @@ namespace Bloxstrap.Dialogs
|
||||
|
||||
Bootstrapper = bootstrapper;
|
||||
|
||||
this.IconBox.BackgroundImage = App.Settings.BootstrapperIcon.GetBitmap();
|
||||
this.IconBox.BackgroundImage = App.Settings.Prop.BootstrapperIcon.GetBitmap();
|
||||
|
||||
SetupDialog();
|
||||
}
|
||||
|
||||
private void ButtonCancel_MouseEnter(object sender, EventArgs e)
|
||||
{
|
||||
if (App.Settings.Theme.GetFinal() == Theme.Dark)
|
||||
if (App.Settings.Prop.Theme.GetFinal() == Theme.Dark)
|
||||
{
|
||||
this.buttonCancel.Image = Properties.Resources.DarkCancelButtonHover;
|
||||
}
|
||||
@ -67,7 +67,7 @@ namespace Bloxstrap.Dialogs
|
||||
|
||||
private void ButtonCancel_MouseLeave(object sender, EventArgs e)
|
||||
{
|
||||
if (App.Settings.Theme.GetFinal() == Theme.Dark)
|
||||
if (App.Settings.Prop.Theme.GetFinal() == Theme.Dark)
|
||||
{
|
||||
this.buttonCancel.Image = Properties.Resources.DarkCancelButton;
|
||||
}
|
||||
|
@ -68,7 +68,7 @@ namespace Bloxstrap.Dialogs
|
||||
|
||||
Dialog = new TaskDialogPage()
|
||||
{
|
||||
Icon = new TaskDialogIcon(App.Settings.BootstrapperIcon.GetIcon()),
|
||||
Icon = new TaskDialogIcon(App.Settings.Prop.BootstrapperIcon.GetIcon()),
|
||||
Caption = App.ProjectName,
|
||||
|
||||
Buttons = { TaskDialogButton.Cancel },
|
||||
|
@ -16,27 +16,14 @@ namespace Bloxstrap.Enums
|
||||
{
|
||||
public static void Show(this BootstrapperStyle bootstrapperStyle, Bootstrapper? bootstrapper = null)
|
||||
{
|
||||
Form dialog;
|
||||
|
||||
switch (bootstrapperStyle)
|
||||
Form dialog = bootstrapperStyle switch
|
||||
{
|
||||
case BootstrapperStyle.VistaDialog:
|
||||
dialog = new VistaDialog(bootstrapper);
|
||||
break;
|
||||
|
||||
case BootstrapperStyle.LegacyDialog2009:
|
||||
dialog = new LegacyDialog2009(bootstrapper);
|
||||
break;
|
||||
|
||||
case BootstrapperStyle.LegacyDialog2011:
|
||||
dialog = new LegacyDialog2011(bootstrapper);
|
||||
break;
|
||||
|
||||
case BootstrapperStyle.ProgressDialog:
|
||||
default:
|
||||
dialog = new ProgressDialog(bootstrapper);
|
||||
break;
|
||||
}
|
||||
BootstrapperStyle.VistaDialog => new VistaDialog(bootstrapper),
|
||||
BootstrapperStyle.LegacyDialog2009 => new LegacyDialog2009(bootstrapper),
|
||||
BootstrapperStyle.LegacyDialog2011 => new LegacyDialog2011(bootstrapper),
|
||||
BootstrapperStyle.ProgressDialog => new ProgressDialog(bootstrapper),
|
||||
_ => new ProgressDialog(bootstrapper)
|
||||
};
|
||||
|
||||
if (bootstrapper is null)
|
||||
{
|
||||
|
@ -174,7 +174,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
}
|
||||
};
|
||||
|
||||
if (!App.Settings.HideRPCButtons)
|
||||
if (!App.Settings.Prop.HideRPCButtons)
|
||||
{
|
||||
buttons.Insert(0, new DiscordRPC.Button()
|
||||
{
|
||||
|
@ -60,7 +60,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
string fileLocation = Path.Combine(folderLocation, "rbxfpsunlocker.exe");
|
||||
string settingsLocation = Path.Combine(folderLocation, "settings");
|
||||
|
||||
if (!App.Settings.RFUEnabled)
|
||||
if (!App.Settings.Prop.RFUEnabled)
|
||||
{
|
||||
if (Directory.Exists(folderLocation))
|
||||
{
|
||||
@ -83,7 +83,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
if (File.Exists(fileLocation))
|
||||
{
|
||||
// no new release published, return
|
||||
if (App.Settings.RFUVersion == releaseInfo.TagName)
|
||||
if (App.Settings.Prop.RFUVersion == releaseInfo.TagName)
|
||||
return;
|
||||
|
||||
CheckIfRunning();
|
||||
@ -104,7 +104,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
if (!File.Exists(settingsLocation))
|
||||
await File.WriteAllTextAsync(settingsLocation, Settings);
|
||||
|
||||
App.Settings.RFUVersion = releaseInfo.TagName;
|
||||
App.Settings.Prop.RFUVersion = releaseInfo.TagName;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
// config synchronization will be done whenever roblox updates or whenever we launch roblox
|
||||
|
||||
string modFolderConfigPath = ConfigLocation;
|
||||
string versionFolderConfigPath = Path.Combine(Directories.Versions, App.Settings.VersionGuid, "ReShade.ini");
|
||||
string versionFolderConfigPath = Path.Combine(Directories.Versions, App.Settings.Prop.VersionGuid, "ReShade.ini");
|
||||
|
||||
// we shouldn't be here if the mod config doesn't already exist
|
||||
if (!File.Exists(modFolderConfigPath))
|
||||
@ -323,13 +323,13 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
|
||||
string injectorLocation = Path.Combine(Directories.Modifications, "dxgi.dll");
|
||||
|
||||
if (!App.Settings.UseReShadeExtraviPresets)
|
||||
if (!App.Settings.Prop.UseReShadeExtraviPresets)
|
||||
{
|
||||
UninstallExtraviPresets();
|
||||
App.Settings.ExtraviPresetsVersion = "";
|
||||
App.Settings.Prop.ExtraviPresetsVersion = "";
|
||||
}
|
||||
|
||||
if (!App.Settings.UseReShade)
|
||||
if (!App.Settings.Prop.UseReShade)
|
||||
{
|
||||
Debug.WriteLine("[ReShade] Uninstalling ReShade...");
|
||||
|
||||
@ -337,7 +337,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
File.Delete(injectorLocation);
|
||||
File.Delete(ConfigLocation);
|
||||
|
||||
App.Settings.ReShadeConfigVersion = "";
|
||||
App.Settings.Prop.ReShadeConfigVersion = "";
|
||||
|
||||
//DeleteShaders("Stock");
|
||||
if (Directory.Exists(BaseDirectory))
|
||||
@ -373,7 +373,7 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
|
||||
// check if we should download a fresh copy of the config
|
||||
// extravi may need to update the config ota, in which case we'll redownload it
|
||||
if (!File.Exists(ConfigLocation) || versionManifest is not null && App.Settings.ReShadeConfigVersion != versionManifest.ConfigFile)
|
||||
if (!File.Exists(ConfigLocation) || versionManifest is not null && App.Settings.Prop.ReShadeConfigVersion != versionManifest.ConfigFile)
|
||||
shouldFetchConfig = true;
|
||||
|
||||
if (shouldFetchReShade)
|
||||
@ -393,15 +393,15 @@ namespace Bloxstrap.Helpers.Integrations
|
||||
await DownloadConfig();
|
||||
|
||||
if (versionManifest is not null)
|
||||
App.Settings.ReShadeConfigVersion = versionManifest.ConfigFile;
|
||||
App.Settings.Prop.ReShadeConfigVersion = versionManifest.ConfigFile;
|
||||
}
|
||||
|
||||
await DownloadShaders("Stock");
|
||||
|
||||
if (App.Settings.UseReShadeExtraviPresets && App.Settings.ExtraviPresetsVersion != versionManifest!.Presets)
|
||||
if (App.Settings.Prop.UseReShadeExtraviPresets && App.Settings.Prop.ExtraviPresetsVersion != versionManifest!.Presets)
|
||||
{
|
||||
await InstallExtraviPresets();
|
||||
App.Settings.ExtraviPresetsVersion = versionManifest.Presets;
|
||||
App.Settings.Prop.ExtraviPresetsVersion = versionManifest.Presets;
|
||||
}
|
||||
|
||||
SynchronizeConfigFile();
|
||||
|
65
Bloxstrap/Helpers/JsonManager.cs
Normal file
65
Bloxstrap/Helpers/JsonManager.cs
Normal file
@ -0,0 +1,65 @@
|
||||
using Bloxstrap.Models;
|
||||
using Bloxstrap.Properties;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
|
||||
namespace Bloxstrap.Helpers
|
||||
{
|
||||
public class JsonManager<T> where T : new()
|
||||
{
|
||||
public T Prop { get; set; } = new T();
|
||||
public bool ShouldSave { get; set; } = true;
|
||||
public string FileLocation => Path.Combine(Directories.Base, $"{typeof(T).Name}.json");
|
||||
//public string? FileLocation { get; set; } = null;
|
||||
|
||||
public void Load()
|
||||
{
|
||||
//if (String.IsNullOrEmpty(FileLocation))
|
||||
// throw new ArgumentNullException("No FileLocation has been set");
|
||||
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] Loading JSON from {FileLocation}...");
|
||||
|
||||
try
|
||||
{
|
||||
T? settings = JsonSerializer.Deserialize<T>(File.ReadAllText(FileLocation));
|
||||
Prop = settings ?? throw new ArgumentNullException("Deserialization returned null");
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] JSON loaded successfully!");
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] Failed to load JSON! ({ex.Message})");
|
||||
}
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] Attempting to save JSON to {FileLocation}...");
|
||||
|
||||
//if (!ShouldSave || String.IsNullOrEmpty(FileLocation))
|
||||
//{
|
||||
// Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] Aborted save (ShouldSave set to false or FileLocation not set)");
|
||||
// return;
|
||||
//}
|
||||
|
||||
if (!ShouldSave)
|
||||
{
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] Aborted save (ShouldSave set to false)");
|
||||
return;
|
||||
}
|
||||
|
||||
string json = JsonSerializer.Serialize(Prop, new JsonSerializerOptions { WriteIndented = true });
|
||||
File.WriteAllText(FileLocation, json);
|
||||
|
||||
Debug.WriteLine($"[JsonManager<{typeof(T).Name}>] JSON saved!");
|
||||
}
|
||||
}
|
||||
}
|
@ -51,17 +51,17 @@ namespace Bloxstrap.Helpers
|
||||
|
||||
if (key == "channel")
|
||||
{
|
||||
if (val.ToLower() != App.Settings.Channel.ToLower())
|
||||
if (val.ToLower() != App.Settings.Prop.Channel.ToLower())
|
||||
{
|
||||
MessageBoxResult result = !App.Settings.PromptChannelChange ? MessageBoxResult.Yes : App.ShowMessageBox(
|
||||
$"{App.ProjectName} was launched with the Roblox build channel set to {val}, however your current preferred channel is {App.Settings.Channel}.\n\n" +
|
||||
$"Would you like to switch channels from {App.Settings.Channel} to {val}?",
|
||||
MessageBoxResult result = !App.Settings.Prop.PromptChannelChange ? MessageBoxResult.Yes : App.ShowMessageBox(
|
||||
$"{App.ProjectName} was launched with the Roblox build channel set to {val}, however your current preferred channel is {App.Settings.Prop.Channel}.\n\n" +
|
||||
$"Would you like to switch channels from {App.Settings.Prop.Channel} to {val}?",
|
||||
MessageBoxImage.Question,
|
||||
MessageBoxButton.YesNo
|
||||
);
|
||||
|
||||
if (result == MessageBoxResult.Yes)
|
||||
App.Settings.Channel = val;
|
||||
App.Settings.Prop.Channel = val;
|
||||
}
|
||||
|
||||
// we'll set the arg when launching
|
||||
|
@ -3,7 +3,7 @@ using Bloxstrap.Helpers;
|
||||
|
||||
namespace Bloxstrap.Models
|
||||
{
|
||||
public class SettingsFormat
|
||||
public class Settings
|
||||
{
|
||||
// could these be moved to a separate file (something like State.json)?
|
||||
// the only problem is i havent yet figured out a way to boil down the settings handler to reduce boilerplate
|
@ -3,10 +3,18 @@
|
||||
"Bloxstrap (Launch)": {
|
||||
"commandName": "Project"
|
||||
},
|
||||
"Bloxstrap (Quiet)": {
|
||||
"Bloxstrap (Quiet Launch)": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "-quiet"
|
||||
},
|
||||
"Bloxstrap (Uninstall)": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "-uninstall"
|
||||
},
|
||||
"Bloxstrap (Quiet Uninstall)": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "-uninstall -quiet"
|
||||
},
|
||||
"Bloxstrap (Menu)": {
|
||||
"commandName": "Project",
|
||||
"commandLineArgs": "-preferences"
|
||||
|
@ -1,83 +0,0 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
|
||||
using Bloxstrap.Models;
|
||||
|
||||
namespace Bloxstrap
|
||||
{
|
||||
public class SettingsManager
|
||||
{
|
||||
public SettingsFormat Settings = new();
|
||||
public bool ShouldSave = false;
|
||||
private bool IsSaving = false;
|
||||
|
||||
private string? _saveLocation;
|
||||
public string? SaveLocation
|
||||
{
|
||||
get => _saveLocation;
|
||||
|
||||
set
|
||||
{
|
||||
if (!String.IsNullOrEmpty(_saveLocation))
|
||||
return;
|
||||
|
||||
_saveLocation = value;
|
||||
|
||||
string settingsJson = "";
|
||||
|
||||
if (File.Exists(_saveLocation))
|
||||
settingsJson = File.ReadAllText(_saveLocation);
|
||||
|
||||
Debug.WriteLine(settingsJson);
|
||||
|
||||
try
|
||||
{
|
||||
var settings = JsonSerializer.Deserialize<SettingsFormat>(settingsJson);
|
||||
|
||||
if (settings is null)
|
||||
throw new Exception("Deserialization returned null");
|
||||
|
||||
Settings = settings;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Debug.WriteLine($"Failed to fetch settings! Reverting to defaults... ({ex.Message})");
|
||||
// Settings = new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Save()
|
||||
{
|
||||
if (IsSaving)
|
||||
{
|
||||
// sometimes Save() is called at the same time from both Main() and Exit(),
|
||||
// so this is here to avoid the program exiting before saving
|
||||
|
||||
Thread.Sleep(1000);
|
||||
return;
|
||||
}
|
||||
|
||||
IsSaving = true;
|
||||
|
||||
Debug.WriteLine("Attempting to save...");
|
||||
|
||||
string SettingsJson = JsonSerializer.Serialize(Settings, new JsonSerializerOptions { WriteIndented = true });
|
||||
Debug.WriteLine(SettingsJson);
|
||||
|
||||
if (!ShouldSave || SaveLocation is null)
|
||||
{
|
||||
Debug.WriteLine("ShouldSave set to false, not saving...");
|
||||
return;
|
||||
}
|
||||
|
||||
// save settings
|
||||
File.WriteAllText(SaveLocation, SettingsJson);
|
||||
|
||||
IsSaving = false;
|
||||
}
|
||||
}
|
||||
}
|
@ -20,7 +20,7 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public ICommand PreviewBootstrapperCommand => new RelayCommand(PreviewBootstrapper);
|
||||
|
||||
private void PreviewBootstrapper() => App.Settings.BootstrapperStyle.Show();
|
||||
private void PreviewBootstrapper() => App.Settings.Prop.BootstrapperStyle.Show();
|
||||
|
||||
public BootstrapperViewModel(Page page)
|
||||
{
|
||||
@ -29,20 +29,20 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool UpdateCheckingEnabled
|
||||
{
|
||||
get => App.Settings.CheckForUpdates;
|
||||
set => App.Settings.CheckForUpdates = value;
|
||||
get => App.Settings.Prop.CheckForUpdates;
|
||||
set => App.Settings.Prop.CheckForUpdates = value;
|
||||
}
|
||||
|
||||
public bool ChannelChangePromptingEnabled
|
||||
{
|
||||
get => App.Settings.PromptChannelChange;
|
||||
set => App.Settings.PromptChannelChange = value;
|
||||
get => App.Settings.Prop.PromptChannelChange;
|
||||
set => App.Settings.Prop.PromptChannelChange = value;
|
||||
}
|
||||
|
||||
public bool MultiInstanceLaunchingEnabled
|
||||
{
|
||||
get => App.Settings.MultiInstanceLaunching;
|
||||
set => App.Settings.MultiInstanceLaunching = value;
|
||||
get => App.Settings.Prop.MultiInstanceLaunching;
|
||||
set => App.Settings.Prop.MultiInstanceLaunching = value;
|
||||
}
|
||||
|
||||
public IReadOnlyDictionary<string, Theme> Themes { get; set; } = new Dictionary<string, Theme>()
|
||||
@ -54,10 +54,10 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public string Theme
|
||||
{
|
||||
get => Themes.FirstOrDefault(x => x.Value == App.Settings.Theme).Key;
|
||||
get => Themes.FirstOrDefault(x => x.Value == App.Settings.Prop.Theme).Key;
|
||||
set
|
||||
{
|
||||
App.Settings.Theme = Themes[value];
|
||||
App.Settings.Prop.Theme = Themes[value];
|
||||
((MainWindow)Window.GetWindow(_page)!).SetTheme();
|
||||
}
|
||||
}
|
||||
@ -72,8 +72,8 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public string Dialog
|
||||
{
|
||||
get => Dialogs.FirstOrDefault(x => x.Value == App.Settings.BootstrapperStyle).Key;
|
||||
set => App.Settings.BootstrapperStyle = Dialogs[value];
|
||||
get => Dialogs.FirstOrDefault(x => x.Value == App.Settings.Prop.BootstrapperStyle).Key;
|
||||
set => App.Settings.Prop.BootstrapperStyle = Dialogs[value];
|
||||
}
|
||||
|
||||
public IReadOnlyDictionary<string, BootstrapperIcon> Icons { get; set; } = new Dictionary<string, BootstrapperIcon>()
|
||||
@ -90,8 +90,8 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public string Icon
|
||||
{
|
||||
get => Icons.FirstOrDefault(x => x.Value == App.Settings.BootstrapperIcon).Key;
|
||||
set => App.Settings.BootstrapperIcon = Icons[value];
|
||||
get => Icons.FirstOrDefault(x => x.Value == App.Settings.Prop.BootstrapperIcon).Key;
|
||||
set => App.Settings.Prop.BootstrapperIcon = Icons[value];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,8 @@ namespace Bloxstrap.ViewModels
|
||||
public event PropertyChangedEventHandler? PropertyChanged;
|
||||
public void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
|
||||
private IEnumerable<string> _channels = DeployManager.ChannelsAbstracted.Contains(App.Settings.Channel) ? DeployManager.ChannelsAbstracted : DeployManager.ChannelsAll;
|
||||
private bool _showAllChannels = !DeployManager.ChannelsAbstracted.Contains(App.Settings.Channel);
|
||||
private IEnumerable<string> _channels = DeployManager.ChannelsAbstracted.Contains(App.Settings.Prop.Channel) ? DeployManager.ChannelsAbstracted : DeployManager.ChannelsAll;
|
||||
private bool _showAllChannels = !DeployManager.ChannelsAbstracted.Contains(App.Settings.Prop.Channel);
|
||||
|
||||
public ICommand BrowseInstallLocationCommand => new RelayCommand(BrowseInstallLocation);
|
||||
|
||||
@ -28,7 +28,7 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public InstallationViewModel()
|
||||
{
|
||||
Task.Run(() => LoadChannelDeployInfo(App.Settings.Channel));
|
||||
Task.Run(() => LoadChannelDeployInfo(App.Settings.Prop.Channel));
|
||||
}
|
||||
|
||||
private async Task LoadChannelDeployInfo(string channel)
|
||||
@ -62,8 +62,8 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool CreateDesktopIcon
|
||||
{
|
||||
get => App.Settings.CreateDesktopIcon;
|
||||
set => App.Settings.CreateDesktopIcon = value;
|
||||
get => App.Settings.Prop.CreateDesktopIcon;
|
||||
set => App.Settings.Prop.CreateDesktopIcon = value;
|
||||
}
|
||||
|
||||
public IEnumerable<string> Channels
|
||||
@ -74,12 +74,12 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public string Channel
|
||||
{
|
||||
get => App.Settings.Channel;
|
||||
get => App.Settings.Prop.Channel;
|
||||
set
|
||||
{
|
||||
//Task.Run(() => GetChannelInfo(value));
|
||||
Task.Run(() => LoadChannelDeployInfo(value));
|
||||
App.Settings.Channel = value;
|
||||
App.Settings.Prop.Channel = value;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,7 @@ namespace Bloxstrap.ViewModels
|
||||
public ICommand OpenReShadeFolderCommand => new RelayCommand(OpenReShadeFolder);
|
||||
public ICommand ShowReShadeHelpCommand => new RelayCommand(ShowReShadeHelp);
|
||||
|
||||
public bool CanOpenReShadeFolder => App.Settings.UseReShade;
|
||||
public bool CanOpenReShadeFolder => App.Settings.Prop.UseReShade;
|
||||
|
||||
public IntegrationsViewModel(Page page)
|
||||
{
|
||||
@ -41,10 +41,10 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool DiscordActivityEnabled
|
||||
{
|
||||
get => App.Settings.UseDiscordRichPresence;
|
||||
get => App.Settings.Prop.UseDiscordRichPresence;
|
||||
set
|
||||
{
|
||||
App.Settings.UseDiscordRichPresence = value;
|
||||
App.Settings.Prop.UseDiscordRichPresence = value;
|
||||
|
||||
if (!value)
|
||||
{
|
||||
@ -56,16 +56,16 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool DiscordActivityJoinEnabled
|
||||
{
|
||||
get => !App.Settings.HideRPCButtons;
|
||||
set => App.Settings.HideRPCButtons = !value;
|
||||
get => !App.Settings.Prop.HideRPCButtons;
|
||||
set => App.Settings.Prop.HideRPCButtons = !value;
|
||||
}
|
||||
|
||||
public bool ReShadeEnabled
|
||||
{
|
||||
get => App.Settings.UseReShade;
|
||||
get => App.Settings.Prop.UseReShade;
|
||||
set
|
||||
{
|
||||
App.Settings.UseReShade = value;
|
||||
App.Settings.Prop.UseReShade = value;
|
||||
ReShadePresetsEnabled = value;
|
||||
OnPropertyChanged(nameof(ReShadePresetsEnabled));
|
||||
}
|
||||
@ -73,16 +73,16 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool ReShadePresetsEnabled
|
||||
{
|
||||
get => App.Settings.UseReShadeExtraviPresets;
|
||||
set => App.Settings.UseReShadeExtraviPresets = value;
|
||||
get => App.Settings.Prop.UseReShadeExtraviPresets;
|
||||
set => App.Settings.Prop.UseReShadeExtraviPresets = value;
|
||||
}
|
||||
|
||||
public bool RbxFpsUnlockerEnabled
|
||||
{
|
||||
get => App.Settings.RFUEnabled;
|
||||
get => App.Settings.Prop.RFUEnabled;
|
||||
set
|
||||
{
|
||||
App.Settings.RFUEnabled = value;
|
||||
App.Settings.Prop.RFUEnabled = value;
|
||||
RbxFpsUnlockerAutocloseEnabled = value;
|
||||
OnPropertyChanged(nameof(RbxFpsUnlockerAutocloseEnabled));
|
||||
}
|
||||
@ -90,8 +90,8 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool RbxFpsUnlockerAutocloseEnabled
|
||||
{
|
||||
get => App.Settings.RFUAutoclose;
|
||||
set => App.Settings.RFUAutoclose = value;
|
||||
get => App.Settings.Prop.RFUAutoclose;
|
||||
set => App.Settings.Prop.RFUAutoclose = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,13 +64,13 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
if (!App.IsFirstRun)
|
||||
{
|
||||
App.SettingsManager.ShouldSave = true;
|
||||
App.Settings.ShouldSave = true;
|
||||
|
||||
if (App.BaseDirectory != _originalBaseDirectory)
|
||||
{
|
||||
App.ShowMessageBox($"{App.ProjectName} will install to the new location you've set the next time it runs.", MessageBoxImage.Information);
|
||||
|
||||
App.Settings.VersionGuid = "";
|
||||
App.Settings.Prop.VersionGuid = "";
|
||||
|
||||
using (RegistryKey registryKey = Registry.CurrentUser.CreateSubKey($@"Software\{App.ProjectName}"))
|
||||
{
|
||||
@ -82,9 +82,9 @@ namespace Bloxstrap.ViewModels
|
||||
// preserve settings
|
||||
// we don't need to copy the bootstrapper over since the install process will do that automatically
|
||||
|
||||
App.SettingsManager.Save();
|
||||
App.Settings.Save();
|
||||
|
||||
File.Copy(Path.Combine(App.BaseDirectory, "Settings.json"), Path.Combine(App.BaseDirectory, "Settings.json"));
|
||||
//File.Copy(Path.Combine(App.BaseDirectory, "Settings.json"), Path.Combine(App.BaseDirectory, "Settings.json"));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,20 +18,20 @@ namespace Bloxstrap.ViewModels
|
||||
|
||||
public bool OldDeathSoundEnabled
|
||||
{
|
||||
get => App.Settings.UseOldDeathSound;
|
||||
set => App.Settings.UseOldDeathSound = value;
|
||||
get => App.Settings.Prop.UseOldDeathSound;
|
||||
set => App.Settings.Prop.UseOldDeathSound = value;
|
||||
}
|
||||
|
||||
public bool OldMouseCursorEnabled
|
||||
{
|
||||
get => App.Settings.UseOldMouseCursor;
|
||||
set => App.Settings.UseOldMouseCursor = value;
|
||||
get => App.Settings.Prop.UseOldMouseCursor;
|
||||
set => App.Settings.Prop.UseOldMouseCursor = value;
|
||||
}
|
||||
|
||||
public bool DisableAppPatchEnabled
|
||||
{
|
||||
get => App.Settings.UseDisableAppPatch;
|
||||
set => App.Settings.UseDisableAppPatch = value;
|
||||
get => App.Settings.Prop.UseDisableAppPatch;
|
||||
set => App.Settings.Prop.UseDisableAppPatch = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ namespace Bloxstrap.Views
|
||||
{
|
||||
var theme = ThemeType.Light;
|
||||
|
||||
if (App.Settings.Theme.GetFinal() == Enums.Theme.Dark)
|
||||
if (App.Settings.Prop.Theme.GetFinal() == Enums.Theme.Dark)
|
||||
theme = ThemeType.Dark;
|
||||
|
||||
_themeService.SetTheme(theme);
|
||||
|
Loading…
Reference in New Issue
Block a user