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.Events;
///
/// Handles error logging for slash commands that couldn't be successfully prepared.
///
[UsedImplicitly]
public class LoggingPreparationErrorEvent : IPreparationErrorEvent {
private readonly ILogger _logger;
public LoggingPreparationErrorEvent(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());
}
}