From 351b76b719ef4b02dcc8060abbdc8395fbf97b67 Mon Sep 17 00:00:00 2001 From: Macintosh II Date: Fri, 22 Sep 2023 19:10:34 +0300 Subject: [PATCH] Add /resetsettings Co-authored-by: Octol1ttle Signed-off-by: Macintosh II --- locale/Messages.resx | 6 +++ locale/Messages.ru.resx | 6 +++ locale/Messages.tt-ru.resx | 6 +++ src/Commands/SettingsCommandGroup.cs | 65 ++++++++++++++++++++++++++++ src/Data/Options/IOption.cs | 5 +++ src/Messages.Designer.cs | 12 +++++ src/Services/GuildDataService.cs | 1 - 7 files changed, 100 insertions(+), 1 deletion(-) diff --git a/locale/Messages.resx b/locale/Messages.resx index 82392a8..a8d6eea 100644 --- a/locale/Messages.resx +++ b/locale/Messages.resx @@ -594,4 +594,10 @@ You don't have any reminders created! + + {0} setting has been reset + + + All settings have been reset + diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx index 7b5b3d4..7f6b382 100644 --- a/locale/Messages.ru.resx +++ b/locale/Messages.ru.resx @@ -594,4 +594,10 @@ У вас нет созданных напоминаний! + + Настройка {0} сброшена + + + Все настройки были сброшены + diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx index bb8c204..6b8ae5b 100644 --- a/locale/Messages.tt-ru.resx +++ b/locale/Messages.tt-ru.resx @@ -594,4 +594,10 @@ ты еще не крафтил напоминалки + + {0} откачен к заводским + + + откатываемся к заводским... + diff --git a/src/Commands/SettingsCommandGroup.cs b/src/Commands/SettingsCommandGroup.cs index dcb0a5f..c5fd6ac 100644 --- a/src/Commands/SettingsCommandGroup.cs +++ b/src/Commands/SettingsCommandGroup.cs @@ -229,4 +229,69 @@ public class SettingsCommandGroup : CommandGroup return await _feedback.SendContextualEmbedResultAsync(embed, ct); } + + /// + /// A slash command that resets per-guild GuildSettings. + /// + /// The setting to reset. + /// A feedback sending result which may have succeeded. + [Command("resetsettings")] + [DiscordDefaultMemberPermissions(DiscordPermission.ManageGuild)] + [DiscordDefaultDMPermission(false)] + [RequireContext(ChannelContext.Guild)] + [RequireDiscordPermission(DiscordPermission.ManageGuild)] + [Description("Reset settings for this server")] + [UsedImplicitly] + public async Task ExecuteResetSettingsAsync( + [Description("Setting to reset")] AllOptionsEnum? setting = null) + { + if (!_context.TryGetContextIDs(out var guildId, out _, out _)) + { + return new ArgumentInvalidError(nameof(_context), "Unable to retrieve necessary IDs from command context"); + } + + var currentUserResult = await _userApi.GetCurrentUserAsync(CancellationToken); + if (!currentUserResult.IsDefined(out var currentUser)) + { + return Result.FromError(currentUserResult); + } + + var cfg = await _guildData.GetSettings(guildId, CancellationToken); + Messages.Culture = GuildSettings.Language.Get(cfg); + + if (setting is not null) + { + return await ResetSettingAsync(cfg, currentUser, AllOptions[(int)setting], CancellationToken); + } + + return await ResetAllSettingsAsync(cfg, currentUser, CancellationToken); + } + + private async Task ResetSettingAsync(JsonNode cfg, IUser currentUser, + IOption option, CancellationToken ct = default) + { + option.Reset(cfg); + + var embed = new EmbedBuilder().WithSmallTitle( + string.Format(Messages.SettingsResetOptional, option.Name), currentUser) + .WithColour(ColorsList.Green) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(embed, ct); + } + + private async Task ResetAllSettingsAsync(JsonNode cfg, IUser currentUser, + CancellationToken ct = default) + { + foreach (var option in AllOptions) + { + option.Reset(cfg); + } + + var embed = new EmbedBuilder().WithSmallTitle(Messages.SettingsReset, currentUser) + .WithColour(ColorsList.Green) + .Build(); + + return await _feedback.SendContextualEmbedResultAsync(embed, ct); + } } diff --git a/src/Data/Options/IOption.cs b/src/Data/Options/IOption.cs index 6f435e5..1ddf5f8 100644 --- a/src/Data/Options/IOption.cs +++ b/src/Data/Options/IOption.cs @@ -8,4 +8,9 @@ public interface IOption string Name { get; } string Display(JsonNode settings); Result Set(JsonNode settings, string from); + + public void Reset(JsonNode settings) + { + settings[Name] = null; + } } diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs index 0fee435..b65c668 100644 --- a/src/Messages.Designer.cs +++ b/src/Messages.Designer.cs @@ -1001,5 +1001,17 @@ namespace Boyfriend { return ResourceManager.GetString("NoRemindersFound", resourceCulture); } } + + internal static string SettingsReset { + get { + return ResourceManager.GetString("SettingsReset", resourceCulture); + } + } + + internal static string SettingsResetOptional { + get { + return ResourceManager.GetString("SettingsResetOptional", resourceCulture); + } + } } } diff --git a/src/Services/GuildDataService.cs b/src/Services/GuildDataService.cs index e3c0b96..b07755d 100644 --- a/src/Services/GuildDataService.cs +++ b/src/Services/GuildDataService.cs @@ -44,7 +44,6 @@ public sealed class GuildDataService : IHostedService public async Task SaveAsync(CancellationToken ct) { - _logger.LogInformation("Saving guild data..."); var tasks = new List(); var datas = _datas.Values.ToArray(); foreach (var data in datas)