From bb291559ce0c773f53bf915ac4e0305b1c1dc03a Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Tue, 11 Jul 2023 13:57:19 +0500 Subject: [PATCH] Add missing implicit use annotations Signed-off-by: Octol1ttle --- src/Boyfriend.cs | 3 ++- src/Commands/AboutCommandGroup.cs | 3 +++ src/Commands/BanCommandGroup.cs | 4 ++++ src/Commands/ErrorLoggingEvents.cs | 14 ++++++++++++-- src/Commands/KickCommandGroup.cs | 3 +++ src/Commands/MuteCommandGroup.cs | 4 ++++ src/Commands/PingCommandGroup.cs | 3 +++ src/Commands/RemindCommandGroup.cs | 3 +++ src/Commands/SettingsCommandGroup.cs | 4 ++++ src/Data/GuildSettings.cs | 5 +++-- src/InteractionResponders.cs | 3 +++ 11 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/Boyfriend.cs b/src/Boyfriend.cs index 8045a60..0731ccd 100644 --- a/src/Boyfriend.cs +++ b/src/Boyfriend.cs @@ -67,11 +67,12 @@ public class Boyfriend { // Init .AddDiscordCaching() .AddDiscordCommands(true) + // Interactions .AddInteractivity() + .AddInteractionGroup() // Slash command event handlers .AddPreparationErrorEvent() .AddPostExecutionEvent() - .AddInteractionGroup() // Services .AddSingleton() .AddSingleton() diff --git a/src/Commands/AboutCommandGroup.cs b/src/Commands/AboutCommandGroup.cs index af65b15..2c34b79 100644 --- a/src/Commands/AboutCommandGroup.cs +++ b/src/Commands/AboutCommandGroup.cs @@ -2,6 +2,7 @@ using System.Text; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Rest; @@ -16,6 +17,7 @@ namespace Boyfriend.Commands; /// /// Handles the command to show information about this bot: /about. /// +[UsedImplicitly] public class AboutCommandGroup : CommandGroup { private static readonly string[] Developers = { "Octol1ttle", "mctaylors", "neroduckale" }; private readonly ICommandContext _context; @@ -40,6 +42,7 @@ public class AboutCommandGroup : CommandGroup { /// [Command("about")] [Description("Shows Boyfriend's developers")] + [UsedImplicitly] public async Task SendAboutBotAsync() { if (!_context.TryGetContextIDs(out var guildId, out _, out _)) return Result.FromError( diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index bd2439e..16fccb5 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Text; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Objects; @@ -19,6 +20,7 @@ namespace Boyfriend.Commands; /// /// Handles commands related to ban management: /ban and /unban. /// +[UsedImplicitly] public class BanCommandGroup : CommandGroup { private readonly IDiscordRestChannelAPI _channelApi; private readonly ICommandContext _context; @@ -60,6 +62,7 @@ public class BanCommandGroup : CommandGroup { [RequireDiscordPermission(DiscordPermission.BanMembers)] [RequireBotDiscordPermissions(DiscordPermission.BanMembers)] [Description("Ban user")] + [UsedImplicitly] public async Task BanUserAsync( [Description("User to ban")] IUser target, [Description("Ban reason")] string reason, @@ -197,6 +200,7 @@ public class BanCommandGroup : CommandGroup { [RequireDiscordPermission(DiscordPermission.BanMembers)] [RequireBotDiscordPermissions(DiscordPermission.BanMembers)] [Description("Unban user")] + [UsedImplicitly] public async Task UnbanUserAsync( [Description("User to unban")] IUser target, [Description("Unban reason")] string reason) { diff --git a/src/Commands/ErrorLoggingEvents.cs b/src/Commands/ErrorLoggingEvents.cs index e35493e..c5eba21 100644 --- a/src/Commands/ErrorLoggingEvents.cs +++ b/src/Commands/ErrorLoggingEvents.cs @@ -1,5 +1,7 @@ +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; @@ -8,6 +10,7 @@ namespace Boyfriend.Commands; /// /// Handles error logging for slash commands that couldn't be successfully prepared. /// +[UsedImplicitly] public class ErrorLoggingPreparationErrorEvent : IPreparationErrorEvent { private readonly ILogger _logger; @@ -25,8 +28,11 @@ public class ErrorLoggingPreparationErrorEvent : IPreparationErrorEvent { /// A result which has succeeded. public Task PreparationFailed( IOperationContext context, IResult preparationResult, CancellationToken ct = default) { - if (!preparationResult.IsSuccess) + 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()); } @@ -35,6 +41,7 @@ public class ErrorLoggingPreparationErrorEvent : IPreparationErrorEvent { /// /// Handles error logging for slash command groups. /// +[UsedImplicitly] public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent { private readonly ILogger _logger; @@ -52,8 +59,11 @@ public class ErrorLoggingPostExecutionEvent : IPostExecutionEvent { /// A result which has succeeded. public Task AfterExecutionAsync( ICommandContext context, IResult commandResult, CancellationToken ct = default) { - if (!commandResult.IsSuccess) + 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()); } diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs index eb06b50..9fb7b4c 100644 --- a/src/Commands/KickCommandGroup.cs +++ b/src/Commands/KickCommandGroup.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Objects; @@ -17,6 +18,7 @@ namespace Boyfriend.Commands; /// /// Handles the command to kick members of a guild: /kick. /// +[UsedImplicitly] public class KickCommandGroup : CommandGroup { private readonly IDiscordRestChannelAPI _channelApi; private readonly ICommandContext _context; @@ -56,6 +58,7 @@ public class KickCommandGroup : CommandGroup { [RequireDiscordPermission(DiscordPermission.KickMembers)] [RequireBotDiscordPermissions(DiscordPermission.KickMembers)] [Description("Kick member")] + [UsedImplicitly] public async Task KickUserAsync( [Description("Member to kick")] IUser target, [Description("Kick reason")] string reason) { diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index 76a44d2..9dbfcbd 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -2,6 +2,7 @@ using System.ComponentModel; using System.Text; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Objects; @@ -19,6 +20,7 @@ namespace Boyfriend.Commands; /// /// Handles commands related to mute management: /mute and /unmute. /// +[UsedImplicitly] public class MuteCommandGroup : CommandGroup { private readonly IDiscordRestChannelAPI _channelApi; private readonly ICommandContext _context; @@ -60,6 +62,7 @@ public class MuteCommandGroup : CommandGroup { [RequireDiscordPermission(DiscordPermission.ModerateMembers)] [RequireBotDiscordPermissions(DiscordPermission.ModerateMembers)] [Description("Mute member")] + [UsedImplicitly] public async Task MuteUserAsync( [Description("Member to mute")] IUser target, [Description("Mute reason")] string reason, @@ -173,6 +176,7 @@ public class MuteCommandGroup : CommandGroup { [RequireDiscordPermission(DiscordPermission.ModerateMembers)] [RequireBotDiscordPermissions(DiscordPermission.ModerateMembers)] [Description("Unmute member")] + [UsedImplicitly] public async Task UnmuteUserAsync( [Description("Member to unmute")] IUser target, [Description("Unmute reason")] string reason) { diff --git a/src/Commands/PingCommandGroup.cs b/src/Commands/PingCommandGroup.cs index 9f336ca..52d924f 100644 --- a/src/Commands/PingCommandGroup.cs +++ b/src/Commands/PingCommandGroup.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Rest; @@ -15,6 +16,7 @@ namespace Boyfriend.Commands; /// /// Handles the command to get the time taken for the gateway to respond to the last heartbeat: /ping /// +[UsedImplicitly] public class PingCommandGroup : CommandGroup { private readonly IDiscordRestChannelAPI _channelApi; private readonly DiscordGatewayClient _client; @@ -42,6 +44,7 @@ public class PingCommandGroup : CommandGroup { /// [Command("ping", "пинг")] [Description("Get bot latency")] + [UsedImplicitly] public async Task SendPingAsync() { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out _)) return Result.FromError( diff --git a/src/Commands/RemindCommandGroup.cs b/src/Commands/RemindCommandGroup.cs index 430c1cd..28e5bf8 100644 --- a/src/Commands/RemindCommandGroup.cs +++ b/src/Commands/RemindCommandGroup.cs @@ -1,6 +1,7 @@ using System.ComponentModel; using Boyfriend.Data; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Rest; @@ -15,6 +16,7 @@ namespace Boyfriend.Commands; /// /// Handles the command to manage reminders: /remind /// +[UsedImplicitly] public class RemindCommandGroup : CommandGroup { private readonly ICommandContext _context; private readonly GuildDataService _dataService; @@ -38,6 +40,7 @@ public class RemindCommandGroup : CommandGroup { /// A feedback sending result which may or may not have succeeded. [Command("remind")] [Description("Create a reminder")] + [UsedImplicitly] public async Task AddReminderAsync( [Description("After what period of time mention the reminder")] TimeSpan @in, diff --git a/src/Commands/SettingsCommandGroup.cs b/src/Commands/SettingsCommandGroup.cs index 6b6c594..9deb0c6 100644 --- a/src/Commands/SettingsCommandGroup.cs +++ b/src/Commands/SettingsCommandGroup.cs @@ -3,6 +3,7 @@ using System.Text; using Boyfriend.Data; using Boyfriend.Data.Options; using Boyfriend.Services; +using JetBrains.Annotations; using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Rest; @@ -17,6 +18,7 @@ namespace Boyfriend.Commands; /// /// Handles the commands to list and modify per-guild settings: /settings and /settings list. /// +[UsedImplicitly] public class SettingsCommandGroup : CommandGroup { private static readonly IOption[] AllOptions = { GuildSettings.Language, @@ -56,6 +58,7 @@ public class SettingsCommandGroup : CommandGroup { /// [Command("settingslist")] [Description("Shows settings list for this server")] + [UsedImplicitly] public async Task ListSettingsAsync() { if (!_context.TryGetContextIDs(out var guildId, out _, out _)) return Result.FromError( @@ -93,6 +96,7 @@ public class SettingsCommandGroup : CommandGroup { /// A feedback sending result which may or may not have succeeded. [Command("settings")] [Description("Change settings for this server")] + [UsedImplicitly] public async Task EditSettingsAsync( [Description("The setting whose value you want to change")] string setting, diff --git a/src/Data/GuildSettings.cs b/src/Data/GuildSettings.cs index 4e5e6cc..07e43a6 100644 --- a/src/Data/GuildSettings.cs +++ b/src/Data/GuildSettings.cs @@ -1,4 +1,5 @@ using Boyfriend.Data.Options; +using Boyfriend.Responders; using Remora.Discord.API.Abstractions.Objects; namespace Boyfriend.Data; @@ -19,14 +20,14 @@ public static class GuildSettings { /// will be sent if set to "default" or "reset" /// /// - /// + /// public static readonly Option WelcomeMessage = new("WelcomeMessage", "default"); /// /// Controls whether or not the message should be sent /// in on startup. /// - /// + /// public static readonly BoolOption ReceiveStartupMessages = new("ReceiveStartupMessages", false); public static readonly BoolOption RemoveRolesOnMute = new("RemoveRolesOnMute", false); diff --git a/src/InteractionResponders.cs b/src/InteractionResponders.cs index 49af44c..6f40d2a 100644 --- a/src/InteractionResponders.cs +++ b/src/InteractionResponders.cs @@ -1,3 +1,4 @@ +using JetBrains.Annotations; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.Commands.Feedback.Messages; using Remora.Discord.Commands.Feedback.Services; @@ -9,6 +10,7 @@ namespace Boyfriend; /// /// Handles responding to various interactions. /// +[UsedImplicitly] public class InteractionResponders : InteractionGroup { private readonly FeedbackService _feedbackService; @@ -22,6 +24,7 @@ public class InteractionResponders : InteractionGroup { /// The ID of the guild and scheduled event, encoded as "guildId:eventId". /// An ephemeral feedback sending result which may or may not have succeeded. [Button("scheduled-event-details")] + [UsedImplicitly] public async Task OnStatefulButtonClicked(string? state = null) { if (state is null) return Result.FromError(new ArgumentNullError(nameof(state)));