surfaces/adapter/telegram/bot.py

76 lines
2.4 KiB
Python

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