From 3f23b4c7088d6d942f1efb503d10ff1e226ab05d Mon Sep 17 00:00:00 2001 From: Muzifs Date: Fri, 25 Jul 2025 20:19:07 +0300 Subject: [PATCH] mute and ban commands with photos --- src/action_reporter.py | 15 +- src/modules/ban.py | 353 ++++++++++++------------- src/modules/content_filter.py | 70 +++++ src/modules/mute.py | 467 +++++++++++++++++----------------- src/modules/unban.py | 3 +- src/modules/unmute.py | 3 +- 6 files changed, 502 insertions(+), 409 deletions(-) create mode 100644 src/modules/content_filter.py diff --git a/src/action_reporter.py b/src/action_reporter.py index cf790e2..f737847 100644 --- a/src/action_reporter.py +++ b/src/action_reporter.py @@ -1,6 +1,7 @@ from telebot.async_telebot import AsyncTeleBot from telebot.types import Message import logging +import os from database import db # Инициализация @@ -47,7 +48,7 @@ class ActionReporter: return text # Отправляет лог действия в админ-чат - async def log_action(self, action: str, user_id: int, admin_id: int, reason: str, duration: str): + async def log_action(self, action: str, user_id: int, admin_id: int, reason: str, duration: str, photo_path: str): try: # Получаем информацию о пользователе и администраторе @@ -64,9 +65,15 @@ class ActionReporter: msg += f"📝 Причина: {reason}\n" msg += f"\n{user_info}\n\n{admin_info}" - - # Отправляем сообщение - await self.bot.send_message(self.log_chat_id, msg, message_thread_id=self.log_thread_id) + + # Отправляем лог с изображением + if photo_path and os.path.exists(photo_path): + with open(photo_path, 'rb') as photo_file: + await self.bot.send_photo(self.log_chat_id, photo_file, caption=msg, message_thread_id=self.log_thread_id) + + # Отправляем лог без изображения + else: + await self.bot.send_message(self.log_chat_id, msg, message_thread_id=self.log_thread_id) except Exception as e: logging.error(f"Ошибка отправки лога: {str(e)}") diff --git a/src/modules/ban.py b/src/modules/ban.py index 0e86069..d6d51e1 100644 --- a/src/modules/ban.py +++ b/src/modules/ban.py @@ -26,67 +26,138 @@ async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int): await bot.delete_message(message.chat.id, message.message_id) await bot.delete_message(message.chat.id, message.message_id+1) -def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики команд +# Регистрирует все обработчики команд +def register_handlers(bot: AsyncTeleBot): - @bot.message_handler(commands=['ban']) # Обработчик команды /ban - async def ban_command(message: Message): + # Обработчик команды /ban + @bot.message_handler(commands=['ban']) + async def _ban_command_wrapper(message: Message): + await ban_command(bot, message) - # Отправка сообщения в тему или обычный чат - send_message = bot.reply_to if message.is_topic_message else bot.send_message - chat_id = message if message.is_topic_message else message.chat.id +# Основная функция команды /ban +async def ban_command(bot: AsyncTeleBot, message: Message, photo_path: str = None): - # Определяем целевого пользователя - target_user = None + # Отправка сообщения в тему или обычный чат + send_message = bot.reply_to if message.is_topic_message else bot.send_message + chat_id = message if message.is_topic_message else message.chat.id - # Определяем причину - reason = None + # Определяем целевого пользователя + target_user = None - # Разбиваем текст сообщения на части - parts_msg = message.text.split() + # Определяем причину + reason = None - # Выводим помощь (/ban help) - if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: - await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) + # Разбиваем текст сообщения на части + parts_msg = message.text.split() - # Удаляем сообщения через 30 секунд - await delete_messages(bot, message, 30) + # Выводим помощь (/ban help) + if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: + await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) - return + # Удаляем сообщения через 30 секунд + await delete_messages(bot, message, 30) + return + + try: + # Проверяем, является ли отправитель администратором try: - # Проверяем, является ли отправитель администратором - try: - admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) - - # Проверяем статус администратора (создателя) - if admin_status.status not in ['administrator', 'creator']: - await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Проверяем право администратора на бан - if admin_status.status == 'administrator' and not admin_status.can_restrict_members: - await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return + admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + # Проверяем статус администратора (создателя) + if admin_status.status not in ['administrator', 'creator']: + await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights']) # Удаляем сообщения через 5 секунд await delete_messages(bot, message, 5) return + + # Проверяем право администратора на бан + if admin_status.status == 'administrator' and not admin_status.can_restrict_members: + await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) - # Если одно слово, то ответом на сообщение - if len(parts_msg) == 1: + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Если одно слово, то ответом на сообщение + if len(parts_msg) == 1: + + # Если это тема + if message.is_topic_message: + + # Если без ответа на сообщение, ошибка + if message.message_thread_id == message.reply_to_message.message_id: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + # Если с ответом на сообщение + else: + target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) + + # Если это обычный чат + elif message.reply_to_message and message.is_topic_message is None: + target_user = message.reply_to_message.from_user + reason = extract_reason(parts_msg[1:]) + + # Удаляем сообщение, если команда неправильная + else: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + else: + + # Если второе слово это тег или ID + if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): + + identifier = parts_msg[1].strip() + reason = extract_reason(parts_msg[2:]) + + # Поиск по ID + if identifier.isdigit(): + + # Делаем в int и ищем + user_info = db.get_user(int(identifier)) + + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + # Поиск по тэгу + elif identifier.startswith('@'): + + # Убираем @ и ищем + user_info = db.get_user_by_username(identifier[1:]) + + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + else: # Если это тема if message.is_topic_message: @@ -113,134 +184,70 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об await bot.delete_message(message.chat.id, message.message_id) return - else: - - # Если второе слово это тег или ID - if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): - - identifier = parts_msg[1].strip() - reason = extract_reason(parts_msg[2:]) - - # Поиск по ID - if identifier.isdigit(): - - # Делаем в int и ищем - user_info = db.get_user(int(identifier)) - - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) - - # Поиск по тэгу - elif identifier.startswith('@'): - - # Убираем @ и ищем - user_info = db.get_user_by_username(identifier[1:]) - - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) - - else: - - # Если это тема - if message.is_topic_message: - - # Если без ответа на сообщение, ошибка - if message.message_thread_id == message.reply_to_message.message_id: - await asyncio.sleep(3) - await bot.delete_message(message.chat.id, message.message_id) - return - - # Если с ответом на сообщение - else: - target_user = message.reply_to_message.from_user - reason = extract_reason(parts_msg[1:]) - - # Если это обычный чат - elif message.reply_to_message and message.is_topic_message is None: - target_user = message.reply_to_message.from_user - reason = extract_reason(parts_msg[1:]) - - # Удаляем сообщение, если команда неправильная - else: - await asyncio.sleep(3) - await bot.delete_message(message.chat.id, message.message_id) - return - - # Если пользователь не найден - if not target_user: - await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Проверяем статус целевого пользователя - try: - target_status = await bot.get_chat_member(message.chat.id, target_user.id) - - # Проверяем, является ли цель администратором или создателем - if target_status.status in ['administrator', 'creator']: - await send_message(chat_id, COMMAND_MESSAGES['cant_ban_admin']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка при получении статуса пользователя: {str(e)}") - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Выполняем бан - try: - await bot.ban_chat_member(message.chat.id, target_user.id) - - # Отправляем лог в админ-чат - await action_reporter.log_action( - action="БАН", - user_id=target_user.id, - admin_id=message.from_user.id, - reason=reason, - duration=None - ) - - # Отправляем сообщения, что пользователь получил бан - await send_message(chat_id, COMMAND_MESSAGES['banned']) - logger.info(f"Пользователь {target_user.id} забанен администратором {message.from_user.id}.") - - # Удаляем сообщения через 5 секунд - await asyncio.sleep(5) - await bot.delete_message(message.chat.id, message.message_id) - await bot.delete_message(message.chat.id, message.message_id+2) - - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка бана: {str(e)}") - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - except Exception as e: - await send_message(chat_id, COMMAND_MESSAGES['general_error']) - logger.error(f"Общая ошибка в ban_command: {str(e)}") + # Если пользователь не найден + if not target_user: + await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) \ No newline at end of file + await delete_messages(bot, message, 5) + + return + + # Проверяем статус целевого пользователя + try: + target_status = await bot.get_chat_member(message.chat.id, target_user.id) + + # Проверяем, является ли цель администратором или создателем + if target_status.status in ['administrator', 'creator']: + await send_message(chat_id, COMMAND_MESSAGES['cant_ban_admin']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка при получении статуса пользователя: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Выполняем бан + try: + await bot.ban_chat_member(message.chat.id, target_user.id) + + # Отправляем лог в админ-чат + await action_reporter.log_action( + action="БАН", + user_id=target_user.id, + admin_id=message.from_user.id, + reason=reason, + duration=None, + photo_path=photo_path + ) + + # Отправляем сообщения, что пользователь получил бан + await send_message(chat_id, COMMAND_MESSAGES['banned']) + logger.info(f"Пользователь {target_user.id} забанен администратором {message.from_user.id}.") + + # Удаляем сообщения через 5 секунд + await asyncio.sleep(5) + await bot.delete_message(message.chat.id, message.message_id) + await bot.delete_message(message.chat.id, message.message_id+2) + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка бана: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + except Exception as e: + await send_message(chat_id, COMMAND_MESSAGES['general_error']) + logger.error(f"Общая ошибка в ban_command: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) \ No newline at end of file diff --git a/src/modules/content_filter.py b/src/modules/content_filter.py new file mode 100644 index 0000000..c0706ea --- /dev/null +++ b/src/modules/content_filter.py @@ -0,0 +1,70 @@ +from telebot.async_telebot import AsyncTeleBot +from telebot.types import Message +import asyncio +import os + +import logging +from database import db + +# Импортируем обработчики команд +from modules.mute import mute_command +from modules.ban import ban_command + +logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля + +def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики событий + + # Обработчик изображений + @bot.message_handler(content_types=['photo']) + async def message_photo(message: Message): + + # Определяем путь к изображению + photo_path = None + + try: + + # Проверяем, есть ли подпись + if not message.caption: + return + + # Разделяем подпись на части + parts = message.caption.split() + + # Определяем команду (первое слово в подписи) + command = parts[0].lower() + + # Поддерживаемые команды + supported_commands = { + '/mute': mute_command, + '/ban': ban_command + } + + # Проверяем, является ли первое слово командой + if command not in supported_commands: + return + + # Скачиваем изображение + file_info = await bot.get_file(message.photo[-1].file_id) + os.makedirs("tmp", exist_ok=True) + photo_path = f"tmp/{file_info.file_id}.jpg" + downloaded_file = await bot.download_file(file_info.file_path) + + with open(photo_path, 'wb') as new_file: + new_file.write(downloaded_file) + + # Переносим caption в text + message.text = message.caption + + # Вызываем обработчик команды + handler = supported_commands[command] + await handler(bot, message, photo_path=photo_path) + + except Exception as e: + logger.error(f"Ошибка обработки команды с изображением: {str(e)}") + + finally: + if photo_path and os.path.exists(photo_path): + try: + os.remove(photo_path) + except Exception as e: + logger.error(f"Ошибка удаления временного изображения: {str(e)}") \ No newline at end of file diff --git a/src/modules/mute.py b/src/modules/mute.py index c727cd4..0105915 100644 --- a/src/modules/mute.py +++ b/src/modules/mute.py @@ -91,76 +91,150 @@ async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int): await bot.delete_message(message.chat.id, message.message_id) await bot.delete_message(message.chat.id, message.message_id+1) -def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики команд +# Регистрирует все обработчики команд +def register_handlers(bot: AsyncTeleBot): - @bot.message_handler(commands=['mute']) # Обработчик команды /mute - async def mute_command(message: Message): + # Обработчик команды /mute + @bot.message_handler(commands=['mute']) + async def _mute_command_wrapper(message: Message): + await mute_command(bot, message) - # Отправка сообщения в тему или обычный чат - send_message = bot.reply_to if message.is_topic_message else bot.send_message - chat_id = message if message.is_topic_message else message.chat.id +# Основная функция команды /mute +async def mute_command(bot: AsyncTeleBot, message: Message, photo_path: str = None): - # Определяем целевого пользователя - target_user = None + # Отправка сообщения в тему или обычный чат + send_message = bot.reply_to if message.is_topic_message else bot.send_message + chat_id = message if message.is_topic_message else message.chat.id - # Отпределяем время - time_arg = None + # Определяем целевого пользователя + target_user = None - # Определяем причину - reason = None + # Отпределяем время + time_arg = None - # Разбиваем текст сообщения на части - parts_msg = message.text.split() + # Определяем причину + reason = None - # Выводим помощь - if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: - await send_message(chat_id, COMMAND_MESSAGES['manual_mute']) + # Разбиваем текст сообщения на части + parts_msg = message.text.split() - # Удаляем сообщения через 30 секунд - await delete_messages(bot, message, 30) + # Выводим помощь + if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: + await send_message(chat_id, COMMAND_MESSAGES['manual_mute']) - return + # Удаляем сообщения через 30 секунд + await delete_messages(bot, message, 30) + return + + try: + # Проверяем, является ли отправитель администратором try: - # Проверяем, является ли отправитель администратором - try: - admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) + admin_status = await bot.get_chat_member(message.chat.id, message.from_user.id) - # Проверяем статус администратора (создателя) - if admin_status.status not in ['administrator', 'creator']: - await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Проверяем право администратора на мут - if admin_status.status == 'administrator' and not admin_status.can_restrict_members: - await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + # Проверяем статус администратора (создателя) + if admin_status.status not in ['administrator', 'creator']: + await send_message(chat_id, COMMAND_MESSAGES['no_admin_rights']) # Удаляем сообщения через 5 секунд await delete_messages(bot, message, 5) return - # Если одно слово, то удаляем сообщение. Ошибка - if len(parts_msg) == 1: + # Проверяем право администратора на мут + if admin_status.status == 'administrator' and not admin_status.can_restrict_members: + await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Если одно слово, то удаляем сообщение. Ошибка + if len(parts_msg) == 1: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + # Если два слово, то ответом на сообщение + elif len(parts_msg) == 2: + + # Если это тема + if message.is_topic_message: + + # Если без ответа на сообщение, ошибка + if message.message_thread_id == message.reply_to_message.message_id: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + # Если с ответом на сообщение + else: + target_user = message.reply_to_message.from_user + time_arg = parts_msg[1] + reason = extract_reason(parts_msg[2:]) + + # Если это обычный чат + elif message.reply_to_message and message.is_topic_message is None: + target_user = message.reply_to_message.from_user + time_arg = parts_msg[1] + reason = extract_reason(parts_msg[2:]) + + # Удаляем сообщение, если команда неправильная + else: await asyncio.sleep(3) await bot.delete_message(message.chat.id, message.message_id) return - # Если два слово, то ответом на сообщение - elif len(parts_msg) == 2: + else: + + # Если второе слово это тег или ID + if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): + + identifier = parts_msg[1].strip() + time_arg = parts_msg[2] + reason = extract_reason(parts_msg[3:]) + + # Поиск по ID + if identifier.isdigit(): + + # Делаем в int и ищем + user_info = db.get_user(int(identifier)) + + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + # Поиск по тегу + elif identifier.startswith('@'): + + # Убираем @ и ищем + user_info = db.get_user_by_username(identifier[1:]) + + if user_info: + # Создаем объект пользователя из данных базы + target_user = User( + id=user_info[0], + first_name=user_info[1], + username=user_info[2], + is_bot=False + ) + + else: # Если это тема if message.is_topic_message: @@ -189,187 +263,120 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об await bot.delete_message(message.chat.id, message.message_id) return - else: - - # Если второе слово это тег или ID - if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): - - identifier = parts_msg[1].strip() - time_arg = parts_msg[2] - reason = extract_reason(parts_msg[3:]) - - # Поиск по ID - if identifier.isdigit(): - - # Делаем в int и ищем - user_info = db.get_user(int(identifier)) - - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) - - # Поиск по тегу - elif identifier.startswith('@'): - - # Убираем @ и ищем - user_info = db.get_user_by_username(identifier[1:]) - - if user_info: - # Создаем объект пользователя из данных базы - target_user = User( - id=user_info[0], - first_name=user_info[1], - username=user_info[2], - is_bot=False - ) - - else: - - # Если это тема - if message.is_topic_message: - - # Если без ответа на сообщение, ошибка - if message.message_thread_id == message.reply_to_message.message_id: - await asyncio.sleep(3) - await bot.delete_message(message.chat.id, message.message_id) - return - - # Если с ответом на сообщение - else: - target_user = message.reply_to_message.from_user - time_arg = parts_msg[1] - reason = extract_reason(parts_msg[2:]) - - # Если это обычный чат - elif message.reply_to_message and message.is_topic_message is None: - target_user = message.reply_to_message.from_user - time_arg = parts_msg[1] - reason = extract_reason(parts_msg[2:]) - - # Удаляем сообщение, если команда неправильная - else: - await asyncio.sleep(3) - await bot.delete_message(message.chat.id, message.message_id) - return - - # Если пользователь не найден - if not target_user: - await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Парсинг времени мута - mute_seconds = parse_mute_time(time_arg) - if mute_seconds is None: - await send_message(chat_id, COMMAND_MESSAGES['incorrect_time_format']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Минимальный мут 1 минута (60 секунд) - if mute_seconds < 60: - await send_message(chat_id, COMMAND_MESSAGES['min_mute']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Максимальный мут 30 дней (2592000 секунд) - if mute_seconds > 2592000: - await send_message(chat_id, COMMAND_MESSAGES['max_mute']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Проверяем статус целевого пользователя - try: - target_status = await bot.get_chat_member(message.chat.id, target_user.id) - - # Проверяем, является ли цель администратором или создателем - if target_status.status in ['administrator', 'creator']: - await send_message(chat_id, COMMAND_MESSAGES['cant_mute_admin']) - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка при получении статуса пользователя: {str(e)}") - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - return - - # Выполняем мут - try: - - # Вычисляем время окончания мута - until_date = int(time.time()) + mute_seconds - - # Устанавливаем ограничения (только чтение) - permissions = ChatPermissions( - can_send_messages=False, - can_send_media_messages=False, - can_send_polls=False, - can_send_other_messages=False, - can_add_web_page_previews=False, - can_change_info=False, - can_invite_users=False, - can_pin_messages=False, - ) - - await bot.restrict_chat_member( - chat_id=message.chat.id, - user_id=target_user.id, - permissions=permissions, - until_date=until_date - ) - - # Форматирование времени - time_display = format_time(mute_seconds) - - # Отправляем лог в админ-чат - await action_reporter.log_action( - action="МУТ", - user_id=target_user.id, - admin_id=message.from_user.id, - reason=reason, - duration=time_display - ) - - # Отправляем сообщения, что пользователь получил мут - await send_message(chat_id, COMMAND_MESSAGES['muted'].format(time_display=time_display)) - logger.info(f"Пользователь {target_user.id} получил мут на {time_display} от администратора {message.from_user.id}.") - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - except Exception as e: - await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") - logger.error(f"Ошибка мута: {str(e)}") - - # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) - - except Exception as e: - await send_message(chat_id, COMMAND_MESSAGES['general_error']) - logger.error(f"Общая ошибка в mute_command: {str(e)}") + # Если пользователь не найден + if not target_user: + await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) # Удаляем сообщения через 5 секунд - await delete_messages(bot, message, 5) \ No newline at end of file + await delete_messages(bot, message, 5) + + return + + # Парсинг времени мута + mute_seconds = parse_mute_time(time_arg) + if mute_seconds is None: + await send_message(chat_id, COMMAND_MESSAGES['incorrect_time_format']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Минимальный мут 1 минута (60 секунд) + if mute_seconds < 60: + await send_message(chat_id, COMMAND_MESSAGES['min_mute']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Максимальный мут 30 дней (2592000 секунд) + if mute_seconds > 2592000: + await send_message(chat_id, COMMAND_MESSAGES['max_mute']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Проверяем статус целевого пользователя + try: + target_status = await bot.get_chat_member(message.chat.id, target_user.id) + + # Проверяем, является ли цель администратором или создателем + if target_status.status in ['administrator', 'creator']: + await send_message(chat_id, COMMAND_MESSAGES['cant_mute_admin']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка при получении статуса пользователя: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Выполняем мут + try: + + # Вычисляем время окончания мута + until_date = int(time.time()) + mute_seconds + + # Устанавливаем ограничения (только чтение) + permissions = ChatPermissions( + can_send_messages=False, + can_send_media_messages=False, + can_send_polls=False, + can_send_other_messages=False, + can_add_web_page_previews=False, + can_change_info=False, + can_invite_users=False, + can_pin_messages=False, + ) + + await bot.restrict_chat_member( + chat_id=message.chat.id, + user_id=target_user.id, + permissions=permissions, + until_date=until_date + ) + + # Форматирование времени + time_display = format_time(mute_seconds) + + # Отправляем лог в админ-чат + await action_reporter.log_action( + action="МУТ", + user_id=target_user.id, + admin_id=message.from_user.id, + reason=reason, + duration=time_display, + photo_path=photo_path + ) + + # Отправляем сообщения, что пользователь получил мут + await send_message(chat_id, COMMAND_MESSAGES['muted'].format(time_display=time_display)) + logger.info(f"Пользователь {target_user.id} получил мут на {time_display} от администратора {message.from_user.id}.") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка мута: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + except Exception as e: + await send_message(chat_id, COMMAND_MESSAGES['general_error']) + logger.error(f"Общая ошибка в mute_command: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) \ No newline at end of file diff --git a/src/modules/unban.py b/src/modules/unban.py index 30fe752..30ecb0c 100644 --- a/src/modules/unban.py +++ b/src/modules/unban.py @@ -152,7 +152,8 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об user_id=target_user.id, admin_id=message.from_user.id, reason=None, - duration=None + duration=None, + photo_path=None ) # Отправляем сообщения, что пользователь получил разбан diff --git a/src/modules/unmute.py b/src/modules/unmute.py index 01dff27..f449717 100644 --- a/src/modules/unmute.py +++ b/src/modules/unmute.py @@ -168,7 +168,8 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об user_id=target_user.id, admin_id=message.from_user.id, reason=None, - duration=None + duration=None, + photo_path=None ) # Отправляем сообщения, что пользователь получил размут