diff --git a/Bloxstrap/Resources/Strings.Designer.cs b/Bloxstrap/Resources/Strings.Designer.cs index af9ccfd..77db067 100644 --- a/Bloxstrap/Resources/Strings.Designer.cs +++ b/Bloxstrap/Resources/Strings.Designer.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -1703,6 +1702,15 @@ namespace Bloxstrap.Resources { } } + /// + /// Looks up a localized string similar to The entry for '{0}' is not valid as the place filter is not formatted correctly.. + /// + public static string Menu_FastFlagEditor_InvalidPlaceFilter { + get { + return ResourceManager.GetString("Menu.FastFlagEditor.InvalidPlaceFilter", resourceCulture); + } + } + /// /// Looks up a localized string similar to The entry for '{0}' is not valid as the name must start with FFlag, DFInt, etc. /// diff --git a/Bloxstrap/Resources/Strings.resx b/Bloxstrap/Resources/Strings.resx index b5eadc2..c749c3d 100644 --- a/Bloxstrap/Resources/Strings.resx +++ b/Bloxstrap/Resources/Strings.resx @@ -1021,4 +1021,7 @@ Selecting 'No' will ignore this warning and continue installation. System default + + The entry for '{0}' is not valid as the place filter is not formatted correctly. + \ No newline at end of file diff --git a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs index d7d5cf0..767bb96 100644 --- a/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs +++ b/Bloxstrap/UI/Elements/Menu/Pages/FastFlagEditorPage.xaml.cs @@ -22,9 +22,15 @@ namespace Bloxstrap.UI.Elements.Menu.Pages private readonly ObservableCollection _fastFlagList = new(); private readonly List _validPrefixes = new() { - "FFlag", "DFFlag", "SFFlag", "FInt", "DFInt", "FString", "DFString", "FLog", "DFlog" + "FFlag", "DFFlag", "SFFlag", "FInt", "DFInt", "FString", "DFString", "FLog", "DFLog" }; + // values must match the entire string to avoid cases where half the string + // matches but the filter would still be invalid + private readonly Regex _boolFilterPattern = new("(?:true|false)(;[\\d]{1,})+$"); + private readonly Regex _intFilterPattern = new("([\\d]{1,})?(;[\\d]{1,})+$"); + private readonly Regex _stringFilterPattern = new("^[^;]*(;[\\d]{1,})+$"); + private bool _showPresets = false; private string _searchFilter = ""; @@ -253,17 +259,20 @@ namespace Bloxstrap.UI.Elements.Menu.Pages string lowerValue = value.ToLowerInvariant(); string errorMessage = ""; - if (!_validPrefixes.Where(x => name.StartsWith(x)).Any()) + if (!_validPrefixes.Any(name.StartsWith)) errorMessage = Bloxstrap.Resources.Strings.Menu_FastFlagEditor_InvalidPrefix; else if (!name.All(x => char.IsLetterOrDigit(x) || x == '_')) errorMessage = Bloxstrap.Resources.Strings.Menu_FastFlagEditor_InvalidCharacter; + + if (name.EndsWith("_PlaceFilter") || name.EndsWith("_DataCenterFilter")) + errorMessage = !ValidateFilter(name, value) ? Bloxstrap.Resources.Strings.Menu_FastFlagEditor_InvalidPlaceFilter : ""; else if ((name.StartsWith("FInt") || name.StartsWith("DFInt")) && !Int32.TryParse(value, out _)) errorMessage = Bloxstrap.Resources.Strings.Menu_FastFlagEditor_InvalidNumberValue; else if ((name.StartsWith("FFlag") || name.StartsWith("DFFlag")) && lowerValue != "true" && lowerValue != "false") errorMessage = Bloxstrap.Resources.Strings.Menu_FastFlagEditor_InvalidBoolValue; - + if (!String.IsNullOrEmpty(errorMessage)) - { + { Frontend.ShowMessageBox(String.Format(errorMessage, name), MessageBoxImage.Error); return false; } @@ -271,6 +280,18 @@ namespace Bloxstrap.UI.Elements.Menu.Pages return true; } + private bool ValidateFilter(string name, string value) + { + if(name.StartsWith("FFlag") || name.StartsWith("DFFlag")) + return _boolFilterPattern.IsMatch(value); + if (name.StartsWith("FInt") || name.StartsWith("DFInt")) + return _intFilterPattern.IsMatch(value); + if (name.StartsWith("FString") || name.StartsWith("DFString") || name.StartsWith("FLog") || name.StartsWith("DFLog")) + return _stringFilterPattern.IsMatch(value); + + return false; + } + // refresh list on page load to synchronize with preset page private void Page_Loaded(object sender, RoutedEventArgs e) => ReloadList();