init
This commit is contained in:
102
main.py
Normal file
102
main.py
Normal file
@@ -0,0 +1,102 @@
|
||||
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"
|
||||
"Диалоги не поддерживаются!!!! <b>Каждое новое сообщение - новый диалог</b>")
|
||||
|
||||
|
||||
@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"
|
||||
"Диалоги не поддерживаются!!!! <b>Каждое новое сообщение - новый диалог</b>"
|
||||
)
|
||||
|
||||
|
||||
# --- ЗАПУСК ---
|
||||
if __name__ == "__main__":
|
||||
setup_logging()
|
||||
try:
|
||||
asyncio.run(dp.start_polling(bot))
|
||||
except KeyboardInterrupt:
|
||||
print("Bot stopped")
|
||||
Reference in New Issue
Block a user