mirror of
https://github.com/wasrusgen/zov-tech.git
synced 2026-06-03 18:04:47 +00:00
bot: убрать reply-keyboard, оставить только inline buttons
Reply-keyboard web_app кнопки на мобиле тоже не передают initData (или с issues). Оставляем только inline-кнопки в самом сообщении — они работают на Telegram Desktop side-panel + на мобильных. /start теперь шлёт ОДНО сообщение с inline-keyboard внутри. /menu — пере-открыть выбор роли. /hide — убрать reply-keyboard (если осталась от предыдущих версий).
This commit is contained in:
parent
a437b55447
commit
d6fbc3df13
@ -1,13 +1,11 @@
|
|||||||
import time
|
import time
|
||||||
|
|
||||||
from aiogram import F, Router
|
from aiogram import Router
|
||||||
from aiogram.filters import Command, CommandStart
|
from aiogram.filters import Command, CommandStart
|
||||||
from aiogram.types import (
|
from aiogram.types import (
|
||||||
InlineKeyboardButton,
|
InlineKeyboardButton,
|
||||||
InlineKeyboardMarkup,
|
InlineKeyboardMarkup,
|
||||||
KeyboardButton,
|
|
||||||
Message,
|
Message,
|
||||||
ReplyKeyboardMarkup,
|
|
||||||
ReplyKeyboardRemove,
|
ReplyKeyboardRemove,
|
||||||
WebAppInfo,
|
WebAppInfo,
|
||||||
)
|
)
|
||||||
@ -22,7 +20,6 @@ router = Router(name="start")
|
|||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
def _bust_cache(url: str) -> str:
|
def _bust_cache(url: str) -> str:
|
||||||
"""Append unique timestamp so Telegram WebView не кеширует между сессиями."""
|
|
||||||
sep = "&" if "?" in url else "?"
|
sep = "&" if "?" in url else "?"
|
||||||
return f"{url}{sep}t={int(time.time())}"
|
return f"{url}{sep}t={int(time.time())}"
|
||||||
|
|
||||||
@ -38,9 +35,10 @@ def _wapp(miniapp_url: str, role: str) -> WebAppInfo:
|
|||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
# Inline keyboard — выбор роли прямо в сообщении /start.
|
# Inline keyboard — единственный способ открыть MiniApp.
|
||||||
# На Telegram Desktop side-panel reply-keyboard НЕ передаёт initData.
|
# Reply-кнопки с web_app не передают initData ни на Desktop side-panel,
|
||||||
# Inline-кнопки открываются в МОДАЛЬНОМ режиме где initData валидно.
|
# ни на мобильных. Inline-buttons открывают MiniApp в modal-режиме,
|
||||||
|
# где initData валидно передаётся на обеих платформах.
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
def role_choice_inline(miniapp_url: str) -> InlineKeyboardMarkup:
|
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
|
# Commands
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|
||||||
@router.message(CommandStart())
|
@router.message(CommandStart())
|
||||||
async def cmd_start(message: Message, config: Config) -> None:
|
async def cmd_start(message: Message, config: Config) -> None:
|
||||||
# Сначала отправляем reply-keyboard (постоянная панель снизу для мобильных)
|
# Сразу убираем нижнюю reply-клавиатуру если она от предыдущих версий висит
|
||||||
await message.answer(
|
|
||||||
"👋 Здравствуйте, я бот-помощник от Руслана ВАСИЛЬЕВА.",
|
|
||||||
reply_markup=role_choice_kb(config.miniapp_url),
|
|
||||||
)
|
|
||||||
# Затем inline-keyboard внутри отдельного сообщения — кнопки тут открывают MiniApp
|
|
||||||
# в МОДАЛЬНОМ режиме (важно для Telegram Desktop)
|
|
||||||
await message.answer(
|
await message.answer(
|
||||||
|
"👋 Здравствуйте, я бот-помощник от Руслана ВАСИЛЬЕВА.\n\n"
|
||||||
"Выберите, кто вы — кабинет откроется одним тапом.\n\n"
|
"Выберите, кто вы — кабинет откроется одним тапом.\n\n"
|
||||||
"<i>«Сотрудник» — для замерщиков и сборщиков ЗОВ.</i>",
|
"<i>«Сотрудник» — для замерщиков и сборщиков ЗОВ.</i>",
|
||||||
reply_markup=role_choice_inline(config.miniapp_url),
|
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),
|
reply_markup=role_choice_inline(config.miniapp_url),
|
||||||
)
|
)
|
||||||
await message.answer(
|
|
||||||
"Или используйте панель снизу.",
|
|
||||||
reply_markup=role_choice_kb(config.miniapp_url),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@router.message(Command("hide"))
|
@router.message(Command("hide"))
|
||||||
async def cmd_hide(message: Message) -> None:
|
async def cmd_hide(message: Message) -> None:
|
||||||
await message.answer("Клавиатура скрыта. Вернуть — /menu", reply_markup=ReplyKeyboardRemove())
|
await message.answer(
|
||||||
|
"Нижняя клавиатура убрана. Для выбора роли — /menu",
|
||||||
|
reply_markup=ReplyKeyboardRemove(),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
# ============================================================
|
# ============================================================
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user