Merge pull request #15 from Bubuni-Team/refactor/warn

[cm] warn decomposition
This commit is contained in:
Andriy
2022-05-05 13:43:08 +03:00
committed by GitHub
4 changed files with 124 additions and 48 deletions
+4
View File
@@ -15,6 +15,10 @@ public class ChatManagement : Module
public override void ConfigureServices(IServiceCollection services) public override void ConfigureServices(IServiceCollection services)
{ {
services.AddScoped<RulesService>(); services.AddScoped<RulesService>();
services.AddScoped<WarnService>();
services.AddTelegramBotParameterParser<BanLength.Param, BanLength.Parser>(); services.AddTelegramBotParameterParser<BanLength.Param, BanLength.Parser>();
WarnService.WarnEvent += Notifier.WarnNotify;
WarnService.UnWarnEvent += Notifier.UnWarnNotify;
} }
} }
+8 -48
View File
@@ -1,56 +1,28 @@
#nullable enable #nullable enable
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using BotFramework.Attributes; using BotFramework.Attributes;
using BotFramework.Enums; using BotFramework.Enums;
using Kruzya.TelegramBot.Core; using Kruzya.TelegramBot.Core;
using Kruzya.TelegramBot.Core.Data; using Kruzya.TelegramBot.Core.Data;
using Kruzya.TelegramBot.Core.Extensions; using West.TelegramBot.ChatManagement.Service;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;
namespace West.TelegramBot.ChatManagement.Handler; namespace West.TelegramBot.ChatManagement.Handler;
public class Warn : CommonHandler 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)] [Command("warn", CommandParseMode.Both)]
public async Task HandleWarn() public async Task HandleWarn()
{ {
if (!await CanPunish()) return; if (!await CanPunish()) return;
var warnUser = RepliedUser!; await _warnService.WarnChatUserAsync(Chat, From, RepliedUser!);
var warnOption = await GetWarnOption(warnUser);
var warnCount = warnOption.GetValue<int>() + 1;
await Bot.SendTextMessageAsync(Chat.Id, $"{warnUser.ToHtml()}<code>, Вам выдано предупреждение! " +
$"Текущее кол-во: {warnCount}/3</code>",
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()} <code>заблокировал</code> {RepliedUser!.ToHtml()} <code>на 7 дней</code>",
disableNotification: true, parseMode: ParseMode.Html);
}
warnOption.SetValue(warnCount);
Db.AddOrUpdate(warnOption);
} }
[Command("unwarn", CommandParseMode.Both)] [Command("unwarn", CommandParseMode.Both)]
@@ -58,18 +30,6 @@ public class Warn : CommonHandler
{ {
if (!await CanPunish()) return; if (!await CanPunish()) return;
var warnOption = await GetWarnOption(RepliedUser!); await _warnService.UnWarnChatUserAsync(Chat, From, RepliedUser!);
var warnCount = warnOption.GetValue<int>();
if (warnCount == 0) return;
warnCount = Math.Max(warnCount - 1, 0);
warnOption.SetValue(warnCount);
Db.AddOrUpdate(warnOption);
await Bot.SendTextMessageAsync(Chat.Id,
$"{RepliedUser.ToHtml()}<code>, с Вас снято предупреждение! " +
$"Текущее кол-во: {warnCount}/3</code>",
disableNotification: true,
parseMode: ParseMode.Html);
} }
} }
+34
View File
@@ -0,0 +1,34 @@
using Kruzya.TelegramBot.Core.Extensions;
using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
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()}<code>, Вам выдано предупреждение! " +
$"Текущее кол-во: {count}/3</code>",
disableNotification: true,
parseMode: ParseMode.Html);
if (isBanned)
{
await bot.SendTextMessageAsync(
chat.Id,
$"{from.ToHtml()} <code>заблокировал</code> {to.ToHtml()} <code>на 7 дней</code>",
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()}<code>, с Вас снято предупреждение! " +
$"Текущее кол-во: {count}/3</code>",
disableNotification: true,
parseMode: ParseMode.Html);
}
}
@@ -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<int>() + 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<int>();
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<BotUserValue> GetWarnOption(Chat chat, User user)
{
return await _db.UserValues.FindOrCreateOption(chat.Id, user.Id, "warnCount");
}
}