diff --git a/locale/Messages.resx b/locale/Messages.resx
index 191e4a1..037ad3f 100644
--- a/locale/Messages.resx
+++ b/locale/Messages.resx
@@ -798,4 +798,7 @@
Increase the Warn Threshold or set a Warn Punishment.
+
+ Invalid Warn Punishment is set.
+
diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx
index f3fb587..68062d4 100644
--- a/locale/Messages.ru.resx
+++ b/locale/Messages.ru.resx
@@ -798,4 +798,7 @@
Увеличьте порог предупреждения или установите наказание за предупреждение.
+
+ Установлено неверное наказание за предупреждение.
+
diff --git a/src/Commands/WarnCommandGroup.cs b/src/Commands/WarnCommandGroup.cs
index dea3102..f4c250a 100644
--- a/src/Commands/WarnCommandGroup.cs
+++ b/src/Commands/WarnCommandGroup.cs
@@ -141,6 +141,28 @@ public class WarnCommandGroup : CommandGroup
return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct: CancellationToken);
}
+ if (warns.Count + 1 < warnThreshold)
+ {
+ return await WarnUserAsync(executor, target, reason, guild, data, channelId, bot, settings,
+ warns, warnThreshold, warnPunishment, warnDuration, ct);
+ }
+
+ var interactionResult
+ = await _access.CheckInteractionsAsync(guild.ID, bot.ID, target.ID,
+ $"{char.ToUpperInvariant(warnPunishment[0])}{warnPunishment[1..]}", ct);
+ if (!interactionResult.IsSuccess)
+ {
+ return ResultExtensions.FromError(interactionResult);
+ }
+
+ if (interactionResult.Entity is not null)
+ {
+ var errorEmbed = new EmbedBuilder().WithSmallTitle(interactionResult.Entity, bot)
+ .WithColour(ColorsList.Red).Build();
+
+ return await _feedback.SendContextualEmbedResultAsync(errorEmbed, ct: ct);
+ }
+
return await WarnUserAsync(executor, target, reason, guild, data, channelId, bot, settings,
warns, warnThreshold, warnPunishment, warnDuration, ct);
}
@@ -181,8 +203,7 @@ public class WarnCommandGroup : CommandGroup
_utility.LogAction(settings, channelId, executor, title, description,
target, ColorsList.Yellow, false, ct);
- var embed = new EmbedBuilder().WithSmallTitle(
- title, target)
+ var embed = new EmbedBuilder().WithSmallTitle(title, target)
.WithColour(ColorsList.Green).Build();
if (warns.Count >= warnThreshold && warnThreshold is not 0)
diff --git a/src/Data/GuildSettings.cs b/src/Data/GuildSettings.cs
index 83d8d2d..fc616bd 100644
--- a/src/Data/GuildSettings.cs
+++ b/src/Data/GuildSettings.cs
@@ -12,7 +12,7 @@ public static class GuildSettings
{
public static readonly LanguageOption Language = new("Language", "en");
- public static readonly Option WarnPunishment = new("WarnPunishment", "disabled");
+ public static readonly PunishmentOption WarnPunishment = new("WarnPunishment", "disabled");
///
/// Controls what message should be sent in when a new member joins the guild.
diff --git a/src/Data/Options/PunishmentOption.cs b/src/Data/Options/PunishmentOption.cs
new file mode 100644
index 0000000..f8d5414
--- /dev/null
+++ b/src/Data/Options/PunishmentOption.cs
@@ -0,0 +1,23 @@
+using System.Text.Json.Nodes;
+using Remora.Results;
+
+namespace Octobot.Data.Options;
+
+///
+public sealed class PunishmentOption : Option
+{
+ private static readonly List AllowedValues =
+ [
+ "ban", "kick", "mute", "off", "disable", "disabled"
+ ];
+
+ public PunishmentOption(string name, string defaultValue) : base(name, defaultValue) { }
+
+ ///
+ public override Result Set(JsonNode settings, string from)
+ {
+ return AllowedValues.Contains(from.ToLowerInvariant())
+ ? base.Set(settings, from.ToLowerInvariant())
+ : new ArgumentInvalidError(nameof(from), Messages.InvalidWarnPunishment);
+ }
+}
diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs
index 19737fd..8266e7f 100644
--- a/src/Messages.Designer.cs
+++ b/src/Messages.Designer.cs
@@ -1344,5 +1344,13 @@ namespace Octobot {
return ResourceManager.GetString("WarnThresholdExceededDescription", resourceCulture);
}
}
+
+ internal static string InvalidWarnPunishment
+ {
+ get
+ {
+ return ResourceManager.GetString("InvalidWarnPunishment", resourceCulture);
+ }
+ }
}
}