Files
LGBot/src/modules/reset_violations.py

127 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)