Исправление определения пользователя для сброса нарушений

This commit is contained in:
2025-10-18 13:41:35 +03:00
parent ab80af2744
commit 2709c8ce40
3 changed files with 44 additions and 18 deletions

View File

@@ -6,6 +6,7 @@ from config import LOG_FILE_NAME
class ColoredFormatter(logging.Formatter): # Цветные логи (для терминала) class ColoredFormatter(logging.Formatter): # Цветные логи (для терминала)
LEVEL_COLORS = { LEVEL_COLORS = {
logging.DEBUG: '\033[96m', # Голубой для DEBUG
logging.INFO: '\033[92m', logging.INFO: '\033[92m',
logging.WARNING: '\033[93m', logging.WARNING: '\033[93m',
logging.ERROR: '\033[91m', logging.ERROR: '\033[91m',
@@ -13,6 +14,7 @@ class ColoredFormatter(logging.Formatter): # Цветные логи (для т
} }
LEVEL_NAMES = { LEVEL_NAMES = {
logging.DEBUG: "D",
logging.INFO: "I", logging.INFO: "I",
logging.WARNING: "W", logging.WARNING: "W",
logging.ERROR: "E", logging.ERROR: "E",
@@ -50,7 +52,7 @@ def setup_logging(): # Инициализирует систему логиро
# Создаем корневой логгер # Создаем корневой логгер
logger = logging.getLogger() logger = logging.getLogger()
logger.setLevel(logging.INFO) logger.setLevel(logging.DEBUG) # Временно DEBUG для отладки
# Проверяем, не настроен ли логгер ранее # Проверяем, не настроен ли логгер ранее
if not logger.hasHandlers(): if not logger.hasHandlers():

View File

@@ -29,32 +29,23 @@ def register_handlers(bot: AsyncTeleBot):
target_user = None target_user = None
target_user_id = None target_user_id = None
# Обработка ответа на сообщение # Парсим команду
if message.reply_to_message: parts = message.text.split(maxsplit=1)
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
# Если есть аргументы в команде (username или ID) - используем их
if len(parts) >= 2:
identifier = parts[1].strip() identifier = parts[1].strip()
# Попытка получить по username # Попытка получить по username
if identifier.startswith('@'): if identifier.startswith('@'):
username = identifier[1:] username = identifier[1:]
logger.info(f"Поиск пользователя по username: {username}")
user_data = db.get_user_by_username(username) user_data = db.get_user_by_username(username)
if user_data: if user_data:
target_user_id = user_data[0] target_user_id = user_data[0]
logger.info(f"Найден пользователь в БД: id={user_data[0]}, nickname={user_data[1]}, tag={user_data[2]}")
else: else:
logger.warning(f"Пользователь с username {username} не найден в БД")
await send_temp_message( await send_temp_message(
bot, bot,
message, message,
@@ -66,6 +57,7 @@ def register_handlers(bot: AsyncTeleBot):
else: else:
try: try:
target_user_id = int(identifier) target_user_id = int(identifier)
logger.info(f"Использован ID пользователя: {target_user_id}")
except ValueError: except ValueError:
await send_temp_message( await send_temp_message(
bot, bot,
@@ -74,6 +66,21 @@ def register_handlers(bot: AsyncTeleBot):
) )
return 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: if not target_user_id:
await send_temp_message( await send_temp_message(

View File

@@ -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}, " logger.info(f"Получен статус пользователя {message.from_user.id}: status={admin_status.status}, "
f"can_restrict={getattr(admin_status, 'can_restrict_members', None)}") 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', но при этом иметь права администратора # ВАЖНО: В каналах администраторы могут иметь статус 'left', но при этом иметь права администратора
# Проверяем наличие прав администратора через can_* поля # Проверяем наличие прав администратора через can_* поля
is_admin = admin_status.status in ('administrator', 'creator') is_admin = admin_status.status in ('administrator', 'creator')
logger.debug(f"Начальная проверка: is_admin={is_admin}, status={admin_status.status}")
# Для каналов: если статус 'left', но есть админские права - считаем администратором # Для каналов: если статус 'left', но есть админские права - считаем администратором
if admin_status.status == 'left': if admin_status.status == 'left':
logger.debug(f"Обнаружен статус 'left', проверяем админские права...")
# Проверяем наличие любых админских прав # Проверяем наличие любых админских прав
has_admin_rights = any([ has_admin_rights = any([
getattr(admin_status, 'can_be_edited', False), getattr(admin_status, 'can_be_edited', False),