mirror of
https://github.com/koloideal/DutyLog.git
synced 2026-06-10 10:25:29 +03:00
93 lines
3.0 KiB
Python
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)
|