zov-tech/bot/handlers/start.py
wasrusgen c41c938a67 rebrand: ZOV → @wasrusgen1 · сборщик (твой бренд)
Брендирование как ЛИЧНЫЙ CRM Руслана Васильева (не ЗОВ).

Splash:
- Убрана inline-SVG ZOV-лого
- Добавлена иконка пилы (assets/wasrusgen-saw.png, оранжевая,
  дыхательная анимация)
- Wordmark «@WASRUSGEN1» — Inter Black 28pt, серый #4A4A4A,
  «1» в оранжевом
- Подпись «сборщик» — Caveat 32pt оранж, поворот -3° (как в твоём лого)
- Полоса прогресса теперь оранжевая

Title окна: «WASRUSGEN1 · Кабинет»
Theme-color: #F08720 (для статусной строки Telegram WebApp)

Bot:
- Menu-кнопка слева от ввода: «Кабинет» (вместо «ЗОВ»)
- Welcome /start: «@wasrusgen1 · сборщик — Рабочий кабинет Руслана Васильева»

Footer клиента: «@wasrusgen1 · сборщик» + «Кабинет от Руслана Васильева»
Meta клиента без менеджера: «@wasrusgen1 · сборщик» (вместо «ЗОВ — кухонная мебель»)

ZOV-упоминания НЕ убраны там, где это про реальный контекст
(подбор техники для кухонь ЗОВ, AI-промпт, аудитория-менеджеры ЗОВ
в роли «Сотрудник»).

Cache bust v=20260513zd.
2026-05-13 21:38:45 +03:00

105 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import time
from aiogram import Router
from aiogram.filters import Command, CommandStart
from aiogram.types import (
InlineKeyboardButton,
InlineKeyboardMarkup,
Message,
ReplyKeyboardRemove,
WebAppInfo,
)
from config import Config
router = Router(name="start")
# ============================================================
# URL helpers
# ============================================================
def _bust_cache(url: str) -> str:
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)))
# ============================================================
# Inline keyboard — единственный способ открыть MiniApp.
# Reply-кнопки с web_app не передают initData ни на Desktop side-panel,
# ни на мобильных. Inline-buttons открывают MiniApp в modal-режиме,
# где initData валидно передаётся на обеих платформах.
# ============================================================
def role_choice_inline(miniapp_url: str) -> InlineKeyboardMarkup:
return InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(text="👤 Я менеджер", web_app=_wapp(miniapp_url, "manager")),
InlineKeyboardButton(text="🏠 Я клиент", web_app=_wapp(miniapp_url, "client")),
],
[
InlineKeyboardButton(text="🔧 Я сотрудник", web_app=_wapp(miniapp_url, "staff")),
],
]
)
# ============================================================
# Commands
# ============================================================
@router.message(CommandStart())
async def cmd_start(message: Message, config: Config) -> None:
await message.answer(
"👋 <b>@wasrusgen1 · сборщик</b>\n"
"Рабочий кабинет Руслана Васильева.\n\n"
"Выберите, кто вы — кабинет откроется одним тапом.\n\n"
"<i>«Сотрудник» — для замерщиков и сборщиков.</i>",
reply_markup=role_choice_inline(config.miniapp_url),
)
@router.message(Command("menu"))
async def cmd_menu(message: Message, config: Config) -> None:
await message.answer(
"Выберите роль:",
reply_markup=role_choice_inline(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"<b>Ваш Telegram ID:</b> <code>{user.id}</code>\n"
f"Username: @{user.username or ''}\n"
f"Имя: {user.first_name or ''} {user.last_name or ''}".strip()
+ "\n\n"
"<i>Перешлите это сообщение куратору @wasrusgen чтобы вам выдали роль замерщика/сборщика.</i>"
)