Skip to content

Commit

Permalink
don't crash if mod or package extraction fails
Browse files Browse the repository at this point in the history
  • Loading branch information
bluepilledgreat committed Mar 1, 2025
1 parent 4785464 commit 0275552
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 9 deletions.
52 changes: 43 additions & 9 deletions Bloxstrap/Bootstrapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public class Bootstrapper
private double _taskbarProgressIncrement;
private double _taskbarProgressMaximum;
private long _totalDownloadedBytes = 0;
private bool _packageExtractionSuccess = true;

private bool _mustUpgrade => String.IsNullOrEmpty(AppData.State.VersionGuid) || !File.Exists(AppData.ExecutablePath);
private bool _noConnection = false;
Expand All @@ -78,7 +79,15 @@ public Bootstrapper(LaunchMode launchMode)

// https://github.com/icsharpcode/SharpZipLib/blob/master/src/ICSharpCode.SharpZipLib/Zip/FastZip.cs/#L669-L680
// exceptions don't get thrown if we define events without actually binding to the failure events. probably a bug. ¯\_(ツ)_/¯
_fastZipEvents.FileFailure += (_, e) => throw e.Exception;
_fastZipEvents.FileFailure += (_, e) =>
{
// only give a pass to font files (no idea whats wrong with them)
if (!e.Name.EndsWith(".ttf"))
throw e.Exception;

App.Logger.WriteLine("FastZipEvents::OnFileFailure", $"Failed to extract {e.Name}");
_packageExtractionSuccess = false;
};
_fastZipEvents.DirectoryFailure += (_, e) => throw e.Exception;
_fastZipEvents.ProcessFile += (_, e) => e.ContinueRunning = !_cancelTokenSource.IsCancellationRequested;

Expand Down Expand Up @@ -221,6 +230,8 @@ public async Task Run()
}
}

bool allModificationsApplied = true;

if (!_noConnection)
{
if (AppData.State.VersionGuid != _latestVersionGuid || _mustUpgrade)
Expand All @@ -231,7 +242,7 @@ public async Task Run()

// we require deployment details for applying modifications for a worst case scenario,
// where we'd need to restore files from a package that isn't present on disk and needs to be redownloaded
await ApplyModifications();
allModificationsApplied = await ApplyModifications();
}

// check registry entries for every launch, just in case the stock bootstrapper changes it back
Expand All @@ -245,7 +256,15 @@ public async Task Run()
await mutex.ReleaseAsync();

if (!App.LaunchSettings.NoLaunchFlag.Active && !_cancelTokenSource.IsCancellationRequested)
{
// show some balloon tips
if (!_packageExtractionSuccess)
Frontend.ShowBalloonTip("Failed to extract files", "Some content may be missing. Please force a Roblox reinstallation in settings.", ToolTipIcon.Warning);
else if (!allModificationsApplied)
Frontend.ShowBalloonTip("Failed to apply modifications", "Not all modifications will be present with the current launch.", ToolTipIcon.Warning);

StartRoblox();
}

await mutex.ReleaseAsync();

Expand Down Expand Up @@ -927,10 +946,12 @@ private async Task UpgradeRoblox()
_isInstalling = false;
}

private async Task ApplyModifications()
private async Task<bool> ApplyModifications()
{
const string LOG_IDENT = "Bootstrapper::ApplyModifications";

bool success = true;

SetStatus(Strings.Bootstrapper_Status_ApplyingModifications);

// handle file mods
Expand Down Expand Up @@ -1006,7 +1027,7 @@ private async Task ApplyModifications()
foreach (string file in Directory.GetFiles(Paths.Modifications, "*.*", SearchOption.AllDirectories))
{
if (_cancelTokenSource.IsCancellationRequested)
return;
return true;

// get relative directory path
string relativeFile = file.Substring(Paths.Modifications.Length + 1);
Expand Down Expand Up @@ -1038,10 +1059,18 @@ private async Task ApplyModifications()
Directory.CreateDirectory(Path.GetDirectoryName(fileVersionFolder)!);

Filesystem.AssertReadOnly(fileVersionFolder);
File.Copy(fileModFolder, fileVersionFolder, true);
Filesystem.AssertReadOnly(fileVersionFolder);

App.Logger.WriteLine(LOG_IDENT, $"{relativeFile} has been copied to the version folder");
try
{
File.Copy(fileModFolder, fileVersionFolder, true);
Filesystem.AssertReadOnly(fileVersionFolder);
App.Logger.WriteLine(LOG_IDENT, $"{relativeFile} has been copied to the version folder");
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, $"Failed to apply modification ({relativeFile})");
App.Logger.WriteException(LOG_IDENT, ex);
success = false;
}
}

// the manifest is primarily here to keep track of what files have been
Expand Down Expand Up @@ -1088,7 +1117,7 @@ private async Task ApplyModifications()
if (package is not null)
{
if (_cancelTokenSource.IsCancellationRequested)
return;
return true;

await DownloadPackage(package);
ExtractPackage(package, entry.Value);
Expand All @@ -1099,6 +1128,11 @@ private async Task ApplyModifications()
App.State.Save();

App.Logger.WriteLine(LOG_IDENT, $"Finished checking file mods");

if (!success)
App.Logger.WriteLine(LOG_IDENT, "Failed to apply all modifications");

return success;
}

private async Task DownloadPackage(Package package)
Expand Down
12 changes: 12 additions & 0 deletions Bloxstrap/UI/Frontend.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,17 @@ private static MessageBoxResult ShowFluentMessageBox(string message, MessageBoxI
return messagebox.Result;
}));
}

public static void ShowBalloonTip(string title, string message, System.Windows.Forms.ToolTipIcon icon = System.Windows.Forms.ToolTipIcon.None, int timeout = 5)
{
var notifyIcon = new System.Windows.Forms.NotifyIcon
{
Icon = Properties.Resources.IconBloxstrap,
Text = App.ProjectName,
Visible = true
};

notifyIcon.ShowBalloonTip(timeout, title, message, icon);
}
}
}

0 comments on commit 0275552

Please sign in to comment.