from contextlib import asynccontextmanager import os from fastapi import FastAPI from fastapi.staticfiles import StaticFiles import httpx from app.api import admin_daily_quests, inventory, news, users, skins, capes, meta, server, store, pranks, marketplace, bonuses, case, promo 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(case.router) app.include_router(inventory.router) app.include_router(bonuses.router) app.include_router(news.router) app.include_router(telegram.router) app.include_router(admin_daily_quests.router) app.include_router(promo.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=["*"], )