From b7ead22e09e2e515dd17b8704d2be38d26e743e0 Mon Sep 17 00:00:00 2001 From: Kwoth Date: Thu, 9 Dec 2021 01:48:39 +0100 Subject: [PATCH] .remindl and .remindrm commands now supports optional 'server' parameter for Administrators which allows them to delete any reminder created on the server --- CHANGELOG.md | 3 + .../Db/Extensions/ReminderExtensions.cs | 7 ++ .../Modules/Utility/RemindCommands.cs | 89 +++++++++++++++++-- .../data/strings/commands/commands.en-US.yml | 6 +- .../strings/responses/responses.en-US.json | 1 + 5 files changed, 97 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fff4f65cd..3be1af6a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ Experimental changelog. Mostly based on [keepachangelog](https://keepachangelog. ## Unreleased +### Added +- `.remindl` and `.remindrm` commands now supports optional 'server' parameter for Administrators which allows them to delete any reminder created on the server + ### Fixed - `.crypto` now supports top 5000 coins diff --git a/src/NadekoBot/Db/Extensions/ReminderExtensions.cs b/src/NadekoBot/Db/Extensions/ReminderExtensions.cs index 7091618cb..6cc60eaa9 100644 --- a/src/NadekoBot/Db/Extensions/ReminderExtensions.cs +++ b/src/NadekoBot/Db/Extensions/ReminderExtensions.cs @@ -18,5 +18,12 @@ namespace NadekoBot.Db .OrderBy(x => x.DateAdded) .Skip(page * 10) .Take(10); + + public static IEnumerable RemindersForServer(this DbSet reminders, ulong serverId, int page) + => reminders.AsQueryable() + .Where(x => x.ServerId == serverId) + .OrderBy(x => x.DateAdded) + .Skip(page * 10) + .Take(10); } } diff --git a/src/NadekoBot/Modules/Utility/RemindCommands.cs b/src/NadekoBot/Modules/Utility/RemindCommands.cs index 7062bc355..ed4c8aa9c 100644 --- a/src/NadekoBot/Modules/Utility/RemindCommands.cs +++ b/src/NadekoBot/Modules/Utility/RemindCommands.cs @@ -80,21 +80,50 @@ namespace NadekoBot.Modules.Utility } } + public enum Server + { + Server = int.MinValue, + Srvr = int.MinValue, + Serv = int.MinValue, + S = int.MinValue, + } + [NadekoCommand, Aliases] - public async Task RemindList(int page = 1) + [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.Administrator)] + [Priority(0)] + public Task RemindList(Server _, int page = 1) + => RemindList(page, true); + + [NadekoCommand, Aliases] + [Priority(1)] + public Task RemindList(int page = 1) + => RemindList(page, false); + + private async Task RemindList(int page, bool isServer) { if (--page < 0) return; var embed = _eb.Create() .WithOkColor() - .WithTitle(GetText(strs.reminder_list)); + .WithTitle(GetText(isServer ? strs.reminder_server_list : strs.reminder_list)); List rems; using (var uow = _db.GetDbContext()) { - rems = uow.Reminders.RemindersFor(ctx.User.Id, page) - .ToList(); + if (isServer) + { + rems = uow.Reminders + .RemindersForServer(ctx.Guild.Id, page) + .ToList(); + } + else + { + rems = uow.Reminders + .RemindersFor(ctx.User.Id, page) + .ToList(); + } } if (rems.Any()) @@ -121,17 +150,63 @@ namespace NadekoBot.Modules.Utility } [NadekoCommand, Aliases] - public async Task RemindDelete(int index) + [RequireContext(ContextType.Guild)] + [RequireUserPermission(GuildPermission.Administrator)] + [Priority(0)] + public Task RemindDelete(Server _, int index) + => RemindDelete(index, true); + + [NadekoCommand, Aliases] + [Priority(1)] + public Task RemindDelete(int index) + => RemindDelete(index, false); + + private async Task RemindDelete(int index, bool isServer) { if (--index < 0) return; - var embed = _eb.Create(); + Reminder rem = null; + using (var uow = _db.GetDbContext()) + { + var rems = isServer + ? uow.Reminders + .RemindersForServer(ctx.Guild.Id, index / 10) + .ToList() + : uow.Reminders + .RemindersFor(ctx.User.Id, index / 10) + .ToList(); + + var pageIndex = index % 10; + if (rems.Count > pageIndex) + { + rem = rems[pageIndex]; + uow.Reminders.Remove(rem); + uow.SaveChanges(); + } + } + + if (rem is null) + { + await ReplyErrorLocalizedAsync(strs.reminder_not_exist).ConfigureAwait(false); + } + else + { + await ReplyConfirmLocalizedAsync(strs.reminder_deleted(index + 1)); + } + } + + [NadekoCommand, Aliases] + public async Task ServerRemindDelete(int index) + { + if (--index < 0) + return; Reminder rem = null; using (var uow = _db.GetDbContext()) { - var rems = uow.Reminders.RemindersFor(ctx.User.Id, index / 10) + var rems = uow.Reminders + .RemindersForServer(ctx.Guild.Id, index / 10) .ToList(); var pageIndex = index % 10; if (rems.Count > pageIndex) diff --git a/src/NadekoBot/data/strings/commands/commands.en-US.yml b/src/NadekoBot/data/strings/commands/commands.en-US.yml index 42a684d07..71e4ff39b 100644 --- a/src/NadekoBot/data/strings/commands/commands.en-US.yml +++ b/src/NadekoBot/data/strings/commands/commands.en-US.yml @@ -406,13 +406,15 @@ remind: - "me 1d5h Do something" - "#general 1m Start now!" reminddelete: - desc: "Deletes a reminder on the specified index." + desc: "Deletes a reminder on the specified index. You can specify 'server' option if you're an Administrator, and you want to delete a reminder on this server created by someone else. " args: - "3" + - "server 2" remindlist: - desc: "Lists all reminders you created. Paginated." + desc: "Lists all reminders you created. You can specify 'server' option if you're an Administrator to list all reminders created on this server. Paginated." args: - "1" + - "server 2" serverinfo: desc: "Shows info about the server the bot is on. If no server is supplied, it defaults to current one." args: diff --git a/src/NadekoBot/data/strings/responses/responses.en-US.json b/src/NadekoBot/data/strings/responses/responses.en-US.json index f57654470..89296c7ae 100644 --- a/src/NadekoBot/data/strings/responses/responses.en-US.json +++ b/src/NadekoBot/data/strings/responses/responses.en-US.json @@ -919,6 +919,7 @@ "reaction_role_removed": "Removed ReactionRole message #{0}", "reaction_roles_full": "You've reached the limit on ReactionRole messages. You have to delete some.", "reminder_list": "List of reminders", + "reminder_server_list": "List of server reminders", "reminder_deleted": "Reminder #{0} was deleted.", "reminder_not_exist": "Reminder at that index does not exist.", "reminders_none": "No reminder on this page.",