forked from Muzifs/LGBot
127 lines
5.5 KiB
Python
127 lines
5.5 KiB
Python
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"<b>{nickname}</b>"
|
||
if tag:
|
||
user_display += f" (@{tag})"
|
||
else:
|
||
user_display = f"<code>{target_user_id}</code>"
|
||
|
||
response = (
|
||
f"✅ Счётчик нарушений сброшен\n\n"
|
||
f"👤 Пользователь: {user_display}\n"
|
||
f"📊 Удалено нарушений: <b>{deleted_count}</b>"
|
||
)
|
||
|
||
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) |