Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: use client struct for character name check #1840

Merged
merged 1 commit into from
Jun 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 7 additions & 27 deletions Dalamud/Utility/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;

namespace Dalamud.Utility;

Expand Down Expand Up @@ -29,38 +30,17 @@ public static class StringExtensions
/// <param name="value">The string to test.</param>
/// <returns>true if the value parameter is null or an empty string (""), or if value consists exclusively of white-space characters.</returns>
public static bool IsNullOrWhitespace([NotNullWhen(false)] this string? value) => string.IsNullOrWhiteSpace(value);

/// <summary>
/// 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.
/// Validate if character name is valid using game check.
/// </summary>
/// <param name="value">character name to validate.</param>
/// <param name="includeLegacy">include legacy names (combined can be 30 instead of 20).</param>
/// <returns>indicator if character is name is valid.</returns>
public static bool IsValidCharacterName(this string value)
public static bool IsValidCharacterName(this string value, bool includeLegacy = true)
{
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;
if (!FFXIVClientStructs.FFXIV.Client.UI.UIModule.IsPlayerCharacterName(value)) return false;
return includeLegacy || value.Length <= 21;
}
}
Loading