bloxstrap/Bloxstrap/UI/ViewModels/Menu/BehaviourViewModel.cs

133 lines
4.6 KiB
C#

namespace Bloxstrap.UI.ViewModels.Menu
{
public class BehaviourViewModel : NotifyPropertyChangedViewModel
{
private string _oldVersionGuid = "";
public BehaviourViewModel()
{
Task.Run(() => LoadChannelDeployInfo(App.Settings.Prop.Channel));
}
private async Task LoadChannelDeployInfo(string channel)
{
const string LOG_IDENT = "BehaviourViewModel::LoadChannelDeployInfo";
ShowLoadingError = false;
OnPropertyChanged(nameof(ShowLoadingError));
ChannelInfoLoadingText = "Fetching latest deploy info, please wait...";
OnPropertyChanged(nameof(ChannelInfoLoadingText));
ChannelDeployInfo = null;
OnPropertyChanged(nameof(ChannelDeployInfo));
try
{
ClientVersion info = await RobloxDeployment.GetInfo(channel, true);
ShowChannelWarning = info.IsBehindDefaultChannel;
OnPropertyChanged(nameof(ShowChannelWarning));
ChannelDeployInfo = new DeployInfo
{
Version = info.Version,
VersionGuid = info.VersionGuid,
Timestamp = info.Timestamp?.ToFriendlyString()!
};
OnPropertyChanged(nameof(ChannelDeployInfo));
}
catch (HttpResponseException ex)
{
ShowLoadingError = true;
OnPropertyChanged(nameof(ShowLoadingError));
ChannelInfoLoadingText = ex.ResponseMessage.StatusCode switch
{
HttpStatusCode.NotFound => "The specified channel name does not exist.",
_ => $"Failed to fetch information! (HTTP {(int)ex.ResponseMessage.StatusCode} - {ex.ResponseMessage.ReasonPhrase})",
};
OnPropertyChanged(nameof(ChannelInfoLoadingText));
}
catch (Exception ex)
{
App.Logger.WriteLine(LOG_IDENT, "An exception occurred while fetching channel information");
App.Logger.WriteException(LOG_IDENT, ex);
ShowLoadingError = true;
OnPropertyChanged(nameof(ShowLoadingError));
ChannelInfoLoadingText = $"Failed to fetch information! ({ex.Message})";
OnPropertyChanged(nameof(ChannelInfoLoadingText));
}
}
public bool ShowLoadingError { get; set; } = false;
public bool ShowChannelWarning { get; set; } = false;
public DeployInfo? ChannelDeployInfo { get; private set; } = null;
public string ChannelInfoLoadingText { get; private set; } = null!;
public bool CreateDesktopIcon
{
get => App.Settings.Prop.CreateDesktopIcon;
set => App.Settings.Prop.CreateDesktopIcon = value;
}
public bool UpdateCheckingEnabled
{
get => App.Settings.Prop.CheckForUpdates;
set => App.Settings.Prop.CheckForUpdates = value;
}
public IEnumerable<string> Channels => RobloxDeployment.SelectableChannels;
public string SelectedChannel
{
get => App.Settings.Prop.Channel;
set
{
value = value.Trim();
if (String.IsNullOrEmpty(value))
value = RobloxDeployment.DefaultChannel;
Task.Run(() => LoadChannelDeployInfo(value));
App.Settings.Prop.Channel = value;
}
}
// todo - move to enum attributes?
public IReadOnlyDictionary<string, ChannelChangeMode> ChannelChangeModes => new Dictionary<string, ChannelChangeMode>
{
{ "Change automatically", ChannelChangeMode.Automatic },
{ "Always prompt", ChannelChangeMode.Prompt },
{ "Never change", ChannelChangeMode.Ignore },
};
public string SelectedChannelChangeMode
{
get => ChannelChangeModes.FirstOrDefault(x => x.Value == App.Settings.Prop.ChannelChangeMode).Key;
set => App.Settings.Prop.ChannelChangeMode = ChannelChangeModes[value];
}
public bool ForceRobloxReinstallation
{
get => String.IsNullOrEmpty(App.State.Prop.VersionGuid);
set
{
if (value)
{
_oldVersionGuid = App.State.Prop.VersionGuid;
App.State.Prop.VersionGuid = "";
}
else
{
App.State.Prop.VersionGuid = _oldVersionGuid;
}
}
}
}
}