126 lines
3.9 KiB
Python
Executable File
126 lines
3.9 KiB
Python
Executable File
import logging
|
|
import time
|
|
|
|
from aiogram.exceptions import TelegramBadRequest
|
|
|
|
from config import bot
|
|
from database import get_user_data, get_user_data_ban, save_user_data, save_user_data_ban
|
|
|
|
logger = logging.getLogger("antispam")
|
|
|
|
STICKER_LIMIT = 15
|
|
STICKER_WINDOW_SECONDS = 60
|
|
STICKER_BAN_SECONDS = 300
|
|
|
|
COMMAND_WARNING_AT = 3
|
|
COMMAND_MUTE_AT = 5
|
|
COMMAND_WINDOW_SECONDS = 60
|
|
COMMAND_MUTE_SECONDS = 600
|
|
|
|
|
|
async def anti_DuDo(user_id: int, message, now: float) -> None:
|
|
chat_id = message.chat.id
|
|
username = message.from_user.username or message.from_user.full_name
|
|
user_info = get_user_data(user_id, chat_id)
|
|
|
|
if not user_info:
|
|
save_user_data(
|
|
user_id=user_id,
|
|
chat_id=chat_id,
|
|
count=0,
|
|
start_time=now,
|
|
ban_trigger=False,
|
|
ban_time=0,
|
|
username=username,
|
|
)
|
|
user_info = get_user_data(user_id, chat_id)
|
|
|
|
count = user_info[2]
|
|
start_time = user_info[3]
|
|
ban_trigger = bool(user_info[4])
|
|
ban_time = user_info[5]
|
|
|
|
if username != user_info[6]:
|
|
save_user_data(user_id, chat_id, username=username)
|
|
|
|
if ban_trigger:
|
|
if now - ban_time >= STICKER_BAN_SECONDS:
|
|
save_user_data(
|
|
user_id,
|
|
chat_id,
|
|
count=0,
|
|
start_time=now,
|
|
ban_trigger=False,
|
|
ban_time=0,
|
|
username=username,
|
|
)
|
|
await bot.send_message(chat_id, f"Надеюсь, {username}, твое злобное дудо остыло...")
|
|
ban_trigger = False
|
|
count = 0
|
|
else:
|
|
try:
|
|
await message.delete()
|
|
except TelegramBadRequest:
|
|
pass
|
|
return
|
|
|
|
if now - start_time >= STICKER_WINDOW_SECONDS:
|
|
count = 0
|
|
start_time = now
|
|
|
|
count += 1
|
|
save_user_data(user_id, chat_id, count=count, start_time=start_time, username=username)
|
|
|
|
if count >= STICKER_LIMIT:
|
|
save_user_data(user_id, chat_id, ban_trigger=True, ban_time=now, username=username)
|
|
await bot.send_message(
|
|
chat_id,
|
|
(
|
|
f"⚠️ {username}, отдохни 5 минут, лови АнтиДудо!\n\n"
|
|
"Хочешь узнать время своего бана — жми /info_ban"
|
|
),
|
|
)
|
|
try:
|
|
await message.delete()
|
|
except TelegramBadRequest:
|
|
pass
|
|
|
|
|
|
async def call_verification(user_id: int, message, command: str) -> None:
|
|
now = time.time()
|
|
chat_id = message.chat.id
|
|
username = message.from_user.username or message.from_user.full_name
|
|
|
|
user_ban_info = get_user_data_ban(user_id, chat_id, command)
|
|
if not user_ban_info:
|
|
save_user_data_ban(user_id, chat_id, command, count=1, ban_time_inf=now)
|
|
return
|
|
|
|
count = user_ban_info[3]
|
|
last_time = user_ban_info[4]
|
|
|
|
if now - last_time >= COMMAND_WINDOW_SECONDS:
|
|
count = 0
|
|
|
|
count += 1
|
|
save_user_data_ban(user_id, chat_id, command, count=count, ban_time_inf=now)
|
|
|
|
if count == COMMAND_WARNING_AT:
|
|
await bot.send_message(chat_id, f"⚠️ {username}, не злоупотребляй командой /{command}")
|
|
|
|
if count >= COMMAND_MUTE_AT:
|
|
member = await bot.get_chat_member(chat_id, user_id)
|
|
if member.status in ["administrator", "creator"]:
|
|
await bot.send_message(
|
|
chat_id,
|
|
f"❗️ {username} нельзя замутить: статус {member.status}.",
|
|
)
|
|
return
|
|
|
|
await bot.restrict_chat_member(chat_id, user_id, until_date=int(now + COMMAND_MUTE_SECONDS))
|
|
await bot.send_message(
|
|
chat_id,
|
|
f"{username} был замучен на 10 минут за злоупотребление командой /{command}.",
|
|
)
|
|
save_user_data_ban(user_id, chat_id, command, count=0, ban_time_inf=now)
|