From 9a563ba0b61042b2efddb4352e6efaa4db421b49 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 29 Jan 2019 23:28:52 +0100 Subject: [PATCH] Cancel message handlers if another handler has already handled it --- .../CommandHandler/CommandHandler.cs | 11 +++++++---- DeukBot4/MessageHandlers/ImageBackupHandler.cs | 3 ++- DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs | 11 +++++++---- .../MessageHandlers/JokeHandling/DeltaJoke.cs | 11 ++++++++--- .../JokeHandling/IJokeController.cs | 2 +- .../MessageHandlers/JokeHandling/JokeHandler.cs | 6 ++++-- .../MessageHandlers/JokeHandling/OwoHandler.cs | 13 ++++++++----- .../MessageHandlers/JokeHandling/ThanksJoke.cs | 9 ++++++--- DeukBot4/MessageHandlers/MainHandler.cs | 16 +++++++++------- DeukBot4/MessageHandlers/PointsMessageHandler.cs | 13 +++++++++---- DeukBot4/MessageHandlers/ReceivedMessage.cs | 16 ++++++++++++++++ DeukBot4/MessageHandlers/ReminderHandler.cs | 8 ++++++-- 12 files changed, 83 insertions(+), 36 deletions(-) create mode 100644 DeukBot4/MessageHandlers/ReceivedMessage.cs diff --git a/DeukBot4/MessageHandlers/CommandHandler/CommandHandler.cs b/DeukBot4/MessageHandlers/CommandHandler/CommandHandler.cs index 620b148..ecbdde0 100644 --- a/DeukBot4/MessageHandlers/CommandHandler/CommandHandler.cs +++ b/DeukBot4/MessageHandlers/CommandHandler/CommandHandler.cs @@ -42,16 +42,19 @@ namespace DeukBot4.MessageHandlers.CommandHandler } - public static async Task HandleMessage(SocketMessage message) + public static async Task HandleMessage(ReceivedMessage receivedMessage) { - if (string.IsNullOrWhiteSpace(message.Content)) + if (string.IsNullOrWhiteSpace(receivedMessage.Message.Content)) return; - if (message.Content[0] != CommandTrigger && message.MentionedUsers.All(x => x.Id != Program.BotId)) + if (receivedMessage.Message.Content[0] != CommandTrigger && receivedMessage.Message.MentionedUsers.All(x => x.Id != Program.BotId)) return; - if (message.Content[1] == '!') + if (receivedMessage.Message.Content[1] == '!') return; + receivedMessage.IsHandled = true; + var message = receivedMessage.Message; + var req = await CommandRequest.Create(message); var resultCode = req.Response; switch (resultCode) diff --git a/DeukBot4/MessageHandlers/ImageBackupHandler.cs b/DeukBot4/MessageHandlers/ImageBackupHandler.cs index 802eb49..1583db4 100644 --- a/DeukBot4/MessageHandlers/ImageBackupHandler.cs +++ b/DeukBot4/MessageHandlers/ImageBackupHandler.cs @@ -28,8 +28,9 @@ namespace DeukBot4.MessageHandlers private static List _backupChannels = new List(); public static WebDavSettings Settings { private get; set; } - public static async Task Backup(SocketMessage message) + public static async Task Backup(ReceivedMessage receivedMessage) { + var message = receivedMessage.Message; if (!(message.Channel is IGuildChannel serverChannel)) return; diff --git a/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs b/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs index 0a16899..e6a280c 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/DadJoke.cs @@ -13,16 +13,19 @@ namespace DeukBot4.MessageHandlers.JokeHandling private readonly Regex _regex = new Regex(@"(\s|^)i(`|’|'| a)?m (?.{3,15})$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant); - public async Task Run(SocketMessage message) + public async Task Run(ReceivedMessage message) { - if (!(message.Author is IGuildUser guildUser)) + if (!(message.Message.Author is IGuildUser guildUser)) return; - var content = message.Content; + var content = message.Message.Content; var match = _regex.Match(content); if (match.Success) { + if (message.IsHandled) + return; + message.IsHandled = true; var newName = match.Groups["word"].Value; - await message.Channel.SendMessageAsync($"Hi {newName}, i'm Deukbot"); + await message.Message.Channel.SendMessageAsync($"Hi {newName}, i'm Deukbot"); await guildUser.ModifyAsync(user => user.Nickname = newName); } } diff --git a/DeukBot4/MessageHandlers/JokeHandling/DeltaJoke.cs b/DeukBot4/MessageHandlers/JokeHandling/DeltaJoke.cs index bd4bbc2..bf0fa9b 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/DeltaJoke.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/DeltaJoke.cs @@ -10,17 +10,22 @@ namespace DeukBot4.MessageHandlers.JokeHandling { public string Id => "delta"; public string Name => "No deltas, it's called Origin"; - public async Task Run(SocketMessage message) + public async Task Run(ReceivedMessage message) { - var lowerCasedContent = message.Content.ToLowerInvariant().RemoveSpecialCharacters(); + var lowerCasedContent = message.Message.Content.ToLowerInvariant().RemoveSpecialCharacters(); if (lowerCasedContent.Contains("origin")) return; + if (message.IsHandled) + return; var lowerSplit = lowerCasedContent.Split(' '); if (lowerSplit.Select(s => Lehvenstein.LevenshteinDistance(s, "delta")).Any(diff => diff <= 1)) { + if (message.IsHandled) + return; + message.IsHandled = true; var warning = "uhh excuse me it's called\n Origin and it's an art"; - await message.Channel.SendFileAsync(await CatPicHandler.GetCatPicture(warning), "cat_pic.png"); + await message.Message.Channel.SendFileAsync(await CatPicHandler.GetCatPicture(warning), "cat_pic.png"); } } } diff --git a/DeukBot4/MessageHandlers/JokeHandling/IJokeController.cs b/DeukBot4/MessageHandlers/JokeHandling/IJokeController.cs index 3b6ea7e..0886e81 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/IJokeController.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/IJokeController.cs @@ -8,6 +8,6 @@ namespace DeukBot4.MessageHandlers.JokeHandling string Id { get; } string Name { get; } - Task Run(SocketMessage message); + Task Run(ReceivedMessage message); } } \ No newline at end of file diff --git a/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs b/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs index 666fb5c..ae6e8b2 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/JokeHandler.cs @@ -23,14 +23,16 @@ namespace DeukBot4.MessageHandlers.JokeHandling } } - public static async Task RunJokes(SocketMessage message) + public static async Task RunJokes(ReceivedMessage message) { - if (message.Channel is IGuildChannel guildChannel) + if (message.Message.Channel is IGuildChannel guildChannel) { var guildSettings = ServerSettingHandler.GetSettings(guildChannel.GuildId); var jokes = guildSettings.EnabledJokes; foreach (var enabledJoke in jokes) { + if (message.IsHandled) + return; var jokeController = Jokes[enabledJoke]; jokeController.Run(message); } diff --git a/DeukBot4/MessageHandlers/JokeHandling/OwoHandler.cs b/DeukBot4/MessageHandlers/JokeHandling/OwoHandler.cs index 7a4d1a1..f4b44ba 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/OwoHandler.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/OwoHandler.cs @@ -3,7 +3,6 @@ using System.Threading.Tasks; using DeukBot4.Database; using DeukBot4.MessageHandlers.CommandHandler; using Discord; -using Discord.WebSocket; namespace DeukBot4.MessageHandlers.JokeHandling { @@ -12,15 +11,19 @@ namespace DeukBot4.MessageHandlers.JokeHandling public string Id => "owo-warn"; public string Name => "Owo Warnings"; - private static readonly Regex Matcher = new Regex(@"(?:^|\s).w.(?:\s|$)", RegexOptions.IgnoreCase); + private static readonly Regex Matcher = new Regex(@"(?:^|\s)(.)[wv]\1(?:\s|$)", RegexOptions.IgnoreCase); - public async Task Run(SocketMessage message) + public async Task Run(ReceivedMessage receivedMessage) { - if (!(message.Channel is IGuildChannel serverChannel)) + if (!(receivedMessage.Message.Channel is IGuildChannel serverChannel)) return; - if (!Matcher.Match(message.Content).Success) + if (!Matcher.Match(receivedMessage.Message.Content).Success) return; + if (receivedMessage.IsHandled) + return; + receivedMessage.IsHandled = true; + var message = receivedMessage.Message; var changePoints = await PointHandler.ChangePoints(serverChannel.GuildId, message.Author.Id, -100); var embed = EmbedFactory.GetStandardEmbedBuilder(); diff --git a/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs b/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs index b19cb9d..e3e6343 100644 --- a/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs +++ b/DeukBot4/MessageHandlers/JokeHandling/ThanksJoke.cs @@ -19,14 +19,17 @@ namespace DeukBot4.MessageHandlers.JokeHandling }; private static int _pos = 0; - public async Task Run(SocketMessage message) + public async Task Run(ReceivedMessage message) { - var content = message.Content; + var content = message.Message.Content; if (_thanksMatcher.IsMatch(content)) { + if (message.IsHandled) + return; + message.IsHandled = true; var response = _thanksResponses[_pos]; _pos = (_pos + 1) % _thanksResponses.Length; - message.Channel.SendMessageAsync(response); + message.Message.Channel.SendMessageAsync(response); } } } diff --git a/DeukBot4/MessageHandlers/MainHandler.cs b/DeukBot4/MessageHandlers/MainHandler.cs index 1c8b149..8338ad0 100644 --- a/DeukBot4/MessageHandlers/MainHandler.cs +++ b/DeukBot4/MessageHandlers/MainHandler.cs @@ -18,13 +18,14 @@ namespace DeukBot4.MessageHandlers } try { + var receivedMessage = new ReceivedMessage(message); #pragma warning disable 4014 - CommandHandler.CommandHandler.HandleMessage(message); - HandlePrivateMessage(message); - ReminderHandler.HandleReminder(message); - ImageBackupHandler.Backup(message); - JokeHandler.RunJokes(message); - PointsMessageHandler.HandleMessage(message); + CommandHandler.CommandHandler.HandleMessage(receivedMessage); + HandlePrivateMessage(receivedMessage); + ReminderHandler.HandleReminder(receivedMessage); + ImageBackupHandler.Backup(receivedMessage); + JokeHandler.RunJokes(receivedMessage); + PointsMessageHandler.HandleMessage(receivedMessage); #pragma warning restore 4014 } catch (Exception e) @@ -34,8 +35,9 @@ namespace DeukBot4.MessageHandlers } private static ITextChannel _dmChannel; - private static async Task HandlePrivateMessage(SocketMessage message) + private static async Task HandlePrivateMessage(ReceivedMessage receivedMessage) { + var message = receivedMessage.Message; if (message.Channel is IPrivateChannel) { await Logger.Main.Log(($"Private Message: {message.Author.Username}- {message.Content}")); diff --git a/DeukBot4/MessageHandlers/PointsMessageHandler.cs b/DeukBot4/MessageHandlers/PointsMessageHandler.cs index 71468f6..0dc1986 100644 --- a/DeukBot4/MessageHandlers/PointsMessageHandler.cs +++ b/DeukBot4/MessageHandlers/PointsMessageHandler.cs @@ -38,18 +38,23 @@ namespace DeukBot4.MessageHandlers } } - public static async Task HandleMessage(SocketMessage message) + public static async Task HandleMessage(ReceivedMessage receivedMessage) { - if (!(message.Channel is IGuildChannel serverChannel)) + if (!(receivedMessage.Message.Channel is IGuildChannel serverChannel)) return; - var permission = await PermissionValidator.GetUserPermissionLevel(message); + var permission = await PermissionValidator.GetUserPermissionLevel(receivedMessage.Message); if (permission < PermissionLevel.Helper) return; - var match = Matcher.Match(message.Content); + var match = Matcher.Match(receivedMessage.Message.Content); if (!match.Success) return; + if (receivedMessage.IsHandled) + return; + receivedMessage.IsHandled = true; + var message = receivedMessage.Message; + var points = long.Parse(match.Groups["amount"].Value); var embed = EmbedFactory.GetStandardEmbedBuilder(); diff --git a/DeukBot4/MessageHandlers/ReceivedMessage.cs b/DeukBot4/MessageHandlers/ReceivedMessage.cs new file mode 100644 index 0000000..c65ae05 --- /dev/null +++ b/DeukBot4/MessageHandlers/ReceivedMessage.cs @@ -0,0 +1,16 @@ +using Discord.WebSocket; + +namespace DeukBot4.MessageHandlers +{ + public class ReceivedMessage + { + public readonly SocketMessage Message; + public bool IsHandled; + + public ReceivedMessage(SocketMessage message) + { + Message = message; + IsHandled = false; + } + } +} \ No newline at end of file diff --git a/DeukBot4/MessageHandlers/ReminderHandler.cs b/DeukBot4/MessageHandlers/ReminderHandler.cs index 657e21e..2accf71 100644 --- a/DeukBot4/MessageHandlers/ReminderHandler.cs +++ b/DeukBot4/MessageHandlers/ReminderHandler.cs @@ -14,13 +14,17 @@ namespace DeukBot4.MessageHandlers @".*(remind\s*((?me)|<@!*(?\d*)>)\s*)(\s+to(?.+)|\s+in\s+(?