165 lines
8.2 KiB
Python
165 lines
8.2 KiB
Python
"""
|
||
Обработчик команды /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")} <b>PrimoGuard - Бот-модератор</b>\n\n'
|
||
'<blockquote>Автоматическое удаление сообщений с запрещёнными словами.\nПоддержка слов, лемм, временных блокировок и режимов модерации.</blockquote>\n\n'
|
||
)
|
||
|
||
# === Команды просмотра ===
|
||
help_text += (
|
||
f'{tg_emoji("4961141003059725568")} <b>Просмотр:</b>\n'
|
||
'<b>/list</b> — список всех правил и слов\n'
|
||
'<b>/stats</b> — статистика по удалениям\n'
|
||
'<b>/id</b> — получение айди пользователя\n'
|
||
'<b>/chatid</b> — получение айди чата\n\n'
|
||
)
|
||
|
||
# === Постоянные банворды ===
|
||
help_text += (
|
||
f'{tg_emoji("4961019408240608234")} <b>Добавить банворд (постоянно):</b>\n'
|
||
'<code>/word</code> <code>слово</code> — слова (простой поиск)\n'
|
||
'<code>/lemma</code> <code>слово</code> — лемма (все формы слова)\n'
|
||
'<code>/part</code> <code>комбинация</code> — часть (поиск без пробелов)\n\n'
|
||
)
|
||
|
||
# === Временные банворды ===
|
||
help_text += (
|
||
f'{tg_emoji("4960719190026618714")} <b>Добавить банворд (временно):</b>\n'
|
||
'<code>/tempword</code> <code>слово минуты</code> — временная слова\n'
|
||
'<code>/templemma</code> <code>слово минуты</code> — временная лемма\n'
|
||
'<i>Пример: /tempword спам 60</i>\n\n'
|
||
)
|
||
|
||
# === Исключения (whitelist) ===
|
||
help_text += (
|
||
f'{tg_emoji("4963010134172239128")} <b>Исключения (whitelist):</b>\n'
|
||
'<code>/addexcept</code> <code>текст</code> — добавить исключение\n'
|
||
'<code>/remexcept</code> <code>текст</code> — удалить исключение\n'
|
||
'<i>Исключения не проверяются фильтром</i>\n\n'
|
||
)
|
||
|
||
# === Режимы модерации ===
|
||
help_text += (
|
||
f'{tg_emoji("4960987543878239236")} <b>Режим тишины:</b>\n'
|
||
'<code>/silence</code> <code>минуты</code> — удалять ВСЕ сообщения\n'
|
||
'<b>/unsilence</b> — отключить режим тишины\n'
|
||
'<code>/report</code> — отправить репорт\n\n'
|
||
)
|
||
|
||
help_text += (
|
||
f'{tg_emoji("4960986152308835400")} <b>Режим антиконфликта:</b>\n'
|
||
'<code>/addconflictword</code> <code>слово</code> — добавить конфликтное слово\n'
|
||
'<code>/addconflictlemma</code> <code>слово</code> — добавить конфликтную лемму\n'
|
||
'<code>/addconflictpart</code> <code>слово</code> — добавить конфликтную часть\n'
|
||
'<code>/stopconflict</code> <code>минуты</code> — активировать режим\n'
|
||
'<code>/unstopconflict</code> — отключить режим\n\n'
|
||
)
|
||
|
||
# === Удаление ===
|
||
help_text += (
|
||
f'{tg_emoji("4961196485447254983")} <b>Удалить:</b>\n'
|
||
'<code>/remword</code> <code>слово</code> — удалить слову\n'
|
||
'<code>/remlemma</code> <code>слово</code> — удалить лемму\n'
|
||
'<code>/rempart</code> <code>комбинация</code> — удалить часть\n'
|
||
'<code>/remtempword</code> <code>слово</code> — удалить временную слову\n'
|
||
'<code>/remtemplemma</code> <code>слово</code> — удалить временную лемму\n'
|
||
'<code>/remconflictword</code> <code>слово</code> — удалить конфликтное слово\n'
|
||
'<code>/remconflictpart</code> <code>слово</code> — удалить конфликтное часть\n'
|
||
'<code>/remconflictlemma</code> <code>слово</code> — удалить конфликтную лемму\n\n'
|
||
)
|
||
|
||
# === Управление админами (только для суперадминов) ===
|
||
if is_super_admin:
|
||
help_text += (
|
||
f'{tg_emoji("4960891456869893259")} <b>Управление админами (только для владельцев):</b>\n'
|
||
'<code>/addadmin</code> <i>ID</i> — добавить администратора\n'
|
||
'<code>/remadmin</code> <i>ID</i> — удалить администратора\n'
|
||
'<b>/redactcomment</b> — изменить комментарий под постом\n'
|
||
'<b>/listadmins</b> — список всех админов\n\n'
|
||
)
|
||
|
||
# === Типы проверок ===
|
||
help_text += (
|
||
f'{tg_emoji("4961021096162755737")} <b>Типы проверок:</b>\n'
|
||
'• <b>Слово</b> — простой поиск в тексте\n'
|
||
'• <b>Лемма</b> — все формы слова (купить→куплю, купил, купишь...)\n'
|
||
'• <b>Часть</b> — поиск без пробелов (обходит \"к у п и т ь\")\n'
|
||
'• <b>Временные</b> — автоматически удаляются через N минут\n'
|
||
'• <b>Конфликтные</b> — работают только в режиме /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)
|