Merge pull request #340 from 13xforever/vnext

Wasting my life
This commit is contained in:
Ilya 2019-06-16 13:03:49 +05:00 committed by GitHub
commit 5e0d651dba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 53 additions and 1 deletions

View File

@ -0,0 +1,24 @@
using System.Threading.Tasks;
using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
namespace CompatBot.Commands
{
[Group("cp77"), Aliases("cp2077", "cyberpunk2077", "cyberpunk"), Hidden]
[Description("Provides information about the Cyberpunk 2077 release event")]
internal sealed class Cyberpunk2077: EventsBaseCommand
{
[GroupCommand]
public Task Cp77Countdown(CommandContext ctx)
=> NearestEvent(ctx, "Cyberpunk 2077");
[Command("2077"), Hidden]
public Task Cp77(CommandContext ctx, [RemainingText] string junk)
=> NearestEvent(ctx, "Cyberpunk 2077");
[Command("countdown")]
[Description("Provides countdown for Cyberpunk 2077 release event")]
public Task Countdown(CommandContext ctx)
=> Cp77Countdown(ctx);
}
}

View File

@ -25,7 +25,7 @@ namespace CompatBot.Commands
protected async Task NearestEvent(CommandContext ctx, string eventName = null)
{
eventName = eventName.Trim(40);
var originalEventName = eventName = eventName.Trim(40);
var current = DateTime.UtcNow;
var currentTicks = current.Ticks;
using (var db = new BotDb())
@ -61,6 +61,22 @@ namespace CompatBot.Commands
var firstNamedEvent = await db.EventSchedule.OrderBy(e => e.Start).FirstOrDefaultAsync(e => e.Year >= current.Year && e.EventName == eventName).ConfigureAwait(false);
if (firstNamedEvent == null)
{
var scheduleEntry = await FuzzyMatchEntryName(db, originalEventName).ConfigureAwait(false);
var events = await db.EventSchedule.OrderBy(e => e.Start).Where(e => e.End > current.Ticks && e.Name == scheduleEntry).ToListAsync().ConfigureAwait(false);
if (events.Any())
{
var eventListMsg = new StringBuilder();
foreach (var eventEntry in events)
{
if (eventEntry.Start < current.Ticks)
eventListMsg.AppendLine($"{eventEntry.Name} ends in {FormatCountdown(eventEntry.End.AsUtc() - current)}");
else
eventListMsg.AppendLine($"{eventEntry.Name} starts in {FormatCountdown(eventEntry.Start.AsUtc() - current)}");
}
await ctx.SendAutosplitMessageAsync(eventListMsg.ToString(), blockStart: "", blockEnd: "").ConfigureAwait(false);
return;
}
var noEventMsg = $"No information about the upcoming {eventName.Sanitize(replaceBackTicks: true)} at the moment";
if (eventName.Length > 10)
noEventMsg = "No information about such event at the moment";
@ -463,6 +479,14 @@ namespace CompatBot.Commands
return score > 0.8 ? name : eventName;
}
private static async Task<string> FuzzyMatchEntryName(BotDb db, string eventName)
{
var now = DateTime.UtcNow.Ticks;
var knownNames = await db.EventSchedule.Where(e => e.End > now).Select(e => e.Name).ToListAsync().ConfigureAwait(false);
var (score, name) = knownNames.Select(n => (score: eventName.GetFuzzyCoefficientCached(n), name: n)).OrderByDescending(t => t.score).FirstOrDefault();
return score > 0.5 ? name : eventName;
}
private static string FixTimeString(string dateTime)
{
return dateTime.ToUpperInvariant()

View File

@ -113,6 +113,7 @@ namespace CompatBot
commands.RegisterCommands<Pr>();
commands.RegisterCommands<Events>();
commands.RegisterCommands<E3>();
commands.RegisterCommands<Cyberpunk2077>();
commands.RegisterCommands<BotStats>();
commands.CommandErrored += UnknownCommandHandler.OnError;

View File

@ -23,6 +23,9 @@ namespace CompatBot.Utils
TimeSpan? timeout,
params DiscordEmoji[] reactions)
{
if (message == null)
throw new ArgumentNullException(nameof(message));
if (reactions.Length == 0)
throw new ArgumentException("At least one reaction must be specified", nameof(reactions));