diff --git a/locale/Messages.resx b/locale/Messages.resx index 0a072c3..5e24811 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -570,4 +570,10 @@ Cleared {0} messages from {1} + + An error occurred during command execution, try again later. + + + Contact the developers if the problem occurs again. + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index 92d4c60..1cc1f9e 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -570,4 +570,10 @@ Очищено {0} сообщений от {1} + + Произошла ошибка при выполнении команды, повтори попытку позже. + + + Обратись к разработчикам, если проблема возникнет снова. + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index 9c5d487..48ad8e7 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -570,4 +570,10 @@ вырезано {0} забавных сообщений от {1} + + произошёл тотальный разнос в команде, удачи. + + + если ты это читаешь второй раз за сегодня, пиши разрабам + diff --git a/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs b/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs index d6a66cc..a6daaf0 100644 --- a/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs +++ b/src/Commands/Events/ErrorLoggingPostExecutionEvent.cs @@ -1,8 +1,12 @@ using JetBrains.Annotations; using Microsoft.Extensions.Logging; using Octobot.Extensions; +using Remora.Discord.API.Abstractions.Rest; using Remora.Discord.Commands.Contexts; +using Remora.Discord.Commands.Feedback.Services; using Remora.Discord.Commands.Services; +using Remora.Discord.Extensions.Embeds; +using Remora.Discord.Extensions.Formatting; using Remora.Results; namespace Octobot.Commands.Events; @@ -14,10 +18,15 @@ namespace Octobot.Commands.Events; public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent { private readonly ILogger _logger; + private readonly FeedbackService _feedback; + private readonly IDiscordRestUserAPI _userApi; - public ErrorLoggingPostExecutionEvent(ILogger logger) + public ErrorLoggingPostExecutionEvent(ILogger logger, FeedbackService feedback, + IDiscordRestUserAPI userApi) { _logger = logger; + _feedback = feedback; + _userApi = userApi; } /// @@ -28,11 +37,34 @@ public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent /// The result whose success is checked. /// The cancellation token for this operation. Unused. /// A result which has succeeded. - public Task AfterExecutionAsync( + public async Task AfterExecutionAsync( ICommandContext context, IResult commandResult, CancellationToken ct = default) { _logger.LogResult(commandResult, $"Error in slash command execution for /{context.Command.Command.Node.Key}."); - return Task.FromResult(Result.FromSuccess()); + var result = commandResult; + while (result.Inner is not null) + { + result = result.Inner; + } + + if (result.IsSuccess) + { + return Result.FromSuccess(); + } + + var botResult = await _userApi.GetCurrentUserAsync(ct); + if (!botResult.IsDefined(out var bot)) + { + return Result.FromError(botResult); + } + + var embed = new EmbedBuilder().WithSmallTitle(Messages.CommandExecutionFailed, bot) + .WithDescription(Markdown.InlineCode(result.Error.Message)) + .WithFooter(Messages.ContactDevelopers) + .WithColour(ColorsList.Red) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(embed, ct); } } diff --git a/src/Extensions/LoggerExtensions.cs b/src/Extensions/LoggerExtensions.cs index fd4aeb7..3805cea 100644 --- a/src/Extensions/LoggerExtensions.cs +++ b/src/Extensions/LoggerExtensions.cs @@ -26,6 +26,11 @@ public static class LoggerExtensions if (result.Error is ExceptionError exe) { + if (exe.Exception is TaskCanceledException) + { + return; + } + logger.LogError(exe.Exception, "{ErrorMessage}", message); return; } diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index 898528c..5f38061 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -996,5 +996,21 @@ namespace Octobot { return ResourceManager.GetString("MessagesClearedFiltered", resourceCulture); } } + + internal static string CommandExecutionFailed + { + get + { + return ResourceManager.GetString("CommandExecutionFailed", resourceCulture); + } + } + + internal static string ContactDevelopers + { + get + { + return ResourceManager.GetString("ContactDevelopers", resourceCulture); + } + } } }