From 9613ecee54af9ae74dc526e757e134fdb848dcc0 Mon Sep 17 00:00:00 2001 From: kolo Date: Fri, 2 Jan 2026 20:45:38 +0300 Subject: [PATCH] commit --- src/trudex/application/__main__.py | 2 + src/trudex/application/bot/handlers.py | 66 ++++++++++++++++--- .../bot/user_dialogs/registration.py | 57 ++++++++++++++++ .../application/bot/user_dialogs/states.py | 4 ++ 4 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 src/trudex/application/bot/user_dialogs/registration.py diff --git a/src/trudex/application/__main__.py b/src/trudex/application/__main__.py index 72bc31b..b76d899 100644 --- a/src/trudex/application/__main__.py +++ b/src/trudex/application/__main__.py @@ -23,6 +23,7 @@ from trudex.application.bot.handlers import router from trudex.application.bot.middlewares.reject_not_admin import RejectNotAdminMiddleware from trudex.application.bot.middlewares.reject_not_creator import RejectNotCreatorMiddleware from trudex.application.bot.user_dialogs.main_menu import user_menu_dialog +from trudex.application.bot.user_dialogs.registration import registration_dialog from trudex.infrastructure.database.repo.user import UserRepository from trudex.infrastructure.di import DatabaseProvider from trudex.infrastructure.utils.bot_commands import setup_bot_commands @@ -47,6 +48,7 @@ async def main() -> None: dp.include_routers( router, user_menu_dialog, + registration_dialog, admin_menu_dialog, admin_users_dialog, admin_tests_dialog, diff --git a/src/trudex/application/bot/handlers.py b/src/trudex/application/bot/handlers.py index 63ba8d4..5455a9c 100644 --- a/src/trudex/application/bot/handlers.py +++ b/src/trudex/application/bot/handlers.py @@ -7,7 +7,8 @@ from dishka.integrations.aiogram import FromDishka from trudex.application.bot.admin_dialogs.states import AdminMenuSG from trudex.application.bot.creator_dialogs.states import CreatorMenuSG -from trudex.application.bot.user_dialogs.states import UserMenuSG +from trudex.application.bot.user_dialogs.states import UserMenuSG, UserRegistrationSG +from trudex.infrastructure.database.dao.group import GroupDAO from trudex.infrastructure.database.dao.user import UserDAO @@ -15,17 +16,64 @@ router = Router() @router.message(CommandStart()) -async def start_handler(message: Message, user_dao: FromDishka[UserDAO], dialog_manager: DialogManager) -> None: +async def start_handler( + message: Message, + user_dao: FromDishka[UserDAO], + group_dao: FromDishka[GroupDAO], + dialog_manager: DialogManager +) -> None: assert message.from_user is not None - await user_dao.upsert( - user_id=message.from_user.id, - first_name=message.from_user.first_name, - username=message.from_user.username, - last_name=message.from_user.last_name, - ) + # Проверяем, существует ли пользователь + existing_user = await user_dao.get_by_id(message.from_user.id) - await dialog_manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK) + if existing_user is None: + # Новый пользователь - проверяем наличие групп + groups = await group_dao.get_all() + + if len(groups) > 0: + # Есть группы - создаем пользователя без группы и показываем выбор + await user_dao.create( + user_id=message.from_user.id, + first_name=message.from_user.first_name, + username=message.from_user.username, + last_name=message.from_user.last_name, + ) + await dialog_manager.start( + UserRegistrationSG.select_group, + mode=StartMode.RESET_STACK, + data={"user_id": message.from_user.id} + ) + else: + # Нет групп - просто создаем пользователя + await user_dao.create( + user_id=message.from_user.id, + first_name=message.from_user.first_name, + username=message.from_user.username, + last_name=message.from_user.last_name, + ) + await dialog_manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK) + else: + # Существующий пользователь + # Проверяем, выбрал ли он группу + groups = await group_dao.get_all() + + if len(groups) > 0 and existing_user.group is None: + # Есть группы, но пользователь не выбрал группу - показываем выбор + await dialog_manager.start( + UserRegistrationSG.select_group, + mode=StartMode.RESET_STACK, + data={"user_id": message.from_user.id} + ) + else: + # Группа выбрана или групп нет - обновляем данные и открываем меню + await user_dao.upsert( + user_id=message.from_user.id, + first_name=message.from_user.first_name, + username=message.from_user.username, + last_name=message.from_user.last_name, + ) + await dialog_manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK) @router.message(Command("admin")) diff --git a/src/trudex/application/bot/user_dialogs/registration.py b/src/trudex/application/bot/user_dialogs/registration.py new file mode 100644 index 0000000..f597895 --- /dev/null +++ b/src/trudex/application/bot/user_dialogs/registration.py @@ -0,0 +1,57 @@ +from aiogram.types import CallbackQuery +from aiogram_dialog import Dialog, DialogManager, StartMode, Window +from aiogram_dialog.widgets.kbd import ScrollingGroup, Select +from aiogram_dialog.widgets.text import Const, Format +from dishka.integrations.aiogram import CONTAINER_NAME + +from trudex.application.bot.user_dialogs.states import UserMenuSG, UserRegistrationSG +from trudex.infrastructure.database.dao.group import GroupDAO +from trudex.infrastructure.database.dao.user import UserDAO + + +async def get_groups_for_registration(dialog_manager: DialogManager, **_kwargs): + container = dialog_manager.middleware_data[CONTAINER_NAME] + group_dao = await container.get(GroupDAO) + + groups = await group_dao.get_all() + + return { + "groups": [(str(g.number), str(g.number)) for g in groups], + } + + +async def on_group_selected(_callback: CallbackQuery, _widget, manager: DialogManager, item_id: str): + container = manager.middleware_data[CONTAINER_NAME] + user_dao = await container.get(UserDAO) + + user_id = manager.start_data.get("user_id") + + await user_dao.update(user_id=user_id, group=int(item_id)) + + await _callback.answer("✅ Группа выбрана! Вы можете изменить её через 24 часа", show_alert=True) + await manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK) + + +registration_dialog = Dialog( + Window( + Const( + "👋 Добро пожаловать!\n\n" + "🎓 Выберите вашу группу:\n\n" + "⚠️ Внимание: Изменить группу можно будет только через 24 часа!" + ), + ScrollingGroup( + Select( + Format("{item[1]}"), + id="groups", + item_id_getter=lambda x: x[0], + items="groups", + on_click=on_group_selected, + ), + id="groups_scroll", + width=2, + height=7, + ), + state=UserRegistrationSG.select_group, + getter=get_groups_for_registration, + ), +) diff --git a/src/trudex/application/bot/user_dialogs/states.py b/src/trudex/application/bot/user_dialogs/states.py index 7435483..e89b889 100644 --- a/src/trudex/application/bot/user_dialogs/states.py +++ b/src/trudex/application/bot/user_dialogs/states.py @@ -3,3 +3,7 @@ from aiogram.fsm.state import State, StatesGroup class UserMenuSG(StatesGroup): main = State() + + +class UserRegistrationSG(StatesGroup): + select_group = State()