mirror of
https://gitlab.com/Kwoth/nadekobot.git
synced 2024-10-03 04:23:13 +00:00
You can now specify time+date (time is optional) in remind instead of relative time, in the format HH:mm dd.MM.YYYY
This commit is contained in:
parent
c28f458972
commit
3e1268f3bb
1 changed files with 53 additions and 19 deletions
|
@ -1,24 +1,24 @@
|
||||||
#nullable disable
|
#nullable disable
|
||||||
|
using System.Globalization;
|
||||||
using LinqToDB;
|
using LinqToDB;
|
||||||
using LinqToDB.EntityFrameworkCore;
|
using LinqToDB.EntityFrameworkCore;
|
||||||
using NadekoBot.Common.ModuleBehaviors;
|
using NadekoBot.Common.ModuleBehaviors;
|
||||||
using NadekoBot.Services.Database.Models;
|
using NadekoBot.Services.Database.Models;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Nadeko.Common;
|
|
||||||
|
|
||||||
namespace NadekoBot.Modules.Utility.Services;
|
namespace NadekoBot.Modules.Utility.Services;
|
||||||
|
|
||||||
public class RemindService : INService, IReadyExecutor
|
public class RemindService : INService, IReadyExecutor
|
||||||
{
|
{
|
||||||
private readonly Regex _regex =
|
private readonly Regex _regex =
|
||||||
new(
|
new(@"^(?:(?:at|on(?:\sthe)?)?\s*(?<date>(?:\d{2}:\d{2}\s)?\d{1,2}\.\d{1,2}(?:\.\d{2,4})?)|(?:in\s?)?\s*(?:(?<mo>\d+)(?:\s?(?:months?|mos?),?))?(?:(?:\sand\s|\s*)?(?<w>\d+)(?:\s?(?:weeks?|w),?))?(?:(?:\sand\s|\s*)?(?<d>\d+)(?:\s?(?:days?|d),?))?(?:(?:\sand\s|\s*)?(?<h>\d+)(?:\s?(?:hours?|h),?))?(?:(?:\sand\s|\s*)?(?<m>\d+)(?:\s?(?:minutes?|mins?|m),?))?)\s+(?:to:?\s+)?(?<what>(?:\r\n|[\r\n]|.)+)",
|
||||||
@"^(?:in\s?)?\s*(?:(?<mo>\d+)(?:\s?(?:months?|mos?),?))?(?:(?:\sand\s|\s*)?(?<w>\d+)(?:\s?(?:weeks?|w),?))?(?:(?:\sand\s|\s*)?(?<d>\d+)(?:\s?(?:days?|d),?))?(?:(?:\sand\s|\s*)?(?<h>\d+)(?:\s?(?:hours?|h),?))?(?:(?:\sand\s|\s*)?(?<m>\d+)(?:\s?(?:minutes?|mins?|m),?))?\s+(?:to:?\s+)?(?<what>(?:\r\n|[\r\n]|.)+)",
|
|
||||||
RegexOptions.Compiled | RegexOptions.Multiline);
|
RegexOptions.Compiled | RegexOptions.Multiline);
|
||||||
|
|
||||||
private readonly DiscordSocketClient _client;
|
private readonly DiscordSocketClient _client;
|
||||||
private readonly DbService _db;
|
private readonly DbService _db;
|
||||||
private readonly IBotCredentials _creds;
|
private readonly IBotCredentials _creds;
|
||||||
private readonly IEmbedBuilderService _eb;
|
private readonly IEmbedBuilderService _eb;
|
||||||
|
private readonly CultureInfo _culture;
|
||||||
|
|
||||||
public RemindService(
|
public RemindService(
|
||||||
DiscordSocketClient client,
|
DiscordSocketClient client,
|
||||||
|
@ -30,6 +30,15 @@ public class RemindService : INService, IReadyExecutor
|
||||||
_db = db;
|
_db = db;
|
||||||
_creds = creds;
|
_creds = creds;
|
||||||
_eb = eb;
|
_eb = eb;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_culture = new CultureInfo("en-GB");
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
_culture = CultureInfo.InvariantCulture;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task OnReadyAsync()
|
public async Task OnReadyAsync()
|
||||||
|
@ -105,32 +114,57 @@ public class RemindService : INService, IReadyExecutor
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var groupName in _regex.GetGroupNames())
|
TimeSpan ts;
|
||||||
|
|
||||||
|
var dateString = m.Groups["date"].Value;
|
||||||
|
if (!string.IsNullOrWhiteSpace(dateString))
|
||||||
{
|
{
|
||||||
if (groupName is "0" or "what")
|
var now = DateTime.UtcNow;
|
||||||
continue;
|
|
||||||
if (string.IsNullOrWhiteSpace(m.Groups[groupName].Value))
|
if (!DateTime.TryParse(dateString, _culture, DateTimeStyles.None, out var dt))
|
||||||
{
|
{
|
||||||
values[groupName] = 0;
|
Log.Warning("Invalid remind datetime format");
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!int.TryParse(m.Groups[groupName].Value, out var value))
|
|
||||||
{
|
|
||||||
Log.Warning("Reminder regex group {GroupName} has invalid value", groupName);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value < 1)
|
if (now >= dt)
|
||||||
{
|
{
|
||||||
Log.Warning("Reminder time value has to be an integer greater than 0");
|
Log.Warning("That remind time has already passed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
values[groupName] = value;
|
ts = dt - now;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var groupName in _regex.GetGroupNames())
|
||||||
|
{
|
||||||
|
if (groupName is "0" or "what")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(m.Groups[groupName].Value))
|
||||||
|
{
|
||||||
|
values[groupName] = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!int.TryParse(m.Groups[groupName].Value, out var value))
|
||||||
|
{
|
||||||
|
Log.Warning("Reminder regex group {GroupName} has invalid value", groupName);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value < 1)
|
||||||
|
{
|
||||||
|
Log.Warning("Reminder time value has to be an integer greater than 0");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
values[groupName] = value;
|
||||||
|
}
|
||||||
|
ts = new TimeSpan((30 * values["mo"]) + (7 * values["w"]) + values["d"], values["h"], values["m"], 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
var ts = new TimeSpan((30 * values["mo"]) + (7 * values["w"]) + values["d"], values["h"], values["m"], 0);
|
|
||||||
|
|
||||||
obj = new()
|
obj = new()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue