from telebot.async_telebot import AsyncTeleBot from telebot.types import Message import logging from database import db from utils import check_admin_status, delete_messages from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) def register_handlers(bot: AsyncTeleBot): """Регистрирует обработчик команды сброса нарушений""" @bot.message_handler(commands=['reset_violations']) async def reset_violations_command(message: Message): """Команда для сброса счётчика нарушений пользователя""" logger.info(f"Команда /reset_violations получена от пользователя {message.from_user.id}") # Проверяем права администратора (без проверки can_restrict_members) admin_check = await check_admin_status(bot, message, check_restrict_rights=False) if admin_check == 1: logger.info(f"Пользователь {message.from_user.id} не является администратором") return logger.info(f"Пользователь {message.from_user.id} прошел проверку прав администратора") # Определяем целевого пользователя target_user = None target_user_id = None # Парсим команду parts = message.text.split(maxsplit=1) # Если есть аргументы в команде (username или ID) - используем их if len(parts) >= 2: identifier = parts[1].strip() # Попытка получить по username if identifier.startswith('@'): username = identifier[1:] logger.info(f"Поиск пользователя по username: {username}") user_data = db.get_user_by_username(username) if user_data: target_user_id = user_data[0] logger.info(f"Найден пользователь в БД: id={user_data[0]}, nickname={user_data[1]}, tag={user_data[2]}") else: logger.warning(f"Пользователь с username {username} не найден в БД") await send_temp_message( bot, message, COMMAND_MESSAGES['user_not_found'] ) return # Попытка получить по ID else: try: target_user_id = int(identifier) logger.info(f"Использован ID пользователя: {target_user_id}") except ValueError: await send_temp_message( bot, message, COMMAND_MESSAGES['user_not_found'] ) return # Если аргументов нет - пробуем использовать reply_to_message elif message.reply_to_message: target_user = message.reply_to_message.from_user target_user_id = target_user.id logger.info(f"Использован пользователь из reply_to_message: id={target_user_id}") # Если ни аргументов, ни reply нет - показываем help else: await send_temp_message( bot, message, COMMAND_MESSAGES['reset_violations_help'] ) return # Проверяем, что нашли пользователя if not target_user_id: await send_temp_message( bot, message, COMMAND_MESSAGES['user_not_found'] ) return # Получаем информацию о пользователе из базы user_info = db.get_user(target_user_id) # Получаем текущее количество нарушений violations_count = db.get_violations_count(target_user_id, message.chat.id) # Сбрасываем нарушения deleted_count = db.reset_user_violations(target_user_id, message.chat.id) # Формируем сообщение if user_info: _, nickname, tag = user_info user_display = f"{nickname}" if tag: user_display += f" (@{tag})" else: user_display = f"{target_user_id}" response = ( f"✅ Счётчик нарушений сброшен\n\n" f"👤 Пользователь: {user_display}\n" f"📊 Удалено нарушений: {deleted_count}" ) await send_temp_message(bot, message, response, time_sleep=30) logger.info(f"Администратор {message.from_user.id} сбросил счётчик нарушений пользователя {target_user_id}") async def send_temp_message(bot: AsyncTeleBot, message: Message, text: str, time_sleep: int = 10): """Отправляет временное сообщение, которое удаляется через указанное время""" await bot.send_message( chat_id=message.chat.id, text=text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=time_sleep, number_message=2)