Compare commits
	
		
			2 Commits
		
	
	
		
			0f26a05b54
			...
			c81a37f9ac
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c81a37f9ac | |||
| 8c8604d465 | 
| @@ -8,6 +8,22 @@ from config import COMMAND_MESSAGES | ||||
|  | ||||
| logger = logging.getLogger(__name__) # Получаем логгер для текущего модуля | ||||
|  | ||||
| # Возвращает причину бана | ||||
| def extract_reason(words: str) -> str: | ||||
|  | ||||
|     if words == []: | ||||
|         reason = 'отсутствует' | ||||
|     else: | ||||
|         reason = ' '.join(words) | ||||
|  | ||||
|     return reason | ||||
|  | ||||
| # Удаляет два последних сообщения | ||||
| 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=['ban']) # Обработчик команды /ban | ||||
| @@ -20,6 +36,9 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об | ||||
|         # Определяем целевого пользователя | ||||
|         target_user = None | ||||
|  | ||||
|         # Определяем причину | ||||
|         reason = None | ||||
|  | ||||
|         # Разбиваем текст сообщения на части | ||||
|         parts_msg = message.text.split() | ||||
|  | ||||
| @@ -31,83 +50,139 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об | ||||
|                 # Проверяем статус администратора (создателя) | ||||
|                 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 | ||||
|  | ||||
|             # Случай №1 - Команда используется в ответ на сообщение | ||||
|             # Выводим помощь (/ban help) | ||||
|             if len(parts_msg) == 2 and parts_msg[1].strip() in ['help', 'помощь']: | ||||
|                 await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) | ||||
|  | ||||
|                 # Удаляем сообщения через 30 секунд | ||||
|                 await delete_messages(bot, message, 30) | ||||
|  | ||||
|                 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: | ||||
|              | ||||
|             # Случай №2 - Команда с аргументом (/ban @username или /ban 12345) | ||||
|             elif len(parts_msg) == 2: | ||||
|  | ||||
|                 # Выводим помощь (/ban help) | ||||
|                 if parts_msg[1].strip() in ['help', 'помощь']: | ||||
|                     await send_message(chat_id, COMMAND_MESSAGES['manual_ban']) | ||||
|                     return | ||||
|                 # Если второе слово это тег или ID | ||||
|                 if parts_msg[1].strip().isdigit() or parts_msg[1].startswith('@'): | ||||
|                  | ||||
|                 identifier = parts_msg[1].strip() | ||||
|                  | ||||
|                 # Поиск по ID | ||||
|                 if identifier.isdigit(): | ||||
|                     identifier = parts_msg[1].strip() | ||||
|                     reason = extract_reason(parts_msg[2:]) | ||||
|                      | ||||
|                     # Поиск по ID | ||||
|                     if identifier.isdigit(): | ||||
|  | ||||
|                     # Делаем в int и ищем | ||||
|                     user_info = db.get_user(int(identifier)) | ||||
|                         # Делаем в 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('@'): | ||||
|                         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:]) | ||||
|                         # Убираем @ и ищем | ||||
|                         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 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 | ||||
|              | ||||
|             # Проверяем статус целевого пользователя | ||||
| @@ -117,27 +192,44 @@ def register_handlers(bot: AsyncTeleBot): # Регистрирует все об | ||||
|                 # Проверяем, является ли цель администратором или создателем | ||||
|                 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 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) | ||||
|                 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)}") | ||||
|  | ||||
|                 # Удаляем сообщения через 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)}") | ||||
|             logger.error(f"Общая ошибка в ban_command: {str(e)}") | ||||
|  | ||||
|             # Удаляем сообщения через 5 секунд | ||||
|             await delete_messages(bot, message, 5) | ||||
		Reference in New Issue
	
	Block a user