🚧 Anti-spam system based on entities

This commit is contained in:
2020-03-03 14:11:51 +04:00
parent 1441c345b2
commit 8f8898e901
9 changed files with 148 additions and 3 deletions
+19
View File
@@ -0,0 +1,19 @@
using Telegram.Bot.Types;
namespace Kruzya.TelegramBot.UrlLimitations
{
public struct ChatMember
{
public long Chat;
public long User;
public static ChatMember From(long chatId, long userId)
{
return new ChatMember()
{
Chat = chatId,
User = userId
};
}
}
}
+58
View File
@@ -0,0 +1,58 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using BotFramework;
using BotFramework.Attributes;
using BotFramework.Setup;
using Kruzya.TelegramBot.Core.Cache;
using Kruzya.TelegramBot.Core.Extensions;
using Microsoft.Extensions.Logging;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
namespace Kruzya.TelegramBot.UrlLimitations
{
public class MessageHandler : BotEventHandler
{
protected ILogger Logger;
protected MemoryCache<ChatMember, UInt16> ChatMembersCache;
public MessageHandler(ILogger<MessageHandler> logger, MemoryCache<ChatMember, UInt16> chatMembersCache)
{
Logger = logger;
ChatMembersCache = chatMembersCache;
}
[TextMessage(InChat.Public)]
public async Task OnMessageReceived()
{
Logger.LogDebug($"Message received from {From.Id} in {Chat.Id}");
UInt16 messageCount;
var chatMember = ChatMember.From(Chat.Id, From.Id);
if (!ChatMembersCache.TryGetValue(chatMember, out messageCount))
{
return;
}
if (messageCount > 10)
{
ChatMembersCache.SetValue(chatMember, 0, 0);
return;
}
messageCount++;
ChatMembersCache.SetValue(chatMember, messageCount);
var message = RawUpdate.Message;
if (message.Entities.Count(e => e.Type == MessageEntityType.Url || e.Type == MessageEntityType.TextLink) >
0)
{
var targetChat = new ChatId(Chat.Id);
await Bot.KickChatMemberAsync(new ChatId(Chat.Id), From.Id, DateTime.Now.AddDays(1));
await Bot.DeleteMessageAsync(targetChat, message.MessageId);
await Bot.SendTextMessageAsync(targetChat,
$"Member {From.ToHtml()} has been banned.\n<b>Reason</b>: <pre>Spam suspicion</pre>", ParseMode.Html);
}
}
}
}
+19
View File
@@ -0,0 +1,19 @@
using System;
using Kruzya.TelegramBot.Core;
using Kruzya.TelegramBot.Core.Extensions;
using Microsoft.Extensions.DependencyInjection;
namespace Kruzya.TelegramBot.UrlLimitations
{
public class UrlLimitations : Module
{
public UrlLimitations(Core.Core core) : base(core)
{
}
public override void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache<ChatMember, UInt16>();
}
}
}
@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<AssemblyName>TelegramBot.UrlLimitations</AssemblyName>
<RootNamespace>Kruzya.TelegramBot.UrlLimitations</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\Core\Core.csproj" />
</ItemGroup>
</Project>
+25
View File
@@ -0,0 +1,25 @@
using System;
using BotFramework;
using BotFramework.Attributes;
using BotFramework.Setup;
using Kruzya.TelegramBot.Core.Cache;
using Telegram.Bot.Types.Enums;
namespace Kruzya.TelegramBot.UrlLimitations
{
public class UserJoinHandler : BotEventHandler
{
protected MemoryCache<ChatMember, UInt16> ChatMembersCache;
public UserJoinHandler(MemoryCache<ChatMember, UInt16> chatMembersCache)
{
ChatMembersCache = chatMembersCache;
}
[Message(MessageType.ChatMembersAdded, InChat.Public)]
public void OnChatMembersAdded()
{
ChatMembersCache.SetValue(ChatMember.From(Chat.Id, From.Id), 0);
}
}
}