using JetBrains.Annotations; using Microsoft.Extensions.Logging; using Remora.Discord.Commands.Contexts; using Remora.Discord.Commands.Extensions; using Remora.Discord.Commands.Services; using Remora.Results; namespace Boyfriend.Commands; /// /// Handles error logging for slash commands that couldn't be successfully prepared. /// [UsedImplicitly] public class ErrorLoggingPreparationErrorEvent : IPreparationErrorEvent { private readonly ILogger _logger; public ErrorLoggingPreparationErrorEvent(ILogger logger) { _logger = logger; } /// /// Logs a warning using the injected if the has not /// succeeded. /// /// The context of the slash command. Unused. /// The result whose success is checked. /// The cancellation token for this operation. Unused. /// A result which has succeeded. public Task PreparationFailed( IOperationContext context, IResult preparationResult, CancellationToken ct = default) { if (!preparationResult.IsSuccess && !preparationResult.Error.IsUserOrEnvironmentError()) { _logger.LogWarning("Error in slash command preparation.\n{ErrorMessage}", preparationResult.Error.Message); if (preparationResult.Error is ExceptionError exerr) _logger.LogError(exerr.Exception, "An exception has been thrown"); } return Task.FromResult(Result.FromSuccess()); } } /// /// Handles error logging for slash command groups. /// [UsedImplicitly] public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent { private readonly ILogger _logger; public ErrorLoggingPostExecutionEvent(ILogger logger) { _logger = logger; } /// /// Logs a warning using the injected if the has not /// succeeded. /// /// The context of the slash command. Unused. /// The result whose success is checked. /// The cancellation token for this operation. Unused. /// A result which has succeeded. public Task AfterExecutionAsync( ICommandContext context, IResult commandResult, CancellationToken ct = default) { if (!commandResult.IsSuccess && !commandResult.Error.IsUserOrEnvironmentError()) { _logger.LogWarning("Error in slash command execution.\n{ErrorMessage}", commandResult.Error.Message); if (commandResult.Error is ExceptionError exerr) _logger.LogError(exerr.Exception, "An exception has been thrown"); } return Task.FromResult(Result.FromSuccess()); } }