From 2709c8ce409163bfc35e0302e4e92d33d1e18eaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=A5=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BE=D0=B2?= Date: Sat, 18 Oct 2025 13:41:35 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D1=81=D0=B1=D1=80=D0=BE=D1=81=D0=B0=20=D0=BD=D0=B0=D1=80?= =?UTF-8?q?=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/logger.py | 6 +++-- src/modules/reset_violations.py | 39 +++++++++++++++++++-------------- src/utils.py | 17 ++++++++++++++ 3 files changed, 44 insertions(+), 18 deletions(-) diff --git a/src/logger.py b/src/logger.py index 3533c57..8832e08 100644 --- a/src/logger.py +++ b/src/logger.py @@ -6,13 +6,15 @@ from config import LOG_FILE_NAME class ColoredFormatter(logging.Formatter): # Цветные логи (для терминала) LEVEL_COLORS = { + logging.DEBUG: '\033[96m', # Голубой для DEBUG logging.INFO: '\033[92m', logging.WARNING: '\033[93m', logging.ERROR: '\033[91m', logging.CRITICAL: '\033[91m' } - + LEVEL_NAMES = { + logging.DEBUG: "D", logging.INFO: "I", logging.WARNING: "W", logging.ERROR: "E", @@ -50,7 +52,7 @@ def setup_logging(): # Инициализирует систему логиро # Создаем корневой логгер logger = logging.getLogger() - logger.setLevel(logging.INFO) + logger.setLevel(logging.DEBUG) # Временно DEBUG для отладки # Проверяем, не настроен ли логгер ранее if not logger.hasHandlers(): diff --git a/src/modules/reset_violations.py b/src/modules/reset_violations.py index 32241b8..bdd92b5 100644 --- a/src/modules/reset_violations.py +++ b/src/modules/reset_violations.py @@ -29,32 +29,23 @@ def register_handlers(bot: AsyncTeleBot): target_user = None target_user_id = None - # Обработка ответа на сообщение - if message.reply_to_message: - target_user = message.reply_to_message.from_user - target_user_id = target_user.id - - # Обработка по username или ID - else: - parts = message.text.split(maxsplit=1) - - if len(parts) < 2: - await send_temp_message( - bot, - message, - COMMAND_MESSAGES['reset_violations_help'] - ) - return + # Парсим команду + 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, @@ -66,6 +57,7 @@ def register_handlers(bot: AsyncTeleBot): else: try: target_user_id = int(identifier) + logger.info(f"Использован ID пользователя: {target_user_id}") except ValueError: await send_temp_message( bot, @@ -74,6 +66,21 @@ def register_handlers(bot: AsyncTeleBot): ) 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( diff --git a/src/utils.py b/src/utils.py index 3a15ef1..ecc87b5 100644 --- a/src/utils.py +++ b/src/utils.py @@ -39,12 +39,29 @@ async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict logger.info(f"Получен статус пользователя {message.from_user.id}: status={admin_status.status}, " f"can_restrict={getattr(admin_status, 'can_restrict_members', None)}") + # Детальное логирование всех прав (для отладки) + logger.debug(f"Детальный статус пользователя {message.from_user.id}: " + f"can_be_edited={getattr(admin_status, 'can_be_edited', None)}, " + f"can_manage_chat={getattr(admin_status, 'can_manage_chat', None)}, " + f"can_delete_messages={getattr(admin_status, 'can_delete_messages', None)}, " + f"can_restrict_members={getattr(admin_status, 'can_restrict_members', None)}, " + f"can_promote_members={getattr(admin_status, 'can_promote_members', None)}, " + f"can_change_info={getattr(admin_status, 'can_change_info', None)}, " + f"can_invite_users={getattr(admin_status, 'can_invite_users', None)}, " + f"can_post_messages={getattr(admin_status, 'can_post_messages', None)}, " + f"can_edit_messages={getattr(admin_status, 'can_edit_messages', None)}, " + f"can_pin_messages={getattr(admin_status, 'can_pin_messages', None)}, " + f"user={getattr(admin_status, 'user', None)}") + # ВАЖНО: В каналах администраторы могут иметь статус 'left', но при этом иметь права администратора # Проверяем наличие прав администратора через can_* поля is_admin = admin_status.status in ('administrator', 'creator') + logger.debug(f"Начальная проверка: is_admin={is_admin}, status={admin_status.status}") + # Для каналов: если статус 'left', но есть админские права - считаем администратором if admin_status.status == 'left': + logger.debug(f"Обнаружен статус 'left', проверяем админские права...") # Проверяем наличие любых админских прав has_admin_rights = any([ getattr(admin_status, 'can_be_edited', False),