More arguments + debug settings (#4814)
Some checks failed
CI (Debug) / build (push) Has been cancelled
CI (Release) / build (push) Has been cancelled
CI (Release) / release (push) Has been cancelled
CI (Release) / release-test (push) Has been cancelled

* ability to disable package cleanup

* add version and channel arguments

* ignore duplicate flags

* fix version argument not working

* add the force flag

* fix compiler warnings

* fix indentation
This commit is contained in:
Matt 2025-03-12 09:12:31 +00:00 committed by GitHub
parent 9d356b0b71
commit 893aecbdd1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 90 additions and 29 deletions

View File

@ -45,8 +45,8 @@ namespace Bloxstrap
private readonly FastZipEvents _fastZipEvents = new();
private readonly CancellationTokenSource _cancelTokenSource = new();
private readonly IAppData AppData;
private readonly LaunchMode _launchMode;
private IAppData AppData = default!;
private LaunchMode _launchMode;
private string _launchCommandLine = App.LaunchSettings.RobloxLaunchArgs;
private string _latestVersionGuid = null!;
@ -60,7 +60,7 @@ namespace Bloxstrap
private long _totalDownloadedBytes = 0;
private bool _packageExtractionSuccess = true;
private bool _mustUpgrade => String.IsNullOrEmpty(AppData.State.VersionGuid) || !File.Exists(AppData.ExecutablePath);
private bool _mustUpgrade => App.LaunchSettings.ForceFlag.Active || String.IsNullOrEmpty(AppData.State.VersionGuid) || !File.Exists(AppData.ExecutablePath);
private bool _noConnection = false;
private AsyncMutex? _mutex;
@ -91,6 +91,11 @@ namespace Bloxstrap
_fastZipEvents.DirectoryFailure += (_, e) => throw e.Exception;
_fastZipEvents.ProcessFile += (_, e) => e.ContinueRunning = !_cancelTokenSource.IsCancellationRequested;
SetupAppData();
}
private void SetupAppData()
{
AppData = IsStudioLaunch ? new RobloxStudioData() : new RobloxPlayerData();
Deployment.BinaryType = AppData.BinaryType;
}
@ -288,12 +293,17 @@ namespace Bloxstrap
using var key = Registry.CurrentUser.CreateSubKey($"SOFTWARE\\ROBLOX Corporation\\Environments\\{AppData.RegistryName}\\Channel");
var match = Regex.Match(
App.LaunchSettings.RobloxLaunchArgs,
"channel:([a-zA-Z0-9-_]+)",
App.LaunchSettings.RobloxLaunchArgs,
"channel:([a-zA-Z0-9-_]+)",
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant
);
if (match.Groups.Count == 2)
if (App.LaunchSettings.ChannelFlag.Active && !string.IsNullOrEmpty(App.LaunchSettings.ChannelFlag.Data))
{
App.Logger.WriteLine(LOG_IDENT, $"Channel set to {App.LaunchSettings.ChannelFlag.Data} from arguments");
Deployment.Channel = App.LaunchSettings.ChannelFlag.Data.ToLowerInvariant();
}
else if (match.Groups.Count == 2)
{
Deployment.Channel = match.Groups[1].Value.ToLowerInvariant();
}
@ -310,29 +320,50 @@ namespace Bloxstrap
if (!Deployment.IsDefaultChannel)
App.SendStat("robloxChannel", Deployment.Channel);
ClientVersion clientVersion;
try
if (!App.LaunchSettings.VersionFlag.Active || string.IsNullOrEmpty(App.LaunchSettings.VersionFlag.Data))
{
clientVersion = await Deployment.GetInfo();
ClientVersion clientVersion;
try
{
clientVersion = await Deployment.GetInfo();
}
catch (InvalidChannelException ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Resetting channel from {Deployment.Channel} because {ex.StatusCode}");
Deployment.Channel = Deployment.DefaultChannel;
clientVersion = await Deployment.GetInfo();
}
key.SetValueSafe("www.roblox.com", Deployment.IsDefaultChannel ? "" : Deployment.Channel);
_latestVersionGuid = clientVersion.VersionGuid;
}
catch (InvalidChannelException ex)
else
{
App.Logger.WriteLine(LOG_IDENT, $"Resetting channel from {Deployment.Channel} because {ex.StatusCode}");
Deployment.Channel = Deployment.DefaultChannel;
clientVersion = await Deployment.GetInfo();
App.Logger.WriteLine(LOG_IDENT, $"Version set to {App.LaunchSettings.VersionFlag.Data} from arguments");
_latestVersionGuid = App.LaunchSettings.VersionFlag.Data;
}
key.SetValueSafe("www.roblox.com", Deployment.IsDefaultChannel ? "" : Deployment.Channel);
_latestVersionGuid = clientVersion.VersionGuid;
_latestVersionDirectory = Path.Combine(Paths.Versions, _latestVersionGuid);
string pkgManifestUrl = Deployment.GetLocation($"/{_latestVersionGuid}-rbxPkgManifest.txt");
var pkgManifestData = await App.HttpClient.GetStringAsync(pkgManifestUrl);
_versionPackageManifest = new(pkgManifestData);
// this can happen if version is set through arguments
if (_launchMode == LaunchMode.Unknown)
{
App.Logger.WriteLine(LOG_IDENT, "Identifying launch mode from package manifest");
bool isPlayer = _versionPackageManifest.Exists(x => x.Name == "RobloxApp.zip");
App.Logger.WriteLine(LOG_IDENT, $"isPlayer: {isPlayer}");
_launchMode = isPlayer ? LaunchMode.Player : LaunchMode.Studio;
SetupAppData(); // we need to set it up again
}
}
private void StartRoblox()
@ -930,20 +961,23 @@ namespace Bloxstrap
allPackageHashes.AddRange(App.State.Prop.Player.PackageHashes.Values);
allPackageHashes.AddRange(App.State.Prop.Studio.PackageHashes.Values);
foreach (string hash in cachedPackageHashes)
if (!App.Settings.Prop.DebugDisableVersionPackageCleanup)
{
if (!allPackageHashes.Contains(hash))
foreach (string hash in cachedPackageHashes)
{
App.Logger.WriteLine(LOG_IDENT, $"Deleting unused package {hash}");
try
if (!allPackageHashes.Contains(hash))
{
File.Delete(Path.Combine(Paths.Downloads, hash));
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Failed to delete {hash}!");
App.Logger.WriteException(LOG_IDENT, ex);
App.Logger.WriteLine(LOG_IDENT, $"Deleting unused package {hash}");
try
{
File.Delete(Path.Combine(Paths.Downloads, hash));
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Failed to delete {hash}!");
App.Logger.WriteException(LOG_IDENT, ex);
}
}
}
}

View File

@ -3,6 +3,10 @@
public enum LaunchMode
{
None,
/// <summary>
/// Launch mode will be determined inside the bootstrapper. Only works if the VersionFlag is set.
/// </summary>
Unknown,
Player,
Studio,
StudioAuth

View File

@ -32,6 +32,12 @@ namespace Bloxstrap
public LaunchFlag StudioFlag { get; } = new("studio");
public LaunchFlag VersionFlag { get; } = new("version");
public LaunchFlag ChannelFlag { get; } = new("channel");
public LaunchFlag ForceFlag { get; } = new("force");
#if DEBUG
public bool BypassUpdateCheck => true;
#else
@ -87,6 +93,13 @@ namespace Bloxstrap
RobloxLaunchArgs = arg;
startIdx = 1;
}
else if (arg.StartsWith("version-"))
{
App.Logger.WriteLine(LOG_IDENT, "Got version argument");
VersionFlag.Active = true;
VersionFlag.Data = arg;
startIdx = 1;
}
}
// parse
@ -108,6 +121,12 @@ namespace Bloxstrap
continue;
}
if (flag.Active)
{
App.Logger.WriteLine(LOG_IDENT, $"Tried to set {identifier} flag twice");
continue;
}
flag.Active = true;
if (i < Args.Length - 1 && Args[i+1] is string nextArg && !nextArg.StartsWith('-'))
@ -122,6 +141,9 @@ namespace Bloxstrap
}
}
if (VersionFlag.Active)
RobloxLaunchMode = LaunchMode.Unknown; // determine in bootstrapper
if (PlayerFlag.Active)
ParsePlayer(PlayerFlag.Data);
else if (StudioFlag.Active)

View File

@ -17,6 +17,7 @@ namespace Bloxstrap.Models.Persistable
public bool UseFastFlagManager { get; set; } = true;
public bool WPFSoftwareRender { get; set; } = false;
public bool EnableAnalytics { get; set; } = true;
public bool DebugDisableVersionPackageCleanup { get; set; } = false;
public string? SelectedCustomTheme { get; set; } = null;
// integration configuration