From dc229ea2b34b2c6427b192f3e4db49b20b4a7979 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 11 Aug 2022 16:19:02 +0200 Subject: [PATCH] Added Timeout as a punishment to warnpunish and anti* commands --- src/NadekoBot/Db/Models/AntiProtection.cs | 3 ++- .../Protection/ProtectionCommands.cs | 15 ++++++++++++++- .../UserPunish/UserPunishCommands.cs | 4 ++++ .../UserPunish/UserPunishService.cs | 10 +++++++++- 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/NadekoBot/Db/Models/AntiProtection.cs b/src/NadekoBot/Db/Models/AntiProtection.cs index 58df3f108..26024be6f 100644 --- a/src/NadekoBot/Db/Models/AntiProtection.cs +++ b/src/NadekoBot/Db/Models/AntiProtection.cs @@ -49,7 +49,8 @@ public enum PunishmentAction ChatMute, VoiceMute, AddRole, - Warn + Warn, + TimeOut } public class AntiSpamIgnore : DbEntity diff --git a/src/NadekoBot/Modules/Administration/Protection/ProtectionCommands.cs b/src/NadekoBot/Modules/Administration/Protection/ProtectionCommands.cs index 9e244bc89..eea1e9712 100644 --- a/src/NadekoBot/Modules/Administration/Protection/ProtectionCommands.cs +++ b/src/NadekoBot/Modules/Administration/Protection/ProtectionCommands.cs @@ -38,10 +38,14 @@ public partial class Administration if (minAgeMinutes < 1 || punishTimeMinutes < 0) return; + var minutes = (int?)punishTime?.Time.TotalMinutes ?? 0; + if (action is PunishmentAction.TimeOut && minutes < 1) + minutes = 1; + await _service.StartAntiAltAsync(ctx.Guild.Id, minAgeMinutes, action, - (int?)punishTime?.Time.TotalMinutes ?? 0); + minutes); await ctx.OkAsync(); } @@ -56,6 +60,9 @@ public partial class Administration if (minAgeMinutes < 1) return; + if (action == PunishmentAction.TimeOut) + return; + await _service.StartAntiAltAsync(ctx.Guild.Id, minAgeMinutes, action, roleId: role.Id); await ctx.OkAsync(); @@ -122,6 +129,9 @@ public partial class Administration var time = (int?)punishTime?.Time.TotalMinutes ?? 0; if (time is < 0 or > 60 * 24) return; + + if(action is PunishmentAction.TimeOut && time < 1) + return; var stats = await _service.StartAntiRaidAsync(ctx.Guild.Id, userThreshold, seconds, action, time); @@ -187,6 +197,9 @@ public partial class Administration if (time is < 0 or > 60 * 24) return; + if (action is PunishmentAction.TimeOut && time < 1) + return; + var stats = await _service.StartAntiSpamAsync(ctx.Guild.Id, messageCount, action, time, role?.Id); await SendConfirmAsync(GetText(strs.prot_enable("Anti-Spam")), diff --git a/src/NadekoBot/Modules/Administration/UserPunish/UserPunishCommands.cs b/src/NadekoBot/Modules/Administration/UserPunish/UserPunishCommands.cs index 72153264e..576f59e1c 100644 --- a/src/NadekoBot/Modules/Administration/UserPunish/UserPunishCommands.cs +++ b/src/NadekoBot/Modules/Administration/UserPunish/UserPunishCommands.cs @@ -345,6 +345,10 @@ public partial class Administration if (punish is PunishmentAction.AddRole or PunishmentAction.Warn) return; + // you must specify the time for timeout + if (punish is PunishmentAction.TimeOut && time is null) + return; + var success = _service.WarnPunish(ctx.Guild.Id, number, punish, time); if (!success) diff --git a/src/NadekoBot/Modules/Administration/UserPunish/UserPunishService.cs b/src/NadekoBot/Modules/Administration/UserPunish/UserPunishService.cs index 2497b330b..854a72508 100644 --- a/src/NadekoBot/Modules/Administration/UserPunish/UserPunishService.cs +++ b/src/NadekoBot/Modules/Administration/UserPunish/UserPunishService.cs @@ -193,6 +193,9 @@ public class UserPunishService : INService, IReadyExecutor case PunishmentAction.Warn: await Warn(guild, user.Id, mod, 1, reason); break; + case PunishmentAction.TimeOut: + await user.SetTimeOutAsync(TimeSpan.FromMinutes(minutes)); + break; } } @@ -224,6 +227,8 @@ public class UserPunishService : INService, IReadyExecutor return botUser.GuildPermissions.MuteMembers; case PunishmentAction.AddRole: return botUser.GuildPermissions.ManageRoles; + case PunishmentAction.TimeOut: + return botUser.GuildPermissions.ModerateMembers; default: return true; } @@ -351,7 +356,7 @@ public class UserPunishService : INService, IReadyExecutor await uow.Warnings.ForgiveAll(guildId, userId, moderator); else toReturn = uow.Warnings.Forgive(guildId, userId, moderator, index - 1); - uow.SaveChanges(); + await uow.SaveChangesAsync(); return toReturn; } @@ -372,6 +377,9 @@ public class UserPunishService : INService, IReadyExecutor if (punish is PunishmentAction.AddRole && role is null) return false; + if (punish is PunishmentAction.TimeOut && time is null) + return false; + using var uow = _db.GetDbContext(); var ps = uow.GuildConfigsForId(guildId, set => set.Include(x => x.WarnPunishments)).WarnPunishments; var toDelete = ps.Where(x => x.Count == number);