delete last bot message if told to shut up

This commit is contained in:
13xforever
2018-08-10 20:24:20 +05:00
committed by Roberto Anić Banić
parent 7ffd507b5e
commit 5205fe184c
7 changed files with 86 additions and 30 deletions

View File

@@ -14,15 +14,15 @@ namespace CompatBot.EventHandlers
{
public static async Task OnMessageCreated(MessageCreateEventArgs args)
{
args.Handled = !await IsClean(args.Client, args.Message).ConfigureAwait(false);
args.Handled = !await IsClean(args.Client, args.Message, args.Guild).ConfigureAwait(false);
}
public static async Task OnMessageEdit(MessageUpdateEventArgs args)
{
args.Handled = !await IsClean(args.Client, args.Message).ConfigureAwait(false);
args.Handled = !await IsClean(args.Client, args.Message, args.Guild).ConfigureAwait(false);
}
private static async Task<bool> IsClean(DiscordClient client, DiscordMessage message)
private static async Task<bool> IsClean(DiscordClient client, DiscordMessage message, DiscordGuild guild)
{
if (message.Author.IsBot)
return true;
@@ -30,7 +30,7 @@ namespace CompatBot.EventHandlers
if (string.IsNullOrEmpty(message.Content) || message.Content.StartsWith(Config.CommandPrefix))
return true;
if ((message.Author as DiscordMember)?.Roles.IsWhitelisted() ?? false)
if (message.Author.IsWhitelisted(client, guild))
return true;
string trigger = null;

View File

@@ -0,0 +1,56 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using CompatBot.Utils;
using DSharpPlus.Entities;
using DSharpPlus.EventArgs;
using NReco.Text;
namespace CompatBot.EventHandlers
{
internal static class BotShutupHandler
{
private static readonly AhoCorasickDoubleArrayTrie<string> ChillCheck = new AhoCorasickDoubleArrayTrie<string>(new[] { "shut the fuck up", "shut up", "shutup", "hush", "chill" }.ToDictionary(s => s, s => s), true);
public static async Task OnMessageCreated(MessageCreateEventArgs args)
{
if (args.Channel.IsPrivate)
return;
if (args.Author.IsBot)
return;
if (string.IsNullOrEmpty(args.Message.Content) || args.Message.Content.StartsWith(Config.CommandPrefix))
return;
if (!args.Author.IsWhitelisted(args.Client, args.Guild))
return;
if (!NeedToSilence(args.Message))
return;
await args.Message.ReactWithAsync(args.Client, DiscordEmoji.FromUnicode("😟"), "Okay (._.)").ConfigureAwait(false);
var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);
if (lastBotMessages.OrderBy(m => m.CreationTimestamp).FirstOrDefault(m => m.Author.IsCurrent) is DiscordMessage msg)
await msg.DeleteAsync("asked to shut up").ConfigureAwait(false);
}
internal static bool NeedToSilence(DiscordMessage msg)
{
if (string.IsNullOrEmpty(msg.Content))
return false;
var needToChill = false;
ChillCheck.ParseText(msg.Content, h =>
{
needToChill = true;
return false;
});
if (!needToChill)
return false;
return msg.Content.Contains("bot") || (msg.MentionedUsers?.Any(u => u.IsCurrent) ?? false);
}
}
}

View File

@@ -57,6 +57,7 @@ namespace CompatBot.EventHandlers
return;
}
bool parsedLog = false;
try
{
foreach (var attachment in message.Attachments.Where(a => a.FileSize < Config.AttachmentSizeLimit))
@@ -65,6 +66,7 @@ namespace CompatBot.EventHandlers
{
await args.Channel.TriggerTypingAsync().ConfigureAwait(false);
Console.WriteLine($">>>>>>> {message.Id%100} Parsing log from attachment {attachment.FileName} ({attachment.FileSize})...");
parsedLog = true;
LogParseState result = null;
try
{
@@ -85,7 +87,7 @@ namespace CompatBot.EventHandlers
{
if (result.Error == LogParseState.ErrorCode.PiracyDetected)
{
if ((args.Message.Author as DiscordMember)?.Roles.IsWhitelisted() ?? false)
if (args.Author.IsWhitelisted(args.Client, args.Guild))
{
await Task.WhenAll(
args.Channel.SendMessageAsync("I see wha' ye did thar ☠"),
@@ -137,7 +139,8 @@ namespace CompatBot.EventHandlers
finally
{
QueueLimiter.Release();
Console.WriteLine($"<<<<<<< {message.Id % 100} Finished parsing");
if (parsedLog)
Console.WriteLine($"<<<<<<< {message.Id % 100} Finished parsing");
}
}
}

View File

@@ -12,7 +12,6 @@ using CompatBot.Utils.ResultFormatters;
using DSharpPlus;
using DSharpPlus.Entities;
using DSharpPlus.EventArgs;
using NReco.Text;
namespace CompatBot.EventHandlers
{
@@ -21,9 +20,8 @@ namespace CompatBot.EventHandlers
// see http://www.psdevwiki.com/ps3/Productcode
public static readonly Regex ProductCode = new Regex(@"(?<letters>(?:[BPSUVX][CL]|P[ETU]|NP)[AEHJKPUIX][ABSM])[ \-]?(?<numbers>\d{5})", RegexOptions.Compiled | RegexOptions.IgnoreCase);
private static readonly Client compatClient = new Client();
private static readonly AhoCorasickDoubleArrayTrie<string> ChillCheck = new AhoCorasickDoubleArrayTrie<string>(new[] {"shut up", "hush", "chill"}.ToDictionary(s => s, s => s), true);
public static async Task OnMessageMention(MessageCreateEventArgs args)
public static async Task OnMessageCreated(MessageCreateEventArgs args)
{
if (args.Author.IsBot)
return;
@@ -33,7 +31,7 @@ namespace CompatBot.EventHandlers
var lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, 20, DateTime.UtcNow.AddSeconds(-30)).ConfigureAwait(false);
foreach (var msg in lastBotMessages)
if (NeedToSilence(msg))
if (BotShutupHandler.NeedToSilence(msg))
return;
lastBotMessages = await args.Channel.GetMessagesBeforeAsync(args.Message.Id, Config.ProductCodeLookupHistoryThrottle).ConfigureAwait(false);
@@ -82,24 +80,6 @@ namespace CompatBot.EventHandlers
.ToList();
}
private static bool NeedToSilence(DiscordMessage msg)
{
if (string.IsNullOrEmpty(msg.Content))
return false;
var needToChill = false;
ChillCheck.ParseText(msg.Content, h =>
{
needToChill = true;
return false;
});
if (!needToChill)
return false;
return msg.Content.Contains("bot") || (msg.MentionedUsers?.Any(u => u.IsCurrent) ?? false);
}
public static async Task<DiscordEmbed> LookupGameInfoAsync(this DiscordClient client, string code, bool footer = true)
{
if (string.IsNullOrEmpty(code))

View File

@@ -80,7 +80,7 @@ namespace CompatBot.EventHandlers
// in case it's not in cache and doesn't contain any info, including Author
message = await channel.GetMessageAsync(message.Id).ConfigureAwait(false);
if ((message.Author as DiscordMember)?.Roles.IsWhitelisted() ?? false)
if (message.Author.IsWhitelisted(client, channel.Guild))
return;
var users = await message.GetReactionsAsync(emoji).ConfigureAwait(false);

View File

@@ -98,9 +98,10 @@ namespace CompatBot
client.MessageReactionAdded += Starbucks.Handler;
client.MessageCreated += AntipiracyMonitor.OnMessageCreated; // should be first
client.MessageCreated += ProductCodeLookup.OnMessageMention;
client.MessageCreated += ProductCodeLookup.OnMessageCreated;
client.MessageCreated += LogInfoHandler.OnMessageCreated;
client.MessageCreated += LogsAsTextMonitor.OnMessageCreated;
client.MessageCreated += BotShutupHandler.OnMessageCreated;
client.MessageUpdated += AntipiracyMonitor.OnMessageEdit;

View File

@@ -1,11 +1,27 @@
using System.Collections.Generic;
using System.Linq;
using CompatBot.Database.Providers;
using DSharpPlus;
using DSharpPlus.Entities;
namespace CompatBot.Utils
{
internal static class RolesExtensions
{
public static bool IsWhitelisted(this DiscordUser user, DiscordClient client, DiscordGuild guild = null)
{
if (ModProvider.IsMod(user.Id))
return true;
var member = guild == null ? client.GetMember(user) : client.GetMember(guild, user);
return member?.Roles.IsWhitelisted() ?? false;
}
public static bool IsWhitelisted(this DiscordMember member)
{
return ModProvider.IsMod(member.Id) || member.Roles.IsWhitelisted();
}
public static bool IsWhitelisted(this IEnumerable<DiscordRole> memberRoles)
{
return memberRoles?.Any(r => Config.Moderation.RoleWhiteList.Contains(r.Name)) ?? false;