diff --git a/src/modules/ban.py b/src/modules/ban.py index 11b494d..9c5d498 100644 --- a/src/modules/ban.py +++ b/src/modules/ban.py @@ -8,6 +8,22 @@ from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля +# Возвращает причину бана +def extract_reason(words: str) -> str: + + if words == []: + reason = 'отсутствует' + else: + reason = ' '.join(words) + + return reason + +# Удаляет два последних сообщения +async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int): + await asyncio.sleep(time_sleep) + await bot.delete_message(message.chat.id, message.message_id) + await bot.delete_message(message.chat.id, message.message_id+1) + def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики команд @bot.message_handler(commands=['ban']) # Обработчик команды /ban @@ -20,6 +36,9 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об # Определяем целевого пользователя target_user = None + # Определяем причину + reason = None + # Разбиваем текст сообщения на части parts_msg = message.text.split() @@ -31,83 +50,139 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об # Проверяем статус администратора (создателя) if admin_status.status not in ['administrator', 'creator']: await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return # Проверяем право администратора на бан if admin_status.status == 'administrator' and not admin_status.can_restrict_members: await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return except Exception as e: await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return - # Случай №1 - Команда используется в ответ на сообщение + # Выводим помощь (/ban help) + if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: + await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) + + # Удаляем сообщения через 30 секунд + await delete_messages(bot, message, 30) + + return + + # Если одно слово, то ответом на сообщение if len(parts_msg) == 1: - # Если банят в теме + # Если это тема if message.is_topic_message: - # Если без ответа на сообщение + # Если без ответа на сообщение, ошибка if message.message_thread_id == message.reply_to_message.message_id: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) return - # Если команда правильная + # Если с ответом на сообщение else: target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) - # Если банят в обычном чате + # Если это обычный чат elif message.reply_to_message and message.is_topic_message is None: target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) - # Не выводим сообщение, что команда неправильная + # Удаляем сообщение, если команда неправильная else: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) return + + else: - # Случай №2 - Команда с аргументом (/ban @username или /ban 12345) - elif len(parts_msg) == 2: - - # Выводим помощь (/ban help) - if parts_msg[1].strip() in ['help', 'помощь']: - await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) - return + # Если второе слово это тег или ID + if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): - identifier = parts_msg[1].strip() - - # Поиск по ID - if identifier.isdigit(): + identifier = parts_msg[1].strip() + reason = extract_reason(parts_msg[2:]) + + # Поиск по ID + if identifier.isdigit(): - # Делаем в int и ищем - user_info = db.get_user(int(identifier)) + # Делаем в int и ищем + user_info = db.get_user(int(identifier)) - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) - - # Поиск по тэгу - elif identifier.startswith('@'): + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + # Поиск по тэгу + elif identifier.startswith('@'): - # Убираем @ и ищем - user_info = db.get_user_by_username(identifier[1:]) + # Убираем @ и ищем + user_info = db.get_user_by_username(identifier[1:]) - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + else: + + # Если это тема + if message.is_topic_message: + + # Если без ответа на сообщение, ошибка + if message.message_thread_id == message.reply_to_message.message_id: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + # Если с ответом на сообщение + else: + target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) + + # Если это обычный чат + elif message.reply_to_message and message.is_topic_message is None: + target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) + + # Удаляем сообщение, если команда неправильная + else: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return # Если пользователь не найден if not target_user: await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return # Проверяем статус целевого пользователя @@ -117,27 +192,44 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об # Проверяем, является ли цель администратором или создателем if target_status.status in ['administrator', 'creator']: await send_message(chat_id, COMMAND_MESSAGES['cant_ban_admin']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return except Exception as e: await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") logger.error(f"Ошибка при получении статуса пользователя: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + return # Выполняем бан try: await bot.ban_chat_member(message.chat.id, target_user.id) + + # Отправляем сообщения, что пользователь получил бан await send_message(chat_id, COMMAND_MESSAGES['banned']) - + logger.info(f"Пользователь {target_user.id} забанен администратором {message.from_user.id}.") + + # Удаляем сообщения через 5 секунд await asyncio.sleep(5) await bot.delete_message(message.chat.id, message.message_id) await bot.delete_message(message.chat.id, message.message_id+2) - logger.info(f"Пользователь {target_user.id} забанен администратором {message.from_user.id}.") except Exception as e: await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") logger.error(f"Ошибка бана: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) except Exception as e: await send_message(chat_id, COMMAND_MESSAGES['general_error']) - logger.error(f"Общая ошибка в ban_command: {str(e)}") \ No newline at end of file + logger.error(f"Общая ошибка в ban_command: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) \ No newline at end of file