Files
mib-new/antispam.py
T

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)