from contextlib import asynccontextmanager import os from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import httpx from app.api import news, users, skins, capes, meta, server, store, pranks, marketplace, bonuses, case from fastapi.middleware.cors import CORSMiddleware from app.core.config import CAPES_DIR, CAPES_STORE_DIR, SKINS_DIR from app.webhooks import telegram from app.db.database import users_collection app = FastAPI() ###################### БОТ ###################### BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN") PUBLIC_WEBHOOK_URL = os.getenv("PUBLIC_WEBHOOK_URL") # https://minecraft.api.popa-popa.ru/telegram/webhook WEBHOOK_SECRET = os.getenv("TELEGRAM_WEBHOOK_SECRET", "") @asynccontextmanager async def lifespan(app: FastAPI): # ===== STARTUP ===== await users_collection.create_index("expires_at", expireAfterSeconds=0) await users_collection.create_index("telegram_user_id", unique=True, sparse=True) if BOT_TOKEN and PUBLIC_WEBHOOK_URL: payload = {"url": PUBLIC_WEBHOOK_URL} if WEBHOOK_SECRET: payload["secret_token"] = WEBHOOK_SECRET async with httpx.AsyncClient(timeout=20) as client: await client.post( f"https://api.telegram.org/bot{BOT_TOKEN}/setWebhook", json=payload, ) yield # ===== SHUTDOWN ===== async with httpx.AsyncClient(timeout=20) as client: await client.post( f"https://api.telegram.org/bot{BOT_TOKEN}/deleteWebhook" ) app = FastAPI(lifespan=lifespan) ################################################## app.include_router(meta.router) app.include_router(users.router) app.include_router(skins.router) app.include_router(capes.router) app.include_router(server.router) app.include_router(store.router) app.include_router(pranks.router) app.include_router(marketplace.router) app.include_router(bonuses.router) app.include_router(news.router) app.include_router(case.router) app.include_router(telegram.router) # Монтируем статику app.mount("/skins", StaticFiles(directory=str(SKINS_DIR)), name="skins") app.mount("/capes", StaticFiles(directory=str(CAPES_DIR)), name="capes") app.mount("/capes_store", StaticFiles(directory=str(CAPES_STORE_DIR)), name="capes_store") # CORS, middleware и т.д. app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )