94 lines
2.6 KiB
Python
94 lines
2.6 KiB
Python
from aiogram import Router
|
|
from aiogram.filters import CommandStart
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.types import Message
|
|
from logging import getLogger
|
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
|
|
from ...main import QBotApp
|
|
from ...model.settings import Settings
|
|
from ...model.language import LanguageBase
|
|
from ...model.user import UserBase
|
|
from ...utils.main import clear_state
|
|
|
|
|
|
logger = getLogger(__name__)
|
|
router = Router()
|
|
|
|
|
|
@router.message(CommandStart())
|
|
async def start(message: Message, **kwargs):
|
|
app: QBotApp = kwargs["app"]
|
|
|
|
if app.start_handler:
|
|
await app.start_handler(
|
|
default_start_handler, message, **kwargs
|
|
)
|
|
else:
|
|
await default_start_handler(message, **kwargs)
|
|
|
|
|
|
async def default_start_handler[UserType: UserBase](
|
|
message: Message,
|
|
db_session: AsyncSession,
|
|
app: QBotApp,
|
|
state: FSMContext,
|
|
**kwargs,
|
|
) -> tuple[UserType, bool]:
|
|
state_data = await state.get_data()
|
|
clear_state(state_data=state_data, clear_nav=True)
|
|
|
|
User = app.user_class
|
|
|
|
user = await User.get(session=db_session, id=message.from_user.id)
|
|
|
|
if not user:
|
|
is_new = True
|
|
msg_text = (await Settings.get(Settings.APP_STRINGS_WELCOME_P_NAME)).format(
|
|
name=message.from_user.full_name
|
|
)
|
|
|
|
try:
|
|
if message.from_user.language_code in [
|
|
item.value for item in LanguageBase.all_members.values()
|
|
]:
|
|
lang = LanguageBase(message.from_user.language_code)
|
|
else:
|
|
lang = LanguageBase.EN
|
|
|
|
user = await User.create(
|
|
session=db_session,
|
|
obj_in=User(
|
|
id=message.from_user.id,
|
|
name=message.from_user.full_name,
|
|
lang=lang,
|
|
is_active=True,
|
|
),
|
|
commit=True,
|
|
)
|
|
|
|
except Exception as e:
|
|
logger.error("Error creating user", exc_info=True)
|
|
message.answer(
|
|
(
|
|
await Settings.get(Settings.APP_STRINGS_INTERNAL_ERROR_P_ERROR)
|
|
).format(error=str(e))
|
|
)
|
|
|
|
return
|
|
|
|
else:
|
|
is_new = False
|
|
if user.is_active:
|
|
msg_text = (
|
|
await Settings.get(Settings.APP_STRINGS_GREETING_P_NAME)
|
|
).format(name=user.name)
|
|
else:
|
|
msg_text = (
|
|
await Settings.get(Settings.APP_STRINGS_USER_BLOCKED_P_NAME)
|
|
).format(name=user.name)
|
|
|
|
await message.answer(msg_text)
|
|
|
|
return user, is_new
|