From 36e721fd3d0e6d7e9a80501f8f95bb1618f13b76 Mon Sep 17 00:00:00 2001 From: Verum Date: Mon, 23 Feb 2026 14:37:05 +0700 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D1=87=D0=B8=D0=BA=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B?= =?UTF-8?q?=20/start?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot/handlers/commands/users/start_cmd.py | 162 +++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 bot/handlers/commands/users/start_cmd.py 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)