Files
LGBot/src/modules/badwords_manager.py
2025-10-18 13:21:47 +03:00

237 lines
10 KiB
Python

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"📝 <b>Бранные слова</b> (всего: {len(words)})\n\n"
text += ", ".join([f"<code>{word}</code>" for word in display_words])
if len(words) > 50:
text += f"\n\n<i>...и ещё {len(words) - 50} слов</i>"
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"📊 <b>Статистика списков</b>\n\n"
f"🚫 Бранных слов: <b>{len(words)}</b>\n"
f"✅ Исключений: <b>{len(exceptions)}</b>"
)
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"⚠️ Слово '<code>{word}</code>' уже есть в списке.")
return
words.append(word)
if save_bad_words(words, exceptions):
reload_words() # Перезагружаем кэш
await send_temp_message(bot, message, f"✅ Слово '<code>{word}</code>' добавлено в список бранных.")
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"⚠️ Слово '<code>{word}</code>' не найдено в списке.")
return
words.remove(word)
if save_bad_words(words, exceptions):
reload_words() # Перезагружаем кэш
await send_temp_message(bot, message, f"✅ Слово '<code>{word}</code>' удалено из списка бранных.")
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"📝 <b>Исключения</b> (всего: {len(exceptions)})\n\n"
text += ", ".join([f"<code>{word}</code>" 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"⚠️ Слово '<code>{word}</code>' уже есть в исключениях.")
return
exceptions.append(word)
if save_bad_words(words, exceptions):
reload_words() # Перезагружаем кэш
await send_temp_message(bot, message, f"✅ Слово '<code>{word}</code>' добавлено в исключения.")
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"⚠️ Слово '<code>{word}</code>' не найдено в исключениях.")
return
exceptions.remove(word)
if save_bad_words(words, exceptions):
reload_words() # Перезагружаем кэш
await send_temp_message(bot, message, f"✅ Слово '<code>{word}</code>' удалено из исключений.")
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"🔄 <b>Списки перезагружены</b>\n\n"
f"🚫 Бранных слов: <b>{len(words)}</b>\n"
f"✅ Исключений: <b>{len(exceptions)}</b>"
)
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)