Compare commits
	
		
			3 Commits
		
	
	
		
			91ea936c15
			...
			85060fd69e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 85060fd69e | |||
| 00e81a5e5f | |||
| 60baf5cac3 | 
| @@ -10,7 +10,7 @@ | ||||
| - [ ] Команда /mute | ||||
| - [ ] Команда /unmute | ||||
| - [X] Команда /ban | ||||
| - [ ] Команда /unban | ||||
| - [X] Команда /unban | ||||
| - [ ] Фильтрация сообщений | ||||
|     - [ ] Удаление сообщений с матом | ||||
|     - [ ] Удаление рекламы | ||||
|   | ||||
| @@ -14,11 +14,18 @@ COMMAND_MESSAGES = { | ||||
|         '2️⃣ Укажите тэг: <code>/ban @username</code>\n' | ||||
|         '3️⃣ Укажите ID: <code>/ban 123456789</code>' | ||||
|     ), | ||||
|     'manual_unban': ( | ||||
|         'ℹ️ Использование разбана:\n' | ||||
|         '1️⃣ Ответьте на сообщение: <code>/unban</code>\n' | ||||
|         '2️⃣ Укажите тэг: <code>/unban @username</code>\n' | ||||
|         '3️⃣ Укажите ID: <code>/unban 123456789</code>' | ||||
|     ), | ||||
|     'no_admin_rights': '❌ Только администраторы могут использовать эту команду.', | ||||
|     'no_restrict_rights': '❌ У вас недостаточно прав.', | ||||
|     'user_not_found': '❌ Пользователь не найден.', | ||||
|     'cant_ban_admin': '❌ Невозможно забанить администратора.', | ||||
|     'banned': '✅ Пользователь успешно забанен.', | ||||
|     'unbanned': '✅ Пользователь успешно разбанен.', | ||||
|     'general_error': '⚠️ Произошла непредвиденная ошибка.' | ||||
|  | ||||
| } | ||||
							
								
								
									
										129
									
								
								src/modules/unban.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								src/modules/unban.py
									
									
									
									
									
										Normal file
									
								
							| @@ -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)}") | ||||
		Reference in New Issue
	
	Block a user