import time
from aiogram import F, Router
from aiogram.filters import Command, CommandStart
from aiogram.types import (
KeyboardButton,
Message,
ReplyKeyboardMarkup,
ReplyKeyboardRemove,
WebAppInfo,
)
from config import Config
router = Router(name="start")
# ============================================================
# URL helpers
# ============================================================
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())}"
def _with_query(url: str, **params: str) -> str:
sep = "&" if "?" in url else "?"
pairs = "&".join(f"{k}={v}" for k, v in params.items() if v)
return f"{url}{sep}{pairs}" if pairs else url
def _wapp(miniapp_url: str, role: str) -> WebAppInfo:
return WebAppInfo(url=_bust_cache(_with_query(miniapp_url, role=role)))
# ============================================================
# Reply keyboard — выбор роли. Три кнопки, все WebApp.
# ============================================================
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:
await message.answer(
"👋 Здравствуйте, я бот-помощник от Руслана ВАСИЛЬЕВА.\n\n"
"Выберите, кто вы — кабинет откроется одним тапом.\n\n"
"«Сотрудник» — для замерщиков и сборщиков ЗОВ. Если вы менеджер или клиент — выбирайте свою роль.",
reply_markup=role_choice_kb(config.miniapp_url),
)
@router.message(Command("menu"))
async def cmd_menu(message: Message, config: Config) -> None:
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())
# ============================================================
# /whoami — сотрудник присылает свой ID куратору, чтобы тот выдал роль
# ============================================================
@router.message(Command("whoami"))
async def cmd_whoami(message: Message) -> None:
user = message.from_user
if not user:
return
await message.answer(
f"Ваш Telegram ID: {user.id}\n"
f"Username: @{user.username or '—'}\n"
f"Имя: {user.first_name or ''} {user.last_name or ''}".strip()
+ "\n\n"
"Перешлите это сообщение куратору @wasrusgen чтобы вам выдали роль замерщика/сборщика."
)