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