From 5b77ef2b8514cf15bd4c5f1ccfb4965af516982d Mon Sep 17 00:00:00 2001 From: West14 <30056636+West14@users.noreply.github.com> Date: Sat, 23 Apr 2022 21:03:33 +0300 Subject: [PATCH] [cm] ability to ban user for an arbitrary period --- Core/CommonHandler.cs | 20 ++---------- modules/ChatManagement/ChatManagement.cs | 5 ++- modules/ChatManagement/ChatManagement.csproj | 4 +++ modules/ChatManagement/Handler/Ban.cs | 28 ++++++++++++++--- modules/ChatManagement/Handler/Warn.cs | 2 +- .../ChatManagement/ParamParser/BanLength.cs | 31 +++++++++++++++++++ 6 files changed, 66 insertions(+), 24 deletions(-) create mode 100644 modules/ChatManagement/ParamParser/BanLength.cs diff --git a/Core/CommonHandler.cs b/Core/CommonHandler.cs index dee081e..a575aa0 100644 --- a/Core/CommonHandler.cs +++ b/Core/CommonHandler.cs @@ -35,21 +35,8 @@ namespace Kruzya.TelegramBot.Core return RepliedUser != null && await Bot.CanPunishMember(Chat, From, RepliedUser); } - #region Bans - protected async Task BanMember(User user, DateTime? banEnd = null, bool sendMessage = true) - { - await BanMember(user.Id, banEnd); - - if (sendMessage) - { - await Bot.SendTextMessageAsync( - Chat.Id, - $"{From.ToHtml()} заблокировал {user.ToHtml()} на 7 дней", - disableNotification: true, parseMode: ParseMode.Html); - } - } - - protected async Task BanMember(long userId, DateTime? banEnd = null) + + protected async Task BanMember(long userId, DateTime banEnd) { await Bot.RestrictChatMemberAsync( Chat.Id, @@ -58,10 +45,9 @@ namespace Kruzya.TelegramBot.Core { CanSendMessages = false }, - banEnd ?? DateTime.Now.AddDays(7) + banEnd ); } - #endregion protected async Task GetWarnOption(User user) { diff --git a/modules/ChatManagement/ChatManagement.cs b/modules/ChatManagement/ChatManagement.cs index eacca60..1c0aa6f 100644 --- a/modules/ChatManagement/ChatManagement.cs +++ b/modules/ChatManagement/ChatManagement.cs @@ -1,5 +1,7 @@ -using Kruzya.TelegramBot.Core; +using BotFramework; +using Kruzya.TelegramBot.Core; using Microsoft.Extensions.DependencyInjection; +using West.TelegramBot.ChatManagement.ParamParser; using West.TelegramBot.ChatManagement.Service; namespace West.TelegramBot.ChatManagement; @@ -13,5 +15,6 @@ public class ChatManagement : Module public override void ConfigureServices(IServiceCollection services) { services.AddScoped(); + services.AddTelegramBotParameterParser(); } } \ No newline at end of file diff --git a/modules/ChatManagement/ChatManagement.csproj b/modules/ChatManagement/ChatManagement.csproj index ff72078..0b39224 100644 --- a/modules/ChatManagement/ChatManagement.csproj +++ b/modules/ChatManagement/ChatManagement.csproj @@ -9,6 +9,10 @@ + + + + diff --git a/modules/ChatManagement/Handler/Ban.cs b/modules/ChatManagement/Handler/Ban.cs index 519f2bb..5defd72 100644 --- a/modules/ChatManagement/Handler/Ban.cs +++ b/modules/ChatManagement/Handler/Ban.cs @@ -1,5 +1,6 @@ #nullable enable +using System; using System.Threading.Tasks; using BotFramework.Attributes; using BotFramework.Enums; @@ -8,6 +9,8 @@ using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Extensions; using Telegram.Bot; using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; +using West.TelegramBot.ChatManagement.ParamParser; namespace West.TelegramBot.ChatManagement.Handler; @@ -15,18 +18,33 @@ public class Ban : CommonHandler { public Ban(CoreContext db) : base(db) {} - [Command("ban", CommandParseMode.Both)] - public async Task HandleBan() + [ParametrizedCommand("ban", CommandParseMode.Both)] + public async Task HandleBan(BanLength.Param banLengthParam) { - if (!await CanPunish()) return; + if (!await CanPunish()) + { + return; + } + var now = DateTime.Now; + var banEnd = now.AddDays(banLengthParam.DayCount); - await BanMember(RepliedUser!); + var banEndMsg = (banEnd - now).Days > 366 ? "навсегда" : $"до {banEnd.ToUniversalTime()}"; + + await Bot.SendTextMessageAsync( + Chat.Id, + $"{From.ToHtml()} заблокировал {RepliedUser!.ToHtml()} {banEndMsg}", + disableNotification: true, parseMode: ParseMode.Html); + + await BanMember(RepliedUser!.Id, banEnd); } [Command("unban", CommandParseMode.Both)] public async Task HandleUnban() { - if (!await CanPunish()) return; + if (!await CanPunish()) + { + return; + } await Bot.RestrictChatMemberAsync(Chat.Id, RepliedUser!.Id, new ChatPermissions diff --git a/modules/ChatManagement/Handler/Warn.cs b/modules/ChatManagement/Handler/Warn.cs index 282ef39..37764ee 100644 --- a/modules/ChatManagement/Handler/Warn.cs +++ b/modules/ChatManagement/Handler/Warn.cs @@ -34,7 +34,7 @@ public class Warn : CommonHandler if (warnCount == 3) { - await BanMember(warnUser); + await BanMember(warnUser.Id, DateTime.Now.AddDays(7)); warnOption.SetValue(0); Db.AddOrUpdate(warnOption); } diff --git a/modules/ChatManagement/ParamParser/BanLength.cs b/modules/ChatManagement/ParamParser/BanLength.cs new file mode 100644 index 0000000..333c66b --- /dev/null +++ b/modules/ChatManagement/ParamParser/BanLength.cs @@ -0,0 +1,31 @@ +using BotFramework; +using static System.UInt32; + +namespace West.TelegramBot.ChatManagement.ParamParser; + +public class BanLength +{ + public class Param + { + public uint DayCount; + } + + public class Parser : IParameterParser + { + public Param DefaultInstance() + { + return new Param(); + } + + public bool TryGetValue(string text, out Param result) + { + result = DefaultInstance(); + + if (!TryParse(text, out result.DayCount)) + { + result.DayCount = 7; + } + return true; + } + } +} \ No newline at end of file