1
0
Fork 1
mirror of https://github.com/TeamOctolings/Octobot.git synced 2025-04-19 16:33:36 +03:00

merge *will* be before the new year

Signed-off-by: mctaylors <cantsendmails@mctaylors.ru>
This commit is contained in:
Macintxsh 2023-12-31 13:40:53 +03:00
parent b4ef2170a0
commit 76e353ef66
Signed by: mctaylors
GPG key ID: 7181BEBE676903C1
2 changed files with 28 additions and 53 deletions

View file

@ -146,7 +146,7 @@ public class RemindCommandGroup : CommandGroup
var data = await _guildData.GetData(guildId, CancellationToken); var data = await _guildData.GetData(guildId, CancellationToken);
Messages.Culture = GuildSettings.Language.Get(data.Settings); Messages.Culture = GuildSettings.Language.Get(data.Settings);
var parseResult = TimeSpanParser.TryParse(stringTimeSpan, CancellationToken); var parseResult = TimeSpanParser.TryParse(stringTimeSpan);
if (!parseResult.IsDefined(out var timeSpan)) if (!parseResult.IsDefined(out var timeSpan))
{ {
var failedEmbed = new EmbedBuilder() var failedEmbed = new EmbedBuilder()

View file

@ -23,11 +23,11 @@ public partial class TimeSpanParser : AbstractTypeParser<TimeSpan>
/// <remarks> /// <remarks>
/// If parse wasn't successful, <see cref="TimeSpanParser"/> will return <see cref="ArgumentInvalidError"/>. /// If parse wasn't successful, <see cref="TimeSpanParser"/> will return <see cref="ArgumentInvalidError"/>.
/// </remarks> /// </remarks>
public static Result<TimeSpan> TryParse(string timeSpanString, CancellationToken ct = default) public static Result<TimeSpan> TryParse(string timeSpanString)
{ {
if (timeSpanString.StartsWith('-')) if (timeSpanString.StartsWith('-'))
{ {
return new ArgumentInvalidError(nameof(timeSpanString), "TimeSpan cannot be inverted."); return new ArgumentInvalidError(nameof(timeSpanString), "TimeSpans cannot be negative.");
} }
if (TimeSpan.TryParse(timeSpanString, DateTimeFormatInfo.InvariantInfo, out var parsedTimeSpan)) if (TimeSpan.TryParse(timeSpanString, DateTimeFormatInfo.InvariantInfo, out var parsedTimeSpan))
@ -38,10 +38,16 @@ public partial class TimeSpanParser : AbstractTypeParser<TimeSpan>
var matches = ParseRegex().Matches(timeSpanString); var matches = ParseRegex().Matches(timeSpanString);
if (matches.Count is 0) if (matches.Count is 0)
{ {
return new ArgumentInvalidError(nameof(timeSpanString), "Invalid TimeSpan."); return new ArgumentInvalidError(nameof(timeSpanString), "The regex did not produce any matches.");
} }
return ParseFromRegex(matches);
}
private static TimeSpan ParseFromRegex(MatchCollection matches)
{
var timeSpan = TimeSpan.Zero; var timeSpan = TimeSpan.Zero;
foreach (var groups in matches.Select(match => match.Groups foreach (var groups in matches.Select(match => match.Groups
.Cast<Group>() .Cast<Group>()
.Where(g => g.Success) .Where(g => g.Success)
@ -50,61 +56,30 @@ public partial class TimeSpanParser : AbstractTypeParser<TimeSpan>
{ {
foreach ((var key, var groupValue) in groups) foreach ((var key, var groupValue) in groups)
{ {
return double.TryParse(groupValue, out var parsedGroupValue) if (!double.TryParse(groupValue, out var parsedGroupValue) ||
? ParseFromRegex(timeSpan, key, groupValue, parsedGroupValue) !int.TryParse(groupValue, out var parsedIntegerValue))
: TimeSpan.Zero; {
return TimeSpan.Zero;
}
var now = DateTimeOffset.UtcNow;
timeSpan += key switch
{
"Years" => now.AddYears(parsedIntegerValue) - now,
"Months" => now.AddMonths(parsedIntegerValue) - now,
"Weeks" => TimeSpan.FromDays(parsedGroupValue * 7),
"Days" => TimeSpan.FromDays(parsedGroupValue),
"Hours" => TimeSpan.FromHours(parsedGroupValue),
"Minutes" => TimeSpan.FromMinutes(parsedGroupValue),
"Seconds" => TimeSpan.FromSeconds(parsedGroupValue),
_ => throw new ArgumentOutOfRangeException(key)
};
} }
} }
return timeSpan; return timeSpan;
} }
private static TimeSpan ParseFromRegex(TimeSpan timeSpan,
string key, string groupValue, double parsedGroupValue)
{
if (key is "Years" or "Months")
{
if (!int.TryParse(groupValue, out var parsedIntegerValue))
{
return TimeSpan.Zero;
}
switch (key)
{
case "Years":
{
var now = DateTimeOffset.UtcNow;
var then = now.AddYears(parsedIntegerValue);
timeSpan += then - now;
break;
}
case "Months":
{
var now = DateTimeOffset.UtcNow;
var then = now.AddMonths(parsedIntegerValue);
timeSpan += then - now;
break;
}
}
return timeSpan;
}
timeSpan += key switch
{
"Weeks" => TimeSpan.FromDays(parsedGroupValue * 7),
"Days" => TimeSpan.FromDays(parsedGroupValue),
"Hours" => TimeSpan.FromHours(parsedGroupValue),
"Minutes" => TimeSpan.FromMinutes(parsedGroupValue),
"Seconds" => TimeSpan.FromSeconds(parsedGroupValue),
_ => throw new ArgumentOutOfRangeException(key)
};
return timeSpan;
}
[GeneratedRegex("(?<Years>\\d+(?=y|л|г))|(?<Months>\\d+(?=mo|мес))|(?<Weeks>\\d+(?=w|н|нед))|(?<Days>\\d+(?=d|дн))|(?<Hours>\\d+(?=h|ч))|(?<Minutes>\\d+(?=m|min|мин|м))|(?<Seconds>\\d+(?=s|sec|с|сек))")] [GeneratedRegex("(?<Years>\\d+(?=y|л|г))|(?<Months>\\d+(?=mo|мес))|(?<Weeks>\\d+(?=w|н|нед))|(?<Days>\\d+(?=d|дн))|(?<Hours>\\d+(?=h|ч))|(?<Minutes>\\d+(?=m|min|мин|м))|(?<Seconds>\\d+(?=s|sec|с|сек))")]
private static partial Regex ParseRegex(); private static partial Regex ParseRegex();
} }