() + 1;
- warnOption.SetValue(warnCount);
- _db.MarkAsModified(warnOption);
-
- await Bot.SendTextMessageAsync(Chat.Id, $"{warnUser.ToHtml()}, Вам выдано предупреждение! " +
- $"Текущее кол-во: {warnCount} / 3заблокировал {warnUser.ToHtml()} на 7 дней
",
- disableNotification: true, parseMode: ParseMode.Html);
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/modules/ChatManagement/Handler/ManagementHandler.cs b/modules/ChatManagement/Handler/ManagementHandler.cs
new file mode 100644
index 0000000..2254a61
--- /dev/null
+++ b/modules/ChatManagement/Handler/ManagementHandler.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Threading.Tasks;
+using BotFramework;
+using Kruzya.TelegramBot.Core.Extensions;
+using Telegram.Bot;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
+using West.TelegramBot.ChatManagement.Extensions;
+
+namespace West.TelegramBot.ChatManagement.Handler
+{
+ public class ManagementHandler : BotEventHandler
+ {
+ protected User GetVictim()
+ {
+ return RawUpdate.Message?.ReplyToMessage?.From;
+ }
+
+ protected async Task CanPunish()
+ {
+ return GetVictim() != null && await Bot.CanPunishMember(Chat, From, GetVictim());
+ }
+
+ protected async Task BanMember(User user, DateTime? banEnd = null, bool sendMessage = true)
+ {
+ await BanMember(user.Id, banEnd, sendMessage);
+
+ if (sendMessage)
+ {
+ await Bot.SendTextMessageAsync(
+ Chat.Id,
+ $"{From.ToHtml(false)} заблокировал {user.ToHtml(false)} на 7 дней",
+ disableNotification: true, parseMode: ParseMode.Html);
+ }
+ }
+
+ protected async Task BanMember(long userId, DateTime? banEnd = null, bool sendMessage = true)
+ {
+ await Bot.RestrictChatMemberAsync(
+ Chat.Id,
+ userId,
+ new ChatPermissions
+ {
+ CanSendMessages = false
+ },
+ banEnd ?? DateTime.Now.AddDays(7)
+ );
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/ChatManagement/Handler/Warn.cs b/modules/ChatManagement/Handler/Warn.cs
new file mode 100644
index 0000000..e71887e
--- /dev/null
+++ b/modules/ChatManagement/Handler/Warn.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Threading.Tasks;
+using BotFramework.Attributes;
+using BotFramework.Enums;
+using Kruzya.TelegramBot.Core.Data;
+using Kruzya.TelegramBot.Core.Extensions;
+using Telegram.Bot;
+using Telegram.Bot.Types.Enums;
+
+namespace West.TelegramBot.ChatManagement.Handler
+{
+ public class Command : ManagementHandler
+ {
+ private readonly CoreContext _db;
+
+ public Command(CoreContext db)
+ {
+ _db = db;
+ }
+
+ [Command("warn", CommandParseMode.Both)]
+ public async Task HandleWarn()
+ {
+ if (!await CanPunish()) return;
+
+ var warnUser = GetVictim();
+ var warnOption = await GetWarnOption();
+ var warnCount = warnOption.GetValue() + 1;
+ warnOption.SetValue(warnCount);
+ _db.MarkAsModified(warnOption);
+
+ await Bot.SendTextMessageAsync(Chat.Id, $"{warnUser.ToHtml(false)}, Вам выдано предупреждение! " +
+ $"Текущее кол-во: {warnCount}/3",
+ disableNotification: true,
+ parseMode: ParseMode.Html);
+
+ if (warnCount == 3)
+ {
+ await BanMember(warnUser);
+ warnOption.SetValue(0);
+ }
+ }
+
+ [Command("unwarn", CommandParseMode.Both)]
+ public async Task HandleUnwarn()
+ {
+ if (!await CanPunish()) return;
+
+ var warnOption = await GetWarnOption();
+ var warnCount = Math.Max(warnOption.GetValue() - 1, 0);
+ warnOption.SetValue(warnCount);
+ _db.MarkAsModified(warnOption);
+
+ await Bot.SendTextMessageAsync(Chat.Id,
+ $"{GetVictim().ToHtml(false)}, с Вас снято предупреждение! " +
+ $"Текущее кол-во: {warnCount}/3",
+ disableNotification: true,
+ parseMode: ParseMode.Html);
+ }
+
+ private async Task GetWarnOption()
+ {
+ return await _db.UserValues.FindOrCreateOption(Chat.Id, GetVictim().Id, "warnCount");
+ }
+ }
+}
\ No newline at end of file