diff --git a/Dalamud/Utility/SeStringExtensions.cs b/Dalamud/Utility/SeStringExtensions.cs index 4833bd629..7eac9160f 100644 --- a/Dalamud/Utility/SeStringExtensions.cs +++ b/Dalamud/Utility/SeStringExtensions.cs @@ -14,4 +14,18 @@ public static class SeStringExtensions /// The original Lumina SeString. /// The re-parsed Dalamud SeString. public static SeString ToDalamudString(this Lumina.Text.SeString originalString) => SeString.Parse(originalString.RawData); + + /// + /// Validate if character name is valid. + /// Both forename and surname must be between 2 and 15 characters and not total more than 20 characters combined. + /// Only letters, hyphens, and apostrophes can be used. + /// The first character of either name must be a letter. + /// Hyphens cannot be used in succession or placed immediately before or after apostrophes. + /// + /// character name to validate. + /// indicator if character is name is valid. + public static bool IsValidCharacterName(this SeString value) + { + return value.ToString().IsValidCharacterName(); + } } diff --git a/Dalamud/Utility/StringExtensions.cs b/Dalamud/Utility/StringExtensions.cs index 150f06c32..2cfb55fc0 100644 --- a/Dalamud/Utility/StringExtensions.cs +++ b/Dalamud/Utility/StringExtensions.cs @@ -1,4 +1,5 @@ using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Dalamud.Utility; @@ -28,4 +29,38 @@ public static class StringExtensions /// The string to test. /// true if the value parameter is null or an empty string (""), or if value consists exclusively of white-space characters. public static bool IsNullOrWhitespace([NotNullWhen(false)] this string? value) => string.IsNullOrWhiteSpace(value); + + /// + /// Validate if character name is valid. + /// Both forename and surname must be between 2 and 15 characters and not total more than 20 characters combined. + /// Only letters, hyphens, and apostrophes can be used. + /// The first character of either name must be a letter. + /// Hyphens cannot be used in succession or placed immediately before or after apostrophes. + /// + /// character name to validate. + /// indicator if character is name is valid. + public static bool IsValidCharacterName(this string value) + { + if (string.IsNullOrEmpty(value)) return false; + if (value.Length > 21) return false; // add 1 to allow for space + var names = value.Split(' '); + if (names.Length != 2) return false; + var forename = names[0]; + var surname = names[1]; + if (!IsValidName(forename)) return false; + if (!IsValidName(surname)) return false; + return true; + } + + private static bool IsValidName(string name) + { + if (name.Length is < 2 or > 15) return false; + if (name.Any(c => !char.IsLetter(c) && !c.Equals('\'') && !c.Equals('-'))) return false; + if (!char.IsLetter(name[0])) return false; + if (!char.IsUpper(name[0])) return false; + if (name.Contains("--")) return false; + if (name.Contains("\'-")) return false; + if (name.Contains("-\'")) return false; + return true; + } }