from __future__ import annotations import asyncio import os import structlog 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") if not token: raise RuntimeError("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())