diff --git a/bot/handlers/start.py b/bot/handlers/start.py index f0fa88b..5e00e22 100644 --- a/bot/handlers/start.py +++ b/bot/handlers/start.py @@ -1,13 +1,11 @@ import time -from aiogram import F, Router +from aiogram import Router from aiogram.filters import Command, CommandStart from aiogram.types import ( InlineKeyboardButton, InlineKeyboardMarkup, - KeyboardButton, Message, - ReplyKeyboardMarkup, ReplyKeyboardRemove, WebAppInfo, ) @@ -22,7 +20,6 @@ router = Router(name="start") # ============================================================ def _bust_cache(url: str) -> str: - """Append unique timestamp so Telegram WebView не кеширует между сессиями.""" sep = "&" if "?" in url else "?" return f"{url}{sep}t={int(time.time())}" @@ -38,9 +35,10 @@ def _wapp(miniapp_url: str, role: str) -> WebAppInfo: # ============================================================ -# Inline keyboard — выбор роли прямо в сообщении /start. -# На Telegram Desktop side-panel reply-keyboard НЕ передаёт initData. -# Inline-кнопки открываются в МОДАЛЬНОМ режиме где initData валидно. +# Inline keyboard — единственный способ открыть MiniApp. +# Reply-кнопки с web_app не передают initData ни на Desktop side-panel, +# ни на мобильных. Inline-buttons открывают MiniApp в modal-режиме, +# где initData валидно передаётся на обеих платформах. # ============================================================ def role_choice_inline(miniapp_url: str) -> InlineKeyboardMarkup: @@ -57,41 +55,15 @@ def role_choice_inline(miniapp_url: str) -> InlineKeyboardMarkup: ) -# ============================================================ -# Reply keyboard — постоянная панель снизу (для мобильных). -# ============================================================ - -def role_choice_kb(miniapp_url: str) -> ReplyKeyboardMarkup: - return ReplyKeyboardMarkup( - keyboard=[ - [ - KeyboardButton(text="👤 Я менеджер", web_app=_wapp(miniapp_url, "manager")), - KeyboardButton(text="🏠 Я клиент", web_app=_wapp(miniapp_url, "client")), - ], - [ - KeyboardButton(text="🔧 Я сотрудник", web_app=_wapp(miniapp_url, "staff")), - ], - ], - resize_keyboard=True, - is_persistent=True, - input_field_placeholder="Выберите кто вы…", - ) - - # ============================================================ # Commands # ============================================================ @router.message(CommandStart()) async def cmd_start(message: Message, config: Config) -> None: - # Сначала отправляем reply-keyboard (постоянная панель снизу для мобильных) - await message.answer( - "👋 Здравствуйте, я бот-помощник от Руслана ВАСИЛЬЕВА.", - reply_markup=role_choice_kb(config.miniapp_url), - ) - # Затем inline-keyboard внутри отдельного сообщения — кнопки тут открывают MiniApp - # в МОДАЛЬНОМ режиме (важно для Telegram Desktop) + # Сразу убираем нижнюю reply-клавиатуру если она от предыдущих версий висит await message.answer( + "👋 Здравствуйте, я бот-помощник от Руслана ВАСИЛЬЕВА.\n\n" "Выберите, кто вы — кабинет откроется одним тапом.\n\n" "«Сотрудник» — для замерщиков и сборщиков ЗОВ.", reply_markup=role_choice_inline(config.miniapp_url), @@ -104,15 +76,14 @@ async def cmd_menu(message: Message, config: Config) -> None: "Выберите роль:", reply_markup=role_choice_inline(config.miniapp_url), ) - await message.answer( - "Или используйте панель снизу.", - reply_markup=role_choice_kb(config.miniapp_url), - ) @router.message(Command("hide")) async def cmd_hide(message: Message) -> None: - await message.answer("Клавиатура скрыта. Вернуть — /menu", reply_markup=ReplyKeyboardRemove()) + await message.answer( + "Нижняя клавиатура убрана. Для выбора роли — /menu", + reply_markup=ReplyKeyboardRemove(), + ) # ============================================================