67 lines
2.2 KiB
Python
67 lines
2.2 KiB
Python
# adapter/telegram/handlers/auth.py
|
||
from __future__ import annotations
|
||
|
||
from aiogram import Router
|
||
from aiogram.filters import CommandStart
|
||
from aiogram.fsm.context import FSMContext
|
||
from aiogram.types import Message
|
||
|
||
from adapter.telegram import db
|
||
from adapter.telegram.states import ChatState
|
||
from core.handler import EventDispatcher
|
||
from core.protocol import IncomingCommand
|
||
|
||
router = Router(name="auth")
|
||
|
||
|
||
@router.message(CommandStart())
|
||
async def cmd_start(
|
||
message: Message,
|
||
state: FSMContext,
|
||
dispatcher: EventDispatcher,
|
||
) -> None:
|
||
tg_id = message.from_user.id
|
||
display_name = message.from_user.full_name
|
||
|
||
# Ensure user exists in platform (mock)
|
||
from sdk.mock import MockPlatformClient
|
||
# platform is available via dispatcher._platform
|
||
platform = dispatcher._platform
|
||
user = await platform.get_or_create_user(
|
||
external_id=str(tg_id),
|
||
platform="telegram",
|
||
display_name=display_name,
|
||
)
|
||
platform_user_id = user.user_id
|
||
|
||
# Upsert in local DB
|
||
db.get_or_create_tg_user(tg_id, platform_user_id, display_name)
|
||
|
||
last_chat = db.get_last_chat(tg_id)
|
||
|
||
if last_chat is None:
|
||
# New user — create first chat
|
||
chat_name = "Чат #1"
|
||
chat_id = db.create_chat(tg_id, chat_name)
|
||
await state.update_data(active_chat_id=chat_id, active_chat_name=chat_name)
|
||
await state.set_state(ChatState.idle)
|
||
await message.answer(
|
||
f"Привет, {message.from_user.first_name}! 👋\n"
|
||
f"Я создал тебе первый чат. Просто пиши.\n\n"
|
||
f"Команды: /new — новый чат, /chats — список чатов"
|
||
)
|
||
else:
|
||
chat_id = last_chat["chat_id"]
|
||
chat_name = last_chat["name"]
|
||
await state.update_data(active_chat_id=chat_id, active_chat_name=chat_name)
|
||
await state.set_state(ChatState.idle)
|
||
await message.answer(f"С возвращением! Продолжаем [{chat_name}]")
|
||
|
||
# Register auth in core
|
||
event = IncomingCommand(
|
||
user_id=platform_user_id,
|
||
platform="telegram",
|
||
chat_id=chat_id,
|
||
command="start",
|
||
)
|
||
await dispatcher.dispatch(event)
|