feat: implement adapter/telegram/ with aiogram 3.x
Virtual DM chats, FSM (idle/waiting_response/settings states), SQLite local DB for tg_users+chats, converter, keyboards, and handlers for /start, /new, /chats, /settings, confirm callbacks.
This commit is contained in:
parent
a3449fc864
commit
9c555261b3
15 changed files with 791 additions and 0 deletions
67
adapter/telegram/handlers/auth.py
Normal file
67
adapter/telegram/handlers/auth.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
# 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 platform.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)
|
||||
Loading…
Add table
Add a link
Reference in a new issue