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 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 ===== 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=["*"], )