forked from Muzifs/LGBot
Исправления для работы в супергруппе 2
This commit is contained in:
43
src/utils.py
43
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,7 +71,13 @@ 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(
|
||||
@@ -82,12 +96,15 @@ 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,
|
||||
user_id=target_user.id,
|
||||
@@ -95,6 +112,8 @@ async def check_target_status(bot: AsyncTeleBot, message: Message, target_user):
|
||||
|
||||
# Проверяем, является ли цель администратором или создателем
|
||||
if target_status.status in ('administrator', 'creator'):
|
||||
# Восстанавливаем thread_id для отправки сообщения
|
||||
message.message_thread_id = original_thread_id
|
||||
|
||||
# Отправляем предупреждение
|
||||
await bot.send_message(
|
||||
@@ -105,9 +124,15 @@ 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
|
||||
|
||||
# Восстанавливаем 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(
|
||||
@@ -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:
|
||||
|
Reference in New Issue
Block a user