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_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,
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user