96 lines
4.9 KiB
Python
96 lines
4.9 KiB
Python
"""
|
||
Конфигурация FSM-потоков:
|
||
- PAYLOADS — все callback payload строки (статические и шаблонные)
|
||
- TRANSITIONS — таблица переходов между состояниями
|
||
|
||
Использование переходов в handlers:
|
||
await context.set_state(TRANSITIONS["ticket:start"])
|
||
|
||
Использование payload в keyboards:
|
||
payload=PAYLOADS.CREATE_TICKET
|
||
payload=PAYLOADS.ITICKET_DETAIL.format(id=task_id)
|
||
|
||
Использование префиксов в фильтрах:
|
||
PayloadStartsWith(PAYLOADS.PFX_ITICKET_DETAIL)
|
||
"""
|
||
from bot.states import AuthStates, CommentStates, TicketStates
|
||
|
||
|
||
class PAYLOADS:
|
||
"""Callback payload строки для кнопок и фильтров."""
|
||
|
||
# Статические payload
|
||
CREATE_TICKET = "create_ticket"
|
||
VIEW_TICKETS = "view_tickets"
|
||
DONE_TICKET = "done_ticket"
|
||
CONFIRM_TICKET = "confirm_ticket"
|
||
EDIT_TICKET = "edit_ticket"
|
||
CANCEL_TICKET = "cancel_ticket"
|
||
MAIN_MENU = "main_menu"
|
||
|
||
# Динамические payload — форматировать через .format(...)
|
||
TICKET_DETAIL = "ticket_detail:{id}"
|
||
TICKETS_PAGE = "tickets_page:{page}"
|
||
ITICKET_DETAIL = "iticket_detail:{id}"
|
||
ITICKETS_PAGE = "itickets_page:{page}"
|
||
ITICKET_COMMENT = "iticket_comment:{task_id}"
|
||
ITICKET_CLOSE = "iticket_close:{task_id}"
|
||
|
||
# Quick reply
|
||
CONFIRM_REPLY = "confirm_reply:{task_id}"
|
||
CANCEL_REPLY = "cancel_reply"
|
||
|
||
# Префиксы для PayloadStartsWith(...)
|
||
PFX_TICKET_DETAIL = "ticket_detail:"
|
||
PFX_TICKETS_PAGE = "tickets_page:"
|
||
PFX_ITICKET_DETAIL = "iticket_detail:"
|
||
PFX_ITICKETS_PAGE = "itickets_page:"
|
||
PFX_ITICKET_COMMENT = "iticket_comment:"
|
||
PFX_ITICKET_CLOSE = "iticket_close:"
|
||
PFX_CONFIRM_REPLY = "confirm_reply:"
|
||
|
||
|
||
TRANSITIONS: dict[str, object] = {
|
||
# ── Auth ──────────────────────────────────────────────────────────────────
|
||
# Новый / не авторизованный пользователь — запрашиваем контакт
|
||
"auth:new_user": AuthStates.waiting_contact,
|
||
# Авторизованный пользователь — сбросить в None (главное меню)
|
||
"auth:authorized": None,
|
||
# Заблокированный пользователь — сбросить в None
|
||
"auth:blocked": None,
|
||
# Контакт найден в белом списке → авторизован → главное меню
|
||
"auth:contact_found": None,
|
||
|
||
# ── Ticket creation ───────────────────────────────────────────────────────
|
||
# Нажали «Создать заявку»
|
||
"ticket:start": TicketStates.waiting_description,
|
||
# Получили первое сообщение с текстом описания
|
||
"ticket:description_ok": TicketStates.collecting_attachments,
|
||
# Нажали «Перейти к предпросмотру»
|
||
"ticket:preview": TicketStates.confirming,
|
||
# Подтвердили создание заявки
|
||
"ticket:confirm": None,
|
||
# Нажали «Продолжить редактирование»
|
||
"ticket:edit": TicketStates.collecting_attachments,
|
||
# Отменили создание заявки
|
||
"ticket:cancel": None,
|
||
|
||
# ── Comment ───────────────────────────────────────────────────────────────
|
||
# Нажали «Оставить комментарий»
|
||
"comment:start": CommentStates.waiting_text,
|
||
# Комментарий отправлен (или отменён через «Назад»)
|
||
"comment:done": None,
|
||
|
||
# ── Quick reply ───────────────────────────────────────────────────────────
|
||
# Свободное сообщение перехвачено — ждём подтверждения от пользователя
|
||
"reply:pending": TicketStates.pending_confirm,
|
||
# Подтверждено / отменено — возврат в idle
|
||
"reply:done": None,
|
||
"reply:cancel": None,
|
||
|
||
# ── Navigation / global ───────────────────────────────────────────────────
|
||
# Перейти в главное меню
|
||
"nav:menu": None,
|
||
# Отменить текущее действие (/cancel)
|
||
"nav:cancel": None,
|
||
}
|