from aiogram import Router from aiogram.filters import CommandStart, ExceptionTypeFilter from aiogram.types import Message, CallbackQuery, ErrorEvent from aiogram_dialog import DialogManager, StartMode from aiogram_dialog.api.exceptions import UnknownIntent from dishka import FromDishka from dutylog.application.bot.user_dialogs.states import ( MainMenuSG, AdminMenuSG, RegistrationSG, ) from dutylog.infrastructure.database.repositories.users_repository import ( UsersRepository, ) from dutylog.infrastructure.database.repositories.residents_repository import ( ResidentsRepository, ) from dutylog.infrastructure.utils.config import Config router = Router() @router.message(CommandStart()) async def start_handler( message: Message, dialog_manager: DialogManager, users_repository: FromDishka[UsersRepository], residents_repository: FromDishka[ResidentsRepository], config: FromDishka[Config], ) -> None: assert message.from_user is not None user = await users_repository.get_or_create_user( user_id=message.from_user.id, username=message.from_user.username, first_name=message.from_user.first_name, last_name=message.from_user.last_name, ) is_creator = message.from_user.id == config.bot.creator_id is_admin = user.is_admin if user else False if is_admin or is_creator: await dialog_manager.start(AdminMenuSG.main, mode=StartMode.RESET_STACK) return if user: resident = await residents_repository.get_resident_by_user_id( message.from_user.id ) if resident: await dialog_manager.start(MainMenuSG.main, mode=StartMode.RESET_STACK) return await dialog_manager.start(RegistrationSG.select_floor, mode=StartMode.RESET_STACK) @router.error(ExceptionTypeFilter(UnknownIntent)) async def unknown_intent_handler( event: ErrorEvent, dialog_manager: DialogManager, users_repository: FromDishka[UsersRepository], residents_repository: FromDishka[ResidentsRepository], config: FromDishka[Config], ) -> None: if not isinstance(event.exception, UnknownIntent): raise event.exception user_id = None if event.update.message and event.update.message.from_user: user_id = event.update.message.from_user.id elif event.update.callback_query and event.update.callback_query.from_user: user_id = event.update.callback_query.from_user.id if not user_id: return user = await users_repository.get_user_by_id(user_id) is_creator = user_id == config.bot.creator_id is_admin = user.is_admin if user else False if is_admin or is_creator: await dialog_manager.start(AdminMenuSG.main, mode=StartMode.RESET_STACK) return resident = await residents_repository.get_resident_by_user_id(user_id) if resident: await dialog_manager.start(MainMenuSG.main, mode=StartMode.RESET_STACK) else: await dialog_manager.start(RegistrationSG.select_floor, mode=StartMode.RESET_STACK)