Files
Birthday-Pool-Bot/birthday_pool_bot/telegram_bot/ui/dispatcher.py

340 lines
12 KiB
Python

import aiogram
from aiogram.filters import Command
from birthday_pool_bot.repositories import RepositoriesContainer
from . import constants, handlers
from .callback_data import (
ConfirmAnswerEnum,
MenuCallbackData,
NewSubscriptionCallbackData,
NewSubscriptionConfirmCallbackData,
PoolActionEnum,
PoolCallbackData,
PoolsBackCallbackData,
PoolsCallbackData,
SubscriptionActionEnum,
SubscriptionCallbackData,
SubscriptionsCallbackData,
)
from .middlewares import (
AuthMiddleware,
DependsMiddleware,
# TypingMiddleware,
)
from .states import (
MenuState,
NewSubscriptionPoolState,
NewSubscriptionState,
SetProfileBirthdayState,
SetProfileGiftPaymentDataState,
SetProfileNameState,
SetProfilePhoneState,
)
def setup_dispatcher(
dispatcher: aiogram.Dispatcher,
repositories_container: RepositoriesContainer,
):
# typing_middleware = TypingMiddleware()
auth_middleware = AuthMiddleware(users_repository=repositories_container.users)
users_repository_middleware = DependsMiddleware(
name="users_repository",
object_=repositories_container.users,
)
pools_repository_middleware = DependsMiddleware(
name="pools_repository",
object_=repositories_container.pools,
)
subscriptions_repository_middleware = DependsMiddleware(
name="subscriptions_repository",
object_=repositories_container.subscriptions,
)
middlewares = [
# typing_middleware,
auth_middleware,
users_repository_middleware,
pools_repository_middleware,
subscriptions_repository_middleware,
]
router = aiogram.Router()
for middleware in middlewares:
dispatcher.update.outer_middleware(middleware)
router.callback_query.middleware(middleware)
router.message.middleware(middleware)
router = setup_router(router=router)
dispatcher.include_router(router)
def setup_router(router: aiogram.Router) -> aiogram.Router:
# Menu
router.message.register(handlers.menu_message_handler, Command("start"))
router.message.register(handlers.menu_message_handler, Command("menu"))
router.message.register(
handlers.profile_message_handler,
MenuState.MENU,
aiogram.F.text == constants.PROFILE_BUTTON,
)
router.message.register(
handlers.subscriptions_message_handler,
MenuState.MENU,
aiogram.F.text == constants.SUBSCRIPTIONS_BUTTON,
)
## Profile
router.message.register(
handlers.ask_profile_name_message_handler,
MenuState.PROFILE,
aiogram.F.text == constants.SET_PROFILE_NAME,
)
router.message.register(
handlers.ask_profile_phone_message_handler,
MenuState.PROFILE,
aiogram.F.text == constants.SET_PROFILE_PHONE,
)
router.message.register(
handlers.ask_profile_birthdate_message_handler,
MenuState.PROFILE,
aiogram.F.text == constants.SET_PROFILE_BIRTHDATE_BUTTON,
)
router.message.register(
handlers.ask_profile_gift_payment_phone_message_handler,
MenuState.PROFILE,
aiogram.F.text == constants.SET_PROFILE_GIFT_PAYMENT_DATA_BUTTON,
)
router.message.register(
handlers.menu_message_handler,
MenuState.PROFILE,
aiogram.F.text == constants.BACK_BUTTON,
)
### Set profile name
router.message.register(
handlers.profile_message_handler,
SetProfileNameState.WAITING_FOR_NAME,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_profile_name_message_handler,
SetProfileNameState.WAITING_FOR_NAME,
)
### Set profile phone
router.message.register(
handlers.profile_message_handler,
SetProfilePhoneState.WAITING_FOR_PHONE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_profile_phone_message_handler,
SetProfilePhoneState.WAITING_FOR_PHONE,
)
### Set profile birthday
router.message.register(
handlers.profile_message_handler,
SetProfileBirthdayState.WAITING_FOR_DATE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_profile_birthdate_message_handler,
SetProfileBirthdayState.WAITING_FOR_DATE,
)
### Set profile gift payment data
router.message.register(
handlers.profile_message_handler,
SetProfileGiftPaymentDataState.WAITING_FOR_PHONE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_profile_gift_payment_phone_message_handler,
SetProfileGiftPaymentDataState.WAITING_FOR_PHONE,
)
router.message.register(
handlers.ask_profile_gift_payment_phone_message_handler,
SetProfileGiftPaymentDataState.WAITING_FOR_BANK,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_profile_gift_payment_bank_message_handler,
SetProfileGiftPaymentDataState.WAITING_FOR_BANK,
aiogram.F.text.in_(constants.BANKS_MAP),
)
## Subscriptions
router.callback_query.register(
handlers.subscription_callback_handler,
MenuState.SUBSCRIPTIONS,
SubscriptionCallbackData.filter(
aiogram.F.action == SubscriptionActionEnum.SHOW,
),
)
router.callback_query.register(
handlers.subscriptions_callback_handler,
MenuState.SUBSCRIPTIONS,
SubscriptionsCallbackData.filter(),
)
router.callback_query.register(
handlers.new_subscription_callback_handler,
MenuState.SUBSCRIPTIONS,
NewSubscriptionCallbackData.filter(),
)
router.callback_query.register(
handlers.menu_callback_handler,
MenuState.SUBSCRIPTIONS,
MenuCallbackData.filter(),
)
### Subscription interaction
router.callback_query.register(
handlers.delete_subscription_callback,
MenuState.SUBSCRIPTIONS,
SubscriptionCallbackData.filter(
aiogram.F.action == SubscriptionActionEnum.DELETE,
),
)
router.callback_query.register(
handlers.subscriptions_callback_handler,
MenuState.SUBSCRIPTIONS,
SubscriptionCallbackData.filter(
aiogram.F.action == SubscriptionActionEnum.BACK,
),
)
### Add new subscription
router.message.register(
handlers.new_subscription_message_handler,
NewSubscriptionState.WAITING_FOR_PHONE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_user_message_handler,
NewSubscriptionState.WAITING_FOR_PHONE,
)
router.message.register(
handlers.ask_new_subscription_user_message_handler,
NewSubscriptionState.WAITING_FOR_DATE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_user_birthday_message_handler,
NewSubscriptionState.WAITING_FOR_DATE,
)
router.message.register(
handlers.ask_new_subscription_user_message_handler,
NewSubscriptionState.WAITING_FOR_NAME,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_name_message_handler,
NewSubscriptionState.WAITING_FOR_NAME,
)
router.message.register(
handlers.ask_new_subscription_pool_description_message_handler,
NewSubscriptionState.WAITING_FOR_POOL_DECISION,
aiogram.F.text == constants.CREATE_POOL_BUTTON,
)
router.message.register(
handlers.show_new_subscription_choosing_pools_message_handler,
NewSubscriptionState.WAITING_FOR_POOL_DECISION,
aiogram.F.text == constants.JOIN_EXISTING_POOL_BUTTON,
)
router.message.register(
handlers.ask_new_subscription_confirmation_message_handler,
NewSubscriptionState.WAITING_FOR_POOL_DECISION,
aiogram.F.text == constants.DECLINE_POOL_BUTTON,
)
router.message.register(
handlers.ask_new_subscription_name_message_handler,
NewSubscriptionState.WAITING_FOR_POOL_DECISION,
aiogram.F.text == constants.BACK_BUTTON,
)
router.callback_query.register(
handlers.confirm_new_subscription_callback_handler,
NewSubscriptionState.WAITING_FOR_CONFIRMATION,
NewSubscriptionConfirmCallbackData.filter(
aiogram.F.answer == ConfirmAnswerEnum.YES,
),
)
router.callback_query.register(
handlers.subscriptions_callback_handler,
NewSubscriptionState.WAITING_FOR_CONFIRMATION,
NewSubscriptionConfirmCallbackData.filter(
aiogram.F.answer == ConfirmAnswerEnum.NO,
),
)
#### Add new subscription pool
router.message.register(
handlers.ask_new_subscription_pool_payment_phone_message_handler,
NewSubscriptionPoolState.WAITING_FOR_DESCRIPTION,
aiogram.F.text == constants.SKIP_BUTTON,
)
router.message.register(
handlers.ask_new_subscription_pool_decision_message_handler,
NewSubscriptionPoolState.WAITING_FOR_DESCRIPTION,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_pool_description_message_handler,
NewSubscriptionPoolState.WAITING_FOR_DESCRIPTION,
)
router.message.register(
handlers.set_new_subscription_pool_payment_data_from_profile_message_handler,
NewSubscriptionPoolState.WAITING_FOR_PAYMENT_PHONE,
aiogram.F.text == constants.USE_PROFILE_GIFT_PAYMENT_DATA,
)
router.message.register(
handlers.ask_new_subscription_pool_description_message_handler,
NewSubscriptionPoolState.WAITING_FOR_PAYMENT_PHONE,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_pool_payment_phone_message_handler,
NewSubscriptionPoolState.WAITING_FOR_PAYMENT_PHONE,
)
router.message.register(
handlers.set_new_subscription_pool_payment_phone_message_handler,
NewSubscriptionPoolState.WAITING_FOR_PAYMENT_BANK,
aiogram.F.text == constants.BACK_BUTTON,
)
router.message.register(
handlers.set_new_subscription_pool_payment_bank_message_handler,
NewSubscriptionPoolState.WAITING_FOR_PAYMENT_BANK,
)
#### Choose pool for subscription
router.callback_query.register(
handlers.show_new_subscription_choosing_pools_callback_handler,
NewSubscriptionState.WAITING_FOR_CHOOSE_POOL,
PoolsCallbackData.filter(),
)
router.callback_query.register(
handlers.ask_new_subscription_pool_decision_callback_handler,
NewSubscriptionState.WAITING_FOR_CHOOSE_POOL,
PoolsBackCallbackData.filter(),
)
router.callback_query.register(
handlers.show_new_subscription_choosing_pool_callback_handler,
NewSubscriptionState.WAITING_FOR_CHOOSE_POOL,
PoolCallbackData.filter(aiogram.F.action == PoolActionEnum.SHOW),
)
router.callback_query.register(
handlers.choose_new_subscription_pool_callback_handler,
NewSubscriptionState.WAITING_FOR_CHOOSE_POOL,
PoolCallbackData.filter(aiogram.F.action == PoolActionEnum.CHOOSE),
)
router.callback_query.register(
handlers.show_new_subscription_choosing_pools_callback_handler,
NewSubscriptionState.WAITING_FOR_CHOOSE_POOL,
PoolsCallbackData.filter(),
)
# Fallback
router.message.register(handlers.fallback_message_handler)
return router