Files
popa_minecraft_launcher_api/main.py

79 lines
2.4 KiB
Python

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