This commit is contained in:
2026-01-02 20:45:38 +03:00
parent 3a70802256
commit 9613ecee54
4 changed files with 120 additions and 9 deletions
+2
View File
@@ -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,
+57 -9
View File
@@ -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"))
@@ -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(
"<b>👋 Добро пожаловать!</b>\n\n"
"🎓 <b>Выберите вашу группу:</b>\n\n"
"⚠️ <b>Внимание:</b> Изменить группу можно будет только через 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,
),
)
@@ -3,3 +3,7 @@ from aiogram.fsm.state import State, StatesGroup
class UserMenuSG(StatesGroup):
main = State()
class UserRegistrationSG(StatesGroup):
select_group = State()