launcher/Kiseki.Launcher/Controller.cs

112 lines
3.4 KiB
C#

using Kiseki.Launcher.Helpers;
namespace Kiseki.Launcher
{
public enum ProgressBarState
{
Normal,
Marquee
}
public class Controller
{
private readonly Dictionary<string, string> Arguments = new();
public event EventHandler<string>? OnPageHeadingChange;
public event EventHandler<int>? OnProgressBarAdd;
public event EventHandler<ProgressBarState>? OnProgressBarStateChange;
public event EventHandler<string[]>? OnErrorShow;
public event EventHandler? OnLaunch;
public Controller(string payload)
{
if (!Base64.IsBase64String(payload))
{
ErrorShow($"Failed to launch {Constants.PROJECT_NAME}", $"Try launching {Constants.PROJECT_NAME} from the website again.");
return;
}
// TODO: The payload will soon include more members; update this accordingly
payload = Base64.ConvertBase64ToString(payload);
if (payload.Split("|").Length != 2)
{
ErrorShow($"Failed to launch {Constants.PROJECT_NAME}", $"Try launching {Constants.PROJECT_NAME} from the website again.");
return;
}
Arguments["JoinScriptURL"] = payload.Split("|")[0];
Arguments["Ticket"] = payload.Split("|")[1];
}
public async void Start()
{
PageHeadingChange("Connecting to Kiseki...");
bool marquee = true;
await foreach (int progressValue in StreamBackgroundOperationProgressAsync())
{
if (marquee)
{
PageHeadingChange("Downloading Kiseki...");
ProgressBarStateChange(ProgressBarState.Normal);
marquee = false;
}
ProgressBarAdd(progressValue);
}
static async IAsyncEnumerable<int> StreamBackgroundOperationProgressAsync()
{
await Task.Delay(2800);
yield return 4;
await Task.Delay(200);
}
PageHeadingChange("Installing Kiseki...");
ProgressBarStateChange(ProgressBarState.Marquee);
await Task.Delay(2200);
PageHeadingChange("Configuring Kiseki...");
await Task.Delay(1200);
PageHeadingChange("Launching Kiseki...");
await Task.Delay(3000);
Launch();
}
public async void Dispose()
{
// TODO: This will only be called when the user closes the window OR we're done (i.e. the Launched event is called.)
}
protected virtual void PageHeadingChange(string heading)
{
OnPageHeadingChange!.Invoke(this, heading);
}
protected virtual void ProgressBarAdd(int value)
{
OnProgressBarAdd!.Invoke(this, value);
}
protected virtual void ProgressBarStateChange(ProgressBarState state)
{
OnProgressBarStateChange!.Invoke(this, state);
}
protected virtual void ErrorShow(string heading, string text)
{
// ugly hack for now (I don't want to derive EventHandler just for this)
OnErrorShow!.Invoke(this, new string[] { heading, text });
}
protected virtual void Launch()
{
OnLaunch!.Invoke(this, EventArgs.Empty);
}
}
}