intra_max_chatbot/bot/flow_config.py
2026-04-03 00:30:24 +03:00

96 lines
4.9 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.

"""
Конфигурация 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,
}