From df43c45f02637bde2ceb2a4ae4ed2dc3a27afbf4 Mon Sep 17 00:00:00 2001 From: West14 <30056636+West14@users.noreply.github.com> Date: Thu, 5 May 2022 13:26:17 +0300 Subject: [PATCH] [cm] warn decomposition --- modules/ChatManagement/ChatManagement.cs | 4 + modules/ChatManagement/Handler/Warn.cs | 56 ++----------- modules/ChatManagement/Notifier.cs | 29 +++++++ modules/ChatManagement/Service/WarnService.cs | 78 +++++++++++++++++++ 4 files changed, 119 insertions(+), 48 deletions(-) create mode 100644 modules/ChatManagement/Notifier.cs create mode 100644 modules/ChatManagement/Service/WarnService.cs diff --git a/modules/ChatManagement/ChatManagement.cs b/modules/ChatManagement/ChatManagement.cs index 1c0aa6f..1ad0f41 100644 --- a/modules/ChatManagement/ChatManagement.cs +++ b/modules/ChatManagement/ChatManagement.cs @@ -15,6 +15,10 @@ public class ChatManagement : Module public override void ConfigureServices(IServiceCollection services) { services.AddScoped(); + services.AddScoped(); services.AddTelegramBotParameterParser(); + + WarnService.WarnEvent += Notifier.WarnNotify; + WarnService.UnWarnEvent += Notifier.UnWarnNotify; } } \ No newline at end of file diff --git a/modules/ChatManagement/Handler/Warn.cs b/modules/ChatManagement/Handler/Warn.cs index 0031b21..b828052 100644 --- a/modules/ChatManagement/Handler/Warn.cs +++ b/modules/ChatManagement/Handler/Warn.cs @@ -1,56 +1,28 @@ #nullable enable -using System; using System.Threading.Tasks; using BotFramework.Attributes; using BotFramework.Enums; using Kruzya.TelegramBot.Core; using Kruzya.TelegramBot.Core.Data; -using Kruzya.TelegramBot.Core.Extensions; -using Telegram.Bot; -using Telegram.Bot.Types.Enums; +using West.TelegramBot.ChatManagement.Service; namespace West.TelegramBot.ChatManagement.Handler; public class Warn : CommonHandler { - public Warn(CoreContext db) : base(db) {} + private readonly WarnService _warnService; + public Warn(CoreContext db, WarnService warnService) : base(db) + { + _warnService = warnService; + } [Command("warn", CommandParseMode.Both)] public async Task HandleWarn() { if (!await CanPunish()) return; - - var warnUser = RepliedUser!; - var warnOption = await GetWarnOption(warnUser); - var warnCount = warnOption.GetValue() + 1; - await Bot.SendTextMessageAsync(Chat.Id, $"{warnUser.ToHtml()}, Вам выдано предупреждение! " + - $"Текущее кол-во: {warnCount}/3", - disableNotification: true, - parseMode: ParseMode.Html); - - if (warnCount >= 3) - { - try - { - await BanMember(warnUser.Id, DateTime.Now.AddDays(7)); - warnCount = 0; - } - catch - { - await Bot.SendTextMessageAsync(Chat.Id, "Нет прав на блокировку пользователя."); - return; - } - - await Bot.SendTextMessageAsync( - Chat.Id, - $"{From.ToHtml()} заблокировал {RepliedUser!.ToHtml()} на 7 дней", - disableNotification: true, parseMode: ParseMode.Html); - } - - warnOption.SetValue(warnCount); - Db.AddOrUpdate(warnOption); + await _warnService.WarnChatUserAsync(Chat, From, RepliedUser!); } [Command("unwarn", CommandParseMode.Both)] @@ -58,18 +30,6 @@ public class Warn : CommonHandler { if (!await CanPunish()) return; - var warnOption = await GetWarnOption(RepliedUser!); - var warnCount = warnOption.GetValue(); - if (warnCount == 0) return; - - warnCount = Math.Max(warnCount - 1, 0); - warnOption.SetValue(warnCount); - Db.AddOrUpdate(warnOption); - - await Bot.SendTextMessageAsync(Chat.Id, - $"{RepliedUser.ToHtml()}, с Вас снято предупреждение! " + - $"Текущее кол-во: {warnCount}/3", - disableNotification: true, - parseMode: ParseMode.Html); + await _warnService.UnWarnChatUserAsync(Chat, From, RepliedUser!); } } \ No newline at end of file diff --git a/modules/ChatManagement/Notifier.cs b/modules/ChatManagement/Notifier.cs new file mode 100644 index 0000000..194682b --- /dev/null +++ b/modules/ChatManagement/Notifier.cs @@ -0,0 +1,29 @@ +namespace West.TelegramBot.ChatManagement; + +public class Notifier +{ + public static async void WarnNotify(ITelegramBotClient bot, Chat chat, User from, User to, int count, bool isBanned = false) + { + await bot.SendTextMessageAsync(chat.Id, $"{to.ToHtml()}, Вам выдано предупреждение! " + + $"Текущее кол-во: {count}/3", + disableNotification: true, + parseMode: ParseMode.Html); + + if (isBanned) + { + await bot.SendTextMessageAsync( + chat.Id, + $"{from.ToHtml()} заблокировал {to.ToHtml()} на 7 дней", + disableNotification: true, parseMode: ParseMode.Html); + } + } + + public static async void UnWarnNotify(ITelegramBotClient bot, Chat chat, User from, User to, int count) + { + await bot.SendTextMessageAsync(chat.Id, + $"{to.ToHtml()}, с Вас снято предупреждение! " + + $"Текущее кол-во: {count}/3", + disableNotification: true, + parseMode: ParseMode.Html); + } +} \ No newline at end of file diff --git a/modules/ChatManagement/Service/WarnService.cs b/modules/ChatManagement/Service/WarnService.cs new file mode 100644 index 0000000..ed72b10 --- /dev/null +++ b/modules/ChatManagement/Service/WarnService.cs @@ -0,0 +1,78 @@ +#nullable enable + +using System; +using System.Threading.Tasks; +using BotFramework.Abstractions; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace West.TelegramBot.ChatManagement.Service; + +public class WarnService +{ + public delegate void WarnHandler(ITelegramBotClient bot, Chat chat, User from, User to, int count, bool isBanned = false); + public delegate void UnWarnHandler(ITelegramBotClient bot, Chat chat, User from, User to, int count); + + public static event WarnHandler? WarnEvent; + public static event UnWarnHandler? UnWarnEvent; + + private readonly CoreContext _db; + private readonly ITelegramBotClient _bot; + + public WarnService(CoreContext db, IBotInstance bot) + { + _db = db; + _bot = bot.BotClient; + } + + public async Task WarnChatUserAsync(Chat chat, User from, User to) + { + var warnOption = await GetWarnOption(chat, to); + var warnCount = warnOption.GetValue() + 1; + + if (warnCount >= 3) + { + try + { + await _bot.RestrictChatMemberAsync( + chat.Id, + to.Id, + new ChatPermissions + { + CanSendMessages = false + }, + DateTime.Now.AddDays(7) + ); + warnCount = 0; + } + catch + { + await _bot.SendTextMessageAsync(chat.Id, "У меня нет прав на блокировку пользователя."); + } + } + + warnOption.SetValue(warnCount); + _db.AddOrUpdate(warnOption); + WarnEvent?.Invoke(_bot, chat, from, to, warnCount == 0 ? 3 : warnCount, warnCount == 0); + } + + public async Task UnWarnChatUserAsync(Chat chat, User from, User user) + { + var warnOption = await GetWarnOption(chat, user); + var warnCount = warnOption.GetValue(); + if (warnCount == 0) return; + + warnCount = Math.Max(warnCount - 1, 0); + warnOption.SetValue(warnCount); + _db.AddOrUpdate(warnOption); + + UnWarnEvent?.Invoke(_bot, chat, from, user, warnCount); + } + + protected async Task GetWarnOption(Chat chat, User user) + { + return await _db.UserValues.FindOrCreateOption(chat.Id, user.Id, "warnCount"); + } +} \ No newline at end of file