bloxstrap/Bloxstrap/UI/ViewModels/Settings/BloxstrapViewModel.cs
2024-10-28 00:35:37 +00:00

91 lines
2.8 KiB
C#

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 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 bool ShouldExportConfig { get; set; } = true;
public bool ShouldExportLogs { get; set; } = true;
public ICommand ExportDataCommand => new RelayCommand(ExportData);
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<string>()
{
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();
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<string> 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);
}
}
}
}