from telebot.async_telebot import AsyncTeleBot from telebot.types import Message import logging from bad_words import ( get_bad_words, get_exceptions, save_bad_words, reload_words ) from utils import check_admin_status, delete_messages from config import COMMAND_MESSAGES logger = logging.getLogger(__name__) def register_handlers(bot: AsyncTeleBot): """Регистрирует обработчики команд управления бранными словами""" @bot.message_handler(commands=['badwords']) async def badwords_command(message: Message): """Главная команда управления списком бранных слов""" logger.info(f"Команда /badwords получена от пользователя {message.from_user.id}") # Проверяем права администратора (без проверки прав на ограничение участников) admin_check = await check_admin_status(bot, message, check_restrict_rights=False) if admin_check == 1: logger.info(f"Пользователь {message.from_user.id} не является администратором") return logger.info(f"Пользователь {message.from_user.id} прошел проверку прав администратора") parts = message.text.split(maxsplit=2) # /badwords без параметров - показываем help if len(parts) == 1: await show_help(bot, message) return subcommand = parts[1].lower() # Обработка подкоманд if subcommand == 'help': await show_help(bot, message) elif subcommand == 'list': await list_bad_words(bot, message) elif subcommand == 'count': await count_words(bot, message) elif subcommand == 'add': if len(parts) < 3: await send_temp_message(bot, message, "❌ Укажите слово для добавления: /badwords add <слово>") else: await add_bad_word(bot, message, parts[2]) elif subcommand == 'remove': if len(parts) < 3: await send_temp_message(bot, message, "❌ Укажите слово для удаления: /badwords remove <слово>") else: await remove_bad_word(bot, message, parts[2]) elif subcommand == 'exceptions': await list_exceptions(bot, message) elif subcommand == 'add_exception': if len(parts) < 3: await send_temp_message(bot, message, "❌ Укажите слово для добавления в исключения: /badwords add_exception <слово>") else: await add_exception(bot, message, parts[2]) elif subcommand == 'remove_exception': if len(parts) < 3: await send_temp_message(bot, message, "❌ Укажите слово для удаления из исключений: /badwords remove_exception <слово>") else: await remove_exception(bot, message, parts[2]) elif subcommand == 'reload': await reload_wordlist(bot, message) else: await send_temp_message(bot, message, f"❌ Неизвестная команда: {subcommand}\n\nИспользуйте /badwords help") async def show_help(bot: AsyncTeleBot, message: Message): """Показывает справку по командам управления бранными словами""" help_text = COMMAND_MESSAGES['badwords_help'] await bot.send_message( chat_id=message.chat.id, text=help_text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=60, number_message=2) async def list_bad_words(bot: AsyncTeleBot, message: Message): """Показывает список бранных слов (первые 50)""" words = get_bad_words() if not words: text = "📝 Список бранных слов пуст." else: # Показываем только первые 50 слов display_words = words[:50] text = f"📝 Бранные слова (всего: {len(words)})\n\n" text += ", ".join([f"{word}" for word in display_words]) if len(words) > 50: text += f"\n\n...и ещё {len(words) - 50} слов" await bot.send_message( chat_id=message.chat.id, text=text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=30, number_message=2) async def count_words(bot: AsyncTeleBot, message: Message): """Показывает статистику по спискам""" words = get_bad_words() exceptions = get_exceptions() text = ( f"📊 Статистика списков\n\n" f"🚫 Бранных слов: {len(words)}\n" f"✅ Исключений: {len(exceptions)}" ) await bot.send_message( chat_id=message.chat.id, text=text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=15, number_message=2) async def add_bad_word(bot: AsyncTeleBot, message: Message, word: str): """Добавляет слово в список бранных""" word = word.lower().strip() words = get_bad_words() exceptions = get_exceptions() if word in words: await send_temp_message(bot, message, f"⚠️ Слово '{word}' уже есть в списке.") return words.append(word) if save_bad_words(words, exceptions): reload_words() # Перезагружаем кэш await send_temp_message(bot, message, f"✅ Слово '{word}' добавлено в список бранных.") logger.info(f"Администратор {message.from_user.id} добавил бранное слово: {word}") else: await send_temp_message(bot, message, "❌ Ошибка при сохранении файла.") async def remove_bad_word(bot: AsyncTeleBot, message: Message, word: str): """Удаляет слово из списка бранных""" word = word.lower().strip() words = get_bad_words() exceptions = get_exceptions() if word not in words: await send_temp_message(bot, message, f"⚠️ Слово '{word}' не найдено в списке.") return words.remove(word) if save_bad_words(words, exceptions): reload_words() # Перезагружаем кэш await send_temp_message(bot, message, f"✅ Слово '{word}' удалено из списка бранных.") logger.info(f"Администратор {message.from_user.id} удалил бранное слово: {word}") else: await send_temp_message(bot, message, "❌ Ошибка при сохранении файла.") async def list_exceptions(bot: AsyncTeleBot, message: Message): """Показывает список исключений""" exceptions = get_exceptions() if not exceptions: text = "📝 Список исключений пуст." else: text = f"📝 Исключения (всего: {len(exceptions)})\n\n" text += ", ".join([f"{word}" for word in exceptions]) await bot.send_message( chat_id=message.chat.id, text=text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=30, number_message=2) async def add_exception(bot: AsyncTeleBot, message: Message, word: str): """Добавляет слово в список исключений""" word = word.lower().strip() words = get_bad_words() exceptions = get_exceptions() if word in exceptions: await send_temp_message(bot, message, f"⚠️ Слово '{word}' уже есть в исключениях.") return exceptions.append(word) if save_bad_words(words, exceptions): reload_words() # Перезагружаем кэш await send_temp_message(bot, message, f"✅ Слово '{word}' добавлено в исключения.") logger.info(f"Администратор {message.from_user.id} добавил исключение: {word}") else: await send_temp_message(bot, message, "❌ Ошибка при сохранении файла.") async def remove_exception(bot: AsyncTeleBot, message: Message, word: str): """Удаляет слово из списка исключений""" word = word.lower().strip() words = get_bad_words() exceptions = get_exceptions() if word not in exceptions: await send_temp_message(bot, message, f"⚠️ Слово '{word}' не найдено в исключениях.") return exceptions.remove(word) if save_bad_words(words, exceptions): reload_words() # Перезагружаем кэш await send_temp_message(bot, message, f"✅ Слово '{word}' удалено из исключений.") logger.info(f"Администратор {message.from_user.id} удалил исключение: {word}") else: await send_temp_message(bot, message, "❌ Ошибка при сохранении файла.") async def reload_wordlist(bot: AsyncTeleBot, message: Message): """Перезагружает списки слов из файла""" words, exceptions = reload_words() text = ( f"🔄 Списки перезагружены\n\n" f"🚫 Бранных слов: {len(words)}\n" f"✅ Исключений: {len(exceptions)}" ) await send_temp_message(bot, message, text) logger.info(f"Администратор {message.from_user.id} перезагрузил списки слов") async def send_temp_message(bot: AsyncTeleBot, message: Message, text: str, time_sleep: int = 10): """Отправляет временное сообщение, которое удаляется через указанное время""" await bot.send_message( chat_id=message.chat.id, text=text, message_thread_id=message.message_thread_id, ) await delete_messages(bot, message, time_sleep=time_sleep, number_message=2)