mirror of
https://github.com/koloideal/Quizzi.git
synced 2026-06-10 18:35:28 +03:00
commit
This commit is contained in:
@@ -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_admin import RejectNotAdminMiddleware
|
||||||
from trudex.application.bot.middlewares.reject_not_creator import RejectNotCreatorMiddleware
|
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.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.database.repo.user import UserRepository
|
||||||
from trudex.infrastructure.di import DatabaseProvider
|
from trudex.infrastructure.di import DatabaseProvider
|
||||||
from trudex.infrastructure.utils.bot_commands import setup_bot_commands
|
from trudex.infrastructure.utils.bot_commands import setup_bot_commands
|
||||||
@@ -47,6 +48,7 @@ async def main() -> None:
|
|||||||
dp.include_routers(
|
dp.include_routers(
|
||||||
router,
|
router,
|
||||||
user_menu_dialog,
|
user_menu_dialog,
|
||||||
|
registration_dialog,
|
||||||
admin_menu_dialog,
|
admin_menu_dialog,
|
||||||
admin_users_dialog,
|
admin_users_dialog,
|
||||||
admin_tests_dialog,
|
admin_tests_dialog,
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ from dishka.integrations.aiogram import FromDishka
|
|||||||
|
|
||||||
from trudex.application.bot.admin_dialogs.states import AdminMenuSG
|
from trudex.application.bot.admin_dialogs.states import AdminMenuSG
|
||||||
from trudex.application.bot.creator_dialogs.states import CreatorMenuSG
|
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
|
from trudex.infrastructure.database.dao.user import UserDAO
|
||||||
|
|
||||||
|
|
||||||
@@ -15,16 +16,63 @@ router = Router()
|
|||||||
|
|
||||||
|
|
||||||
@router.message(CommandStart())
|
@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
|
assert message.from_user is not None
|
||||||
|
|
||||||
|
# Проверяем, существует ли пользователь
|
||||||
|
existing_user = await user_dao.get_by_id(message.from_user.id)
|
||||||
|
|
||||||
|
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(
|
await user_dao.upsert(
|
||||||
user_id=message.from_user.id,
|
user_id=message.from_user.id,
|
||||||
first_name=message.from_user.first_name,
|
first_name=message.from_user.first_name,
|
||||||
username=message.from_user.username,
|
username=message.from_user.username,
|
||||||
last_name=message.from_user.last_name,
|
last_name=message.from_user.last_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
await dialog_manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK)
|
await dialog_manager.start(UserMenuSG.main, mode=StartMode.RESET_STACK)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
class UserMenuSG(StatesGroup):
|
||||||
main = State()
|
main = State()
|
||||||
|
|
||||||
|
|
||||||
|
class UserRegistrationSG(StatesGroup):
|
||||||
|
select_group = State()
|
||||||
|
|||||||
Reference in New Issue
Block a user