Initial commit: MIB bot
This commit is contained in:
Executable
+125
@@ -0,0 +1,125 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user