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: