diff --git a/src/Commands/MuteCommandGroup.cs b/src/Commands/MuteCommandGroup.cs index 16f3d4c..bc64a64 100644 --- a/src/Commands/MuteCommandGroup.cs +++ b/src/Commands/MuteCommandGroup.cs @@ -133,11 +133,16 @@ public class MuteCommandGroup : CommandGroup var until = DateTimeOffset.UtcNow.Add(duration); // >:) var memberData = data.GetOrCreateMemberData(target.ID); - memberData.MutedUntil = DateTimeOffset.UtcNow.Add(duration); + memberData.MutedUntil = until; var assignRoles = new List { GuildSettings.MuteRole.Get(data.Settings) }; + if (!GuildSettings.RemoveRolesOnMute.Get(data.Settings)) + { + assignRoles.AddRange(memberData.Roles.ConvertAll(r => r.ToSnowflake())); + } + var muteResult = await _guildApi.ModifyGuildMemberAsync( guildId, target.ID, roles: assignRoles, reason: $"({user.GetTag()}) {reason}".EncodeHeader(), ct: ct); @@ -170,7 +175,7 @@ public class MuteCommandGroup : CommandGroup IUser target, string reason, TimeSpan duration, Snowflake guildId, GuildData data, Snowflake channelId, IUser user, IUser currentUser, CancellationToken ct = default) { - if (duration.Days >= 28) + if (duration.TotalDays >= 28) { var failedEmbed = new EmbedBuilder().WithSmallTitle(Messages.BotCannotMuteTarget, currentUser) .WithDescription(Messages.DurationRequiredForTimeOuts) diff --git a/src/Services/Update/MemberUpdateService.cs b/src/Services/Update/MemberUpdateService.cs index 65a9808..ab3993e 100644 --- a/src/Services/Update/MemberUpdateService.cs +++ b/src/Services/Update/MemberUpdateService.cs @@ -79,30 +79,9 @@ public sealed partial class MemberUpdateService : BackgroundService { var failedResults = new List(); var id = data.Id.ToSnowflake(); - if (DateTimeOffset.UtcNow > data.BannedUntil) - { - var unbanResult = await _guildApi.RemoveGuildBanAsync( - guildId, id, Messages.PunishmentExpired.EncodeHeader(), ct); - if (unbanResult.IsSuccess) - { - data.BannedUntil = null; - } - return unbanResult; - } - - if (DateTimeOffset.UtcNow > data.MutedUntil) - { - var unmuteResult = await _guildApi.ModifyGuildMemberAsync( - guildId, id, roles: data.Roles.ConvertAll(r => r.ToSnowflake()), - reason: Messages.PunishmentExpired.EncodeHeader(), ct: ct); - if (unmuteResult.IsSuccess) - { - data.MutedUntil = null; - } - - return unmuteResult; - } + var punishmentsResult = await CheckMemberPunishmentsAsync(guildId, id, data, ct); + failedResults.AddIfFailed(punishmentsResult); if (defaultRole.Value is not 0 && !data.Roles.Contains(defaultRole.Value)) { @@ -138,6 +117,35 @@ public sealed partial class MemberUpdateService : BackgroundService return failedResults.AggregateErrors(); } + private async Task CheckMemberPunishmentsAsync( + Snowflake guildId, Snowflake id, MemberData data, CancellationToken ct) + { + if (DateTimeOffset.UtcNow > data.BannedUntil) + { + var unbanResult = await _guildApi.RemoveGuildBanAsync( + guildId, id, Messages.PunishmentExpired.EncodeHeader(), ct); + if (unbanResult.IsSuccess) + { + data.BannedUntil = null; + } + + return unbanResult; + } + + if (DateTimeOffset.UtcNow > data.MutedUntil) + { + var unmuteResult = await _guildApi.ModifyGuildMemberAsync( + guildId, id, roles: data.Roles.ConvertAll(r => r.ToSnowflake()), + reason: Messages.PunishmentExpired.EncodeHeader(), ct: ct); + if (unmuteResult.IsSuccess) + { + data.MutedUntil = null; + } + } + + return Result.FromSuccess(); + } + private async Task FilterNicknameAsync(Snowflake guildId, IUser user, IGuildMember member, CancellationToken ct) {