From 5056b0aa94ffd83e6005c6c50d25a16020ff1d3b Mon Sep 17 00:00:00 2001 From: Octol1ttle Date: Thu, 20 Jul 2023 19:20:49 +0500 Subject: [PATCH] Reduce complexity of methods in MuteCommandGroup Signed-off-by: Octol1ttle --- src/Commands/BanCommandGroup.cs | 6 +- src/Commands/MuteCommandGroup.cs | 192 +++++++++++++------------------ 2 files changed, 85 insertions(+), 113 deletions(-) diff --git a/src/Commands/BanCommandGroup.cs b/src/Commands/BanCommandGroup.cs index 14f6d4f..51529aa 100644 --- a/src/Commands/BanCommandGroup.cs +++ b/src/Commands/BanCommandGroup.cs @@ -91,8 +91,7 @@ public class BanCommandGroup : CommandGroup { IUser target, string reason, TimeSpan? duration, IGuild guild, Snowflake channelId, IUser user, IUser currentUser) { var data = await _dataService.GetData(guild.ID, CancellationToken); - var cfg = data.Settings; - Messages.Culture = GuildSettings.Language.Get(cfg); + Messages.Culture = GuildSettings.Language.Get(data.Settings); var existingBanResult = await _guildApi.GetGuildBanAsync(guild.ID, target.ID, CancellationToken); if (existingBanResult.IsDefined()) { @@ -152,7 +151,8 @@ public class BanCommandGroup : CommandGroup { title, target) .WithColour(ColorsList.Green).Build(); - var logResult = _utility.LogActionAsync(cfg, channelId, user, title, description, target, CancellationToken); + var logResult = _utility.LogActionAsync( + data.Settings, channelId, user, title, description, target, CancellationToken); if (!logResult.IsSuccess) return Result.FromError(logResult.Error); diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index eff7029..c572b78 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -7,13 +7,13 @@ 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.Discord.Extensions.Formatting; +using Remora.Rest.Core; using Remora.Results; namespace Boyfriend.Commands; @@ -23,20 +23,17 @@ namespace Boyfriend.Commands; /// [UsedImplicitly] public class MuteCommandGroup : CommandGroup { - private readonly IDiscordRestChannelAPI _channelApi; - private readonly ICommandContext _context; - private readonly GuildDataService _dataService; - private readonly FeedbackService _feedbackService; - private readonly IDiscordRestGuildAPI _guildApi; - private readonly IDiscordRestUserAPI _userApi; - private readonly UtilityService _utility; + private readonly ICommandContext _context; + private readonly GuildDataService _dataService; + private readonly FeedbackService _feedbackService; + private readonly IDiscordRestGuildAPI _guildApi; + private readonly IDiscordRestUserAPI _userApi; + private readonly UtilityService _utility; public MuteCommandGroup( - ICommandContext context, IDiscordRestChannelAPI channelApi, GuildDataService dataService, - FeedbackService feedbackService, IDiscordRestGuildAPI guildApi, IDiscordRestUserAPI userApi, - UtilityService utility) { + ICommandContext context, GuildDataService dataService, FeedbackService feedbackService, + IDiscordRestGuildAPI guildApi, IDiscordRestUserAPI userApi, UtilityService utility) { _context = context; - _channelApi = channelApi; _dataService = dataService; _feedbackService = feedbackService; _guildApi = guildApi; @@ -57,7 +54,7 @@ public class MuteCommandGroup : CommandGroup { /// A feedback sending result which may or may not have succeeded. A successful result does not mean that the member /// was muted and vice-versa. /// - /// + /// [Command("mute", "мут")] [DiscordDefaultMemberPermissions(DiscordPermission.ModerateMembers)] [DiscordDefaultDMPermission(false)] @@ -66,7 +63,7 @@ public class MuteCommandGroup : CommandGroup { [RequireBotDiscordPermissions(DiscordPermission.ModerateMembers)] [Description("Mute member")] [UsedImplicitly] - public async Task MuteUserAsync( + public async Task ExecuteMute( [Description("Member to mute")] IUser target, [Description("Mute reason")] string reason, [Description("Mute duration")] TimeSpan duration) { @@ -79,6 +76,13 @@ public class MuteCommandGroup : CommandGroup { 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 data = await _dataService.GetData(guildId.Value, CancellationToken); + Messages.Culture = GuildSettings.Language.Get(data.Settings); + var memberResult = await _guildApi.GetGuildMemberAsync(guildId.Value, target.ID, CancellationToken); if (!memberResult.IsSuccess) { var embed = new EmbedBuilder().WithSmallTitle(Messages.UserNotFoundShort, currentUser) @@ -87,71 +91,48 @@ public class MuteCommandGroup : CommandGroup { return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } + return await MuteUserAsync(target, reason, duration, guildId.Value, data, channelId.Value, user, currentUser); + } + + private async Task MuteUserAsync( + IUser target, string reason, TimeSpan duration, Snowflake guildId, GuildData data, Snowflake channelId, + IUser user, IUser currentUser) { var interactionResult = await _utility.CheckInteractionsAsync( - guildId.Value, userId.Value, target.ID, "Mute", CancellationToken); + guildId, user.ID, target.ID, "Mute", CancellationToken); if (!interactionResult.IsSuccess) return Result.FromError(interactionResult); - var data = await _dataService.GetData(guildId.Value, CancellationToken); - var cfg = data.Settings; - Messages.Culture = GuildSettings.Language.Get(cfg); - - 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 until = DateTimeOffset.UtcNow.Add(duration); // >:) - var muteResult = await _guildApi.ModifyGuildMemberAsync( - guildId.Value, target.ID, reason: $"({user.GetTag()}) {reason}".EncodeHeader(), - communicationDisabledUntil: until, ct: CancellationToken); - if (!muteResult.IsSuccess) - return Result.FromError(muteResult.Error); - - responseEmbed = new EmbedBuilder().WithSmallTitle( - string.Format(Messages.UserMuted, 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 builder = new StringBuilder().AppendLine(string.Format(Messages.DescriptionActionReason, reason)) - .Append( - string.Format( - Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))); - - var logEmbed = new EmbedBuilder().WithSmallTitle( - string.Format(Messages.UserMuted, target.GetTag()), target) - .WithDescription(builder.ToString()) - .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 until = DateTimeOffset.UtcNow.Add(duration); // >:) + var muteResult = await _guildApi.ModifyGuildMemberAsync( + guildId, target.ID, reason: $"({user.GetTag()}) {reason}".EncodeHeader(), + communicationDisabledUntil: until, ct: CancellationToken); + if (!muteResult.IsSuccess) + return Result.FromError(muteResult.Error); + + var title = string.Format(Messages.UserMuted, target.GetTag()); + var description = new StringBuilder().AppendLine(string.Format(Messages.DescriptionActionReason, reason)) + .Append( + string.Format( + Messages.DescriptionActionExpiresAt, Markdown.Timestamp(until))).ToString(); + + 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.UserMuted, target.GetTag()), target) + .WithColour(ColorsList.Green).Build(); + + return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } /// @@ -166,7 +147,7 @@ public class MuteCommandGroup : CommandGroup { /// A feedback sending result which may or may not have succeeded. A successful result does not mean that the member /// was unmuted and vice-versa. /// - /// + /// /// [Command("unmute", "размут")] [DiscordDefaultMemberPermissions(DiscordPermission.ModerateMembers)] @@ -176,7 +157,7 @@ public class MuteCommandGroup : CommandGroup { [RequireBotDiscordPermissions(DiscordPermission.ModerateMembers)] [Description("Unmute member")] [UsedImplicitly] - public async Task UnmuteUserAsync( + public async Task ExecuteUnmute( [Description("Member to unmute")] IUser target, [Description("Unmute reason")] string reason) { if (!_context.TryGetContextIDs(out var guildId, out var channelId, out var userId)) @@ -188,8 +169,13 @@ public class MuteCommandGroup : CommandGroup { if (!currentUserResult.IsDefined(out var currentUser)) return Result.FromError(currentUserResult); - var cfg = await _dataService.GetSettings(guildId.Value, CancellationToken); - Messages.Culture = GuildSettings.Language.Get(cfg); + // Needed to get the tag and avatar + var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken); + if (!userResult.IsDefined(out var user)) + return Result.FromError(userResult); + + var data = await _dataService.GetData(guildId.Value, CancellationToken); + Messages.Culture = GuildSettings.Language.Get(data.Settings); var memberResult = await _guildApi.GetGuildMemberAsync(guildId.Value, target.ID, CancellationToken); if (!memberResult.IsSuccess) { @@ -199,56 +185,42 @@ public class MuteCommandGroup : CommandGroup { return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } + return await UnmuteUserAsync(target, reason, guildId.Value, data, channelId.Value, user, currentUser); + } + + private async Task UnmuteUserAsync( + IUser target, string reason, Snowflake guildId, GuildData data, Snowflake channelId, IUser user, + IUser currentUser) { var interactionResult = await _utility.CheckInteractionsAsync( - guildId.Value, userId.Value, target.ID, "Unmute", CancellationToken); + guildId, user.ID, target.ID, "Unmute", CancellationToken); if (!interactionResult.IsSuccess) return Result.FromError(interactionResult); - // Needed to get the tag and avatar - var userResult = await _userApi.GetUserAsync(userId.Value, CancellationToken); - if (!userResult.IsDefined(out var user)) - return Result.FromError(userResult); + if (interactionResult.Entity is not null) { + var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser) + .WithColour(ColorsList.Red).Build(); + + return await _feedbackService.SendContextualEmbedResultAsync(failedEmbed, CancellationToken); + } var unmuteResult = await _guildApi.ModifyGuildMemberAsync( - guildId.Value, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(), + guildId, target.ID, $"({user.GetTag()}) {reason}".EncodeHeader(), communicationDisabledUntil: null, ct: CancellationToken); if (!unmuteResult.IsSuccess) return Result.FromError(unmuteResult.Error); - var responseEmbed = new EmbedBuilder().WithSmallTitle( + var title = string.Format(Messages.UserUnmuted, 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.UserUnmuted, 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.UserUnmuted, target.GetTag()), target) - .WithDescription(string.Format(Messages.DescriptionActionReason, reason)) - .WithActionFooter(user) - .WithCurrentTimestamp() - .WithColour(ColorsList.Green) - .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(responseEmbed, CancellationToken); + return await _feedbackService.SendContextualEmbedResultAsync(embed, CancellationToken); } }