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); + } + } } }