diff --git a/src/config.py b/src/config.py index 2cacfc8..acc21e9 100644 --- a/src/config.py +++ b/src/config.py @@ -17,6 +17,12 @@ COMMAND_MESSAGES = { '2️⃣ Укажите тэг: /mute @username время\n' '3️⃣ Укажите ID: /mute 123456789 время\n\n' ), + 'manual_unmute': ( + 'ℹ️ Использование размута:\n' + '1️⃣ Ответьте на сообщение: /unmute время\n' + '2️⃣ Укажите тэг: /unmute @username время\n' + '3️⃣ Укажите ID: /unmute 123456789 время\n\n' + ), 'manual_ban': ( 'ℹ️ Использование бана:\n' '1️⃣ Ответьте на сообщение: /ban\n' @@ -38,6 +44,7 @@ COMMAND_MESSAGES = { 'cant_mute_admin': '❌ Невозможно замутить администратора.', 'cant_ban_admin': '❌ Невозможно забанить администратора.', 'muted': '✅ Пользователь замучен на {time_display}.', + 'unmuted': '✅ Пользователь размучен.', 'banned': '✅ Пользователь успешно забанен.', 'unbanned': '✅ Пользователь успешно разбанен.', 'general_error': '⚠️ Произошла непредвиденная ошибка.' diff --git a/src/modules/unmute.py b/src/modules/unmute.py new file mode 100644 index 0000000..ebd0078 --- /dev/null +++ b/src/modules/unmute.py @@ -0,0 +1,182 @@ +from telebot.async_telebot import AsyncTeleBot +from telebot.types import Message, User, ChatPermissions +import asyncio +import logging +from database import db + +from config import COMMAND_MESSAGES + +logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля + +# Удаляет два последних сообщения +async def delete_messages(bot: AsyncTeleBot, message: Message, time_sleep: int): + await asyncio.sleep(time_sleep) + 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): # Регистрирует все обработчики команд + + @bot.message_handler(commands=['unmute']) # Обработчик команды /unmute + async def unmute_command(message: 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 + + # Определяем целевого пользователя + target_user = None + + # Разбиваем текст сообщения на части + parts_msg = message.text.split() + + 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 + + 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 + + # Выводим помощь (/unmute help) + if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: + await send_message(chat_id, COMMAND_MESSAGES['manual_unmute']) + + # Удаляем сообщения через 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 + + # Если это обычный чат + elif message.reply_to_message and message.is_topic_message is None: + target_user = message.reply_to_message.from_user + + # Удаляем сообщение, если команда неправильная + else: + await asyncio.sleep(3) + await bot.delete_message(message.chat.id, message.message_id) + return + + # Если два, то через тег или ID + elif len(parts_msg) == 2: + + identifier = parts_msg[1].strip() + + # Поиск по 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 + ) + + # Если пользователь не найден + if not target_user: + await send_message(chat_id, COMMAND_MESSAGES['user_not_found']) + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) + + return + + # Выполняем размут + try: + # Убираем ограничения (можно писать в чат) + permissions = ChatPermissions( + can_send_messages=True, + can_send_media_messages=True, + can_send_polls=True, + can_send_other_messages=True, + can_add_web_page_previews=True, + can_change_info=False, + can_invite_users=True, + can_pin_messages=False, + ) + + await bot.restrict_chat_member( + chat_id=message.chat.id, + user_id=target_user.id, + permissions=permissions + ) + + # Отправляем сообщения, что пользователь получил размут + await send_message(chat_id, COMMAND_MESSAGES['unmuted']) + logger.info(f"Пользователь {target_user.id} получил размут от администратора {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"Общая ошибка в unmute_command: {str(e)}") + + # Удаляем сообщения через 5 секунд + await delete_messages(bot, message, 5) \ No newline at end of file