ServerManagers/src/ConanServerManager/Windows/GameDataWindow.xaml.cs
Brett Hewitson 479e4a64dc GameData Changes
- when changing the gamedata files (add, delete, reload) it will reload all the gamedata files and repopulate the server managers.
- updated the viewmodels to check for valid class names.
2022-06-17 18:41:05 +10:00

321 lines
12 KiB
C#

using Microsoft.WindowsAPICodePack.Dialogs;
using ServerManagerTool.Common.Utils;
using ServerManagerTool.Lib;
using ServerManagerTool.Lib.ViewModel;
using ServerManagerTool.Utils;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using WPFSharp.Globalizer;
namespace ServerManagerTool
{
/// <summary>
/// Interaction logic for GameDataWindow.xaml
/// </summary>
public partial class GameDataWindow : Window
{
private readonly GlobalizedApplication _globalizer = GlobalizedApplication.Instance;
public static readonly DependencyProperty GameDataFilesProperty = DependencyProperty.Register(nameof(GameDataFiles), typeof(GameDataFileList), typeof(GameDataWindow), new PropertyMetadata(null));
public GameDataWindow()
{
InitializeComponent();
WindowUtils.RemoveDefaultResourceDictionary(this, Config.Default.DefaultGlobalizationFile);
this.GameDataFiles = new GameDataFileList();
this.DataContext = this;
}
public GameDataFileList GameDataFiles
{
get { return GetValue(GameDataFilesProperty) as GameDataFileList; }
set { SetValue(GameDataFilesProperty, value); }
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
ReloadGameDataFiles();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_LoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void AddGameData_Click(object sender, RoutedEventArgs e)
{
var dialog = new CommonOpenFileDialog();
dialog.Title = GlobalizedApplication.Instance.GetResourceString("GameDataWindow_AddDialogTitle");
dialog.DefaultExtension = GlobalizedApplication.Instance.GetResourceString("GameDataWindow_GameDataDefaultExtension");
dialog.Filters.Add(new CommonFileDialogFilter(GlobalizedApplication.Instance.GetResourceString("GameDataWindow_AddFilterLabel"), GlobalizedApplication.Instance.GetResourceString("GameDataWindow_AddFilterExtension")));
if (dialog == null || dialog.ShowDialog(this) != CommonFileDialogResult.Ok)
return;
try
{
AddGameDataFile(GameData.UserDataFolder, dialog.FileName);
GameData.Reload();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_AddErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void ClearGameData_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show(_globalizer.GetResourceString("GameDataWindow_ClearLabel"), _globalizer.GetResourceString("GameDataWindow_ClearTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
return;
try
{
if (!GameData.UserDataFolder.Equals(GameData.MainDataFolder, StringComparison.OrdinalIgnoreCase))
{
DeleteAllGameDataFiles(GameData.UserDataFolder);
}
GameData.Reload();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_ClearErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void OpenGameDataFolder_Click(object sender, RoutedEventArgs e)
{
try
{
if (!Directory.Exists(GameData.UserDataFolder))
Directory.CreateDirectory(GameData.UserDataFolder);
Process.Start("explorer.exe", GameData.UserDataFolder);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_OpenErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void GameDataForum_Click(object sender, RoutedEventArgs e)
{
Process.Start(Config.Default.GameDataUrl);
}
private void ReloadGameData_Click(object sender, RoutedEventArgs e)
{
try
{
ReloadGameDataFiles();
GameData.Reload();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_LoadErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void RemoveGameData_Click(object sender, RoutedEventArgs e)
{
if (MessageBox.Show(_globalizer.GetResourceString("GameDataWindow_DeleteLabel"), _globalizer.GetResourceString("GameDataWindow_DeleteTitle"), MessageBoxButton.YesNo, MessageBoxImage.Question) != MessageBoxResult.Yes)
return;
try
{
var gameDataItem = ((GameDataFile)((Button)e.Source).DataContext);
DeleteGameDataFile(gameDataItem.File, true);
GameData.Reload();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_DeleteErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void ValidateGameData_Click(object sender, RoutedEventArgs e)
{
try
{
ValidateAllGameDataFiles(GameData.UserDataFolder);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, _globalizer.GetResourceString("GameDataWindow_ClearErrorTitle"), MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private void AddGameDataFile(string folder, string gameDataFile)
{
if (string.IsNullOrWhiteSpace(folder))
return;
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
var newGameDataFile = Path.Combine(folder, $"{Path.GetFileName(gameDataFile)}");
if (File.Exists(newGameDataFile))
throw new Exception(_globalizer.GetResourceString("GameDataWindow_ExistingFileErrorLabel"));
ValidateGameDataFile(gameDataFile);
File.Copy(gameDataFile, newGameDataFile, true);
LoadGameDataFile(newGameDataFile, true);
}
private void DeleteAllGameDataFiles(string folder)
{
if (string.IsNullOrWhiteSpace(folder) || !Directory.Exists(folder))
return;
var fileList = Directory.GetFiles(folder, $"*.{GlobalizedApplication.Instance.GetResourceString("GameDataWindow_GameDataDefaultExtension")}");
foreach (var file in fileList)
{
DeleteGameDataFile(file, false);
}
LoadGameDataFiles(GameData.UserDataFolder, true, true);
LoadGameDataFiles(GameData.MainDataFolder, false, false);
}
private void DeleteGameDataFile(string file, bool updateList)
{
if (string.IsNullOrWhiteSpace(file) || !File.Exists(file))
return;
File.Delete(file);
if (updateList)
{
var gameDataFiles = GameDataFiles.Where(f => f.File == file).ToList();
foreach (var gameDataFile in gameDataFiles)
{
GameDataFiles.Remove(gameDataFile);
}
}
}
private void LoadGameDataFile(string file, bool isUserData)
{
if (string.IsNullOrWhiteSpace(file) || !File.Exists(file))
return;
BaseGameData baseGameData = null;
try
{
baseGameData = BaseGameData.Load(file);
}
catch
{
// do nothing, just swallow the error
}
var gameDataFile = new GameDataFile
{
CreatedDate = baseGameData?.Created ?? DateTime.MinValue,
File = file,
FileName = string.IsNullOrWhiteSpace(file) ? string.Empty : Path.GetFileNameWithoutExtension(file),
IsUserData = isUserData,
Version = baseGameData?.Version ?? "0.0.0",
HasError = baseGameData == null,
};
GameDataFiles.Add(gameDataFile);
}
private void LoadGameDataFiles(string folder, bool isUserData, bool ClearExisting)
{
if (ClearExisting)
GameDataFiles.Clear();
if (string.IsNullOrWhiteSpace(folder) || !Directory.Exists(folder))
return;
var files = Directory.GetFiles(folder, $"*.{GlobalizedApplication.Instance.GetResourceString("GameDataWindow_GameDataDefaultExtension")}");
foreach (var file in files)
{
LoadGameDataFile(file, isUserData);
}
}
private void ReloadGameDataFiles()
{
if (!GameData.UserDataFolder.Equals(GameData.MainDataFolder, StringComparison.OrdinalIgnoreCase))
{
LoadGameDataFiles(GameData.UserDataFolder, true, true);
}
LoadGameDataFiles(GameData.MainDataFolder, false, false);
}
private void ValidateAllGameDataFiles(string folder)
{
if (string.IsNullOrWhiteSpace(folder) || !Directory.Exists(folder))
{
MessageBox.Show(_globalizer.GetResourceString("GameDataWindow_ValidateSuccessLabel"), _globalizer.GetResourceString("GameDataWindow_ValidateSuccessTitle"), MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
var fileList = Directory.GetFiles(folder, $"*.{GlobalizedApplication.Instance.GetResourceString("GameDataWindow_GameDataDefaultExtension")}");
var errorList = new List<string>();
foreach (var file in fileList)
{
try
{
ValidateGameDataFile(file);
}
catch (Exception ex)
{
errorList.Add($"{Path.GetFileNameWithoutExtension(file)} - {ex.Message}");
}
}
if (errorList.Count > 0)
{
var message = $"{_globalizer.GetResourceString("GameDataWindow_ValidateErrorLabel")}{Environment.NewLine}{string.Join(Environment.NewLine, errorList)}";
var window = new CommandLineWindow(message);
window.OutputTextWrapping = TextWrapping.NoWrap;
window.Height = 300;
window.Width = 600;
window.Title = _globalizer.GetResourceString("GameDataWindow_ValidateErrorTitle");
window.Owner = this;
window.ShowDialog();
}
else
{
MessageBox.Show(_globalizer.GetResourceString("GameDataWindow_ValidateSuccessLabel"), _globalizer.GetResourceString("GameDataWindow_ValidateSuccessTitle"), MessageBoxButton.OK, MessageBoxImage.Information);
}
}
private void ValidateGameDataFile(string file)
{
if (string.IsNullOrWhiteSpace(file) || !File.Exists(file))
return;
MainGameData gameData = null;
try
{
gameData = MainGameData.Load(file, true);
}
catch (Exception ex)
{
var message = _globalizer.GetResourceString("GameDataWindow_ValidateErrorMessage");
throw new Exception(message, ex);
}
if (gameData == null)
{
var message = _globalizer.GetResourceString("GameDataWindow_ValidateErrorMessage");
throw new Exception(message);
}
}
}
}