Защита от спама Telegram.Bot

Рейтинг: 0Ответов: 0Опубликовано: 10.03.2023

Пишу бота на C# (использую Long Polling) возникла задача защиты от спама сообщениями. Я пытаюсь решить это так:

    Dictionary<long, GuardModel> UserBanCounter = new Dictionary<long, GuardModel>();
    TimeSpan blockLimit = new TimeSpan(0,0,2);

public async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
    {
        try
        {
            if (update.Type != UpdateType.Message)
            {
                return;
            }
            if (UserBanCounter.ContainsKey(update.Message.From.Id))
            {
                if (UserBanCounter[update.Message.From.Id].Amount > 10)
                {
                    return;
                }
                if (UserBanCounter[update.Message.From.Id].Amount == 10)
                {
                    await botClient.SendTextMessageAsync(new(AdminID), $"Пользователь {update.Message.From.Username} заблокирован за спам");
                    UserBanCounter[update.Message.From.Id].Amount++;
                    return;
                }
                if (update.Message.Date - UserBanCounter[update.Message.From.Id].LastMessageTime < blockLimit)
                {
                    UserBanCounter[update.Message.From.Id].Amount++;
                }
                else
                {
                    UserBanCounter[update.Message.From.Id].Amount = 0;
                }
                UserBanCounter[update.Message.From.Id].LastMessageTime = update.Message.Date;
            }
            else
            {
                UserBanCounter.Add(update.Message.From.Id, new GuardModel(update.Message.Date));
            }
            .
            .
            .

Дело в том, что я не нашёл нигде поднятия данного вопроса и возможных способов его решения, но прохождение несколькольких логических конструкций прежде чем сделать return кажется крайне ресурсоёмким процессом, если речи идёт о спаме наскольких сотен сообщений в секунду. Подскажите, есть ли знаете более элегантное решение. Заранее благодарю.

Ответы

Ответов пока нет.