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)