using System.Windows; using System.Windows.Input; using CommunityToolkit.Mvvm.Input; using ICSharpCode.SharpZipLib.Zip; using Microsoft.Win32; namespace Bloxstrap.UI.ViewModels.Settings { public class BloxstrapViewModel : NotifyPropertyChangedViewModel { public WebEnvironment[] WebEnvironments => Enum.GetValues(); public bool UpdateCheckingEnabled { get => App.Settings.Prop.CheckForUpdates; set => App.Settings.Prop.CheckForUpdates = value; } public bool AnalyticsEnabled { get => App.Settings.Prop.EnableAnalytics; set => App.Settings.Prop.EnableAnalytics = value; } public WebEnvironment WebEnvironment { get => App.Settings.Prop.WebEnvironment; set => App.Settings.Prop.WebEnvironment = value; } public Visibility DeveloperOptionVisibility => App.Settings.Prop.DeveloperMode ? Visibility.Visible : Visibility.Collapsed; public bool ShouldExportConfig { get; set; } = true; public bool ShouldExportLogs { get; set; } = true; public ICommand DebugCrashCommand => new RelayCommand(DebugCrash); public ICommand ExportDataCommand => new RelayCommand(ExportData); private void DebugCrash() { throw new ApplicationException("Pretend like something terrible has happened"); } private void ExportData() { string timestamp = DateTime.UtcNow.ToString("yyyyMMdd'T'HHmmss'Z'"); var dialog = new SaveFileDialog { FileName = $"Bloxstrap-export-{timestamp}.zip", Filter = $"{Strings.FileTypes_ZipArchive}|*.zip" }; if (dialog.ShowDialog() != true) return; using var memStream = new MemoryStream(); using var zipStream = new ZipOutputStream(memStream); if (ShouldExportConfig) { var files = new List() { App.Settings.FileLocation, App.State.FileLocation, App.FastFlags.FileLocation }; AddFilesToZipStream(zipStream, files, "Config/"); } if (ShouldExportLogs && Directory.Exists(Paths.Logs)) { var files = Directory.GetFiles(Paths.Logs) .Where(x => !x.Equals(App.Logger.FileLocation, StringComparison.OrdinalIgnoreCase)); AddFilesToZipStream(zipStream, files, "Logs/"); } zipStream.CloseEntry(); zipStream.Finish(); memStream.Position = 0; using var outputStream = File.OpenWrite(dialog.FileName); memStream.CopyTo(outputStream); Process.Start("explorer.exe", $"/select,\"{dialog.FileName}\""); } private void AddFilesToZipStream(ZipOutputStream zipStream, IEnumerable files, string directory) { foreach (string file in files) { if (!File.Exists(file)) continue; var entry = new ZipEntry(directory + Path.GetFileName(file)); entry.DateTime = DateTime.Now; zipStream.PutNextEntry(entry); using var fileStream = File.OpenRead(file); fileStream.CopyTo(zipStream); } } } }