mirror of
https://github.com/Bubuni-Team/telegram-bot.git
synced 2026-07-31 00:29:24 +03:00
🚧 Anti-spam system based on entities
This commit is contained in:
@@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user