import asyncio import logging import os from aiogram import Bot, Dispatcher, Router, F from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode from aiogram.filters import CommandStart, Command, CommandObject from aiogram.types import Message, BufferedInputFile from aiogram.fsm.storage.mongo import MongoStorage from dotenv import load_dotenv from motor.motor_asyncio import AsyncIOMotorClient # Импорты from adapters.google_adapter import GoogleAdapter from middlewares.auth import AuthMiddleware from middlewares.dao import DaoMiddleware from repos.char_repo import CharacterRepo from repos.dao import DAO from repos.user_repo import UsersRepo from routers import char_router # ВАЖНО: Импортируем роутер с логикой кнопок, а не создаем пустой from routers.auth_router import router as auth_router from routers.gen_router import router as gen_router from routers.char_router import router as char_router load_dotenv() # Настройки BOT_TOKEN = os.getenv("BOT_TOKEN") GEMINI_API_KEY = os.getenv("GEMINI_API_KEY") MONGO_HOST = os.getenv("MONGO_HOST") ADMIN_ID = int(os.getenv("ADMIN_ID")) # Сразу преобразуем в int # Инициализация bot = Bot(token=BOT_TOKEN, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) # БД mongo_client = AsyncIOMotorClient(MONGO_HOST) users_repo = UsersRepo(mongo_client) char_repo = CharacterRepo(mongo_client) # Dispatcher # Если MongoStorage пока не настроен на authSource=admin, можно временно убрать storage=... dp = Dispatcher(storage=MongoStorage(mongo_client)) # ВНЕДРЕНИЕ ЗАВИСИМОСТЕЙ (чтобы они были доступны в хендлерах) dp["repo"] = users_repo dp["admin_id"] = ADMIN_ID dp["gemini"] = GoogleAdapter(api_key=GEMINI_API_KEY) # Инициализируем тут # РОУТИНГ # 1. Роутер авторизации (кнопки) - ПОДКЛЮЧАЕМ ПЕРВЫМ И БЕЗ МИДЛВАРИ dp.include_router(auth_router) main_router = Router() dp.include_router(main_router) dp.include_router(char_router) dp.include_router(gen_router) # 2. Основной роутер (чат с ботом) # Вешаем защиту ТОЛЬКО на основной роутер main_router.message.middleware(AuthMiddleware(repo=users_repo, admin_id=ADMIN_ID)) gen_router.message.middleware(AuthMiddleware(repo=users_repo, admin_id=ADMIN_ID)) char_router.message.middleware(DaoMiddleware(dao=DAO(client=mongo_client))) def setup_logging() -> None: logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(name)s: %(message)s") # --- ХЕНДЛЕРЫ ОСНОВНОГО РОУТЕРА --- # Переносим их прямо сюда или в отдельный файл routers/chat_router.py @main_router.message(Command("help")) async def show_help(message: Message) -> None: await message.answer("Для того, чтобы обратиться для текстовой генерации - просто отправь промпт.\n\n" "Для генерации фото - /image {prompt}\n\n" "Можно отправить фото и команду /image {prompt}\n\n" "Диалоги не поддерживаются!!!! Каждое новое сообщение - новый диалог") @main_router.message(CommandStart()) async def cmd_start(message: Message): await message.answer("👋 Привет! Я готов к работе.\n\n" "Для того, чтобы обратиться для текстовой генерации - просто отправь промпт.\n\n" "Для генерации фото - /image {prompt}\n\n" "Можно отправить фото и команду /image {prompt}\n\n" "Диалоги не поддерживаются!!!! Каждое новое сообщение - новый диалог" ) # --- ЗАПУСК --- if __name__ == "__main__": setup_logging() try: asyncio.run(dp.start_polling(bot)) except KeyboardInterrupt: print("Bot stopped")