mirror of
https://github.com/bloxstraplabs/bloxstrap.git
synced 2025-06-23 23:00:23 -07:00
Compare commits
6 Commits
4ea1c3c0e1
...
9e78bd4116
Author | SHA1 | Date | |
---|---|---|---|
|
9e78bd4116 | ||
|
f75d755e9e | ||
|
12bc3ef6e7 | ||
|
b54e44aa58 | ||
|
3e9e0fba16 | ||
|
7be311dda6 |
@ -65,6 +65,20 @@ namespace Bloxstrap
|
||||
);
|
||||
|
||||
private static bool _showingExceptionDialog = false;
|
||||
|
||||
private static string? _webUrl = null;
|
||||
public static string WebUrl
|
||||
{
|
||||
get {
|
||||
if (_webUrl != null)
|
||||
return _webUrl;
|
||||
|
||||
string url = ConstructBloxstrapWebUrl();
|
||||
if (Settings.Loaded) // only cache if settings are done loading
|
||||
_webUrl = url;
|
||||
return url;
|
||||
}
|
||||
}
|
||||
|
||||
public static void Terminate(ErrorCode exitCode = ErrorCode.ERROR_SUCCESS)
|
||||
{
|
||||
@ -126,6 +140,25 @@ namespace Bloxstrap
|
||||
Terminate(ErrorCode.ERROR_INSTALL_FAILURE);
|
||||
}
|
||||
|
||||
public static string ConstructBloxstrapWebUrl()
|
||||
{
|
||||
// dont let user switch web environment if debug mode is not on
|
||||
if (Settings.Prop.WebEnvironment == WebEnvironment.Production || !Settings.Prop.DeveloperMode)
|
||||
return "bloxstraplabs.com";
|
||||
|
||||
string? sub = Settings.Prop.WebEnvironment.GetDescription();
|
||||
return $"web-{sub}.bloxstraplabs.com";
|
||||
}
|
||||
|
||||
public static bool CanSendLogs()
|
||||
{
|
||||
// non developer mode always uses production
|
||||
if (!Settings.Prop.DeveloperMode || Settings.Prop.WebEnvironment == WebEnvironment.Production)
|
||||
return IsProductionBuild;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static async Task<GithubRelease?> GetLatestRelease()
|
||||
{
|
||||
const string LOG_IDENT = "App::GetLatestRelease";
|
||||
@ -157,7 +190,7 @@ namespace Bloxstrap
|
||||
|
||||
try
|
||||
{
|
||||
await HttpClient.GetAsync($"https://bloxstraplabs.com/metrics/post?key={key}&value={value}");
|
||||
await HttpClient.GetAsync($"https://{WebUrl}/metrics/post?key={key}&value={value}");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -167,13 +200,13 @@ namespace Bloxstrap
|
||||
|
||||
public static async void SendLog()
|
||||
{
|
||||
if (!Settings.Prop.EnableAnalytics || !IsProductionBuild)
|
||||
if (!Settings.Prop.EnableAnalytics || !CanSendLogs())
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
await HttpClient.PostAsync(
|
||||
$"https://bloxstraplabs.com/metrics/post-exception",
|
||||
$"https://{WebUrl}/metrics/post-exception",
|
||||
new StringContent(Logger.AsDocument)
|
||||
);
|
||||
}
|
||||
@ -347,6 +380,9 @@ namespace Bloxstrap
|
||||
Settings.Save();
|
||||
}
|
||||
|
||||
Logger.WriteLine(LOG_IDENT, $"Developer mode: {Settings.Prop.DeveloperMode}");
|
||||
Logger.WriteLine(LOG_IDENT, $"Web environment: {Settings.Prop.WebEnvironment}");
|
||||
|
||||
Locale.Set(Settings.Prop.Locale);
|
||||
|
||||
if (!LaunchSettings.BypassUpdateCheck)
|
||||
|
26
Bloxstrap/Enums/WebEnvironment.cs
Normal file
26
Bloxstrap/Enums/WebEnvironment.cs
Normal file
@ -0,0 +1,26 @@
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace Bloxstrap.Enums
|
||||
{
|
||||
[JsonConverter(typeof(JsonStringEnumConverter))]
|
||||
public enum WebEnvironment
|
||||
{
|
||||
[Description("prod")]
|
||||
Production,
|
||||
|
||||
[Description("stage")]
|
||||
Staging,
|
||||
|
||||
[Description("dev")]
|
||||
Dev,
|
||||
|
||||
[Description("pizza")]
|
||||
DevPizza,
|
||||
|
||||
[Description("matt")]
|
||||
DevMatt,
|
||||
|
||||
[Description("local")]
|
||||
Local
|
||||
}
|
||||
}
|
22
Bloxstrap/Extensions/TEnumEx.cs
Normal file
22
Bloxstrap/Extensions/TEnumEx.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System.ComponentModel;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Bloxstrap.Extensions
|
||||
{
|
||||
internal static class TEnumEx
|
||||
{
|
||||
public static string? GetDescription<TEnum>(this TEnum e)
|
||||
{
|
||||
string? enumName = e?.ToString();
|
||||
if (enumName == null)
|
||||
return null;
|
||||
|
||||
FieldInfo? field = e?.GetType().GetField(enumName);
|
||||
if (field == null)
|
||||
return null;
|
||||
|
||||
DescriptionAttribute? attribute = field.GetCustomAttribute<DescriptionAttribute>();
|
||||
return attribute?.Description;
|
||||
}
|
||||
}
|
||||
}
|
@ -13,6 +13,8 @@ namespace Bloxstrap
|
||||
/// </summary>
|
||||
public string? LastFileHash { get; private set; }
|
||||
|
||||
public bool Loaded { get; set; } = false;
|
||||
|
||||
public virtual string ClassName => typeof(T).Name;
|
||||
|
||||
public virtual string FileLocation => Path.Combine(Paths.Base, $"{ClassName}.json");
|
||||
@ -35,6 +37,7 @@ namespace Bloxstrap
|
||||
throw new ArgumentNullException("Deserialization returned null");
|
||||
|
||||
Prop = settings;
|
||||
Loaded = true;
|
||||
LastFileHash = MD5Hash.FromString(contents);
|
||||
|
||||
App.Logger.WriteLine(LOG_IDENT, "Loaded successfully!");
|
||||
|
@ -10,6 +10,8 @@ namespace Bloxstrap.Models.Persistable
|
||||
public string BootstrapperTitle { get; set; } = App.ProjectName;
|
||||
public string BootstrapperIconCustomLocation { get; set; } = "";
|
||||
public Theme Theme { get; set; } = Theme.Default;
|
||||
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
|
||||
public bool DeveloperMode { get; set; } = false;
|
||||
public bool CheckForUpdates { get; set; } = true;
|
||||
public bool MultiInstanceLaunching { get; set; } = false;
|
||||
public bool ConfirmLaunches { get; set; } = false;
|
||||
@ -21,6 +23,7 @@ namespace Bloxstrap.Models.Persistable
|
||||
public bool BackgroundUpdatesEnabled { get; set; } = true;
|
||||
public bool DebugDisableVersionPackageCleanup { get; set; } = false;
|
||||
public string? SelectedCustomTheme { get; set; } = null;
|
||||
public WebEnvironment WebEnvironment { get; set; } = WebEnvironment.Production;
|
||||
|
||||
// integration configuration
|
||||
public bool EnableActivityTracking { get; set; } = true;
|
||||
|
@ -26,7 +26,8 @@
|
||||
|
||||
public static string Application { get; private set; } = "";
|
||||
|
||||
public static string CustomFont => Path.Combine(Modifications, "content\\fonts\\CustomFont.ttf");
|
||||
public static string Fonts => Path.Combine("content\\fonts");
|
||||
public static string CustomFont => Path.Combine(Fonts, "CustomFont.ttf");
|
||||
|
||||
public static bool Initialized => !String.IsNullOrEmpty(Base);
|
||||
|
||||
|
@ -29,6 +29,14 @@
|
||||
<ui:ToggleSwitch IsChecked="{Binding AnalyticsEnabled, Mode=TwoWay}" />
|
||||
</controls:OptionControl>
|
||||
|
||||
<!-- This does not need i18n as this is locked behind "Developer Mode" -->
|
||||
<controls:OptionControl
|
||||
Visibility="{Binding Path=WebEnvironmentVisibility, Mode=OneTime}"
|
||||
Header="Web environment"
|
||||
Description="Site to use for metrics">
|
||||
<ComboBox Width="200" Padding="10,5,10,5" ItemsSource="{Binding WebEnvironments, Mode=OneWay}" SelectedValue="{Binding WebEnvironment, Mode=TwoWay}" />
|
||||
</controls:OptionControl>
|
||||
|
||||
<ui:CardExpander Margin="0,8,0,0" IsExpanded="True">
|
||||
<ui:CardExpander.Header>
|
||||
<Grid>
|
||||
|
@ -99,7 +99,7 @@
|
||||
Description="{x:Static resources:Strings.Menu_Mods_Misc_CustomFont_Description}">
|
||||
<StackPanel>
|
||||
<ui:Button Icon="DocumentAdd16" Content="{x:Static resources:Strings.Menu_Mods_Misc_CustomFont_Choose}" Command="{Binding ManageCustomFontCommand}" Visibility="{Binding ChooseCustomFontVisibility, Mode=OneWay}" />
|
||||
<ui:Button Icon="Delete16" Content="{x:Static resources:Strings.Menu_Mods_Misc_CustomFont_Remove}" Appearance="Danger" Command="{Binding ManageCustomFontCommand}" Visibility="{Binding DeleteCustomFontVisibility, Mode=OneWay}" />
|
||||
<ui:Button Icon="Delete16" FontFamily="{Binding DeleteCustomFontFontFamily}" Content="{x:Static resources:Strings.Menu_Mods_Misc_CustomFont_Remove}" Appearance="Danger" Command="{Binding ManageCustomFontCommand}" Visibility="{Binding DeleteCustomFontVisibility, Mode=OneWay}" />
|
||||
</StackPanel>
|
||||
</controls:OptionControl>
|
||||
</StackPanel>
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Windows.Input;
|
||||
using System.Windows;
|
||||
using System.Windows.Input;
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
using ICSharpCode.SharpZipLib.Zip;
|
||||
using Microsoft.Win32;
|
||||
@ -7,6 +8,8 @@ namespace Bloxstrap.UI.ViewModels.Settings
|
||||
{
|
||||
public class BloxstrapViewModel : NotifyPropertyChangedViewModel
|
||||
{
|
||||
public WebEnvironment[] WebEnvironments => Enum.GetValues<WebEnvironment>();
|
||||
|
||||
public bool UpdateCheckingEnabled
|
||||
{
|
||||
get => App.Settings.Prop.CheckForUpdates;
|
||||
@ -19,6 +22,14 @@ namespace Bloxstrap.UI.ViewModels.Settings
|
||||
set => App.Settings.Prop.EnableAnalytics = value;
|
||||
}
|
||||
|
||||
public WebEnvironment WebEnvironment
|
||||
{
|
||||
get => App.Settings.Prop.WebEnvironment;
|
||||
set => App.Settings.Prop.WebEnvironment = value;
|
||||
}
|
||||
|
||||
public Visibility WebEnvironmentVisibility => App.Settings.Prop.DeveloperMode ? Visibility.Visible : Visibility.Collapsed;
|
||||
|
||||
public bool ShouldExportConfig { get; set; } = true;
|
||||
|
||||
public bool ShouldExportLogs { get; set; } = true;
|
||||
|
@ -9,8 +9,10 @@ using Windows.Win32.Foundation;
|
||||
|
||||
using CommunityToolkit.Mvvm.Input;
|
||||
|
||||
using Bloxstrap.Models.SettingTasks;
|
||||
using Bloxstrap.AppData;
|
||||
using System.Drawing.Text;
|
||||
using Wpf.Ui.Controls;
|
||||
using System.Windows.Media;
|
||||
|
||||
namespace Bloxstrap.UI.ViewModels.Settings
|
||||
{
|
||||
@ -52,9 +54,12 @@ namespace Bloxstrap.UI.ViewModels.Settings
|
||||
|
||||
TextFontTask.NewState = dialog.FileName;
|
||||
}
|
||||
|
||||
|
||||
OnPropertyChanged(nameof(ChooseCustomFontVisibility));
|
||||
OnPropertyChanged(nameof(DeleteCustomFontVisibility));
|
||||
OnPropertyChanged(nameof(CustomFontName));
|
||||
OnPropertyChanged(nameof(DeleteCustomFontFontFamily));
|
||||
}
|
||||
|
||||
public ICommand OpenModsFolderCommand => new RelayCommand(OpenModsFolder);
|
||||
@ -63,6 +68,18 @@ namespace Bloxstrap.UI.ViewModels.Settings
|
||||
|
||||
public Visibility DeleteCustomFontVisibility => !String.IsNullOrEmpty(TextFontTask.NewState) ? Visibility.Visible : Visibility.Collapsed;
|
||||
|
||||
public System.Windows.Media.FontFamily DeleteCustomFontFontFamily => new System.Windows.Media.FontFamily($"{TextFontTask.NewState}#{CustomFontName}");
|
||||
|
||||
public string CustomFontName
|
||||
{
|
||||
get
|
||||
{
|
||||
var families = Fonts.GetFontFamilies(TextFontTask.NewState);
|
||||
var first = families.ElementAt(0);
|
||||
return first.ToString().Split("#").ElementAt(first.ToString().Split("#").Count() - 1);
|
||||
}
|
||||
}
|
||||
|
||||
public ICommand ManageCustomFontCommand => new RelayCommand(ManageCustomFont);
|
||||
|
||||
public ICommand OpenCompatSettingsCommand => new RelayCommand(OpenCompatSettings);
|
||||
|
Loading…
Reference in New Issue
Block a user