AntiFlood service

This commit is contained in:
2022-02-16 19:44:53 +03:00
parent a4d1dea47d
commit 520f1efe37
4 changed files with 89 additions and 4 deletions
+9
View File
@@ -0,0 +1,9 @@
using Telegram.Bot.Types;
namespace Kruzya.TelegramBot.Core.Service;
public interface IAntiFlood
{
public bool IsUserFlooding(Chat chat, User user);
public void RecordAction(Chat chat, User user);
}
+63
View File
@@ -0,0 +1,63 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Extensions.Configuration;
using Telegram.Bot.Types;
namespace Kruzya.TelegramBot.Core.Service;
public class MemoryAntiFloodService : IAntiFlood
{
private IDictionary<string, IList<DateTime>> _floodUsers;
private IDictionary<string, DateTime> _bannedUsers;
private int _floodStartsAfter = 3;
private TimeSpan _banningTimeSpan;
public MemoryAntiFloodService(IConfiguration configuration)
{
_floodUsers = new Dictionary<string, IList<DateTime>>();
_bannedUsers = new Dictionary<string, DateTime>();
_floodStartsAfter = configuration.GetValue<int>("FloodActions");
_banningTimeSpan = TimeSpan.FromMinutes(configuration.GetValue<double>("FloodBanTime"));
}
public bool IsUserFlooding(Chat chat, User user)
{
var dictKey = DictKey(chat, user);
if (_bannedUsers.TryGetValue(dictKey, out var expirationTime))
{
if (DateTime.UtcNow <= expirationTime)
{
expirationTime = DateTime.MinValue;
_bannedUsers.Remove(dictKey);
}
}
return (DateTime.UtcNow >= expirationTime);
}
public void RecordAction(Chat chat, User user)
{
var dictKey = DictKey(chat, user);
if (!_floodUsers.TryGetValue(dictKey, out var actionTimeList))
{
actionTimeList = new List<DateTime>();
}
actionTimeList.Add(DateTime.UtcNow);
actionTimeList = actionTimeList.Where(e => e.Subtract(_banningTimeSpan) <= DateTime.UtcNow).ToList();
_floodUsers[dictKey] = actionTimeList;
if (actionTimeList.Count > _floodStartsAfter)
{
actionTimeList.Clear();
_bannedUsers[dictKey] = DateTime.UtcNow.Add(_banningTimeSpan);
}
}
private string DictKey(Chat chat, User user)
{
return $"{chat.Id}-{user.Id}";
}
}