From 8d53021863bafaeac13a32c10eac5a7326e31fe3 Mon Sep 17 00:00:00 2001 From: alyssa Date: Wed, 1 Jan 2025 22:30:52 +0000 Subject: [PATCH] fix(bot): silence internal errors from initial handler checks --- PluralKit.Bot/Bot.cs | 12 ++++++++---- PluralKit.Bot/Handlers/MessageCreated.cs | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/PluralKit.Bot/Bot.cs b/PluralKit.Bot/Bot.cs index 1c9e3656..6e15799c 100644 --- a/PluralKit.Bot/Bot.cs +++ b/PluralKit.Bot/Bot.cs @@ -179,7 +179,7 @@ public class Bot catch (Exception exc) { - await HandleError(handler, evt, serviceScope, exc); + await HandleError(handler, evt, serviceScope, exc, false); } _logger.Verbose("Received gateway event: {@Event}", evt); @@ -202,13 +202,13 @@ public class Bot } catch (Exception exc) { - await HandleError(handler, evt, serviceScope, exc); + await HandleError(handler, evt, serviceScope, exc, false); } } } - private async Task HandleError(IEventHandler handler, T evt, ILifetimeScope serviceScope, - Exception exc) + public async Task HandleError(IEventHandler handler, T evt, ILifetimeScope serviceScope, + Exception exc, bool preChecksDone) where T : IGatewayEvent { _metrics.Measure.Meter.Mark(BotMetrics.BotErrors, exc.GetType().FullName); @@ -245,6 +245,10 @@ public class Bot if (_config.DisableErrorReporting) return; + // don't show errors for "failed to lookup channel" and such + // interaction handler doesn't have pre-checks, so just always try to show + if (!(preChecksDone && !(evt is InteractionCreateEvent _))) return; + if (!exc.ShowToUser()) return; // Once we've sent it to Sentry, report it to the user (if we have permission to) diff --git a/PluralKit.Bot/Handlers/MessageCreated.cs b/PluralKit.Bot/Handlers/MessageCreated.cs index 9a0c8c48..2bb6bfcf 100644 --- a/PluralKit.Bot/Handlers/MessageCreated.cs +++ b/PluralKit.Bot/Handlers/MessageCreated.cs @@ -86,12 +86,19 @@ public class MessageCreated: IEventHandler } // Try each handler until we find one that succeeds + // only show exceptions to users if the checks above succeed + try + { + if (await TryHandleCommand(shardId, evt, guild, channel)) + return; - if (await TryHandleCommand(shardId, evt, guild, channel)) - return; - - if (evt.GuildId != null) - await TryHandleProxy(evt, guild, channel, rootChannel.Id, botPermissions); + if (evt.GuildId != null) + await TryHandleProxy(evt, guild, channel, rootChannel.Id, botPermissions); + } + catch (Exception exc) + { + await _bot.HandleError(this, evt, _services, exc, true); + } } private async Task TryHandleLogClean(Channel channel, MessageCreateEvent evt)