#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.RestrictChatMember( chat.Id, to.Id, new ChatPermissions { CanSendMessages = false }, untilDate: DateTime.Now.AddDays(7) ); warnCount = 0; } catch { await _bot.SendMessage(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"); } }