Files
DutyLog/src/dutylog/application/bot/user_handlers.py
T
2026-03-01 16:26:47 +03:00

93 lines
3.0 KiB
Python

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)