diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index d558ba2..94b85a6 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -285,17 +285,11 @@ public class MuteCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(embed, CancellationToken); } - if (data.GetOrCreateMemberData(target.ID).MutedUntil is not null) - { - return await RemoveMuteRoleUserAsync( - target, reason, guildId, data, channelId, user, currentUser, CancellationToken); - } - - return await RemoveTimeoutUserAsync( + return await RemoveMuteAsync( target, reason, guildId, data, channelId, user, currentUser, CancellationToken); } - private async Task RemoveMuteRoleUserAsync( + private async Task RemoveMuteAsync( IUser target, string reason, Snowflake guildId, GuildData data, Snowflake channelId, IUser user, IUser currentUser, CancellationToken ct = default) { @@ -315,58 +309,37 @@ public class MuteCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct); } + var guildMemberResult = await _guildApi.GetGuildMemberAsync(guildId, user.ID, ct); + DateTimeOffset? communicationDisabledUntil = null; + if (guildMemberResult.IsDefined(out var guildMember)) + { + communicationDisabledUntil = guildMember.CommunicationDisabledUntil.OrDefault(null); + } + var memberData = data.GetOrCreateMemberData(target.ID); - var unmuteResult = await _guildApi.ModifyGuildMemberAsync( - guildId, target.ID, roles: memberData.Roles.ConvertAll(r => r.ToSnowflake()), - reason: $"({user.GetTag()}) {reason}".EncodeHeader(), ct: ct); - memberData.MutedUntil = null; - if (!unmuteResult.IsSuccess) + var isMuted = memberData.MutedUntil is not null || communicationDisabledUntil is not null; + + if (!isMuted) { - return Result.FromError(unmuteResult.Error); - } - - 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, ColorsList.Green, ct: ct); - if (!logResult.IsSuccess) - { - return Result.FromError(logResult.Error); - } - - var embed = new EmbedBuilder().WithSmallTitle( - string.Format(Messages.UserUnmuted, target.GetTag()), target) - .WithColour(ColorsList.Green).Build(); - - return await _feedback.SendContextualEmbedResultAsync(embed, ct); - } - - private async Task RemoveTimeoutUserAsync( - IUser target, string reason, Snowflake guildId, GuildData data, Snowflake channelId, IUser user, - IUser currentUser, CancellationToken ct = default) - { - var interactionResult - = await _utility.CheckInteractionsAsync( - guildId, user.ID, target.ID, "Unmute", ct); - if (!interactionResult.IsSuccess) - { - return Result.FromError(interactionResult); - } - - if (interactionResult.Entity is not null) - { - var failedEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, currentUser) + var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.UserNotMuted, currentUser) .WithColour(ColorsList.Red).Build(); return await _feedback.SendContextualEmbedResultAsync(failedEmbed, ct); } - var unmuteResult = await _guildApi.ModifyGuildMemberAsync( - guildId, target.ID, reason: $"({user.GetTag()}) {reason}".EncodeHeader(), - communicationDisabledUntil: null, ct: ct); - if (!unmuteResult.IsSuccess) + if (memberData.MutedUntil is not null) { - return Result.FromError(unmuteResult.Error); + await _guildApi.ModifyGuildMemberAsync( + guildId, target.ID, roles: memberData.Roles.ConvertAll(r => r.ToSnowflake()), + reason: $"({user.GetTag()}) {reason}".EncodeHeader(), ct: ct); + memberData.MutedUntil = null; + } + + if (communicationDisabledUntil is not null) + { + await _guildApi.ModifyGuildMemberAsync( + guildId, target.ID, reason: $"({user.GetTag()}) {reason}".EncodeHeader(), + communicationDisabledUntil: null, ct: ct); } var title = string.Format(Messages.UserUnmuted, target.GetTag());