From 3ba1d06fd0bedd40967c1150ac94b90c02a78d96 Mon Sep 17 00:00:00 2001 From: Toastie Date: Sat, 5 Oct 2024 11:17:12 +1300 Subject: [PATCH] expressions will no longer cause exceptions if the bot doesn't have perms to write in the target channel Cleaned up expr code a little bit --- .../Expressions/EllieExpressionExtensions.cs | 43 ------- .../Expressions/EllieExpressionsService.cs | 111 +++++++++++++----- 2 files changed, 80 insertions(+), 74 deletions(-) diff --git a/src/EllieBot/Modules/Expressions/EllieExpressionExtensions.cs b/src/EllieBot/Modules/Expressions/EllieExpressionExtensions.cs index 1ed9504..6d8b89c 100644 --- a/src/EllieBot/Modules/Expressions/EllieExpressionExtensions.cs +++ b/src/EllieBot/Modules/Expressions/EllieExpressionExtensions.cs @@ -6,49 +6,6 @@ namespace EllieBot.Modules.EllieExpressions; public static class EllieExpressionExtensions { - private static string ResolveTriggerString(this string str, DiscordSocketClient client) - => str.Replace("%bot.mention%", client.CurrentUser.Mention, StringComparison.Ordinal); - - public static async Task Send( - this EllieExpression cr, - IUserMessage ctx, - IReplacementService repSvc, - DiscordSocketClient client, - IMessageSenderService sender) - { - var channel = cr.DmResponse ? await ctx.Author.CreateDMChannelAsync() : ctx.Channel; - - var trigger = cr.Trigger.ResolveTriggerString(client); - var substringIndex = trigger.Length; - if (cr.ContainsAnywhere) - { - var pos = ctx.Content.AsSpan().GetWordPosition(trigger); - if (pos == WordPosition.Start) - substringIndex += 1; - else if (pos == WordPosition.End) - substringIndex = ctx.Content.Length; - else if (pos == WordPosition.Middle) - substringIndex += ctx.Content.IndexOf(trigger, StringComparison.InvariantCulture); - } - - var canMentionEveryone = (ctx.Author as IGuildUser)?.GuildPermissions.MentionEveryone ?? true; - - var repCtx = new ReplacementContext(client: client, - guild: (ctx.Channel as ITextChannel)?.Guild as SocketGuild, - channel: ctx.Channel, - user: ctx.Author - ) - .WithOverride("%target%", - () => canMentionEveryone - ? ctx.Content[substringIndex..].Trim() - : ctx.Content[substringIndex..].Trim().SanitizeMentions(true)); - - var text = SmartText.CreateFrom(cr.Response); - text = await repSvc.ReplaceAsync(text, repCtx); - - return await sender.Response(channel).Text(text).Sanitize(false).SendAsync(); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WordPosition GetWordPosition(this ReadOnlySpan str, in ReadOnlySpan word) { diff --git a/src/EllieBot/Modules/Expressions/EllieExpressionsService.cs b/src/EllieBot/Modules/Expressions/EllieExpressionsService.cs index 783e3ab..9101ee0 100644 --- a/src/EllieBot/Modules/Expressions/EllieExpressionsService.cs +++ b/src/EllieBot/Modules/Expressions/EllieExpressionsService.cs @@ -249,46 +249,54 @@ public sealed class EllieExpressionsService : IExecOnMessage, IReadyExecutor try { - if (guild is SocketGuild sg) + if (guild is not SocketGuild sg) + return false; + + var result = await _permChecker.CheckPermsAsync( + guild, + msg.Channel, + msg.Author, + "ACTUALEXPRESSIONS", + expr.Trigger + ); + + if (!result.IsAllowed) { - var result = await _permChecker.CheckPermsAsync( - guild, - msg.Channel, - msg.Author, - "ACTUALEXPRESSIONS", - expr.Trigger - ); - - if (!result.IsAllowed) + var cache = _pc.GetCacheFor(guild.Id); + if (cache.Verbose) { - var cache = _pc.GetCacheFor(guild.Id); - if (cache.Verbose) + if (result.TryPickT3(out var disallowed, out _)) { - if (result.TryPickT3(out var disallowed, out _)) + var permissionMessage = _strings.GetText(strs.perm_prevent(disallowed.PermIndex + 1, + Format.Bold(disallowed.PermText)), + sg.Id); + + try + { + await _sender.Response(msg.Channel) + .Error(permissionMessage) + .SendAsync(); + } + catch { - var permissionMessage = _strings.GetText(strs.perm_prevent(disallowed.PermIndex + 1, - Format.Bold(disallowed.PermText)), - sg.Id); - - try - { - await _sender.Response(msg.Channel) - .Error(permissionMessage) - .SendAsync(); - } - catch - { - } - - Log.Information("{PermissionMessage}", permissionMessage); } - } - return true; + Log.Information("{PermissionMessage}", permissionMessage); + } } + + return true; } - var sentMsg = await expr.Send(msg, _repSvc, _client, _sender); + var cu = sg.CurrentUser; + + var channel = expr.DmResponse ? await msg.Author.CreateDMChannelAsync() : msg.Channel; + + // have no perms to speak in that channel + if (channel is ITextChannel tc && !cu.GetPermissions(tc).SendMessages) + return false; + + var sentMsg = await Send(expr, msg, channel); var reactions = expr.GetReactions(); foreach (var reaction in reactions) @@ -336,6 +344,47 @@ public sealed class EllieExpressionsService : IExecOnMessage, IReadyExecutor return false; } + + public string ResolveTriggerString(string str) + => str.Replace("%bot.mention%", _client.CurrentUser.Mention, StringComparison.Ordinal); + + public async Task Send( + EllieExpression cr, + IUserMessage ctx, + IMessageChannel channel + ) + { + var trigger = ResolveTriggerString(cr.Trigger); + var substringIndex = trigger.Length; + if (cr.ContainsAnywhere) + { + var pos = ctx.Content.AsSpan().GetWordPosition(trigger); + if (pos == WordPosition.Start) + substringIndex += 1; + else if (pos == WordPosition.End) + substringIndex = ctx.Content.Length; + else if (pos == WordPosition.Middle) + substringIndex += ctx.Content.IndexOf(trigger, StringComparison.InvariantCulture); + } + + var canMentionEveryone = (ctx.Author as IGuildUser)?.GuildPermissions.MentionEveryone ?? true; + + var repCtx = new ReplacementContext(client: _client, + guild: (ctx.Channel as ITextChannel)?.Guild as SocketGuild, + channel: ctx.Channel, + user: ctx.Author + ) + .WithOverride("%target%", + () => canMentionEveryone + ? ctx.Content[substringIndex..].Trim() + : ctx.Content[substringIndex..].Trim().SanitizeMentions(true)); + + var text = SmartText.CreateFrom(cr.Response); + text = await _repSvc.ReplaceAsync(text, repCtx); + + return await _sender.Response(channel).Text(text).Sanitize(false).SendAsync(); + } + public async Task ResetExprReactions(ulong? maybeGuildId, int id) { EllieExpression expr;