Files
archived-discord-bot/CompatBot/EventHandlers/PostLogHelpHandler.cs

72 lines
2.9 KiB
C#

using System;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using CompatBot.Database;
using CompatBot.Utils;
using DSharpPlus.EventArgs;
using Microsoft.EntityFrameworkCore;
namespace CompatBot.EventHandlers
{
internal sealed class PostLogHelpHandler
{
private const RegexOptions DefaultOptions = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture;
private static readonly Regex UploadLogMention = new Regex(@"\b(post|upload)\s+(a|the|rpcs3('s)?|your|you're|ur|my)?\blogs?\b", DefaultOptions);
private static readonly SemaphoreSlim TheDoor = new SemaphoreSlim(1, 1);
private static readonly TimeSpan ThrottlingThreshold = TimeSpan.FromSeconds(5);
private static DateTime lastMention = DateTime.UtcNow.AddHours(-1);
public const string DefaultLogUploadExplanation = "To upload log, run the game, then completely close RPCS3, then drag and drop rpcs3.log.gz from the RPCS3 folder into Discord. The file may have a zip or rar icon.";
public static async Task OnMessageCreated(MessageCreateEventArgs args)
{
if (args.Author.IsBot)
return;
if (!args.Channel.Name.Equals("help", StringComparison.InvariantCultureIgnoreCase))
return;
if (DateTime.UtcNow - lastMention < ThrottlingThreshold)
return;
if (string.IsNullOrEmpty(args.Message.Content) || args.Message.Content.StartsWith(Config.CommandPrefix))
return;
if (!UploadLogMention.IsMatch(args.Message.Content))
return;
if (!TheDoor.Wait(0))
return;
try
{
var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);
foreach (var msg in lastBotMessages)
if (BotShutupHandler.NeedToSilence(msg).needToChill)
return;
var explanation = await GetLogUploadExplanationAsync().ConfigureAwait(false);
await args.Channel.SendMessageAsync(explanation).ConfigureAwait(false);
lastMention = DateTime.UtcNow;
}
finally
{
TheDoor.Release();
}
}
public static async Task<string> GetLogUploadExplanationAsync()
{
string explanation;
using (var db = new BotDb())
{
var result = await db.Explanation.FirstOrDefaultAsync(e => e.Keyword == "log").ConfigureAwait(false);
explanation = result?.Text;
}
if (string.IsNullOrEmpty(explanation))
explanation = DefaultLogUploadExplanation;
return explanation;
}
}
}