From 60baf5cac3cad7ac85f406f38a93dc86ab20a18c Mon Sep 17 00:00:00 2001 From: Muzifs Date: Wed, 9 Jul 2025 17:18:06 +0300 Subject: [PATCH 1/2] added command unban --- src/config.py | 7 +++ src/modules/unban.py | 129 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 src/modules/unban.py diff --git a/src/config.py b/src/config.py index 8cc4f0d..153d051 100644 --- a/src/config.py +++ b/src/config.py @@ -14,11 +14,18 @@ COMMAND_MESSAGES = { '2️⃣ Укажите тэг: /ban @username\n' '3️⃣ Укажите ID: /ban 123456789' ), + 'manual_unban': ( + 'ℹ️ Использование разбана:\n' + '1️⃣ Ответьте на сообщение: /unban\n' + '2️⃣ Укажите тэг: /unban @username\n' + '3️⃣ Укажите ID: /unban 123456789' + ), 'no_admin_rights': '❌ Только администраторы могут использовать эту команду.', 'no_restrict_rights': '❌ У вас недостаточно прав.', 'user_not_found': '❌ Пользователь не найден.', 'cant_ban_admin': '❌ Невозможно забанить администратора.', 'banned': '✅ Пользователь успешно забанен.', + 'unbanned': '✅ Пользователь успешно разбанен.', 'general_error': '⚠️ Произошла непредвиденная ошибка.' } \ No newline at end of file diff --git a/src/modules/unban.py b/src/modules/unban.py new file mode 100644 index 0000000..6e5a679 --- /dev/null +++ b/src/modules/unban.py @@ -0,0 +1,129 @@ +from telebot.async_telebot import AsyncTeleBot +from telebot.types import Message, User +import asyncio +import logging +from database import db + +from config import COMMAND_MESSAGES + +logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля + +def register_handlers(bot: AsyncTeleBot): # Регистрирует все обработчики команд + + @bot.message_handler(commands=['unban']) # Обработчик команды /unban + async def unban_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']) + return + + # Проверяем право администратора на разбан + if admin_status.status == 'administrator' and not admin_status.can_restrict_members: + await send_message(chat_id, COMMAND_MESSAGES['no_restrict_rights']) + return + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка при получении статуса администратора: {str(e)}") + return + + # Случай №1 - Команда используется в ответ на сообщение + if len(parts_msg) == 1: + + # Если банят в теме + if message.is_topic_message: + + # Если без ответа на сообщение + if message.message_thread_id == message.reply_to_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: + return + + # Случай №2 - Команда с аргументом (/unban @username или /unban 12345) + elif len(parts_msg) == 2: + + # Выводим помощь (/unban help) + if parts_msg[1].strip() in ['help', 'помощь']: + await send_message(chat_id, COMMAND_MESSAGES['manual_unban']) + return + + 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']) + return + + # Выполняем разбан + try: + await bot.unban_chat_member(message.chat.id, target_user.id) + await send_message(chat_id, COMMAND_MESSAGES['unbanned']) + + await asyncio.sleep(5) + await bot.delete_message(message.chat.id, message.message_id) + await bot.delete_message(message.chat.id, message.message_id+1) + logger.info(f"Пользователь {target_user.id} разбанен администратором {message.from_user.id}.") + + except Exception as e: + await send_message(chat_id, f"⚠️ Ошибка: {str(e)}") + logger.error(f"Ошибка разбана: {str(e)}") + + except Exception as e: + await send_message(chat_id, COMMAND_MESSAGES['general_error']) + logger.error(f"Общая ошибка в unban_command: {str(e)}") \ No newline at end of file -- 2.49.0 From 00e81a5e5f8c4ff938ea9fec46fe6577f6fa7573 Mon Sep 17 00:00:00 2001 From: Muzifs Date: Wed, 9 Jul 2025 17:19:54 +0300 Subject: [PATCH 2/2] updaded README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6855146..d9d3aa2 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - [ ] Команда /mute - [ ] Команда /unmute - [X] Команда /ban -- [ ] Команда /unban +- [X] Команда /unban - [ ] Фильтрация сообщений - [ ] Удаление сообщений с матом - [ ] Удаление рекламы -- 2.49.0