surfaces/adapter/telegram/bot.py
Mikhail Putilovskij 6ced154124 feat(matrix): land QA follow-ups and refresh docs
- harden Matrix onboarding/chat lifecycle after manual QA
- refresh README and Matrix docs to match current behavior
- add local ignores for runtime artifacts and include current planning/report docs

Closes #7
Closes #9
Closes #14
2026-04-05 19:08:58 +03:00

79 lines
2.5 KiB
Python

from __future__ import annotations
import asyncio
import os
import structlog
from dotenv import load_dotenv
load_dotenv()
from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.types import BotCommand
from adapter.telegram import db
from adapter.telegram.handlers import commands, message, settings, start, topic_events
from core.auth import AuthManager
from core.chat import ChatManager
from core.handler import EventDispatcher
from core.settings import SettingsManager
from core.store import InMemoryStore
from sdk.mock import MockPlatformClient
logger = structlog.get_logger(__name__)
class PlatformMiddleware:
def __init__(self, dispatcher: EventDispatcher) -> None:
self._dispatcher = dispatcher
async def __call__(self, handler, event, data):
data["dispatcher"] = self._dispatcher
return await handler(event, data)
def build_event_dispatcher() -> EventDispatcher:
platform = MockPlatformClient()
store = InMemoryStore()
return EventDispatcher(
platform=platform,
chat_mgr=ChatManager(platform, store),
auth_mgr=AuthManager(platform, store),
settings_mgr=SettingsManager(platform, store),
)
async def main() -> None:
token = os.environ.get("BOT_TOKEN") or os.environ.get("TELEGRAM_BOT_TOKEN")
if not token:
raise RuntimeError("BOT_TOKEN (or TELEGRAM_BOT_TOKEN) env variable is not set")
db.init_db()
bot = Bot(token=token)
dp = Dispatcher(storage=MemoryStorage())
event_dispatcher = build_event_dispatcher()
dp.message.middleware(PlatformMiddleware(event_dispatcher))
dp.callback_query.middleware(PlatformMiddleware(event_dispatcher))
dp.include_router(topic_events.router)
dp.include_router(start.router)
dp.include_router(commands.router)
dp.include_router(settings.router)
dp.include_router(message.router)
await bot.set_my_commands([
BotCommand(command="start", description="Начать / восстановить сессию"),
BotCommand(command="new", description="Создать новый чат"),
BotCommand(command="archive", description="Архивировать текущий чат"),
BotCommand(command="rename", description="Переименовать текущий чат"),
BotCommand(command="settings", description="Настройки"),
])
logger.info("bot_starting")
await dp.start_polling(bot, allowed_updates=["message", "callback_query"])
if __name__ == "__main__":
asyncio.run(main())