From c53f165c8afc0f97785c49c2fbef0d99d5c862a6 Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Thu, 20 Jul 2023 18:56:53 +0500 Subject: [PATCH] Reduce complexity of KickCommandGroup#KickUserAsync Signed-off-by: Octol1ttle --- src/Commands/KickCommandGroup.cs | 121 +++++++++++++------------------ 1 file changed, 51 insertions(+), 70 deletions(-) diff --git a/src/Commands/KickCommandGroup.cs b/src/Commands/KickCommandGroup.cs index 56154bd..7a9fe0c 100644 --- a/src/Commands/KickCommandGroup.cs +++ b/src/Commands/KickCommandGroup.cs @@ -6,12 +6,12 @@ using Remora.Commands.Attributes; using Remora.Commands.Groups; using Remora.Discord.API.Abstractions.Objects; using Remora.Discord.API.Abstractions.Rest; -using Remora.Discord.API.Objects; using Remora.Discord.Commands.Attributes; using Remora.Discord.Commands.Conditions; using Remora.Discord.Commands.Contexts; using Remora.Discord.Commands.Feedback.Services; using Remora.Discord.Extensions.Embeds; +using Remora.Rest.Core; using Remora.Results; namespace Boyfriend.Commands; @@ -62,21 +62,25 @@ public class KickCommandGroup : CommandGroup { [RequireBotDiscordPermissions(DiscordPermission.KickMembers)] [Description("Kick member")] [UsedImplicitly] - public async Task KickUserAsync( + public async Task ExecuteKick( [Description("Member to kick")] IUser target, [Description("Kick reason")] string reason) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var userId)) return Result.FromError( new ArgumentNullError(nameof(_context), "Unable to retrieve necessary IDs from command context")); - // The current user's avatar is used when sending error messages var currentUserResult = await _userApi.GetCurrentUserAsync(CancellationToken); if (!currentUserResult.IsDefined(out var currentUser)) return Result.FromError(currentUserResult); + var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken); + if (!userResult.IsDefined(out var user)) + return Result.FromError(userResult); + var guildResult = await _guildApi.GetGuildAsync(guildId.Value, ct: CancellationToken); + if (!guildResult.IsDefined(out var guild)) + return Result.FromError(guildResult); var data = await _dataService.GetData(guildId.Value, CancellationToken); - var cfg = data.Settings; - Messages.Culture = GuildSettings.Language.Get(cfg); + Messages.Culture = GuildSettings.Language.Get(data.Settings); var memberResult = await _guildApi.GetGuildMemberAsync(guildId.Value, target.ID, CancellationToken); if (!memberResult.IsSuccess) { @@ -86,79 +90,56 @@ public class KickCommandGroup : CommandGroup { return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } + return await KickUserAsync(target, reason, guild, channelId.Value, data, user, currentUser); + } + + private async Task KickUserAsync( + IUser target, string reason, IGuild guild, Snowflake channelId, GuildData data, IUser user, IUser currentUser) { var interactionResult - = await _utility.CheckInteractionsAsync(guildId.Value, userId.Value, target.ID, "Kick", CancellationToken); + = await _utility.CheckInteractionsAsync(guild.ID, user.ID, target.ID, "Kick", CancellationToken); if (!interactionResult.IsSuccess) return Result.FromError(interactionResult); - Result responseEmbed; if (interactionResult.Entity is not null) { - responseEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser) + var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser) .WithColour(ColorsList.Red).Build(); - } else { - var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken); - if (!userResult.IsDefined(out var user)) - return Result.FromError(userResult); - var dmChannelResult = await _userApi.CreateDMAsync(target.ID, CancellationToken); - if (dmChannelResult.IsDefined(out var dmChannel)) { - var guildResult = await _guildApi.GetGuildAsync(guildId.Value, ct: CancellationToken); - if (!guildResult.IsDefined(out var guild)) - return Result.FromError(guildResult); - - var dmEmbed = new EmbedBuilder().WithGuildTitle(guild) - .WithTitle(Messages.YouWereKicked) - .WithDescription(string.Format(Messages.DescriptionActionReason, reason)) - .WithActionFooter(user) - .WithCurrentTimestamp() - .WithColour(ColorsList.Red) - .Build(); - - if (!dmEmbed.IsDefined(out var dmBuilt)) - return Result.FromError(dmEmbed); - await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: CancellationToken); - } - - var kickResult = await _guildApi.RemoveGuildMemberAsync( - guildId.Value, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(), - ct: CancellationToken); - if (!kickResult.IsSuccess) - return Result.FromError(kickResult.Error); - data.GetMemberData(target.ID).Roles.Clear(); - - responseEmbed = new EmbedBuilder().WithSmallTitle( - string.Format(Messages.UserKicked, target.GetTag()), target) - .WithColour(ColorsList.Green).Build(); - - if ((!GuildSettings.PublicFeedbackChannel.Get(cfg).Empty() - && GuildSettings.PublicFeedbackChannel.Get(cfg) != channelId.Value) - || (!GuildSettings.PrivateFeedbackChannel.Get(cfg).Empty() - && GuildSettings.PrivateFeedbackChannel.Get(cfg) != channelId.Value)) { - var logEmbed = new EmbedBuilder().WithSmallTitle( - string.Format(Messages.UserKicked, target.GetTag()), target) - .WithDescription(string.Format(Messages.DescriptionActionReason, reason)) - .WithActionFooter(user) - .WithCurrentTimestamp() - .WithColour(ColorsList.Red) - .Build(); - - if (!logEmbed.IsDefined(out var logBuilt)) - return Result.FromError(logEmbed); - - var builtArray = new[] { logBuilt }; - // Not awaiting to reduce response time - if (GuildSettings.PublicFeedbackChannel.Get(cfg) != channelId.Value) - _ = _channelApi.CreateMessageAsync( - GuildSettings.PublicFeedbackChannel.Get(cfg), embeds: builtArray, - ct: CancellationToken); - if (GuildSettings.PrivateFeedbackChannel.Get(cfg) != GuildSettings.PublicFeedbackChannel.Get(cfg) - && GuildSettings.PrivateFeedbackChannel.Get(cfg) != channelId.Value) - _ = _channelApi.CreateMessageAsync( - GuildSettings.PrivateFeedbackChannel.Get(cfg), embeds: builtArray, - ct: CancellationToken); - } + return await _feedbackService.SendContextualEmbedResultAsync(failedEmbed, CancellationToken); } - return await _feedbackService.SendContextualEmbedResultAsync(responseEmbed, CancellationToken); + var dmChannelResult = await _userApi.CreateDMAsync(target.ID, CancellationToken); + if (dmChannelResult.IsDefined(out var dmChannel)) { + var dmEmbed = new EmbedBuilder().WithGuildTitle(guild) + .WithTitle(Messages.YouWereKicked) + .WithDescription(string.Format(Messages.DescriptionActionReason, reason)) + .WithActionFooter(user) + .WithCurrentTimestamp() + .WithColour(ColorsList.Red) + .Build(); + + if (!dmEmbed.IsDefined(out var dmBuilt)) + return Result.FromError(dmEmbed); + await _channelApi.CreateMessageAsync(dmChannel.ID, embeds: new[] { dmBuilt }, ct: CancellationToken); + } + + var kickResult = await _guildApi.RemoveGuildMemberAsync( + guild.ID, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(), + CancellationToken); + if (!kickResult.IsSuccess) + return Result.FromError(kickResult.Error); + data.GetMemberData(target.ID).Roles.Clear(); + + var title = string.Format(Messages.UserKicked, target.GetTag()); + var description = string.Format(Messages.DescriptionActionReason, reason); + var logResult = _utility.LogActionAsync( + data.Settings, channelId, user, title, description, target, CancellationToken); + if (!logResult.IsSuccess) + return Result.FromError(logResult.Error); + + var embed = new EmbedBuilder().WithSmallTitle( + string.Format(Messages.UserKicked, target.GetTag()), target) + .WithColour(ColorsList.Green).Build(); + + return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } }