"""
Обработчик команды /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.decorators import log_action
__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 = (
"🤖 PrimoGuard - Бот-модератор\n\n"
"Автоматическое удаление сообщений с запрещёнными словами.\n"
"Поддержка подстрок, лемм, временных блокировок и режимов модерации.\n\n"
)
# === Команды просмотра ===
help_text += (
"📋 Просмотр:\n"
"/list — список всех правил и слов\n"
"/stats — статистика по удалениям\n"
"/id — получение айди пользователя\n"
"/chatid — получение айди чата\n\n"
)
# === Постоянные банворды ===
help_text += (
"➕ Добавить банворд (постоянно):\n"
"/addword слово — подстрока (простой поиск)\n"
"/addlemma слово — лемма (все формы слова)\n"
"/addpart комбинация — часть (поиск без пробелов)\n\n"
)
# === Временные банворды ===
help_text += (
"⏱ Добавить банворд (временно):\n"
"/addtempword слово минуты — временная подстрока\n"
"/addtemplemma слово минуты — временная лемма\n"
"Пример: /addtempword спам 60\n\n"
)
# === Исключения (whitelist) ===
help_text += (
"✅ Исключения (whitelist):\n"
"/addexcept текст — добавить исключение\n"
"/remexcept текст — удалить исключение\n"
"Исключения не проверяются фильтром\n\n"
)
# === Режимы модерации ===
help_text += (
"🔇 Режим тишины:\n"
"/silence минуты — удалять ВСЕ сообщения\n"
"/unsilence — отключить режим тишины\n"
"/report — отправить репорт\n\n"
)
help_text += (
"⚔️ Режим антиконфликта:\n"
"/addconflictword слово — добавить конфликтное слово\n"
"/addconflictlemma слово — добавить конфликтную лемму\n"
"/stopconflict минуты — активировать режим\n"
"/unstopconflict — отключить режим\n\n"
)
# === Удаление ===
help_text += (
"➖ Удалить:\n"
"/remword слово — удалить подстроку\n"
"/remlemma слово — удалить лемму\n"
"/rempart комбинация — удалить часть\n"
"/remtempword слово — удалить временную подстроку\n"
"/remtemplemma слово — удалить временную лемму\n"
"/remconflictword слово — удалить конфликтное слово\n"
"/remconflictlemma слово — удалить конфликтную лемму\n\n"
)
# === Управление админами (только для суперадминов) ===
if is_super_admin:
help_text += (
"👑 Управление админами (только для владельцев):\n"
"/addadmin ID — добавить администратора\n"
"/remadmin ID — удалить администратора\n"
"/listadmins — список всех админов\n\n"
)
# === Типы проверок ===
help_text += (
"ℹ️ Типы проверок:\n"
"• Подстрока — простой поиск в тексте\n"
"• Лемма — все формы слова (купить→куплю, купил, купишь...)\n"
"• Часть — поиск без пробелов (обходит \"к у п и т ь\")\n"
"• Временные — автоматически удаляются через N минут\n"
"• Конфликтные — работают только в режиме /stopconflict\n\n"
)
help_text += (
"🔧 Технологии:\n"
"• Unicode-нормализация (латиница→кириллица)\n"
"• Обход через разделители (\"с п а м\" → \"спам\")\n"
"• Морфологический анализ (pymorphy3)\n"
"• SQLAlchemy + SQLite с кэшированием\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("❌ Ошибка отображения справки", show_alert=True)