From ff397dc4960ac120d7979ddcda3b42e11f58e0b2 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: Mon, 13 Oct 2025 14:55:37 +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=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=8B=20=D0=B2=20=D1=81=D1=83=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B3=D1=80=D1=83=D0=BF=D0=BF=D0=B5=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils.py | 59 +++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/src/utils.py b/src/utils.py index f140292..9db425c 100644 --- a/src/utils.py +++ b/src/utils.py @@ -20,15 +20,19 @@ async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int, # Проверяет, является ли отправитель администратором async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict_rights: bool = True): - if message.reply_to_message and not message.is_topic_message: - message.message_thread_id = None + # Сохраняем оригинальный thread_id для восстановления после проверки + original_thread_id = message.message_thread_id + + # ВАЖНО: Временно сбрасываем thread_id для проверки прав на уровне ВСЕЙ группы + # Иначе Telegram вернет статус в контексте топика, а не группы + message.message_thread_id = None try: # Логируем параметры проверки logger.info(f"Проверка прав: chat_id={message.chat.id}, user_id={message.from_user.id}, " - f"is_topic={message.is_topic_message}, thread_id={message.message_thread_id}") + f"is_topic={message.is_topic_message}, original_thread_id={original_thread_id}") - # Получаем статус отправителя + # Получаем статус отправителя на уровне ВСЕЙ группы (без thread_id) admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) # Логируем полученный статус @@ -37,6 +41,8 @@ async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict # Проверка наличия прав администратора/создателя if admin_status.status not in ('administrator', 'creator'): + # Восстанавливаем thread_id для отправки сообщения в правильный топик + message.message_thread_id = original_thread_id # Отправляем предупреждение await bot.send_message( @@ -51,6 +57,8 @@ async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict # Проверка права на ограничение участников (опционально) if check_restrict_rights and admin_status.status == 'administrator' and not admin_status.can_restrict_members: + # Восстанавливаем thread_id для отправки сообщения в правильный топик + message.message_thread_id = original_thread_id # Отправляем предупреждение await bot.send_message( @@ -63,12 +71,18 @@ async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict await delete_messages(bot, message, time_sleep=5, number_message=2) return 1 + # Восстанавливаем thread_id после успешной проверки + message.message_thread_id = original_thread_id + return 0 + except Exception as e: + # Восстанавливаем thread_id для отправки сообщения об ошибке + message.message_thread_id = original_thread_id # Отправляем ошибку await bot.send_message( - chat_id=message.chat.id, - text=COMMAND_MESSAGES['error'].format(e=str(e)), + chat_id=message.chat.id, + text=COMMAND_MESSAGES['error'].format(e=str(e)), message_thread_id=message.message_thread_id, ) @@ -82,37 +96,48 @@ async def check_admin_status(bot: AsyncTeleBot, message: Message, check_restrict # Проверяет статус целевого пользователя async def check_target_status(bot: AsyncTeleBot, message: Message, target_user): - if message.reply_to_message and not message.is_topic_message: - message.message_thread_id = None + # Сохраняем оригинальный thread_id + original_thread_id = message.message_thread_id + + # Временно сбрасываем thread_id для проверки статуса на уровне ВСЕЙ группы + message.message_thread_id = None try: - # Получаем статус пользователя + # Получаем статус пользователя на уровне ВСЕЙ группы target_status = await bot.get_chat_member( - chat_id=message.chat.id, + chat_id=message.chat.id, user_id=target_user.id, ) # Проверяем, является ли цель администратором или создателем if target_status.status in ('administrator', 'creator'): - + # Восстанавливаем thread_id для отправки сообщения + message.message_thread_id = original_thread_id + # Отправляем предупреждение await bot.send_message( - chat_id=message.chat.id, - text=COMMAND_MESSAGES['cant_mute_admin'], + chat_id=message.chat.id, + text=COMMAND_MESSAGES['cant_mute_admin'], message_thread_id=message.message_thread_id, ) # Удаляем сообщения через 5 секунд await delete_messages(bot, message, time_sleep=5, number_message=2) - return + return 1 + + # Восстанавливаем thread_id после успешной проверки + message.message_thread_id = original_thread_id + return 0 except Exception as e: + # Восстанавливаем thread_id для отправки сообщения об ошибке + message.message_thread_id = original_thread_id # Отправляем ошибку await bot.send_message( - chat_id=message.chat.id, - text=COMMAND_MESSAGES['error'].format(e=str(e)), + chat_id=message.chat.id, + text=COMMAND_MESSAGES['error'].format(e=str(e)), message_thread_id=message.message_thread_id, ) @@ -121,7 +146,7 @@ async def check_target_status(bot: AsyncTeleBot, message: Message, target_user): # Удаляем сообщения через 5 секунд await delete_messages(bot, message, time_sleep=5, number_message=2) - return + return 1 # Возвращает количество секунд def parse_mute_time(time_str: str) -> int | None: