forked from Muzifs/LGBot
237 lines
10 KiB
Python
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) |