mirror of
https://github.com/TeamOctolings/Octobot.git
synced 2025-01-31 17:19:00 +03:00
Octol1ttle
f260681b39
GuildUpdateService is a service that contains way too many responsibilities with everything strictly coupled to each other. The code is buggy, hard to refactor and swallows errors. This prompted me to make this PR, which splits it into three independant services: - SongUpdateService (responsible for changing songs presence); - MemberUpdateService (responsible for updating member datas: unbanning users, adding the default role, sending reminders, filtering nicknames); - ScheduledEventUpdateService (responsible for updating scheduled events: sending notifications, automatically starting events). All of these services and their methods use Results to push errors all the way up in the stack, making sure no error is missed. To make logging and debugging easier, an extension method for `ILogger` was created - `LogResult`. The method checks if the result was successful or if its failure was caused by a user or environment error before logging anything - providing cleaner code and logs. `ExceptionError`s will also have their exception stacktrace and type logged (except in Remora code). This PR also fixes an issue that prevented banned users from being unbanned when their punishment was over. --------- Signed-off-by: Octol1ttle <l1ttleofficial@outlook.com>
37 lines
1.4 KiB
C#
37 lines
1.4 KiB
C#
using JetBrains.Annotations;
|
|
using Microsoft.Extensions.Logging;
|
|
using Remora.Discord.Commands.Contexts;
|
|
using Remora.Discord.Commands.Services;
|
|
using Remora.Results;
|
|
|
|
namespace Boyfriend.Commands.Events;
|
|
|
|
/// <summary>
|
|
/// Handles error logging for slash commands that couldn't be successfully prepared.
|
|
/// </summary>
|
|
[UsedImplicitly]
|
|
public class LoggingPreparationErrorEvent : IPreparationErrorEvent
|
|
{
|
|
private readonly ILogger<LoggingPreparationErrorEvent> _logger;
|
|
|
|
public LoggingPreparationErrorEvent(ILogger<LoggingPreparationErrorEvent> logger)
|
|
{
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Logs a warning using the injected <see cref="ILogger" /> if the <paramref name="preparationResult" /> has not
|
|
/// succeeded.
|
|
/// </summary>
|
|
/// <param name="context">The context of the slash command. Unused.</param>
|
|
/// <param name="preparationResult">The result whose success is checked.</param>
|
|
/// <param name="ct">The cancellation token for this operation. Unused.</param>
|
|
/// <returns>A result which has succeeded.</returns>
|
|
public Task<Result> PreparationFailed(
|
|
IOperationContext context, IResult preparationResult, CancellationToken ct = default)
|
|
{
|
|
_logger.LogResult(preparationResult, "Error in slash command preparation.");
|
|
|
|
return Task.FromResult(Result.FromSuccess());
|
|
}
|
|
}
|