Update bot.py

parent ea52c884
...@@ -15,6 +15,7 @@ import unicodedata ...@@ -15,6 +15,7 @@ import unicodedata
from aiogram.filters import Command from aiogram.filters import Command
import logging import logging
from aiogram import types from aiogram import types
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
# Список слов фраз - указателей спама # Список слов фраз - указателей спама
...@@ -96,6 +97,7 @@ load_dotenv() ...@@ -96,6 +97,7 @@ load_dotenv()
# Получение значения токена # Получение значения токена
bot_token = os.getenv("BOT_TOKEN") bot_token = os.getenv("BOT_TOKEN")
log_chat_id = os.getenv("LOG_CHAT_ID") log_chat_id = os.getenv("LOG_CHAT_ID")
main_chat_id = os.getenv("MAIN_CHAT_ID")
# Инициализация бота и диспетчера # Инициализация бота и диспетчера
bot = Bot(token=bot_token) bot = Bot(token=bot_token)
...@@ -107,7 +109,6 @@ dp.include_router(router) ...@@ -107,7 +109,6 @@ dp.include_router(router)
# Для хранения информации о новых участниках # Для хранения информации о новых участниках
active_users = {} active_users = {}
class TelegramLogHandler(logging.Handler): class TelegramLogHandler(logging.Handler):
def __init__(self, bot, chat_id, *args, **kwargs): def __init__(self, bot, chat_id, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
...@@ -171,6 +172,12 @@ def has_mixed_layout(text): ...@@ -171,6 +172,12 @@ def has_mixed_layout(text):
except Exception as e: except Exception as e:
logger.error("Checking error: %s", e) logger.error("Checking error: %s", e)
return False return False
# Проверка на арабские символы в имени
def is_arabic_name(name: str) -> bool:
"""Проверяет, содержит ли имя арабские символы."""
arabic_regex = re.compile("[\u0600-\u06FF]") # Диапазон арабских символов в Unicode
return bool(arabic_regex.search(name))
# Регулярное выражение для распознавания эмодзи # Регулярное выражение для распознавания эмодзи
emoji_pattern = re.compile("[" emoji_pattern = re.compile("["
...@@ -185,7 +192,7 @@ emoji_pattern = re.compile("[" ...@@ -185,7 +192,7 @@ emoji_pattern = re.compile("["
u"\U0001FA70-\U0001FAFF" # Symbols and Pictographs Extended-A u"\U0001FA70-\U0001FAFF" # Symbols and Pictographs Extended-A
u"\U00002702-\U000027B0" # Dingbats u"\U00002702-\U000027B0" # Dingbats
u"\U0001F004-\U0001F0CF" # Playing Cards u"\U0001F004-\U0001F0CF" # Playing Cards
"]+", flags=re.UNICODE) "]+", flags=re.UNICODE)
def normalize_text_to_infinitive(text): def normalize_text_to_infinitive(text):
""" """
...@@ -275,7 +282,6 @@ def is_spam(text): ...@@ -275,7 +282,6 @@ def is_spam(text):
return spam_count >= 2 return spam_count >= 2
def generate_math_problem(): def generate_math_problem():
"""Генерация простого математического примера.""" """Генерация простого математического примера."""
a = random.randint(1, 10) a = random.randint(1, 10)
...@@ -287,6 +293,21 @@ async def welcome_new_user(event: ChatMemberUpdated): ...@@ -287,6 +293,21 @@ async def welcome_new_user(event: ChatMemberUpdated):
"""Обработчик новых участников группы.""" """Обработчик новых участников группы."""
if event.new_chat_member.status == "member" and event.old_chat_member.status not in ["member", "administrator", "creator"]: if event.new_chat_member.status == "member" and event.old_chat_member.status not in ["member", "administrator", "creator"]:
new_user = event.new_chat_member.user new_user = event.new_chat_member.user
# Проверка, если имя пользователя содержит арабские символы
if is_arabic_name(new_user.first_name):
try:
# Немедленно удаляем пользователя
await bot.ban_chat_member(event.chat.id, new_user.id)
logger.info(f"User {new_user.first_name} ({new_user.id}) banned due to Arabic name.")
return # Прерываем дальнейшую обработку
except AiogramError as e:
logger.error(f"Failed to ban user {new_user.id}. Error: {e}")
except Exception as e:
logger.error(f"Error banning user {new_user.id}: {e}")
return
math_problem, correct_answer = generate_math_problem() math_problem, correct_answer = generate_math_problem()
try: try:
...@@ -294,9 +315,9 @@ async def welcome_new_user(event: ChatMemberUpdated): ...@@ -294,9 +315,9 @@ async def welcome_new_user(event: ChatMemberUpdated):
logger.info(f"Sending welcome message to {new_user.first_name} ({new_user.id}) in chat {event.chat.id}") logger.info(f"Sending welcome message to {new_user.first_name} ({new_user.id}) in chat {event.chat.id}")
welcome_message = await bot.send_message( welcome_message = await bot.send_message(
chat_id=event.chat.id, chat_id=event.chat.id,
text=f"Здравствуйте, {new_user.first_name}! Добро пожаловать в нашу группу!\n\n" text=f"Здравствуйте, {new_user.first_name}! Добро пожаловать в группу!\n\n"
f"Нам необходимо удостовериться, что вы человек.\n" f"Нам необходимо удостовериться, что вы человек.\n"
f"Решите математический пример в течение 2-х минут! В качестве ответа отправьте одно число.\n\n{math_problem}\n" f"Решите математический пример в течение минуты! В качестве ответа отправьте одно число.\n\n{math_problem}\n"
) )
# Сохраняем данные о пользователе # Сохраняем данные о пользователе
...@@ -314,10 +335,33 @@ async def welcome_new_user(event: ChatMemberUpdated): ...@@ -314,10 +335,33 @@ async def welcome_new_user(event: ChatMemberUpdated):
logger.error(f"Failed sending a message to the group {event.chat.id}. Error: {e}") logger.error(f"Failed sending a message to the group {event.chat.id}. Error: {e}")
# Ожидание ответа пользователя # Ожидание ответа пользователя
await check_answer(new_user.id) await check_answer(new_user.id)
# Обработчик кнопки "Разбанить"
@router.callback_query(lambda c: c.data.startswith("unban_"))
async def unban_user(callback_query: types.CallbackQuery):
user_id = int(callback_query.data.split("_")[1])
try:
await bot.unban_chat_member(main_chat_id, user_id, only_if_banned=True)
await callback_query.answer("✅ User unbanned!")
# Сообщение в логи
await bot.send_message(
callback_query.message.chat.id,
f"✅ User <b>{user_id}</b> unbanned.",
parse_mode="HTML"
)
except AiogramError as e:
await callback_query.answer("Unbanning error.")
await bot.send_message(
callback_query.message.chat.id,
f"Error in unbanning {user_id}: {e}"
)
async def check_answer(user_id): async def check_answer(user_id):
"""Проверка ответа пользователя через 1 минуты.""" """Проверка ответа пользователя через 1 минуту."""
await asyncio.sleep(60) await asyncio.sleep(60)
user_data = active_users.get(user_id) user_data = active_users.get(user_id)
...@@ -328,12 +372,28 @@ async def check_answer(user_id): ...@@ -328,12 +372,28 @@ async def check_answer(user_id):
# Удаляем пользователя из группы # Удаляем пользователя из группы
await bot.ban_chat_member(chat_id=user_data["chat_id"], user_id=user_id) await bot.ban_chat_member(chat_id=user_data["chat_id"], user_id=user_id)
logger.info(f"User {user_id} has been banned due to not answering in time.")
# Создаем кнопку для разбанивания
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[InlineKeyboardButton(text="🔓 Разбанить", callback_data=f"unban_{user_id}")]
]
)
# Отправляем сообщение с кнопкой в группу логов
await bot.send_message(
chat_id=log_chat_id,
text=f"❌ User <b>{user_id}</b> has been banned in {user_data['chat_id']} due to not answering in time.",
reply_markup=keyboard,
parse_mode="HTML"
)
except AiogramError as e: except AiogramError as e:
logger.error(f"User deletion error {user_id}. Error: {e}") logger.error(f"User deletion error {user_id}. Error: {e}")
except Exception as e: except Exception as e:
logger.error(f"User deletion error {user_id}. Error: {e}") logger.error(f"User deletion error {user_id}. Error: {e}")
async def cleanup_messages(user_data): async def cleanup_messages(user_data):
"""Удаление всех сообщений пользователя и бота.""" """Удаление всех сообщений пользователя и бота."""
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment