forked from Muzifs/LGBot
Добавление автомута
This commit is contained in:
231
src/modules/badwords_manager.py
Normal file
231
src/modules/badwords_manager.py
Normal file
@@ -0,0 +1,231 @@
|
||||
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):
|
||||
"""Главная команда управления списком бранных слов"""
|
||||
|
||||
# Проверяем права администратора
|
||||
if await check_admin_status(bot, message) == 1:
|
||||
return
|
||||
|
||||
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)
|
Reference in New Issue
Block a user