Files
popa_minecraft_launcher_api/main.py

92 lines
3.0 KiB
Python

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.services.promo import PromoService
from app.webhooks import telegram
from app.db.database import users_collection
from app.api import marketplace_ws
from app.db.database import users_collection, sessions_collection
###################### БОТ ######################
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 =====
# TTL для сессий (автоочистка)
await sessions_collection.create_index(
"expires_at",
expireAfterSeconds=0
)
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,
)
await PromoService().ensure_indexes()
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(marketplace_ws.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=["*"],
)