Исправления для работы в супергруппе 2

This commit is contained in:
2025-10-13 14:55:37 +03:00
parent e0886fcfa8
commit ff397dc496

View File

@@ -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: