from telebot.async_telebot import AsyncTeleBot from telebot.types import Message, User import asyncio import logging from database import db from action_reporter import action_reporter from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля # Удаляет два последних сообщения 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=['unban']) # Обработчик команды /unban async def unban_command(message: Message): # Отправка сообщения в тему или обычный чат send_message = bot.reply_to if message.is_topic_message else bot.send_message chat_id = message if message.is_topic_message else message.chat.id # Определяем целевого пользователя target_user = None # Разбиваем текст сообщения на части parts_msg = message.text.split() # Выводим помощь (/unban help) if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: await send_message(chat_id, COMMAND_MESSAGES['manual_unban']) # Удаляем сообщения через 30 секунд await delete_messages(bot, message, 30) return try: # Проверяем, является ли отправитель администратором try: admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) # Проверяем статус администратора (создателя) 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 # Если одно слово, то ответом на сообщение 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 # Если это обычный чат elif message.reply_to_message and message.is_topic_message is None: target_user = message.reply_to_message.from_user # Удаляем сообщение, если команда неправильная else: await asyncio.sleep(3) await bot.delete_message(message.chat.id, message.message_id) return # Если два, то через тег или ID elif len(parts_msg) == 2: identifier = parts_msg[1].strip() # Поиск по ID if identifier.isdigit(): # Делаем в 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('@'): # Убираем @ и ищем 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 not target_user: await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) # Удаляем сообщения через 5 секунд await delete_messages(bot, message, 5) return # Выполняем разбан try: await bot.unban_chat_member(message.chat.id, target_user.id) # Отправляем лог в админ-чат await action_reporter.log_action( action="РАЗБАН", user_id=target_user.id, admin_id=message.from_user.id, reason=None, duration=None ) # Отправляем сообщения, что пользователь получил разбан await send_message(chat_id, COMMAND_MESSAGES['unbanned']) logger.info(f"Пользователь {target_user.id} разбанен администратором {message.from_user.id}.") # Удаляем сообщения через 5 секунд await delete_messages(bot, message, 5) 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"Общая ошибка в unban_command: {str(e)}") # Удаляем сообщения через 5 секунд await delete_messages(bot, message, 5)