@@ -1,5 +1,6 @@
using Discord.Interactions;
using Discord.Interactions;
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq;
namespace System.Text.RegularExpressions
namespace System.Text.RegularExpressions
@@ -90,7 +91,7 @@ namespace System.Text.RegularExpressions
return match.Count;
return match.Count;
}
}
internal static bool TryBuildRegexPattern<T>(T commandInfo, string wildCardStr, out string pattern) where T: class, ICommandInfo
internal static bool TryBuildRegexPattern<T>(T commandInfo, string wildCardStr, out string pattern) where T : class, ICommandInfo
{
{
if (commandInfo.TreatNameAsRegex)
if (commandInfo.TreatNameAsRegex)
{
{
@@ -105,14 +106,72 @@ namespace System.Text.RegularExpressions
}
}
var escapedWildCard = Regex.Escape(wildCardStr);
var escapedWildCard = Regex.Escape(wildCardStr);
var unquantified = Regex.Replace(commandInfo.Name, $@"(?<!\\){escapedWildCard}(?<delimiter>[^{escapedWildCard}]?)",
@"([^\n\t${delimiter}]+)${delimiter}") ;
var unquantifiedPattern = $@"(?<!\\){escapedWildCard}(?<delimiter>[^{escapedWildCard}]?)";
var quantifiedPattern = $@"(?<!\\){{(?<start>[0-9]+)(?<end>,[0-9]*)?(?<!\\)}}(?<delimiter>[^{escapedWildCard}]?)" ;
var quantified = Regex.Replace(unquantified, $@"(?<!\\){{(?<start>[0-9]+)(?<end>,[0-9]*)?(?<!\\)}}(?<delimiter>[^{escapedWildCard}]?)",
@"([^\n\t${delimiter}]{${start}${end}})${delimiter}");
string name = commandInfo.Name;
var matchPairs = new SortedDictionary<int, MatchPair>();
foreach (Match match in Regex.Matches(name, unquantifiedPattern))
matchPairs.Add(match.Index, new(MatchType.Unquantified, match));
foreach (Match match in Regex.Matches(name, quantifiedPattern))
matchPairs.Add(match.Index, new(MatchType.Quantified, match));
var sb = new StringBuilder();
var previousMatch = 0;
foreach (var matchPair in matchPairs)
{
sb.Append(Regex.Escape(name.Substring(previousMatch, matchPair.Key - previousMatch)));
Match match = matchPair.Value.Match;
MatchType type = matchPair.Value.Type;
previousMatch = matchPair.Key + match.Length;
var delimiter = match.Groups["delimiter"].Value;
switch (type)
{
case MatchType.Unquantified:
{
sb.Append(@$"([^\n\t{Regex.Escape(delimiter)}]+){Regex.Escape(delimiter)}");
}
break;
case MatchType.Quantified:
{
var start = match.Groups["start"].Value;
var end = match.Groups["end"].Value;
sb.Append($@"([^\n\t{Regex.Escape(delimiter)}]{{{start}{end}}}){Regex.Escape(delimiter)}");
}
break;
}
}
pattern = "\\A" + sb.ToString() + "\\Z";
pattern = "\\A" + quantified + "\\Z";
return true;
return true;
}
}
private enum MatchType
{
Quantified,
Unquantified
}
private record MatchPair
{
public MatchType Type { get; }
public Match Match { get; }
public MatchPair(MatchType type, Match match)
{
Type = type;
Match = match;
}
}
}
}
}
}