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()