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:
Mikhail Putilovskij 2026-03-31 21:35:16 +03:00
parent a3449fc864
commit 9c555261b3
15 changed files with 791 additions and 0 deletions

View 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)