forked from Muzifs/LGBot
189 lines
7.4 KiB
Python
189 lines
7.4 KiB
Python
from telebot.async_telebot import AsyncTeleBot
|
||
from telebot.types import Message
|
||
import asyncio
|
||
import logging
|
||
|
||
from config import COMMAND_MESSAGES
|
||
|
||
# Получаем логгер для текущего модуля
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# Удаляет определённое количество сообщения
|
||
async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int, number_message: int):
|
||
await asyncio.sleep(time_sleep)
|
||
for i in range(number_message):
|
||
try:
|
||
await bot.delete_message(message.chat.id, message.message_id+i)
|
||
except Exception as e:
|
||
logger.debug(f"Не удалось удалить сообщение {message.message_id+i}: {e}")
|
||
|
||
# Проверяет, является ли отправитель администратором
|
||
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
|
||
|
||
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}")
|
||
|
||
# Получаем статус отправителя
|
||
admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id)
|
||
|
||
# Логируем полученный статус
|
||
logger.info(f"Получен статус пользователя {message.from_user.id}: status={admin_status.status}, "
|
||
f"can_restrict={getattr(admin_status, 'can_restrict_members', None)}")
|
||
|
||
# Проверка наличия прав администратора/создателя
|
||
if admin_status.status not in ('administrator', 'creator'):
|
||
|
||
# Отправляем предупреждение
|
||
await bot.send_message(
|
||
chat_id=message.chat.id,
|
||
text=COMMAND_MESSAGES['no_admin_rights'],
|
||
message_thread_id=message.message_thread_id,
|
||
)
|
||
|
||
# Удаляем сообщения через 5 секунд
|
||
await delete_messages(bot, message, time_sleep=5, number_message=2)
|
||
return 1
|
||
|
||
# Проверка права на ограничение участников (опционально)
|
||
if check_restrict_rights and admin_status.status == 'administrator' and not admin_status.can_restrict_members:
|
||
|
||
# Отправляем предупреждение
|
||
await bot.send_message(
|
||
chat_id=message.chat.id,
|
||
text=COMMAND_MESSAGES['no_restrict_rights'],
|
||
message_thread_id=message.message_thread_id,
|
||
)
|
||
|
||
# Удаляем сообщения через 5 секунд
|
||
await delete_messages(bot, message, time_sleep=5, number_message=2)
|
||
return 1
|
||
|
||
except Exception as e:
|
||
|
||
# Отправляем ошибку
|
||
await bot.send_message(
|
||
chat_id=message.chat.id,
|
||
text=COMMAND_MESSAGES['error'].format(e=str(e)),
|
||
message_thread_id=message.message_thread_id,
|
||
)
|
||
|
||
# Записываем ошибку в логи
|
||
logger.error(f"Ошибка при получении статуса администратора: {str(e)}")
|
||
|
||
# Удаляем сообщения через 5 секунд
|
||
await delete_messages(bot, message, time_sleep=5, number_message=2)
|
||
return 1
|
||
|
||
# Проверяет статус целевого пользователя
|
||
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
|
||
|
||
try:
|
||
|
||
# Получаем статус пользователя
|
||
target_status = await bot.get_chat_member(
|
||
chat_id=message.chat.id,
|
||
user_id=target_user.id,
|
||
)
|
||
|
||
# Проверяем, является ли цель администратором или создателем
|
||
if target_status.status in ('administrator', 'creator'):
|
||
|
||
# Отправляем предупреждение
|
||
await bot.send_message(
|
||
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
|
||
|
||
except Exception as e:
|
||
|
||
# Отправляем ошибку
|
||
await bot.send_message(
|
||
chat_id=message.chat.id,
|
||
text=COMMAND_MESSAGES['error'].format(e=str(e)),
|
||
message_thread_id=message.message_thread_id,
|
||
)
|
||
|
||
# Записываем ошибку в логи
|
||
logger.error(f"Ошибка при получении статуса пользователя: {str(e)}")
|
||
|
||
# Удаляем сообщения через 5 секунд
|
||
await delete_messages(bot, message, time_sleep=5, number_message=2)
|
||
return
|
||
|
||
# Возвращает количество секунд
|
||
def parse_mute_time(time_str: str) -> int | None:
|
||
|
||
# Нормализация входной строки
|
||
normalized = time_str.strip().lower()
|
||
|
||
# Словарь для конвертации единиц времени в секунды
|
||
time_units = {
|
||
'm': 60, 'м': 60, # минуты
|
||
'h': 3600, 'ч': 3600, # часы
|
||
'd': 86400, 'д': 86400 # дни
|
||
}
|
||
|
||
# Проверям, существует ли строка
|
||
if not normalized:
|
||
return None
|
||
|
||
# Проверяем последний символ (единица измерения)
|
||
unit = normalized[-1]
|
||
if unit not in time_units:
|
||
return None
|
||
|
||
# Парсим числовую часть
|
||
try:
|
||
value = int(normalized[:-1])
|
||
if value <= 0:
|
||
return None
|
||
|
||
return value * time_units[unit]
|
||
|
||
except (ValueError, TypeError):
|
||
return None
|
||
|
||
# Форматирует время в нормальный вид
|
||
def format_mute_time(seconds: int) -> str:
|
||
|
||
# Обработка минут
|
||
minutes = seconds // 60
|
||
if minutes < 60:
|
||
if minutes % 10 == 1 and minutes % 100 != 11:
|
||
return f"{minutes} минуту"
|
||
elif 2 <= minutes % 10 <= 4 and (minutes % 100 < 10 or minutes % 100 >= 20):
|
||
return f"{minutes} минуты"
|
||
else:
|
||
return f"{minutes} минут"
|
||
|
||
# Обработка часов
|
||
hours = minutes // 60
|
||
if hours < 24:
|
||
if hours % 10 == 1 and hours % 100 != 11:
|
||
return f"{hours} час"
|
||
elif 2 <= hours % 10 <= 4 and (hours % 100 < 10 or hours % 100 >= 20):
|
||
return f"{hours} часа"
|
||
else:
|
||
return f"{hours} часов"
|
||
|
||
# Обработка дней
|
||
days = hours // 24
|
||
if days % 10 == 1 and days % 100 != 11:
|
||
return f"{days} день"
|
||
elif 2 <= days % 10 <= 4 and (days % 100 < 10 or days % 100 >= 20):
|
||
return f"{days} дня"
|
||
else:
|
||
return f"{days} дней" |