diff --git a/bot/handlers/commands/users/start_cmd.py b/bot/handlers/commands/users/start_cmd.py new file mode 100644 index 0000000..a8aa4c1 --- /dev/null +++ b/bot/handlers/commands/users/start_cmd.py @@ -0,0 +1,162 @@ +""" +Обработчик команды /start и /help для администраторов. +Показывает список доступных команд для управления банвордами. +""" +from aiogram import Router, F +from aiogram.filters import Command +from aiogram.types import Message, CallbackQuery +from aiogram.utils.keyboard import InlineKeyboardBuilder + +from bot.filters.admin import IsAdmin +from configs import settings, COMMANDS +from middleware.loggers import logger +from bot.utils import log_action, tg_emoji + +__all__ = ("router",) + +CMD: str = "start" + +router: Router = Router(name="start_cmd_router") + +def kb(text: str = "Создатель⬆️", url: str = "https://t.me/verdise"): + ikb = InlineKeyboardBuilder() + ikb.button(text=text, url=url) + return ikb.as_markup() + +@router.callback_query(F.data.casefold() == CMD) +@router.message(Command(*COMMANDS[CMD], prefix=settings.PREFIX, ignore_case=True), IsAdmin()) +@log_action(action_name="START_COMMAND", log_args=True) +async def start_cmd(update: Message | CallbackQuery) -> None: + """ + Обработчик команды /start и /help. + Показывает справку по командам бота для администраторов. + + Доступно только администраторам (суперадмин или доп. админ из БД). + + Args: + update: Message или CallbackQuery + """ + print(123) + + # Определяем тип update и извлекаем данные + if isinstance(update, CallbackQuery): + message = update.message + user_id = update.from_user.id + is_callback = True + else: + message = update + user_id = update.from_user.id + is_callback = False + + # Проверяем, является ли пользователь суперадмином + is_super_admin = user_id in settings.OWNER_ID + + # Формируем текст помощи + help_text = ( + f'{tg_emoji(4961073056677103064)} PrimoGuard - Бот-модератор\n\n' + '
Автоматическое удаление сообщений с запрещёнными словами.\nПоддержка подстрок, лемм, временных блокировок и режимов модерации.\n\n' + ) + + # === Команды просмотра === + help_text += ( + f'{tg_emoji(4961141003059725568)} Просмотр:\n' + '/list — список всех правил и слов\n' + '/stats — статистика по удалениям\n' + '/id — получение айди пользователя\n' + '/chatid — получение айди чата\n\n' + ) + + # === Постоянные банворды === + help_text += ( + f'{tg_emoji(4961019408240608234)} Добавить банворд (постоянно):\n' + '
/addword слово — подстрока (простой поиск)\n'
+ '/addlemma слово — лемма (все формы слова)\n'
+ '/addpart комбинация — часть (поиск без пробелов)\n\n'
+ )
+
+ # === Временные банворды ===
+ help_text += (
+ f'{tg_emoji(4960719190026618714)} Добавить банворд (временно):\n'
+ '/addtempword слово минуты — временная подстрока\n'
+ '/addtemplemma слово минуты — временная лемма\n'
+ 'Пример: /addtempword спам 60\n\n'
+ )
+
+ # === Исключения (whitelist) ===
+ help_text += (
+ f'{tg_emoji(4963010134172239128)} Исключения (whitelist):\n'
+ '/addexcept текст — добавить исключение\n'
+ '/remexcept текст — удалить исключение\n'
+ 'Исключения не проверяются фильтром\n\n'
+ )
+
+ # === Режимы модерации ===
+ help_text += (
+ f'{tg_emoji(4960987543878239236)} Режим тишины:\n'
+ '/silence минуты — удалять ВСЕ сообщения\n'
+ '/unsilence — отключить режим тишины\n'
+ '/report — отправить репорт\n\n'
+ )
+
+ help_text += (
+ f'{tg_emoji(4960986152308835400)} Режим антиконфликта:\n'
+ '/addconflictword слово — добавить конфликтное слово\n'
+ '/addconflictlemma слово — добавить конфликтную лемму\n'
+ '/stopconflict минуты — активировать режим\n'
+ '/unstopconflict — отключить режим\n\n'
+ )
+
+ # === Удаление ===
+ help_text += (
+ f'{tg_emoji(4961196485447254983)} Удалить:\n'
+ '/remword слово — удалить подстроку\n'
+ '/remlemma слово — удалить лемму\n'
+ '/rempart комбинация — удалить часть\n'
+ '/remtempword слово — удалить временную подстроку\n'
+ '/remtemplemma слово — удалить временную лемму\n'
+ '/remconflictword слово — удалить конфликтное слово\n'
+ '/remconflictlemma слово — удалить конфликтную лемму\n\n'
+ )
+
+ # === Управление админами (только для суперадминов) ===
+ if is_super_admin:
+ help_text += (
+ f'{tg_emoji(4960891456869893259)} Управление админами (только для владельцев):\n'
+ '/addadmin ID — добавить администратора\n'
+ '/remadmin ID — удалить администратора\n'
+ '/redactcomment — изменить комментарий под постом\n'
+ '/listadmins — список всех админов\n\n'
+ )
+
+ # === Типы проверок ===
+ help_text += (
+ f'{tg_emoji(4961021096162755737)} Типы проверок:\n'
+ '• Подстрока — простой поиск в тексте\n'
+ '• Лемма — все формы слова (купить→куплю, купил, купишь...)\n'
+ '• Часть — поиск без пробелов (обходит \"к у п и т ь\")\n'
+ '• Временные — автоматически удаляются через N минут\n'
+ '• Конфликтные — работают только в режиме /stopconflict\n\n'
+ )
+
+ # Отправляем ответ
+ try:
+ if is_callback:
+ await message.edit_text(
+ text=help_text,
+ parse_mode="HTML",
+ reply_markup=kb()
+ )
+ await update.answer()
+ else:
+ await message.answer(
+ text=help_text,
+ parse_mode="HTML",
+ reply_markup=kb()
+ )
+ except Exception as e:
+ logger.error(
+ f"Ошибка отправки help сообщения: {e}",
+ log_type="ERROR"
+ )
+ if is_callback:
+ await update.answer(f'{tg_emoji(4963277744994518278)} Ошибка отображения справки', show_alert=True)