feat(start): add persistent reply keyboard with main commands; add /menu to show it\nchore(bot): register BotCommand list for Telegram menu

This commit is contained in:
2025-12-04 17:15:49 +03:00
parent f8a5294ca8
commit ff17dc543a
2 changed files with 58 additions and 3 deletions

View File

@@ -1,6 +1,13 @@
from aiogram import Router, F from aiogram import Router, F
from aiogram.filters import CommandStart, Command from aiogram.filters import CommandStart, Command
from aiogram.types import Message, InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery from aiogram.types import (
Message,
InlineKeyboardMarkup,
InlineKeyboardButton,
CallbackQuery,
ReplyKeyboardMarkup,
KeyboardButton,
)
from aiogram.fsm.context import FSMContext from aiogram.fsm.context import FSMContext
from database.db import async_session_maker from database.db import async_session_maker
@@ -43,7 +50,8 @@ async def cmd_start(message: Message, state: FSMContext):
f"• /stats - статистика\n" f"• /stats - статистика\n"
f"• /settings - настройки\n" f"• /settings - настройки\n"
f"• /reminder - напоминания\n" f"• /reminder - напоминания\n"
f"• /help - полная справка" f"• /help - полная справка",
reply_markup=main_menu_keyboard(),
) )
# Предлагаем пройти тест уровня # Предлагаем пройти тест уровня
@@ -70,10 +78,17 @@ async def cmd_start(message: Message, state: FSMContext):
f"• /practice - практика диалога\n" f"• /practice - практика диалога\n"
f"• /words [тема] - тематическая подборка\n" f"• /words [тема] - тематическая подборка\n"
f"• /stats - статистика\n" f"• /stats - статистика\n"
f"• /help - все команды" f"• /help - все команды",
reply_markup=main_menu_keyboard(),
) )
@router.message(Command("menu"))
async def cmd_menu(message: Message):
"""Показать клавиатуру с основными командами."""
await message.answer("Главное меню доступно ниже ⤵️", reply_markup=main_menu_keyboard())
@router.message(Command("help")) @router.message(Command("help"))
async def cmd_help(message: Message): async def cmd_help(message: Message):
"""Обработчик команды /help""" """Обработчик команды /help"""
@@ -111,6 +126,30 @@ async def skip_level_test_callback(callback: CallbackQuery):
"""Пропустить тест уровня""" """Пропустить тест уровня"""
await callback.message.edit_text( await callback.message.edit_text(
"✅ Хорошо!\n\n" "✅ Хорошо!\n\n"
def main_menu_keyboard() -> ReplyKeyboardMarkup:
"""Клавиатура с основными командами (кнопки отправляют команды)."""
return ReplyKeyboardMarkup(
resize_keyboard=True,
keyboard=[
[
KeyboardButton(text="/add"),
KeyboardButton(text="/vocabulary"),
],
[
KeyboardButton(text="/task"),
KeyboardButton(text="/practice"),
],
[
KeyboardButton(text="/words travel"),
KeyboardButton(text="/import"),
],
[
KeyboardButton(text="/stats"),
KeyboardButton(text="/settings"),
],
],
)
"Ты можешь пройти тест позже командой /level_test\n" "Ты можешь пройти тест позже командой /level_test\n"
"или установить уровень вручную в /settings\n\n" "или установить уровень вручную в /settings\n\n"
"Давай начнём! Попробуй:\n" "Давай начнём! Попробуй:\n"

16
main.py
View File

@@ -4,6 +4,7 @@ import logging
from aiogram import Bot, Dispatcher from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode from aiogram.enums import ParseMode
from aiogram.types import BotCommand
from config.settings import settings from config.settings import settings
from bot.handlers import start, vocabulary, tasks, settings as settings_handler, words, import_text, practice, reminder, level_test from bot.handlers import start, vocabulary, tasks, settings as settings_handler, words, import_text, practice, reminder, level_test
@@ -26,6 +27,21 @@ async def main():
) )
dp = Dispatcher() dp = Dispatcher()
# Команды бота для меню Telegram
await bot.set_my_commands([
BotCommand(command="start", description="Запустить бота"),
BotCommand(command="add", description="Добавить слово"),
BotCommand(command="words", description="Тематическая подборка слов"),
BotCommand(command="import", description="Импорт слов из текста"),
BotCommand(command="vocabulary", description="Мой словарь"),
BotCommand(command="task", description="Задания"),
BotCommand(command="practice", description="Диалог с AI"),
BotCommand(command="stats", description="Статистика"),
BotCommand(command="settings", description="Настройки"),
BotCommand(command="reminder", description="Напоминания"),
BotCommand(command="help", description="Справка"),
])
# Регистрация роутеров # Регистрация роутеров
dp.include_router(start.router) dp.include_router(start.router)
dp.include_router(level_test.router) dp.include_router(level_test.router)